From d8e2e675289cf170fce314d0cc914c79450f17c0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Feb 2017 15:24:26 +0200 Subject: [PATCH 001/495] batch5 --- iguana/main.c | 10 +- iguana/tests/KMD.batch5 | 339 +++++++++++++++++++++++++ iguana/tests/KMD.batch5.importaddress | 337 ++++++++++++++++++++++++ iguana/tests/KMD.batch5.listunspent | 272 ++++++++++++++++++++ iguana/tests/REVS.batch5 | 38 +++ iguana/tests/REVS.batch5.importaddress | 36 +++ iguana/tests/dexlistunspent | 2 +- 7 files changed, 1028 insertions(+), 6 deletions(-) create mode 100755 iguana/tests/KMD.batch5 create mode 100755 iguana/tests/KMD.batch5.importaddress create mode 100755 iguana/tests/KMD.batch5.listunspent create mode 100755 iguana/tests/REVS.batch5 create mode 100755 iguana/tests/REVS.batch5.importaddress diff --git a/iguana/main.c b/iguana/main.c index 0fee9231a..6de01dea2 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1575,7 +1575,7 @@ void komodo_ICO_batch(cJSON *array,int32_t batchid) if ( (n= cJSON_GetArraySize(array)) > 0 ) { totalKMD = totalREVS = 0; - for (iter=2; iter<3; iter++) + for (iter=3; iter<4; iter++) for (i=0; i Date: Sat, 4 Feb 2017 21:28:01 +0200 Subject: [PATCH 002/495] libsecp warnings --- iguana/dpow/dpow_network.c | 2 +- iguana/iguana_secp.c | 4 +- iguana/tests/KMD.batch5 | 1 + iguana/tests/KMD.batch5.txids | 130 +++++++++++++++++++++++++++++++++ iguana/tests/KMD.bounty0 | 115 +++++++++++++++++++++++++++++ iguana/tests/REVS.batch5 | 1 + iguana/tests/REVS.batch5.txids | 12 +++ iguana/tests/dexlistunspent | 2 +- 8 files changed, 263 insertions(+), 4 deletions(-) create mode 100644 iguana/tests/KMD.batch5.txids create mode 100644 iguana/tests/KMD.bounty0 create mode 100644 iguana/tests/REVS.batch5.txids diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 99c0e63b4..9a4efab38 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -115,7 +115,7 @@ int32_t signed_nn_send(void *ctx,bits256 privkey,int32_t sock,void *packet,int32 break; } bitcoin_pubkey33(ctx,signpubkey33,privkey); - for (j=0; j<10; j++) + for (j=0; j<33; j++) { if ( i < 10000 && (siglen= bitcoin_sign(ctx,"nnsend",sig,sigpacket->packethash,privkey,1)) > 0 && siglen == 65 ) { diff --git a/iguana/iguana_secp.c b/iguana/iguana_secp.c index f7a51164a..05e43e01a 100755 --- a/iguana/iguana_secp.c +++ b/iguana/iguana_secp.c @@ -137,9 +137,9 @@ int32_t bitcoin_sign(void *ctx,char *symbol,uint8_t *sig,bits256 txhash2,bits256 // printf("%02x",pubkey[i]); //printf(" bitcoin_sign's pubkey\n"); - } else printf("secpub mismatch\n"); + } //else printf("secpub mismatch\n"); } else printf("pubkey create error\n"); - } else printf("recover error\n"); + } //else printf("recover error\n"); } else printf("secp256k1_ecdsa_sign_recoverable error\n"); } else diff --git a/iguana/tests/KMD.batch5 b/iguana/tests/KMD.batch5 index 9ffb37578..c03ab0568 100755 --- a/iguana/tests/KMD.batch5 +++ b/iguana/tests/KMD.batch5 @@ -1,3 +1,4 @@ +sleep 999999 # RRpHETjTPAfUExD1Bq9tnc6dhvpfsZFLi4 KMD 19343.06542151 ./komodo-cli sendtoaddress RRpHETjTPAfUExD1Bq9tnc6dhvpfsZFLi4 19343.06542151 sleep 3 diff --git a/iguana/tests/KMD.batch5.txids b/iguana/tests/KMD.batch5.txids new file mode 100644 index 000000000..bb3f7b656 --- /dev/null +++ b/iguana/tests/KMD.batch5.txids @@ -0,0 +1,130 @@ +671839f2ab21a621aaa25887ea401b5d4f3fdcfa2d2d1437ec7c30ad380f7f8e +19343.06542151 <- expected amount RRpHETjTPAfUExD1Bq9tnc6dhvpfsZFLi4 +c18addc60b0510f2896f27e33d7b83e4a5a9251393e94fc740008f15ed5501df +3873.26099750 <- expected amount RCkuABdHjmYJu9DqBhyUrBLma3UfGJTxXy +7e8452c65da4aaea9097d09010014030d7014283cfc78434affb67d0f0212db6 +6971.86979550 <- expected amount RCQ6Updk7CusynB1qEEs7nkRJUvChNp8Yq +53ddded19eebb4e5e2dbeba31dd9f5081f0d8fb3972892b17d8c33c8d0fd72ef +4912.04612506 <- expected amount RFquxwxMoADidBiLLFgoBvNoAotdXPGXgU +2985f9d7143580038bef79728bfe77e827ecc7366f809f92c33e6d31289b9e3e +27887.47918200 <- expected amount RFVnbATCEBhw1ZtXiJ353pYc1WCAY5Gvs6 +62ada7fc582dd59afa2c48a79796c50861a07fd28d3488640440bd79c1bbf7db +1452.47287406 <- expected amount RMNjQroPTdw6FDXvztV2QZnyCChJcuM7ix +25b1b8cac0d9f019c59727211d34f72bc054991837b93c527f36106f3cc05be2 +852.11741945 <- expected amount RAVWPDpje2fFtmm4m9LJ8whe28rLT1ahHW +775a78c73b9bf95b8f018b047aa053be81f49a17cbe5bb04b1b32e5dc061ba6a +1625.48610260 <- expected amount RC33WTbwtTrYXp6fdnX4waie6kbYBC4UTQ +ece870032a6382cae538c619bf126afede64bfc61929fd95d54e15b05c5fa250 +5228.90234661 <- expected amount RAFCAAxLFfTbLS7tHXrEMfasQVFFZAVj19 +cd1c3c0896c2a57a29b9adce2aa890a60137f0f00137e3e4f5b8eb47ba60ae56 +6045.00703151 <- expected amount RGahFz48G2H6mUJfGnrH6wvDXTJuTE6i6Y +c327a19c1596f224121a73d4f73ada584942691d07b4c3ba6ce20511c29fed17 +10521.01631272 <- expected amount RL5EuMVC878LpRvM7bmhvkD3v8GMtkrnsZ +7ed7bed2a5e7f4adc74004a46ca85f4b0e44342fc6ee42fe40c975bb943091e4 +2902.52496000 <- expected amount RFG72C8qkjEedduoB4kgSjZvtKFSNJpKMc +065404be877363994e606a1c56ca6cb499fa51a61d2c7e81e4bdae13fc0c53c9 +35570.77185561 <- expected amount RPwgBuP6dqg275ogGT6oXLGLRhb3KJBiL1 +489e0f36b6eff9d5e0ee0e4c6a42c2fc8926e7ec8f2542177aaefc408399afd1 +291.86077302 <- expected amount RPxZS6VUMVQ882fmxCES5q6xQFj8ABpMVM +e36d4886c94697d53477f2c4b3a1d2d6cd6b877c37df4037e597e50e8493d493 +19366.30498750 <- expected amount RJzkWn3SH2yk5NcQxjF2E4DbqTC5XhLpva +e398ccd36730ee0091c520705f04463d01438f64be0569977d9b41f11fe83095 +722.28571081 <- expected amount RKwvsAhZ5hRrdXoRMyjXVqu1N7rnjGhu7S +2c223ff098c632a444046356f8e0fa677f8ab69a7e7491031328ffd7daa8ca41 +416761.10163094 <- expected amount RHt5mSvqCTDkwEJhF2jQ7uAAThkt5WaM2x +b94905d04a004c9d53ec64acfda2251c00a2cfcba840682f75fcbe0162e56be6 +9767.05422136 <- expected amount RKg3D8GzPcBYsRaVuKfEahBDAdv8D1rVjH +a749ff1f14c0b724871dc55e5b1dc2460a82f6bc7bacef283094881caf6030c3 +1891.37303787 <- expected amount RGur4rnZTJRSdAjU5avya5EA57K5izbv9b +2b806ace63b634089a37159a3012ba1157f28f7fbb9cbadf0b8bbdee5524308c +17009.37539559 <- expected amount REzUa4zYVZychBN6GT1vRrQ1k7VEa8zb91 +1a15d425625378de4da79ebcadc7a8ed23d3e5b10cd1dc3f69e12655ec852fc9 +1241.69290122 <- expected amount RER2vwRLHFT4HNQLzyqT1PhbeMCitDaY1u +3bbdb56a2708ee1f7fae191625a7bbe143a1b14a77c5e3dece305ac27d64b421 +852.11741945 <- expected amount RC1MxfkT36U6ifcaE2U25yHvc7u4W2yFZM +7ab5fe203ae7b23957ca398484a9eb6279c0f9bc68c0d3dd0bc2c0aab8cc9d77 +195982.90265756 <- expected amount RKuwq4oi4mqQ2V4r54mPEthn3TBrEwu2Ni +f9565a6da32ceb99dc15c6f76bf9c2ba14f6f97f9507959559423fda957b8535 +9117.34456938 <- expected amount RLF4RDbghSp9F1bXpnYoT64BhiS5BK2pXY +4ff416b520100c3ff835ad5609ab3e693627507ce793946acaf47a8ce5369f5e +11842.49549985 <- expected amount RGjy7Co3moKAdBWr1kXe6V9T1keDHbjhiU +26ea54eed2119c46477b15e6942d421b4650ced130b5f87b5de93c8173abcdba +861.17744171 <- expected amount RXjdDrkbmgEVBviV8PhnqASupSjPLubY5H +01079e344e33c318a09c58030d2f6a2cd504163a3b93f3140ce8deb77def3d73 +30792.42493012 <- expected amount RHrb9VZXMq4D4GGjwpmsW9U5ATwFA6CRYg +291e269fa045a3cfabe190840e2ad1334fd4d06faa1587ce24a29a9cec7ed452 +9683.15249375 <- expected amount RNXYQyJnopoYEMuq6QEvuJTAAM6oLspGtN +085e0e1c032548f1ac48a826377d8ed7d0052ecf430ada7f805485aa0597028f +6641.51666395 <- expected amount RAHQfS9AwqS5i75zSVL2DgJFwYfQGY6BWJ +97ae90ac6609753583ec70ed0a74a775384f11a1df13250035da31340374eac2 +972.76143201 <- expected amount RFWr9v55i1zUEa1iH7J1Pz1DyUPbZ8HVfE +0c28a02c2e3f2294685b6beaf07c114ef10f9c02bea487e71a233c23873ae5a6 +7967.93037537 <- expected amount RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ +36b5dc3bca899b5cc5fee912cb921d55ad4d436e66c1d08897a9fcd00622f31e +2518.25812688 <- expected amount RX4Gzaf4W19vdRWPZxgyUz9mMvMyJsGEiM +104748914a14191cf2a662861d57f3cbc4843a22a53a8fea5f545a6dd630d264 +28809.31529940 <- expected amount RSjXG6NziGU5Qp25UTLgP6SsnTjrTfcqy5 +648e495d292e994d1ecc748af1c6405e7c7a5284d9b921c62da3b2e52142fc1f +6740.09632448 <- expected amount REq67wAMhhyUD6JRScLBpc2BD6farddg3e +f2cc6ee905fca8aad91e373df6f1fec47c49d451ba9017de04f119064936d44e +22492.75115633 <- expected amount RKCBKPrxDxTEtedqSqCm76obnGt8Enii6s +e25f692ffca4b53e2452afecdc0fe0435fd609ad708cb60f77cc9a8857d5c1ca +15493.04399000 <- expected amount RGWCMt87wKwK4MVaAUj9EAnpsniVyuTp6S +aeb5a2f1411fb6b29a54a0f48570e1a0eb6a61e47e82f5ee4e29a2eb97138e3b +1140.36550287 <- expected amount RFWgzBtdFELPNZiA47x1NGu7f1HPmRdf3m +d501fec2932177ae06fcf1f3c15168ca50ecf1102107034ec1d88c8d10316992 +1575.45572767 <- expected amount RDcrAkGEAnUCznAfbEbRqjdJAQEu362k58 +c599f1909f31c77a72586ef345ad59a0aa2d6db7cdf4f26ccf1944ad86ad31db +14524.72874062 <- expected amount RAoJYgpXxPm2s1hvDkiqXz85yNPCkhsTvU +9df47b44440e21cbf991351f28b9ad7c851e09bf90485e2b22b7c12e737613a9 +87148.37244375 <- expected amount RCevKsK6KqdDrCTvt6WnGeFpAF9zKzRUmu +77710eacb96e013294415b40a5c1899a1501cf2a56700190a9ea8bc779ef6573 +95237.89695894 <- expected amount R9Xi2PKLWLA5d2V13qhqoqt3vjxGWfKH2W +4d36d166d161174f096725951acdf2ff7263a14ee998ecc9dfffbbb72c199d8d +3.13113297 <- expected amount RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3 +650eec54b8a77318693f1bc30101f2c33ec763ae85ef9ed5b044167de76ca06c +1659.54315667 <- expected amount RSMhR3aV7yc7LaqBmtcLgZ2SxkHquvaUja +f757e2c700a284bde5d17a971e0b8cc7202f88ab2cc9a8fa1cfc791b029190b5 +8643.80014966 <- expected amount RUAvb7FFPvxjNTVhABeS2EbbdUi2LfGNMj +6ba72bac45bd935d79b4f33c42d319f15b0c4e72a650cff625563126d8faac87 +553085.02723026 <- expected amount RDDMHNTWge3CMGFyKXUueNjGbsWcXmL31D +290c608e966169e442a2c84fdb4d86e2bb85ed4e7c4a9a1370fd42d777369e63 +1946.54604690 <- expected amount RQ4kgWZng7P9ZU7wAjSf3BQxih6iTdKZtP +ec9a7c19dfb79fbd735bc8bd4a107bad5781e063717bce7d3c069b11772df3e1 +6165.95629088 <- expected amount REmYfd1MwrYzxW7swvXMMcuKb7u1LFeNHk +d86161a40821b03f118c92fbce0c0a152aa42fd5d59c1a21f2ad966c8fe41185 +11144.67547452 <- expected amount RRYeo7NkjrHqhWBpCtAPZUW6aCWZatD1qK +efd52feec4651ddd206c0bfd64a4bab6a3d935b70c0f819b50e005f8bcf125f4 +6944.64226884 <- expected amount RRTks3iwSe4oR3UDmRfGszcNcfAv6Rb5es +416bad294d078583e7fdb5add11f7c9973a0a16b963ac1050844703e16e070c1 +29049.45748125 <- expected amount RDE5pyXfNVdbyJpy3mxV3EfBLMG9PyVk5e +e1e7e0a58e522106fe4d0f88948dd5f76adfe8e3029b8da0914d9db7b5e162e7 +14070.80002269 <- expected amount RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct +6ca3813ebbff042d97357b6e52fda029aa2976afd837736a7c8710cc167c2ead +25865.73214606 <- expected amount RG5GXpHFBJYkH3WkyJZ6QCrT9Tr9LDvddd +8ea4abdb447455b4e116d9ebbfb4b850d9579058f2b6fe9cf8e4efb3a3532a83 +20625.11481168 <- expected amount RYCfN826eBPZ1hmkUdTjG2Bn6byASCN3EU +e5fd8f8ef3b0a235c4c70d4b8c04075ec86efbec24f66637a8b1dfcfa93df790 +306877.42641191 <- expected amount RHDe5bouzmteaF1ZnWgfNG2FbKrGHHmHQr +25eef7401f610c0ea22c5dd91a918f051c8eac744dcd5cffa2281299888b0460 +230865.18565552 <- expected amount RAfW9pukafJsa2CweFztAsFxaSW8HT7KfY +c428b116e25dd9ee1dfd56745bbf016a4b5d02a879834fd1fd5e087bd1f4158f +1548.52974680 <- expected amount RG9CAC4m1H9giJxcVW8s7zhFVmy3EAEFAt +a16520723826ae6aa4915eb4ec0e5ca050aa76ca0692a712101ea36efdb96a87 +2651.62370624 <- expected amount RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47 +399d596a0bfa0bb4e96439e7fcb431ef9a1f81ebc25cf14a80ce34b2894ea5a1 +13266.57413441 <- expected amount RKziMKBsSDGQT6zmwgyyXvTWbc7PPjiy4a +041d5206cb2f2cf1d9cc7af985c970393f24b4a3f3d19b20762c62962c441e48 +2182.61555865 <- expected amount RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz +43e0fb29858b1319f6118c3cb056016de52f46f090aa5d59e51c4357d1d45b04 +12541.20725926 <- expected amount RXoox1yRGdHhYa5scahD734qajAAQiNKDf +e7ca53552f94e48509aaa7fa724d38fec3c774a47ac86ebae849a2b70cffe65d +129183.61336863 <- expected amount RJfGGtCX44Q3eEkg8LL2tkGg2cS6WGZxDY +c003dd75a95918962cb1e5f3360e351c0527d561381ec5fb53391cc7385e1c99 +1985.04626121 <- expected amount RNyoYchuVZXH8vKE4uSRpJwKi87K6ChrWr +fcb63dd4ff36a485c4ca7e7d169b97e71b7c2fbcb3de83b7d27232f9fbe717a6 +15880.37008974 <- expected amount RU1ZM55ux8PTTFa1uF8GizmQEBWj58YdKu +6016abb3a53bf01865ab79572b78db6ed36e5af5968b0c25945652e7ded85249 +1578.13191862 <- expected amount RQ95BQJrkhsLySpGpr2PFLHmBZBmLtjsyo +1f71f4d543a4a8254523994fa521f8772f67d5c0dc57844a54274b9a21bf1329 +774.65219950 <- expected amount RXRgFV97Y6aPAQQm2RY5fed4AB9zTKRTad diff --git a/iguana/tests/KMD.bounty0 b/iguana/tests/KMD.bounty0 new file mode 100644 index 000000000..4ae393026 --- /dev/null +++ b/iguana/tests/KMD.bounty0 @@ -0,0 +1,115 @@ +sleep 99999 +./komodo-cli sendtoaddress RSYpupqZVwubaRADkasjHnWAQwHmZ91gwo 775 +./komodo-cli sendtoaddress RPVNUvVq4BgKrrB3E1uULja2hjPW6Hv6r9 1162 +./komodo-cli sendtoaddress RP8CkGhyfhdoVpGqGbVmEmRL7gGdqKBdkt 1162 +./komodo-cli sendtoaddress RXs3VbEem331Rxg1Jac3hqknTti4UUo5pz 775 +./komodo-cli sendtoaddress RE1wsrDNwW2NnNWM5eE162yp6haLtm5uh7 775 +./komodo-cli sendtoaddress R9jjHXGTWmT19dVuqyTXv9sETectd1PjsP 388 +./komodo-cli sendtoaddress RFU7peqch5dMXr2Hm7Quz1VeHirkxsomSC 1937 +./komodo-cli sendtoaddress RM6mJs8LG1des4HhXaj4DS5mnF3hgsE56g 2000 +./komodo-cli sendtoaddress RHKuiEoakr9yeWQT9UZzCrqPgR8MPBaGvD 1000 +./komodo-cli sendtoaddress RC8jWr1QQsRyo1pDkue8AxGs58Wyz4F3wZ 777 +./komodo-cli sendtoaddress RDzixD5TUH8MHPQQ4WeL3qjP6GqQvtzssH 100 +./komodo-cli sendtoaddress RLHADkss8t2xJWxoBqH1Vj8bqEhAt8YgK7 100 +./komodo-cli sendtoaddress RSsTgVnqh9qvcrKmZTg596VQ7moyNrh1WD 100 +./komodo-cli sendtoaddress RBEJuQMGaB1uSJuH4U1yCgbksZRaGyZaJE 100 +./komodo-cli sendtoaddress RKZNz4pVsguad4HM5H71YwRFjRNnWGvMTi 100 +./komodo-cli sendtoaddress RN1t6SGGsWGrgcfE8fJPJWwHmKH4zE93Vj 100 +./komodo-cli sendtoaddress RWZetGBkP4UiFQFht1Tem4pLAyvGjBGRY5 100 +./komodo-cli sendtoaddress RRCNocaPAB74cUzZDr8iepomNJiZGYiKno 100 +./komodo-cli sendtoaddress RLKpQZGWbkciVEmvtNVT93VLbm8kFE9BBB 100 +./komodo-cli sendtoaddress RJG3GAzYkX2BypfFXsZ6M8zozpX1ALSdpm 100 +./komodo-cli sendtoaddress RFTF6ya1XDqtFrAunPdJ3g4bUZrMCD8cEM 100 +./komodo-cli sendtoaddress RQJYttaCzFwb8iNNTJuyHjRt7hyjYZG4yX 100 +./komodo-cli sendtoaddress RNoaDacQgoYifqagidpsMqTQ74t5QxDWXd 100 +./komodo-cli sendtoaddress RMg5XaC6Lsj3YT2FtCtSDCAa5i715NYxrf 100 +./komodo-cli sendtoaddress RP8CkGhyfhdoVpGqGbVmEmRL7gGdqKBdkt 908 +./komodo-cli sendtoaddress RKcZmLNMsfdooKLzD6pRRDnbECBoygTQbz 1005 +./komodo-cli sendtoaddress RTHtdb735hqJi5DJjXNiP2LREkqUL5b8Sx 484 +./komodo-cli sendtoaddress RRergGKQPDcYHU8PxKhpx6kmR7mXdqp8Ce 1150 +./komodo-cli sendtoaddress RLxJJAZzFZUj9t23KbHARNywC7twcMHq3o 908 +./komodo-cli sendtoaddress RKMWyyocd1CSMRqByAfsn31QHoqZd9Bfk4 1126 +./komodo-cli sendtoaddress RG4jMz3SPqXQL8Eqj6q5CFLefB2PDw2qkx 605 +./komodo-cli sendtoaddress RFPKxBL8iLQGmkoUukXdFU7VkXyGJLSsGw 726 +./komodo-cli sendtoaddress RVryLHd1zcrC4J2q2fzSWdTTXuDWz43wKa 605 +./komodo-cli sendtoaddress RBzif61dTsAJsZQd3L4Q559nsuUNXp6N4R 545 +./komodo-cli sendtoaddress RHzPpnxWeyiydRdNoTYv3b2akDr9mPAf4Q 1210 +./komodo-cli sendtoaddress RLVqd66r5LXb4ZvYjzpVVoKEQboiMrZnYY 575 +./komodo-cli sendtoaddress RDjm2Xec5UTWiz3Yku8sUce8ZWxe8mTh72 1452 +./komodo-cli sendtoaddress RSJsEK1pstctVa5A5Tn57SqtRUfbAovRef 508 +./komodo-cli sendtoaddress RRaSQCAWk74r5cXzZV8JqqW9JFbhF2o2nH 1816 +./komodo-cli sendtoaddress RAFRxQLG1PYUTbo51BTK8XnU7txmZ6n4gS 520 +./komodo-cli sendtoaddress RKMWyyocd1CSMRqByAfsn31QHoqZd9Bfk4 545 +./komodo-cli sendtoaddress RG3BbpMegpZNqDetqw4fuUZFiSXurg3drG 908 +./komodo-cli sendtoaddress RCmLc2JBpPw9T9g1skg7J5Xr5kz1fyd7mx 1089 +./komodo-cli sendtoaddress R9ce1xHEaWnRRP5jrWozEfPf9ZJgX7jnxd 605 +./komodo-cli sendtoaddress RXuNeDyRd2EAKaYZryYrB4CcwtomRjuNeX 520 +./komodo-cli sendtoaddress RSTKuMryZW56yf3kdEXhMJG8Hy9TwvHwYs 908 +./komodo-cli sendtoaddress RVQ9CuyZzaScspJV5sGSiZ3TTkwbP3hzwq 726 +./komodo-cli sendtoaddress R9biWRWRVedJh8FKqWY8Y3FWnV6XupYWYH 1186 +./komodo-cli sendtoaddress RHoouCBBapEHE6uyX7CxHGFcRwUQFGMot5 756 +./komodo-cli sendtoaddress RWszpjqDXG6ifFzTJN2qaqSfZ4nJ8FX3Cp 908 +./komodo-cli sendtoaddress RXazQXNerkDmCdvPTmSU3VeLKBZ1CTtyAj 490 +./komodo-cli sendtoaddress RSeppnxMwvVDkiA5d3wDZjyeYwvcyn8dve 697 +./komodo-cli sendtoaddress RHbf3qwhmmUBw3WNR5NYoMx3YH13JjXWrv 363 +./komodo-cli sendtoaddress RFN4H8YYm71TjCVkHkoVFBFpg31i4ejbiu 310 +./komodo-cli sendtoaddress RBGX2Z43Fiey6tkgRCL9rzc3gNhdcvQyzf 436 +./komodo-cli sendtoaddress RNyoYchuVZXH8vKE4uSRpJwKi87K6ChrWr 871 + +ea1c78c745ce438e63162245391a81fe927bedfc271b1ec2dc5cba2e7404ceb8 +7abf28ba81489341f1ca84624ad7dd906c59a9aa918797ef5ac0ce1f6c65e755 +9a267a73e883828c418a4787402d95f0593bf0c7c94c320447d1f6a52bd2cd45 +9f3d10b949f59be536a5ae1407ec5dd3c116d5a2566cef6ef4220eb42adc1e93 +73d27618816805a9d8ced056ef1374d8705935320c92f6f7134e6c2b7e2233ac +f5002db57264351d06184285a72d588dc46d8923f52e7b79b8b24dde0ac52a60 +64418ecd76d064689aef22ccdf57e5375a8994219a80ffec605a6456c47cce02 +964ab4c6d0a755b6c694076fce6c32ea0f45864988f6fae198cd83dc885f203c +ebb5800be0ffe1817998d3addf301000c915c4591da3c6056bcc5cdf6f854a3a +33201a7465d55203c376c96921ed664dc2c40454c00de2442affca491b5982b8 +33248c0f33b0af88d7ea1e76dd9d9dcc5da262bce5550b6a50f6bc76aed9f0c8 +e313f326440b6873d76e0f6f886747dd9eef75d6247308b8c9c1d277cc7d0dae +0d5139cb9361e5c23e297dc9b9a6482cf515625011f2b96683559a50a07df0f9 +5ea2e77e4a3453321c0ab116afb16fbce872fda21e4f366a475362648a5a2541 +352c0563da158e5cab2e01040ceab5f680b9fad7487d0d72ca18b23117fcb0d0 +f2a46fc6f9bc318a75be0b4bc02192cd980492423b7ef972ae5ce71f012409f5 +76bb6dfd31e599fcb7f388691b19fb09cd18add9aa61c2f94b6e7b81d9e6e00a +ff40a66d7009d69d8927fafe89532b598179ecbac55973d7b72d0bd3c85689b8 +3013607e8fea9e226b12a9330a85d05f6110a92ff0a835afce485e902bfa56a0 +3af34176360af2fef394b8ffba51698af944ef3a44d44e92f54ddecf528d482e +a53590c831ef88164cb7d8fc2e5e8e4920fa1a506c7ce81b12af0372d3535146 +002478453347223e4b80dfde5b5b3e70adc559adb7d724479c6238566ba69664 +6d07ba1c2651a900a8b4f457ba9123ca2b5ea25b2c07b20ebc49325a159d92c4 +974c1c3bb967a7f9407eb15600a7db5bf81172152ca4ec23d04c52547f952f31 +b396c2eea6df1031f031dbcfbaf8b27cda00faecf247c7c9ba025fe1362b5b7f +b53cbb895bb097733102c1861a8777d79ca9239f88591734b22e46c8475ff442 +b35056858ef7d66e109ea532efd956ff0f93c8e9e5584426dcece4bd1464ac90 +834f0b3c04cf173173bfcd68f25dfea9bfe0e87cc7f96cbf75344740409d591d +57b8130aa9539a59473264f417ceea634866e3f91c4b1e2b67dff348745e104a +f8f1594f3c6867a20082a9fdbfa76cf40eb7a2e9e76b0e02c82551055a1b117e +44f59799bf745182eb8c0e524801412e1248f3709c474514a917a05c39374205 +ae5c06de2aee59b09812374313a280247972851876243ea43f39f58a82a7703a +ba22caff723dcd837bc1f6201dca2677ad4f77f213d272802ecf4bc569b0e2f1 +a259babba660e0f577f44d26a4ec966a11a62e61a7bd69d4c37e908abde10385 +85f25a41fdc14fff4a96828a5e823f9ac7328336fb680bec516e23297db22602 +bf6255452c4edd0afa2f5274733714c4cafee5f88f8e919b093d121a9ab3c920 +b4400c0dea93483e84f8d3157ca2a1b6fa7d21ff60176a7f102d427614861e9a +6ea70bc7abb5171fc2dac7a8f0a0b63a1ba10c801b9465c1de6143c4e4a83f7b +4edc0ce43b85695088a34a07a25685a3adc56faa515884d4650b97745286bd1b +737016875be9619de6cf6521bdce1d1a7e9bfca9829221b8adf3355f2206dcbc +40f6c466e0366c24985e6f449af4825e80179cc49ec7f77e234a36c0bf24e022 +29c897d952003d97880b0cf5d1dc27e4e336d1ea0c2b40ea881f4e340d72ed26 +9cd5650657491b955d66c3048850659be70844f87ccf248b1be30007d9603c87 +1b0820a5898fddfc8da255a9711c7f20ed8e840694043916b5fffbbc86a44d50 +bd0799a588cd6329e7e78d28c7cb827a6dcfefdc1dbd7f04abd2a6359d0367d5 +2be889e7b69765e13aecd529542a3816619b4579f320c5e3f00a5c406f73841b +5502aa0e5a162e5941db6653a298c96482d6295c715d095f46213c037322f75b +f81804c91fcd000a1138e328c252c4ff37bf02b5d97b4b93f23c4baf3a017b7e +6e52ca4b4385bb1b51fe3e28e66b2501bf1ac5ce4688b8a6977ee5bd5e35285d +f275612c3df8023287b06846824170d9a5bd85e149d6767b6d6fa3f6422491e6 +d8202d11390f89eca637059572b67933a6418802eb0c4e5b4ae77e36e309ab10 +79f005a323ac5d9173d535f62eb66c8439d92e85410d7ef700ebecaf094747fb +f9c59a9598fbfa9b43a4456f88ba8ae9791f082d420845b00e9dc28fc986bf78 +e16422d5ef3afa67ac5d125243dcd3e157253b8eef203e17b3da15ee670c0554 +6c7f82189df7906dc0a12a771d2cb7ab8f55b7419c263c424a430fe98ffb72b0 +460af1d4342f511d91d634ff4ba62dad705f39b6e89396d3e7e153b04fc669f1 + diff --git a/iguana/tests/REVS.batch5 b/iguana/tests/REVS.batch5 index 5efb86d82..ab67a7075 100755 --- a/iguana/tests/REVS.batch5 +++ b/iguana/tests/REVS.batch5 @@ -1,3 +1,4 @@ +sleep 99999 # RGahFz48G2H6mUJfGnrH6wvDXTJuTE6i6Y KMD 6045.00703151, REVS 119.90847305 sleep 1 fiat/revs sendtoaddress RGahFz48G2H6mUJfGnrH6wvDXTJuTE6i6Y 119.90847305 diff --git a/iguana/tests/REVS.batch5.txids b/iguana/tests/REVS.batch5.txids new file mode 100644 index 000000000..4c6611554 --- /dev/null +++ b/iguana/tests/REVS.batch5.txids @@ -0,0 +1,12 @@ +1f2ef4a160ef08a462fea5743a43471c51c485f013e30dd82a9be8b97743e674 +4df46669fea7697c04f58cf60a9290287f74ae026686a29b3f610bb397651134 +86aa2de8fe4f96374cb0d97631a4d95b076db775e11955cd72bcdb0166b86ff6 +6d45001119034eaa73ff607e3f779c07e3ea64fdafbb02c141e9b0bf04593191 +38e0ea46fc476f97238dae649213c764ee648a5dd661d58809fbda9dce82ff65 +14cbe2b75e6d1d0664a387dcec1099d81438f7b4a16e93e45b5f60fa11d2735c +0f1389abb35b7cfb0d607872078a3131bab4c21f38e7442e7b21196b790fbba0 +fe642dcc31305547eed48056aa714a8d09b2a0e1debecf58e18a47f2ada0a39a +ac2ef885f7b10ba44de3c7ea3e631faf8b575b2138805bf7c2456ba1b9d3f66d +3cac67df2e80b2f04cf6f28225be476cf0b8be2664b219f12a9196897db709c6 +2d03201c6a1eb0beb40e47fe5ffccdde8d6e8199c3230d5df43a772a24f9e1bd +5aa8e6fd3e05374094eb2ad922f6d5e7ac54ab6a3bde2488513d104085048554 diff --git a/iguana/tests/dexlistunspent b/iguana/tests/dexlistunspent index c038fe5fb..a651e5d4f 100755 --- a/iguana/tests/dexlistunspent +++ b/iguana/tests/dexlistunspent @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RW3gz9fEadohRLZerK9r8zXkugk5swWHrf\",\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RB1cuwtKBpwZPZnwyJeznaij53ovj8Dm8i\",\"symbol\":\"KMD\"}" From ce446adfb692cafca083e20d5dcb6062589613e5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Feb 2017 21:32:03 +0200 Subject: [PATCH 003/495] test --- iguana/dpow/dpow_network.c | 17 +++++++++-------- iguana/iguana_mofn.c | 7 +++++++ includes/iguana_funcs.h | 2 ++ 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 9a4efab38..4bae54ed2 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -100,7 +100,7 @@ void dex_init(struct supernet_info *myinfo) portable_mutex_init(&myinfo->dexmutex); } -int32_t signed_nn_send(void *ctx,bits256 privkey,int32_t sock,void *packet,int32_t size) +int32_t signed_nn_send(struct supernet_info *myinfo,void *ctx,bits256 privkey,int32_t sock,void *packet,int32_t size) { int32_t i,j,sentbytes,siglen = 0; uint8_t sig[65],pubkey33[33],signpubkey33[33]; struct signed_nnpacket *sigpacket; if ( (sigpacket= calloc(1,size + sizeof(*sigpacket))) != 0 ) @@ -138,6 +138,7 @@ int32_t signed_nn_send(void *ctx,bits256 privkey,int32_t sock,void *packet,int32 } } free(sigpacket); + iguana_fixsecp(myinfo); printf("error signing nnpacket\n"); } return(-1); @@ -1710,7 +1711,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo pfd.events = NN_POLLOUT; if ( nn_poll(&pfd,1,100) > 0 ) { - sentbytes = signed_nn_send(myinfo->ctx,myinfo->persistent_priv,myinfo->dpowsock,np,size); + sentbytes = signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->dpowsock,np,size); break; } usleep(1000); @@ -1844,7 +1845,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { //printf("FROM BUS.%08x -> pub\n",dexp->crc32); - signed_nn_send(myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); + signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); dex_packet(myinfo,dexp,size); } //printf("GOT DEX bus PACKET.%d\n",size); @@ -1860,13 +1861,13 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) //printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); if ( (retstr= dex_response(&broadcastflag,myinfo,dexp)) != 0 ) { - signed_nn_send(myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,retstr,(int32_t)strlen(retstr)+1); + signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,retstr,(int32_t)strlen(retstr)+1); //printf("send back[%ld]\n",strlen(retstr)+1); free(retstr); if ( broadcastflag != 0 ) { printf("BROADCAST dexp request.[%d]\n",size); - signed_nn_send(myinfo->ctx,myinfo->persistent_priv,myinfo->dexsock,dexp,size); + signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->dexsock,dexp,size); } } else @@ -1874,13 +1875,13 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( (m= myinfo->numdpowipbits) > 0 ) { r = myinfo->dpowipbits[rand() % m]; - signed_nn_send(myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,&r,sizeof(r)); + signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,&r,sizeof(r)); //printf("REP.%08x <- rand ip m.%d %x\n",dexp->crc32,m,r); } else printf("illegal state without dpowipbits?\n"); if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { - signed_nn_send(myinfo->ctx,myinfo->persistent_priv,myinfo->dexsock,dexp,size); - signed_nn_send(myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); + signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->dexsock,dexp,size); + signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); //printf("REP.%08x -> dexbus and pub, t.%d lag.%d\n",dexp->crc32,dexp->timestamp,(int32_t)(time(NULL)-dexp->timestamp)); dex_packet(myinfo,dexp,size); } else printf("failed dexpacketcheck\n"); diff --git a/iguana/iguana_mofn.c b/iguana/iguana_mofn.c index 4cca28947..c1866f01f 100755 --- a/iguana/iguana_mofn.c +++ b/iguana/iguana_mofn.c @@ -238,6 +238,13 @@ int32_t gfshare_test(struct supernet_info *myinfo,int32_t M,int32_t N,int32_t da return ok!=1; } +void iguana_fixsecp(struct supernet_info *myinfo) +{ + myinfo->ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); + secp256k1_pedersen_context_initialize(myinfo->ctx); + secp256k1_rangeproof_context_initialize(myinfo->ctx); +} + void libgfshare_init(struct supernet_info *myinfo,uint8_t _logs[256],uint8_t _exps[510]) { uint32_t i,x = 1; diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index e3094974e..4a00dfe4a 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -637,6 +637,8 @@ void gfshare_ctx_decextract(uint8_t *logs,uint8_t *exps,gfshare_ctx * /* ctx */, void libgfshare_init(struct supernet_info *myinfo,uint8_t _logs[256],uint8_t _exps[510]); int32_t init_sharenrs(uint8_t sharenrs[255],uint8_t *orig,int32_t m,int32_t n); void iguana_schnorr(struct supernet_info *myinfo); +void iguana_fixsecp(struct supernet_info *myinfo); + #include "../includes/iguana_api.h" From 4c66a97db00cedabff91cc49499e1d0a67f1391a Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 6 Feb 2017 19:52:04 +0200 Subject: [PATCH 004/495] batch6 --- iguana/main.c | 8 +- iguana/tests/KMD.batch6 | 302 +++++++++++++++++++++++++ iguana/tests/KMD.batch6.importaddress | 299 ++++++++++++++++++++++++ iguana/tests/KMD.batch6.listunspent | 240 ++++++++++++++++++++ iguana/tests/REVS.batch6 | 17 ++ iguana/tests/REVS.batch6.importaddress | 15 ++ iguana/tests/dexgetT | 2 +- iguana/tests/dexlistunspent | 2 +- iguana/tests/sign | 2 +- includes/iguana_defines.h | 2 +- 10 files changed, 881 insertions(+), 8 deletions(-) create mode 100755 iguana/tests/KMD.batch6 create mode 100755 iguana/tests/KMD.batch6.importaddress create mode 100755 iguana/tests/KMD.batch6.listunspent create mode 100755 iguana/tests/REVS.batch6 create mode 100755 iguana/tests/REVS.batch6.importaddress diff --git a/iguana/main.c b/iguana/main.c index 6de01dea2..0e479eb49 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1611,9 +1611,9 @@ void komodo_ICO_batch(cJSON *array,int32_t batchid) printf("# %s KMD %.8f\n",coinaddr,dstr(kmdamount)); if ( (iter & 1) == 0 ) { - //printf("curl --url \"http://127.0.0.1:7778\" --data \"{\\\"agent\\\":\\\"dex\\\",\\\"method\\\":\\\"importaddress\\\",\\\"address\\\":\\\"%s\\\",\\\"symbol\\\":\\\"KMD\\\"}\" # %.8f\n",coinaddr,dstr(kmdamount)); - //printf("sleep 3\n"); - printf("curl --url \"http://127.0.0.1:7778\" --data \"{\\\"agent\\\":\\\"dex\\\",\\\"method\\\":\\\"listunspent\\\",\\\"address\\\":\\\"%s\\\",\\\"symbol\\\":\\\"KMD\\\"}\"\n",coinaddr); + printf("curl --url \"http://127.0.0.1:7778\" --data \"{\\\"agent\\\":\\\"dex\\\",\\\"method\\\":\\\"importaddress\\\",\\\"address\\\":\\\"%s\\\",\\\"symbol\\\":\\\"KMD\\\"}\" # %.8f\n",coinaddr,dstr(kmdamount)); + printf("sleep 3\n"); + //printf("curl --url \"http://127.0.0.1:7778\" --data \"{\\\"agent\\\":\\\"dex\\\",\\\"method\\\":\\\"listunspent\\\",\\\"address\\\":\\\"%s\\\",\\\"symbol\\\":\\\"KMD\\\"}\"\n",coinaddr); } else { @@ -1673,7 +1673,7 @@ void iguana_main(void *arg) else printf("ENDIAN ERROR\n"); mycalloc(0,0,0); #ifdef __APPLE__ - char *batchstr,*batchstr2; cJSON *batchjson; long batchsize; char fname[512],fname2[512]; int32_t batchid = 6; + char *batchstr,*batchstr2; cJSON *batchjson; long batchsize; char fname[512],fname2[512]; int32_t batchid = 7; sprintf(fname,"REVS.raw"), sprintf(fname2,"REVS.rawtxids"); if ( 0 && (batchstr= OS_filestr(&batchsize,fname)) != 0 && (batchstr2= OS_filestr(&batchsize,fname2)) != 0 ) { diff --git a/iguana/tests/KMD.batch6 b/iguana/tests/KMD.batch6 new file mode 100755 index 000000000..d57c4e8da --- /dev/null +++ b/iguana/tests/KMD.batch6 @@ -0,0 +1,302 @@ +# RAHPGb1w6XyVYD7WbiWBzr5yxEDdtP7zWk KMD 8908.50029425 +./komodo-cli sendtoaddress RAHPGb1w6XyVYD7WbiWBzr5yxEDdtP7zWk 8908.50029425 +sleep 3 +echo "8908.50029425 <- expected amount RAHPGb1w6XyVYD7WbiWBzr5yxEDdtP7zWk" + +# RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf KMD 2306.15801572 +./komodo-cli sendtoaddress RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf 2306.15801572 +sleep 3 +echo "2306.15801572 <- expected amount RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf" + +# RHq8NpfqMJZdchhDWsXayXEM5VEimBKgSv KMD 1368.88526791 +./komodo-cli sendtoaddress RHq8NpfqMJZdchhDWsXayXEM5VEimBKgSv 1368.88526791 +sleep 3 +echo "1368.88526791 <- expected amount RHq8NpfqMJZdchhDWsXayXEM5VEimBKgSv" + +# RU8ZZ29f8U1LNHriwu6Tj3q6y2in9Q6LtZ KMD 106.39636971 +./komodo-cli sendtoaddress RU8ZZ29f8U1LNHriwu6Tj3q6y2in9Q6LtZ 106.39636971 +sleep 3 +echo "106.39636971 <- expected amount RU8ZZ29f8U1LNHriwu6Tj3q6y2in9Q6LtZ" + +# RQNX8jpgQYR3WBitCrjGQ6nGt1HnX5Qcie KMD 32892.15837201 +./komodo-cli sendtoaddress RQNX8jpgQYR3WBitCrjGQ6nGt1HnX5Qcie 32892.15837201 +sleep 3 +echo "32892.15837201 <- expected amount RQNX8jpgQYR3WBitCrjGQ6nGt1HnX5Qcie" + +# RCzsyBmQBtVWCZURt56K6XprynMNwXUr3V KMD 153.99848359 +./komodo-cli sendtoaddress RCzsyBmQBtVWCZURt56K6XprynMNwXUr3V 153.99848359 +sleep 3 +echo "153.99848359 <- expected amount RCzsyBmQBtVWCZURt56K6XprynMNwXUr3V" + +# RXhGJR2d175Tau3qDViZcPQwxZmzqgoW56 KMD 250.09618515 +./komodo-cli sendtoaddress RXhGJR2d175Tau3qDViZcPQwxZmzqgoW56 250.09618515 +sleep 3 +echo "250.09618515 <- expected amount RXhGJR2d175Tau3qDViZcPQwxZmzqgoW56" + +# RRoZ5xorGhikkB2qEoVfmuiyMMm3Thq3ei KMD 2285.12762738 +./komodo-cli sendtoaddress RRoZ5xorGhikkB2qEoVfmuiyMMm3Thq3ei 2285.12762738 +sleep 3 +echo "2285.12762738 <- expected amount RRoZ5xorGhikkB2qEoVfmuiyMMm3Thq3ei" + +# RXsqMJSo3B9npdT9M57SYnRUkez1rVmQYC KMD 1660.51377862 +./komodo-cli sendtoaddress RXsqMJSo3B9npdT9M57SYnRUkez1rVmQYC 1660.51377862 +sleep 3 +echo "1660.51377862 <- expected amount RXsqMJSo3B9npdT9M57SYnRUkez1rVmQYC" + +# RDDMHNTWge3CMGFyKXUueNjGbsWcXmL31D KMD 15065.53304887 +./komodo-cli sendtoaddress RDDMHNTWge3CMGFyKXUueNjGbsWcXmL31D 15065.53304887 +sleep 3 +echo "15065.53304887 <- expected amount RDDMHNTWge3CMGFyKXUueNjGbsWcXmL31D" + +# RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut KMD 2667.18064500 +./komodo-cli sendtoaddress RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut 2667.18064500 +sleep 3 +echo "2667.18064500 <- expected amount RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut" + +# RRu4rm9zCpK41rSMn4NPtgrmcmHXBStQda KMD 24981.55183756 +./komodo-cli sendtoaddress RRu4rm9zCpK41rSMn4NPtgrmcmHXBStQda 24981.55183756 +sleep 3 +echo "24981.55183756 <- expected amount RRu4rm9zCpK41rSMn4NPtgrmcmHXBStQda" + +# REvMg538sSpHUdRyCV1jJDjT63XePKLwkh KMD 1334.49334406 +./komodo-cli sendtoaddress REvMg538sSpHUdRyCV1jJDjT63XePKLwkh 1334.49334406 +sleep 3 +echo "1334.49334406 <- expected amount REvMg538sSpHUdRyCV1jJDjT63XePKLwkh" + +# RPD8PawM6UFBsSrYujjGa9Smfc3hT48tUF KMD 10773.51776054 +./komodo-cli sendtoaddress RPD8PawM6UFBsSrYujjGa9Smfc3hT48tUF 10773.51776054 +sleep 3 +echo "10773.51776054 <- expected amount RPD8PawM6UFBsSrYujjGa9Smfc3hT48tUF" + +# RDAtSjPgVNwUvV3cNy1DohVKumdXK5zXRs KMD 607.46792378 +./komodo-cli sendtoaddress RDAtSjPgVNwUvV3cNy1DohVKumdXK5zXRs 607.46792378 +sleep 3 +echo "607.46792378 <- expected amount RDAtSjPgVNwUvV3cNy1DohVKumdXK5zXRs" + +# RPAmDGUEooCPRRxDpG3KrJ3uEK7kpo1taS KMD 2028.62052490 +./komodo-cli sendtoaddress RPAmDGUEooCPRRxDpG3KrJ3uEK7kpo1taS 2028.62052490 +sleep 3 +echo "2028.62052490 <- expected amount RPAmDGUEooCPRRxDpG3KrJ3uEK7kpo1taS" + +# RAJ2UXw4RskMXFJfNbmZUhZ8PjDJ4uwz2W KMD 40431.89788465 +./komodo-cli sendtoaddress RAJ2UXw4RskMXFJfNbmZUhZ8PjDJ4uwz2W 40431.89788465 +sleep 3 +echo "40431.89788465 <- expected amount RAJ2UXw4RskMXFJfNbmZUhZ8PjDJ4uwz2W" + +# RNrhJLYeG7yMYhTrpkFmP7g4SoEEGZLTg9 KMD 24325.33313227 +./komodo-cli sendtoaddress RNrhJLYeG7yMYhTrpkFmP7g4SoEEGZLTg9 24325.33313227 +sleep 3 +echo "24325.33313227 <- expected amount RNrhJLYeG7yMYhTrpkFmP7g4SoEEGZLTg9" + +# RPVfyZ5ikstBeXXZsemgWfbB85Em7BdhnA KMD 26784.99417167 +./komodo-cli sendtoaddress RPVfyZ5ikstBeXXZsemgWfbB85Em7BdhnA 26784.99417167 +sleep 3 +echo "26784.99417167 <- expected amount RPVfyZ5ikstBeXXZsemgWfbB85Em7BdhnA" + +# RWAjXKk7zwHj8jy8SeuS4R45EA9S572dUc KMD 200.88047000 +./komodo-cli sendtoaddress RWAjXKk7zwHj8jy8SeuS4R45EA9S572dUc 200.88047000 +sleep 3 +echo "200.88047000 <- expected amount RWAjXKk7zwHj8jy8SeuS4R45EA9S572dUc" + +# RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw KMD 942.22930620 +./komodo-cli sendtoaddress RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw 942.22930620 +sleep 3 +echo "942.22930620 <- expected amount RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw" + +# RUcnbCSHhpHMhQbKNk5VMgmi2vn7hGGyNQ KMD 9295.82639400 +./komodo-cli sendtoaddress RUcnbCSHhpHMhQbKNk5VMgmi2vn7hGGyNQ 9295.82639400 +sleep 3 +echo "9295.82639400 <- expected amount RUcnbCSHhpHMhQbKNk5VMgmi2vn7hGGyNQ" + +# RBP3Yq3aAkuw9HfixLWygqcSmhTWJRNvey KMD 1859.16527880 +./komodo-cli sendtoaddress RBP3Yq3aAkuw9HfixLWygqcSmhTWJRNvey 1859.16527880 +sleep 3 +echo "1859.16527880 <- expected amount RBP3Yq3aAkuw9HfixLWygqcSmhTWJRNvey" + +# RFqApCmTfnC5G4xjKojfS9HMeLGEyAEDKR KMD 726.21002139 +./komodo-cli sendtoaddress RFqApCmTfnC5G4xjKojfS9HMeLGEyAEDKR 726.21002139 +sleep 3 +echo "726.21002139 <- expected amount RFqApCmTfnC5G4xjKojfS9HMeLGEyAEDKR" + +# RFnW3BXvF5U67dxB1BnuWEGaQjjBosqCwz KMD 121577.72836165 +./komodo-cli sendtoaddress RFnW3BXvF5U67dxB1BnuWEGaQjjBosqCwz 121577.72836165 +sleep 3 +echo "121577.72836165 <- expected amount RFnW3BXvF5U67dxB1BnuWEGaQjjBosqCwz" + +# RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1 KMD 2511.34619763 +./komodo-cli sendtoaddress RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1 2511.34619763 +sleep 3 +echo "2511.34619763 <- expected amount RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1" + +# RVbdZ1ki4piJF9NNBVbgc49r7KccxJL6oc KMD 23246.75713145, REVS 66.39295712 +# RVbdZ1ki4piJF9NNBVbgc49r7KccxJL6oc KMD 23246.75713145 +./komodo-cli sendtoaddress RVbdZ1ki4piJF9NNBVbgc49r7KccxJL6oc 23246.75713145 +sleep 3 +echo "23246.75713145 <- expected amount RVbdZ1ki4piJF9NNBVbgc49r7KccxJL6oc" + +# REDocWFMCjY9JDTf7WYQwyPesHZd7RUT9L KMD 83333.21036121 +./komodo-cli sendtoaddress REDocWFMCjY9JDTf7WYQwyPesHZd7RUT9L 83333.21036121 +sleep 3 +echo "83333.21036121 <- expected amount REDocWFMCjY9JDTf7WYQwyPesHZd7RUT9L" + +# RMq7CwKZHNycYivj2wFfvoJp8XWJAVeDf4 KMD 5325.73387156 +./komodo-cli sendtoaddress RMq7CwKZHNycYivj2wFfvoJp8XWJAVeDf4 5325.73387156 +sleep 3 +echo "5325.73387156 <- expected amount RMq7CwKZHNycYivj2wFfvoJp8XWJAVeDf4" + +# RJNoJwWP9xpyNMPUi7iPrLNWCxTAKZxGD8 KMD 938.92347308 +./komodo-cli sendtoaddress RJNoJwWP9xpyNMPUi7iPrLNWCxTAKZxGD8 938.92347308 +sleep 3 +echo "938.92347308 <- expected amount RJNoJwWP9xpyNMPUi7iPrLNWCxTAKZxGD8" + +# RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW KMD 484157.62468750 +./komodo-cli sendtoaddress RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW 484157.62468750 +sleep 3 +echo "484157.62468750 <- expected amount RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW" + +# RHkK2ZCbWK35bDZkojVBCXTezoS9hqZDJ2 KMD 9683.15249375 +./komodo-cli sendtoaddress RHkK2ZCbWK35bDZkojVBCXTezoS9hqZDJ2 9683.15249375 +sleep 3 +echo "9683.15249375 <- expected amount RHkK2ZCbWK35bDZkojVBCXTezoS9hqZDJ2" + +# RLcnhkZr56a9z7oLLrj9ZSoKicpnxPZVVH KMD 8908.50029425 +./komodo-cli sendtoaddress RLcnhkZr56a9z7oLLrj9ZSoKicpnxPZVVH 8908.50029425 +sleep 3 +echo "8908.50029425 <- expected amount RLcnhkZr56a9z7oLLrj9ZSoKicpnxPZVVH" + +# RJMikLhPMUv8t3Z8xycZpzdKPwv76yKbdA KMD 502.18197380 +./komodo-cli sendtoaddress RJMikLhPMUv8t3Z8xycZpzdKPwv76yKbdA 502.18197380 +sleep 3 +echo "502.18197380 <- expected amount RJMikLhPMUv8t3Z8xycZpzdKPwv76yKbdA" + +# RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW KMD 17002.74354061, REVS 278.99000000 +# RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW KMD 17002.74354061 +./komodo-cli sendtoaddress RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW 17002.74354061 +sleep 3 +echo "17002.74354061 <- expected amount RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW" + +# RP6WfJVmgrtRT9DBywBtq48HBzBpspTU4J KMD 149751.00241450 +./komodo-cli sendtoaddress RP6WfJVmgrtRT9DBywBtq48HBzBpspTU4J 149751.00241450 +sleep 3 +echo "149751.00241450 <- expected amount RP6WfJVmgrtRT9DBywBtq48HBzBpspTU4J" + +# RF6xs65r4k2okG9uvTx3D9Zz5yXhvjPvFe KMD 96831.52493750 +./komodo-cli sendtoaddress RF6xs65r4k2okG9uvTx3D9Zz5yXhvjPvFe 96831.52493750 +sleep 3 +echo "96831.52493750 <- expected amount RF6xs65r4k2okG9uvTx3D9Zz5yXhvjPvFe" + +# RQS6HyxAdNjeAob3cee7TVXN3ptZowRBUh KMD 18021.41836725 +./komodo-cli sendtoaddress RQS6HyxAdNjeAob3cee7TVXN3ptZowRBUh 18021.41836725 +sleep 3 +echo "18021.41836725 <- expected amount RQS6HyxAdNjeAob3cee7TVXN3ptZowRBUh" + +# RCAP5E6YMeqbBZmbXmTq7cvhruyysyhuWk KMD 41017.83396352 +./komodo-cli sendtoaddress RCAP5E6YMeqbBZmbXmTq7cvhruyysyhuWk 41017.83396352 +sleep 3 +echo "41017.83396352 <- expected amount RCAP5E6YMeqbBZmbXmTq7cvhruyysyhuWk" + +# R9Zv5ZZprWtw427XmGfNLTsH3Goe49Ghic KMD 13263.41995905 +./komodo-cli sendtoaddress R9Zv5ZZprWtw427XmGfNLTsH3Goe49Ghic 13263.41995905 +sleep 3 +echo "13263.41995905 <- expected amount R9Zv5ZZprWtw427XmGfNLTsH3Goe49Ghic" + +# RUipJV9DPtvCYA81w3EwkCr5DNQ99289zN KMD 8982.68540439 +./komodo-cli sendtoaddress RUipJV9DPtvCYA81w3EwkCr5DNQ99289zN 8982.68540439 +sleep 3 +echo "8982.68540439 <- expected amount RUipJV9DPtvCYA81w3EwkCr5DNQ99289zN" + +# RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL KMD 12356.73789711, REVS 112.00000000 +# RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL KMD 12356.73789711 +./komodo-cli sendtoaddress RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL 12356.73789711 +sleep 3 +echo "12356.73789711 <- expected amount RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL" + +# RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct KMD 12561.43380413 +./komodo-cli sendtoaddress RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct 12561.43380413 +sleep 3 +echo "12561.43380413 <- expected amount RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct" + +# RKyuFwhojJgYNUQjuHWEcDUouiPHCpbRS6 KMD 4453.35929709 +./komodo-cli sendtoaddress RKyuFwhojJgYNUQjuHWEcDUouiPHCpbRS6 4453.35929709 +sleep 3 +echo "4453.35929709 <- expected amount RKyuFwhojJgYNUQjuHWEcDUouiPHCpbRS6" + +# RA9G36WwA9K95bn8Cbycq5ZnoxhSzzhhBw KMD 4521.29210647 +./komodo-cli sendtoaddress RA9G36WwA9K95bn8Cbycq5ZnoxhSzzhhBw 4521.29210647 +sleep 3 +echo "4521.29210647 <- expected amount RA9G36WwA9K95bn8Cbycq5ZnoxhSzzhhBw" + +# RHbf3qwhmmUBw3WNR5NYoMx3YH13JjXWrv KMD 11653.72856174 +./komodo-cli sendtoaddress RHbf3qwhmmUBw3WNR5NYoMx3YH13JjXWrv 11653.72856174 +sleep 3 +echo "11653.72856174 <- expected amount RHbf3qwhmmUBw3WNR5NYoMx3YH13JjXWrv" + +# RL2LycM1d3STMFXMN7ipcNfNejhieFeQDR KMD 1561.74292091 +./komodo-cli sendtoaddress RL2LycM1d3STMFXMN7ipcNfNejhieFeQDR 1561.74292091 +sleep 3 +echo "1561.74292091 <- expected amount RL2LycM1d3STMFXMN7ipcNfNejhieFeQDR" + +# RDEKuSHP6Ues1gi4ex2vt9rpBEeKAqPWfv KMD 25107.55827068 +./komodo-cli sendtoaddress RDEKuSHP6Ues1gi4ex2vt9rpBEeKAqPWfv 25107.55827068 +sleep 3 +echo "25107.55827068 <- expected amount RDEKuSHP6Ues1gi4ex2vt9rpBEeKAqPWfv" + +# RQ1JfavGVxps1wXnhCfwnAbNoXn7ei1zMt KMD 391.52338368, REVS 7.76943254 +# RQ1JfavGVxps1wXnhCfwnAbNoXn7ei1zMt KMD 391.52338368 +./komodo-cli sendtoaddress RQ1JfavGVxps1wXnhCfwnAbNoXn7ei1zMt 391.52338368 +sleep 3 +echo "391.52338368 <- expected amount RQ1JfavGVxps1wXnhCfwnAbNoXn7ei1zMt" + +# RAsxHJd4zrSxvhQedDeTRaANwv6eG9CYjx KMD 2212.41539458 +./komodo-cli sendtoaddress RAsxHJd4zrSxvhQedDeTRaANwv6eG9CYjx 2212.41539458 +sleep 3 +echo "2212.41539458 <- expected amount RAsxHJd4zrSxvhQedDeTRaANwv6eG9CYjx" + +# RLADbn4XTgAbsCcENNhUPX2Kb5KcX7hfs5 KMD 12079.07428158 +./komodo-cli sendtoaddress RLADbn4XTgAbsCcENNhUPX2Kb5KcX7hfs5 12079.07428158 +sleep 3 +echo "12079.07428158 <- expected amount RLADbn4XTgAbsCcENNhUPX2Kb5KcX7hfs5" + +# RELNTFjyhMRntuSbrvJSnG9LSt8ycmD5eh KMD 2323.95659850 +./komodo-cli sendtoaddress RELNTFjyhMRntuSbrvJSnG9LSt8ycmD5eh 2323.95659850 +sleep 3 +echo "2323.95659850 <- expected amount RELNTFjyhMRntuSbrvJSnG9LSt8ycmD5eh" + +# RFoHKWbcKrktCAdYJVGhrJ4g8dXQ1Cvy5r KMD 682.83148523, REVS 13.54307355 +# RFoHKWbcKrktCAdYJVGhrJ4g8dXQ1Cvy5r KMD 682.83148523 +./komodo-cli sendtoaddress RFoHKWbcKrktCAdYJVGhrJ4g8dXQ1Cvy5r 682.83148523 +sleep 3 +echo "682.83148523 <- expected amount RFoHKWbcKrktCAdYJVGhrJ4g8dXQ1Cvy5r" + +# RVTjyRex85TVcNwy5vW7JrmtfEt9y45Sx3 KMD 48415.76246875 +./komodo-cli sendtoaddress RVTjyRex85TVcNwy5vW7JrmtfEt9y45Sx3 48415.76246875 +sleep 3 +echo "48415.76246875 <- expected amount RVTjyRex85TVcNwy5vW7JrmtfEt9y45Sx3" + +# RM9QCciRjSeoctNUzwfVh2gY6H8Qfc2anD KMD 8133.84809475 +./komodo-cli sendtoaddress RM9QCciRjSeoctNUzwfVh2gY6H8Qfc2anD 8133.84809475 +sleep 3 +echo "8133.84809475 <- expected amount RM9QCciRjSeoctNUzwfVh2gY6H8Qfc2anD" + +# RAaszCNodXXu9rJL6qqVMZDykXncDecTMS KMD 693.08132289 +./komodo-cli sendtoaddress RAaszCNodXXu9rJL6qqVMZDykXncDecTMS 693.08132289 +sleep 3 +echo "693.08132289 <- expected amount RAaszCNodXXu9rJL6qqVMZDykXncDecTMS" + +# RUxvWRVR7xEqTbxF43nE1roPXfppbsDL57 KMD 1773.66877470 +./komodo-cli sendtoaddress RUxvWRVR7xEqTbxF43nE1roPXfppbsDL57 1773.66877470 +sleep 3 +echo "1773.66877470 <- expected amount RUxvWRVR7xEqTbxF43nE1roPXfppbsDL57" + +# RASmNV8wHNdhU78WnoFwu9aLpM4zS4EFNa KMD 2971.54458972 +./komodo-cli sendtoaddress RASmNV8wHNdhU78WnoFwu9aLpM4zS4EFNa 2971.54458972 +sleep 3 +echo "2971.54458972 <- expected amount RASmNV8wHNdhU78WnoFwu9aLpM4zS4EFNa" + +# RGfFiiX5euPb4GCpB76VfVdrFJhPWoJZQR KMD 3351.00027124 +./komodo-cli sendtoaddress RGfFiiX5euPb4GCpB76VfVdrFJhPWoJZQR 3351.00027124 +sleep 3 +echo "3351.00027124 <- expected amount RGfFiiX5euPb4GCpB76VfVdrFJhPWoJZQR" + + +# total KMD 1452257.08309448 REVS 0.00000000 diff --git a/iguana/tests/KMD.batch6.importaddress b/iguana/tests/KMD.batch6.importaddress new file mode 100755 index 000000000..a485650fc --- /dev/null +++ b/iguana/tests/KMD.batch6.importaddress @@ -0,0 +1,299 @@ +# RAHPGb1w6XyVYD7WbiWBzr5yxEDdtP7zWk KMD 8908.50029425 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RAHPGb1w6XyVYD7WbiWBzr5yxEDdtP7zWk\",\"symbol\":\"KMD\"}" # 8908.50029425 +sleep 3 +echo "8908.50029425 <- expected amount RAHPGb1w6XyVYD7WbiWBzr5yxEDdtP7zWk" + +# RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf KMD 2306.15801572 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf\",\"symbol\":\"KMD\"}" # 2306.15801572 +sleep 3 +echo "2306.15801572 <- expected amount RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf" + +# RHq8NpfqMJZdchhDWsXayXEM5VEimBKgSv KMD 1368.88526791 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RHq8NpfqMJZdchhDWsXayXEM5VEimBKgSv\",\"symbol\":\"KMD\"}" # 1368.88526791 +sleep 3 +echo "1368.88526791 <- expected amount RHq8NpfqMJZdchhDWsXayXEM5VEimBKgSv" + +# RU8ZZ29f8U1LNHriwu6Tj3q6y2in9Q6LtZ KMD 106.39636971 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RU8ZZ29f8U1LNHriwu6Tj3q6y2in9Q6LtZ\",\"symbol\":\"KMD\"}" # 106.39636971 +sleep 3 +echo "106.39636971 <- expected amount RU8ZZ29f8U1LNHriwu6Tj3q6y2in9Q6LtZ" + +# RQNX8jpgQYR3WBitCrjGQ6nGt1HnX5Qcie KMD 32892.15837201 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RQNX8jpgQYR3WBitCrjGQ6nGt1HnX5Qcie\",\"symbol\":\"KMD\"}" # 32892.15837201 +sleep 3 +echo "32892.15837201 <- expected amount RQNX8jpgQYR3WBitCrjGQ6nGt1HnX5Qcie" + +# RCzsyBmQBtVWCZURt56K6XprynMNwXUr3V KMD 153.99848359 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RCzsyBmQBtVWCZURt56K6XprynMNwXUr3V\",\"symbol\":\"KMD\"}" # 153.99848359 +sleep 3 +echo "153.99848359 <- expected amount RCzsyBmQBtVWCZURt56K6XprynMNwXUr3V" + +# RXhGJR2d175Tau3qDViZcPQwxZmzqgoW56 KMD 250.09618515 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RXhGJR2d175Tau3qDViZcPQwxZmzqgoW56\",\"symbol\":\"KMD\"}" # 250.09618515 +sleep 3 +echo "250.09618515 <- expected amount RXhGJR2d175Tau3qDViZcPQwxZmzqgoW56" + +# RRoZ5xorGhikkB2qEoVfmuiyMMm3Thq3ei KMD 2285.12762738 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RRoZ5xorGhikkB2qEoVfmuiyMMm3Thq3ei\",\"symbol\":\"KMD\"}" # 2285.12762738 +sleep 3 +echo "2285.12762738 <- expected amount RRoZ5xorGhikkB2qEoVfmuiyMMm3Thq3ei" + +# RXsqMJSo3B9npdT9M57SYnRUkez1rVmQYC KMD 1660.51377862 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RXsqMJSo3B9npdT9M57SYnRUkez1rVmQYC\",\"symbol\":\"KMD\"}" # 1660.51377862 +sleep 3 +echo "1660.51377862 <- expected amount RXsqMJSo3B9npdT9M57SYnRUkez1rVmQYC" + +# RDDMHNTWge3CMGFyKXUueNjGbsWcXmL31D KMD 15065.53304887 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RDDMHNTWge3CMGFyKXUueNjGbsWcXmL31D\",\"symbol\":\"KMD\"}" # 15065.53304887 +sleep 3 +echo "15065.53304887 <- expected amount RDDMHNTWge3CMGFyKXUueNjGbsWcXmL31D" + +# RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut KMD 2667.18064500 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut\",\"symbol\":\"KMD\"}" # 2667.18064500 +sleep 3 +echo "2667.18064500 <- expected amount RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut" + +# RRu4rm9zCpK41rSMn4NPtgrmcmHXBStQda KMD 24981.55183756 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RRu4rm9zCpK41rSMn4NPtgrmcmHXBStQda\",\"symbol\":\"KMD\"}" # 24981.55183756 +sleep 3 +echo "24981.55183756 <- expected amount RRu4rm9zCpK41rSMn4NPtgrmcmHXBStQda" + +# REvMg538sSpHUdRyCV1jJDjT63XePKLwkh KMD 1334.49334406 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"REvMg538sSpHUdRyCV1jJDjT63XePKLwkh\",\"symbol\":\"KMD\"}" # 1334.49334406 +sleep 3 +echo "1334.49334406 <- expected amount REvMg538sSpHUdRyCV1jJDjT63XePKLwkh" + +# RPD8PawM6UFBsSrYujjGa9Smfc3hT48tUF KMD 10773.51776054 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RPD8PawM6UFBsSrYujjGa9Smfc3hT48tUF\",\"symbol\":\"KMD\"}" # 10773.51776054 +sleep 3 +echo "10773.51776054 <- expected amount RPD8PawM6UFBsSrYujjGa9Smfc3hT48tUF" + +# RDAtSjPgVNwUvV3cNy1DohVKumdXK5zXRs KMD 607.46792378 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RDAtSjPgVNwUvV3cNy1DohVKumdXK5zXRs\",\"symbol\":\"KMD\"}" # 607.46792378 +sleep 3 +echo "607.46792378 <- expected amount RDAtSjPgVNwUvV3cNy1DohVKumdXK5zXRs" + +# RPAmDGUEooCPRRxDpG3KrJ3uEK7kpo1taS KMD 2028.62052490 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RPAmDGUEooCPRRxDpG3KrJ3uEK7kpo1taS\",\"symbol\":\"KMD\"}" # 2028.62052490 +sleep 3 +echo "2028.62052490 <- expected amount RPAmDGUEooCPRRxDpG3KrJ3uEK7kpo1taS" + +# RAJ2UXw4RskMXFJfNbmZUhZ8PjDJ4uwz2W KMD 40431.89788465 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RAJ2UXw4RskMXFJfNbmZUhZ8PjDJ4uwz2W\",\"symbol\":\"KMD\"}" # 40431.89788465 +sleep 3 +echo "40431.89788465 <- expected amount RAJ2UXw4RskMXFJfNbmZUhZ8PjDJ4uwz2W" + +# RNrhJLYeG7yMYhTrpkFmP7g4SoEEGZLTg9 KMD 24325.33313227 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RNrhJLYeG7yMYhTrpkFmP7g4SoEEGZLTg9\",\"symbol\":\"KMD\"}" # 24325.33313227 +sleep 3 +echo "24325.33313227 <- expected amount RNrhJLYeG7yMYhTrpkFmP7g4SoEEGZLTg9" + +# RPVfyZ5ikstBeXXZsemgWfbB85Em7BdhnA KMD 26784.99417167 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RPVfyZ5ikstBeXXZsemgWfbB85Em7BdhnA\",\"symbol\":\"KMD\"}" # 26784.99417167 +sleep 3 +echo "26784.99417167 <- expected amount RPVfyZ5ikstBeXXZsemgWfbB85Em7BdhnA" + +# RWAjXKk7zwHj8jy8SeuS4R45EA9S572dUc KMD 200.88047000 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RWAjXKk7zwHj8jy8SeuS4R45EA9S572dUc\",\"symbol\":\"KMD\"}" # 200.88047000 +sleep 3 +echo "200.88047000 <- expected amount RWAjXKk7zwHj8jy8SeuS4R45EA9S572dUc" + +# RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw KMD 942.22930620 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw\",\"symbol\":\"KMD\"}" # 942.22930620 +sleep 3 +echo "942.22930620 <- expected amount RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw" + +# RUcnbCSHhpHMhQbKNk5VMgmi2vn7hGGyNQ KMD 9295.82639400 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RUcnbCSHhpHMhQbKNk5VMgmi2vn7hGGyNQ\",\"symbol\":\"KMD\"}" # 9295.82639400 +sleep 3 +echo "9295.82639400 <- expected amount RUcnbCSHhpHMhQbKNk5VMgmi2vn7hGGyNQ" + +# RBP3Yq3aAkuw9HfixLWygqcSmhTWJRNvey KMD 1859.16527880 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RBP3Yq3aAkuw9HfixLWygqcSmhTWJRNvey\",\"symbol\":\"KMD\"}" # 1859.16527880 +sleep 3 +echo "1859.16527880 <- expected amount RBP3Yq3aAkuw9HfixLWygqcSmhTWJRNvey" + +# RFqApCmTfnC5G4xjKojfS9HMeLGEyAEDKR KMD 726.21002139 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RFqApCmTfnC5G4xjKojfS9HMeLGEyAEDKR\",\"symbol\":\"KMD\"}" # 726.21002139 +sleep 3 +echo "726.21002139 <- expected amount RFqApCmTfnC5G4xjKojfS9HMeLGEyAEDKR" + +# RFnW3BXvF5U67dxB1BnuWEGaQjjBosqCwz KMD 121577.72836165 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RFnW3BXvF5U67dxB1BnuWEGaQjjBosqCwz\",\"symbol\":\"KMD\"}" # 121577.72836165 +sleep 3 +echo "121577.72836165 <- expected amount RFnW3BXvF5U67dxB1BnuWEGaQjjBosqCwz" + +# RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1 KMD 2511.34619763 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1\",\"symbol\":\"KMD\"}" # 2511.34619763 +sleep 3 +echo "2511.34619763 <- expected amount RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1" + +# RVbdZ1ki4piJF9NNBVbgc49r7KccxJL6oc KMD 23246.75713145, REVS 66.39295712 +# RVbdZ1ki4piJF9NNBVbgc49r7KccxJL6oc KMD 23246.75713145 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RVbdZ1ki4piJF9NNBVbgc49r7KccxJL6oc\",\"symbol\":\"KMD\"}" # 23246.75713145 +sleep 3 +echo "23246.75713145 <- expected amount RVbdZ1ki4piJF9NNBVbgc49r7KccxJL6oc" + +# REDocWFMCjY9JDTf7WYQwyPesHZd7RUT9L KMD 83333.21036121 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"REDocWFMCjY9JDTf7WYQwyPesHZd7RUT9L\",\"symbol\":\"KMD\"}" # 83333.21036121 +sleep 3 +echo "83333.21036121 <- expected amount REDocWFMCjY9JDTf7WYQwyPesHZd7RUT9L" + +# RMq7CwKZHNycYivj2wFfvoJp8XWJAVeDf4 KMD 5325.73387156 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RMq7CwKZHNycYivj2wFfvoJp8XWJAVeDf4\",\"symbol\":\"KMD\"}" # 5325.73387156 +sleep 3 +echo "5325.73387156 <- expected amount RMq7CwKZHNycYivj2wFfvoJp8XWJAVeDf4" + +# RJNoJwWP9xpyNMPUi7iPrLNWCxTAKZxGD8 KMD 938.92347308 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RJNoJwWP9xpyNMPUi7iPrLNWCxTAKZxGD8\",\"symbol\":\"KMD\"}" # 938.92347308 +sleep 3 +echo "938.92347308 <- expected amount RJNoJwWP9xpyNMPUi7iPrLNWCxTAKZxGD8" + +# RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW KMD 484157.62468750 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW\",\"symbol\":\"KMD\"}" # 484157.62468750 +sleep 3 +echo "484157.62468750 <- expected amount RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW" + +# RHkK2ZCbWK35bDZkojVBCXTezoS9hqZDJ2 KMD 9683.15249375 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RHkK2ZCbWK35bDZkojVBCXTezoS9hqZDJ2\",\"symbol\":\"KMD\"}" # 9683.15249375 +sleep 3 +echo "9683.15249375 <- expected amount RHkK2ZCbWK35bDZkojVBCXTezoS9hqZDJ2" + +# RLcnhkZr56a9z7oLLrj9ZSoKicpnxPZVVH KMD 8908.50029425 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RLcnhkZr56a9z7oLLrj9ZSoKicpnxPZVVH\",\"symbol\":\"KMD\"}" # 8908.50029425 +sleep 3 +echo "8908.50029425 <- expected amount RLcnhkZr56a9z7oLLrj9ZSoKicpnxPZVVH" + +# RJMikLhPMUv8t3Z8xycZpzdKPwv76yKbdA KMD 502.18197380 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RJMikLhPMUv8t3Z8xycZpzdKPwv76yKbdA\",\"symbol\":\"KMD\"}" # 502.18197380 +sleep 3 +echo "502.18197380 <- expected amount RJMikLhPMUv8t3Z8xycZpzdKPwv76yKbdA" + +# RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW KMD 17002.74354061, REVS 278.99000000 +# RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW KMD 17002.74354061 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW\",\"symbol\":\"KMD\"}" # 17002.74354061 +sleep 3 +echo "17002.74354061 <- expected amount RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW" + +# RP6WfJVmgrtRT9DBywBtq48HBzBpspTU4J KMD 149751.00241450 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RP6WfJVmgrtRT9DBywBtq48HBzBpspTU4J\",\"symbol\":\"KMD\"}" # 149751.00241450 +sleep 3 +echo "149751.00241450 <- expected amount RP6WfJVmgrtRT9DBywBtq48HBzBpspTU4J" + +# RF6xs65r4k2okG9uvTx3D9Zz5yXhvjPvFe KMD 96831.52493750 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RF6xs65r4k2okG9uvTx3D9Zz5yXhvjPvFe\",\"symbol\":\"KMD\"}" # 96831.52493750 +sleep 3 +echo "96831.52493750 <- expected amount RF6xs65r4k2okG9uvTx3D9Zz5yXhvjPvFe" + +# RQS6HyxAdNjeAob3cee7TVXN3ptZowRBUh KMD 18021.41836725 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RQS6HyxAdNjeAob3cee7TVXN3ptZowRBUh\",\"symbol\":\"KMD\"}" # 18021.41836725 +sleep 3 +echo "18021.41836725 <- expected amount RQS6HyxAdNjeAob3cee7TVXN3ptZowRBUh" + +# RCAP5E6YMeqbBZmbXmTq7cvhruyysyhuWk KMD 41017.83396352 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RCAP5E6YMeqbBZmbXmTq7cvhruyysyhuWk\",\"symbol\":\"KMD\"}" # 41017.83396352 +sleep 3 +echo "41017.83396352 <- expected amount RCAP5E6YMeqbBZmbXmTq7cvhruyysyhuWk" + +# R9Zv5ZZprWtw427XmGfNLTsH3Goe49Ghic KMD 13263.41995905 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"R9Zv5ZZprWtw427XmGfNLTsH3Goe49Ghic\",\"symbol\":\"KMD\"}" # 13263.41995905 +sleep 3 +echo "13263.41995905 <- expected amount R9Zv5ZZprWtw427XmGfNLTsH3Goe49Ghic" + +# RUipJV9DPtvCYA81w3EwkCr5DNQ99289zN KMD 8982.68540439 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RUipJV9DPtvCYA81w3EwkCr5DNQ99289zN\",\"symbol\":\"KMD\"}" # 8982.68540439 +sleep 3 +echo "8982.68540439 <- expected amount RUipJV9DPtvCYA81w3EwkCr5DNQ99289zN" + +# RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL KMD 12356.73789711, REVS 112.00000000 +# RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL KMD 12356.73789711 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL\",\"symbol\":\"KMD\"}" # 12356.73789711 +sleep 3 +echo "12356.73789711 <- expected amount RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL" + +# RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct KMD 12561.43380413 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct\",\"symbol\":\"KMD\"}" # 12561.43380413 +sleep 3 +echo "12561.43380413 <- expected amount RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct" + +# RKyuFwhojJgYNUQjuHWEcDUouiPHCpbRS6 KMD 4453.35929709 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RKyuFwhojJgYNUQjuHWEcDUouiPHCpbRS6\",\"symbol\":\"KMD\"}" # 4453.35929709 +sleep 3 +echo "4453.35929709 <- expected amount RKyuFwhojJgYNUQjuHWEcDUouiPHCpbRS6" + +# RA9G36WwA9K95bn8Cbycq5ZnoxhSzzhhBw KMD 4521.29210647 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RA9G36WwA9K95bn8Cbycq5ZnoxhSzzhhBw\",\"symbol\":\"KMD\"}" # 4521.29210647 +sleep 3 +echo "4521.29210647 <- expected amount RA9G36WwA9K95bn8Cbycq5ZnoxhSzzhhBw" + +# RHbf3qwhmmUBw3WNR5NYoMx3YH13JjXWrv KMD 11653.72856174 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RHbf3qwhmmUBw3WNR5NYoMx3YH13JjXWrv\",\"symbol\":\"KMD\"}" # 11653.72856174 +sleep 3 +echo "11653.72856174 <- expected amount RHbf3qwhmmUBw3WNR5NYoMx3YH13JjXWrv" + +# RL2LycM1d3STMFXMN7ipcNfNejhieFeQDR KMD 1561.74292091 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RL2LycM1d3STMFXMN7ipcNfNejhieFeQDR\",\"symbol\":\"KMD\"}" # 1561.74292091 +sleep 3 +echo "1561.74292091 <- expected amount RL2LycM1d3STMFXMN7ipcNfNejhieFeQDR" + +# RDEKuSHP6Ues1gi4ex2vt9rpBEeKAqPWfv KMD 25107.55827068 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RDEKuSHP6Ues1gi4ex2vt9rpBEeKAqPWfv\",\"symbol\":\"KMD\"}" # 25107.55827068 +sleep 3 +echo "25107.55827068 <- expected amount RDEKuSHP6Ues1gi4ex2vt9rpBEeKAqPWfv" + +# RQ1JfavGVxps1wXnhCfwnAbNoXn7ei1zMt KMD 391.52338368, REVS 7.76943254 +# RQ1JfavGVxps1wXnhCfwnAbNoXn7ei1zMt KMD 391.52338368 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RQ1JfavGVxps1wXnhCfwnAbNoXn7ei1zMt\",\"symbol\":\"KMD\"}" # 391.52338368 +sleep 3 +echo "391.52338368 <- expected amount RQ1JfavGVxps1wXnhCfwnAbNoXn7ei1zMt" + +# RAsxHJd4zrSxvhQedDeTRaANwv6eG9CYjx KMD 2212.41539458 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RAsxHJd4zrSxvhQedDeTRaANwv6eG9CYjx\",\"symbol\":\"KMD\"}" # 2212.41539458 +sleep 3 +echo "2212.41539458 <- expected amount RAsxHJd4zrSxvhQedDeTRaANwv6eG9CYjx" + +# RLADbn4XTgAbsCcENNhUPX2Kb5KcX7hfs5 KMD 12079.07428158 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RLADbn4XTgAbsCcENNhUPX2Kb5KcX7hfs5\",\"symbol\":\"KMD\"}" # 12079.07428158 +sleep 3 +echo "12079.07428158 <- expected amount RLADbn4XTgAbsCcENNhUPX2Kb5KcX7hfs5" + +# RELNTFjyhMRntuSbrvJSnG9LSt8ycmD5eh KMD 2323.95659850 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RELNTFjyhMRntuSbrvJSnG9LSt8ycmD5eh\",\"symbol\":\"KMD\"}" # 2323.95659850 +sleep 3 +echo "2323.95659850 <- expected amount RELNTFjyhMRntuSbrvJSnG9LSt8ycmD5eh" + +# RFoHKWbcKrktCAdYJVGhrJ4g8dXQ1Cvy5r KMD 682.83148523, REVS 13.54307355 +# RFoHKWbcKrktCAdYJVGhrJ4g8dXQ1Cvy5r KMD 682.83148523 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RFoHKWbcKrktCAdYJVGhrJ4g8dXQ1Cvy5r\",\"symbol\":\"KMD\"}" # 682.83148523 +sleep 3 +echo "682.83148523 <- expected amount RFoHKWbcKrktCAdYJVGhrJ4g8dXQ1Cvy5r" + +# RVTjyRex85TVcNwy5vW7JrmtfEt9y45Sx3 KMD 48415.76246875 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RVTjyRex85TVcNwy5vW7JrmtfEt9y45Sx3\",\"symbol\":\"KMD\"}" # 48415.76246875 +sleep 3 +echo "48415.76246875 <- expected amount RVTjyRex85TVcNwy5vW7JrmtfEt9y45Sx3" + +# RM9QCciRjSeoctNUzwfVh2gY6H8Qfc2anD KMD 8133.84809475 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RM9QCciRjSeoctNUzwfVh2gY6H8Qfc2anD\",\"symbol\":\"KMD\"}" # 8133.84809475 +sleep 3 +echo "8133.84809475 <- expected amount RM9QCciRjSeoctNUzwfVh2gY6H8Qfc2anD" + +# RAaszCNodXXu9rJL6qqVMZDykXncDecTMS KMD 693.08132289 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RAaszCNodXXu9rJL6qqVMZDykXncDecTMS\",\"symbol\":\"KMD\"}" # 693.08132289 +sleep 3 +echo "693.08132289 <- expected amount RAaszCNodXXu9rJL6qqVMZDykXncDecTMS" + +# RUxvWRVR7xEqTbxF43nE1roPXfppbsDL57 KMD 1773.66877470 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RUxvWRVR7xEqTbxF43nE1roPXfppbsDL57\",\"symbol\":\"KMD\"}" # 1773.66877470 +sleep 3 +echo "1773.66877470 <- expected amount RUxvWRVR7xEqTbxF43nE1roPXfppbsDL57" + +# RASmNV8wHNdhU78WnoFwu9aLpM4zS4EFNa KMD 2971.54458972 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RASmNV8wHNdhU78WnoFwu9aLpM4zS4EFNa\",\"symbol\":\"KMD\"}" # 2971.54458972 +sleep 3 +echo "2971.54458972 <- expected amount RASmNV8wHNdhU78WnoFwu9aLpM4zS4EFNa" + +# RGfFiiX5euPb4GCpB76VfVdrFJhPWoJZQR KMD 3351.00027124 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RGfFiiX5euPb4GCpB76VfVdrFJhPWoJZQR\",\"symbol\":\"KMD\"}" # 3351.00027124 +sleep 3 +echo "3351.00027124 <- expected amount RGfFiiX5euPb4GCpB76VfVdrFJhPWoJZQR" diff --git a/iguana/tests/KMD.batch6.listunspent b/iguana/tests/KMD.batch6.listunspent new file mode 100755 index 000000000..dba872f05 --- /dev/null +++ b/iguana/tests/KMD.batch6.listunspent @@ -0,0 +1,240 @@ +# RAHPGb1w6XyVYD7WbiWBzr5yxEDdtP7zWk KMD 8908.50029425 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RAHPGb1w6XyVYD7WbiWBzr5yxEDdtP7zWk\",\"symbol\":\"KMD\"}" +echo "8908.50029425 <- expected amount RAHPGb1w6XyVYD7WbiWBzr5yxEDdtP7zWk" + +# RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf KMD 2306.15801572 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf\",\"symbol\":\"KMD\"}" +echo "2306.15801572 <- expected amount RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf" + +# RHq8NpfqMJZdchhDWsXayXEM5VEimBKgSv KMD 1368.88526791 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RHq8NpfqMJZdchhDWsXayXEM5VEimBKgSv\",\"symbol\":\"KMD\"}" +echo "1368.88526791 <- expected amount RHq8NpfqMJZdchhDWsXayXEM5VEimBKgSv" + +# RU8ZZ29f8U1LNHriwu6Tj3q6y2in9Q6LtZ KMD 106.39636971 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RU8ZZ29f8U1LNHriwu6Tj3q6y2in9Q6LtZ\",\"symbol\":\"KMD\"}" +echo "106.39636971 <- expected amount RU8ZZ29f8U1LNHriwu6Tj3q6y2in9Q6LtZ" + +# RQNX8jpgQYR3WBitCrjGQ6nGt1HnX5Qcie KMD 32892.15837201 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RQNX8jpgQYR3WBitCrjGQ6nGt1HnX5Qcie\",\"symbol\":\"KMD\"}" +echo "32892.15837201 <- expected amount RQNX8jpgQYR3WBitCrjGQ6nGt1HnX5Qcie" + +# RCzsyBmQBtVWCZURt56K6XprynMNwXUr3V KMD 153.99848359 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RCzsyBmQBtVWCZURt56K6XprynMNwXUr3V\",\"symbol\":\"KMD\"}" +echo "153.99848359 <- expected amount RCzsyBmQBtVWCZURt56K6XprynMNwXUr3V" + +# RXhGJR2d175Tau3qDViZcPQwxZmzqgoW56 KMD 250.09618515 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RXhGJR2d175Tau3qDViZcPQwxZmzqgoW56\",\"symbol\":\"KMD\"}" +echo "250.09618515 <- expected amount RXhGJR2d175Tau3qDViZcPQwxZmzqgoW56" + +# RRoZ5xorGhikkB2qEoVfmuiyMMm3Thq3ei KMD 2285.12762738 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RRoZ5xorGhikkB2qEoVfmuiyMMm3Thq3ei\",\"symbol\":\"KMD\"}" +echo "2285.12762738 <- expected amount RRoZ5xorGhikkB2qEoVfmuiyMMm3Thq3ei" + +# RXsqMJSo3B9npdT9M57SYnRUkez1rVmQYC KMD 1660.51377862 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RXsqMJSo3B9npdT9M57SYnRUkez1rVmQYC\",\"symbol\":\"KMD\"}" +echo "1660.51377862 <- expected amount RXsqMJSo3B9npdT9M57SYnRUkez1rVmQYC" + +# RDDMHNTWge3CMGFyKXUueNjGbsWcXmL31D KMD 15065.53304887 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RDDMHNTWge3CMGFyKXUueNjGbsWcXmL31D\",\"symbol\":\"KMD\"}" +echo "15065.53304887 <- expected amount RDDMHNTWge3CMGFyKXUueNjGbsWcXmL31D" + +# RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut KMD 2667.18064500 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut\",\"symbol\":\"KMD\"}" +echo "2667.18064500 <- expected amount RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut" + +# RRu4rm9zCpK41rSMn4NPtgrmcmHXBStQda KMD 24981.55183756 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RRu4rm9zCpK41rSMn4NPtgrmcmHXBStQda\",\"symbol\":\"KMD\"}" +echo "24981.55183756 <- expected amount RRu4rm9zCpK41rSMn4NPtgrmcmHXBStQda" + +# REvMg538sSpHUdRyCV1jJDjT63XePKLwkh KMD 1334.49334406 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"REvMg538sSpHUdRyCV1jJDjT63XePKLwkh\",\"symbol\":\"KMD\"}" +echo "1334.49334406 <- expected amount REvMg538sSpHUdRyCV1jJDjT63XePKLwkh" + +# RPD8PawM6UFBsSrYujjGa9Smfc3hT48tUF KMD 10773.51776054 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RPD8PawM6UFBsSrYujjGa9Smfc3hT48tUF\",\"symbol\":\"KMD\"}" +echo "10773.51776054 <- expected amount RPD8PawM6UFBsSrYujjGa9Smfc3hT48tUF" + +# RDAtSjPgVNwUvV3cNy1DohVKumdXK5zXRs KMD 607.46792378 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RDAtSjPgVNwUvV3cNy1DohVKumdXK5zXRs\",\"symbol\":\"KMD\"}" +echo "607.46792378 <- expected amount RDAtSjPgVNwUvV3cNy1DohVKumdXK5zXRs" + +# RPAmDGUEooCPRRxDpG3KrJ3uEK7kpo1taS KMD 2028.62052490 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RPAmDGUEooCPRRxDpG3KrJ3uEK7kpo1taS\",\"symbol\":\"KMD\"}" +echo "2028.62052490 <- expected amount RPAmDGUEooCPRRxDpG3KrJ3uEK7kpo1taS" + +# RAJ2UXw4RskMXFJfNbmZUhZ8PjDJ4uwz2W KMD 40431.89788465 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RAJ2UXw4RskMXFJfNbmZUhZ8PjDJ4uwz2W\",\"symbol\":\"KMD\"}" +echo "40431.89788465 <- expected amount RAJ2UXw4RskMXFJfNbmZUhZ8PjDJ4uwz2W" + +# RNrhJLYeG7yMYhTrpkFmP7g4SoEEGZLTg9 KMD 24325.33313227 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RNrhJLYeG7yMYhTrpkFmP7g4SoEEGZLTg9\",\"symbol\":\"KMD\"}" +echo "24325.33313227 <- expected amount RNrhJLYeG7yMYhTrpkFmP7g4SoEEGZLTg9" + +# RPVfyZ5ikstBeXXZsemgWfbB85Em7BdhnA KMD 26784.99417167 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RPVfyZ5ikstBeXXZsemgWfbB85Em7BdhnA\",\"symbol\":\"KMD\"}" +echo "26784.99417167 <- expected amount RPVfyZ5ikstBeXXZsemgWfbB85Em7BdhnA" + +# RWAjXKk7zwHj8jy8SeuS4R45EA9S572dUc KMD 200.88047000 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RWAjXKk7zwHj8jy8SeuS4R45EA9S572dUc\",\"symbol\":\"KMD\"}" +echo "200.88047000 <- expected amount RWAjXKk7zwHj8jy8SeuS4R45EA9S572dUc" + +# RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw KMD 942.22930620 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw\",\"symbol\":\"KMD\"}" +echo "942.22930620 <- expected amount RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw" + +# RUcnbCSHhpHMhQbKNk5VMgmi2vn7hGGyNQ KMD 9295.82639400 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RUcnbCSHhpHMhQbKNk5VMgmi2vn7hGGyNQ\",\"symbol\":\"KMD\"}" +echo "9295.82639400 <- expected amount RUcnbCSHhpHMhQbKNk5VMgmi2vn7hGGyNQ" + +# RBP3Yq3aAkuw9HfixLWygqcSmhTWJRNvey KMD 1859.16527880 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RBP3Yq3aAkuw9HfixLWygqcSmhTWJRNvey\",\"symbol\":\"KMD\"}" +echo "1859.16527880 <- expected amount RBP3Yq3aAkuw9HfixLWygqcSmhTWJRNvey" + +# RFqApCmTfnC5G4xjKojfS9HMeLGEyAEDKR KMD 726.21002139 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RFqApCmTfnC5G4xjKojfS9HMeLGEyAEDKR\",\"symbol\":\"KMD\"}" +echo "726.21002139 <- expected amount RFqApCmTfnC5G4xjKojfS9HMeLGEyAEDKR" + +# RFnW3BXvF5U67dxB1BnuWEGaQjjBosqCwz KMD 121577.72836165 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RFnW3BXvF5U67dxB1BnuWEGaQjjBosqCwz\",\"symbol\":\"KMD\"}" +echo "121577.72836165 <- expected amount RFnW3BXvF5U67dxB1BnuWEGaQjjBosqCwz" + +# RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1 KMD 2511.34619763 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1\",\"symbol\":\"KMD\"}" +echo "2511.34619763 <- expected amount RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1" + +# RVbdZ1ki4piJF9NNBVbgc49r7KccxJL6oc KMD 23246.75713145, REVS 66.39295712 +# RVbdZ1ki4piJF9NNBVbgc49r7KccxJL6oc KMD 23246.75713145 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RVbdZ1ki4piJF9NNBVbgc49r7KccxJL6oc\",\"symbol\":\"KMD\"}" +echo "23246.75713145 <- expected amount RVbdZ1ki4piJF9NNBVbgc49r7KccxJL6oc" + +# REDocWFMCjY9JDTf7WYQwyPesHZd7RUT9L KMD 83333.21036121 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"REDocWFMCjY9JDTf7WYQwyPesHZd7RUT9L\",\"symbol\":\"KMD\"}" +echo "83333.21036121 <- expected amount REDocWFMCjY9JDTf7WYQwyPesHZd7RUT9L" + +# RMq7CwKZHNycYivj2wFfvoJp8XWJAVeDf4 KMD 5325.73387156 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RMq7CwKZHNycYivj2wFfvoJp8XWJAVeDf4\",\"symbol\":\"KMD\"}" +echo "5325.73387156 <- expected amount RMq7CwKZHNycYivj2wFfvoJp8XWJAVeDf4" + +# RJNoJwWP9xpyNMPUi7iPrLNWCxTAKZxGD8 KMD 938.92347308 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RJNoJwWP9xpyNMPUi7iPrLNWCxTAKZxGD8\",\"symbol\":\"KMD\"}" +echo "938.92347308 <- expected amount RJNoJwWP9xpyNMPUi7iPrLNWCxTAKZxGD8" + +# RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW KMD 484157.62468750 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW\",\"symbol\":\"KMD\"}" +echo "484157.62468750 <- expected amount RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW" + +# RHkK2ZCbWK35bDZkojVBCXTezoS9hqZDJ2 KMD 9683.15249375 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RHkK2ZCbWK35bDZkojVBCXTezoS9hqZDJ2\",\"symbol\":\"KMD\"}" +echo "9683.15249375 <- expected amount RHkK2ZCbWK35bDZkojVBCXTezoS9hqZDJ2" + +# RLcnhkZr56a9z7oLLrj9ZSoKicpnxPZVVH KMD 8908.50029425 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RLcnhkZr56a9z7oLLrj9ZSoKicpnxPZVVH\",\"symbol\":\"KMD\"}" +echo "8908.50029425 <- expected amount RLcnhkZr56a9z7oLLrj9ZSoKicpnxPZVVH" + +# RJMikLhPMUv8t3Z8xycZpzdKPwv76yKbdA KMD 502.18197380 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RJMikLhPMUv8t3Z8xycZpzdKPwv76yKbdA\",\"symbol\":\"KMD\"}" +echo "502.18197380 <- expected amount RJMikLhPMUv8t3Z8xycZpzdKPwv76yKbdA" + +# RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW KMD 17002.74354061, REVS 278.99000000 +# RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW KMD 17002.74354061 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW\",\"symbol\":\"KMD\"}" +echo "17002.74354061 <- expected amount RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW" + +# RP6WfJVmgrtRT9DBywBtq48HBzBpspTU4J KMD 149751.00241450 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RP6WfJVmgrtRT9DBywBtq48HBzBpspTU4J\",\"symbol\":\"KMD\"}" +echo "149751.00241450 <- expected amount RP6WfJVmgrtRT9DBywBtq48HBzBpspTU4J" + +# RF6xs65r4k2okG9uvTx3D9Zz5yXhvjPvFe KMD 96831.52493750 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RF6xs65r4k2okG9uvTx3D9Zz5yXhvjPvFe\",\"symbol\":\"KMD\"}" +echo "96831.52493750 <- expected amount RF6xs65r4k2okG9uvTx3D9Zz5yXhvjPvFe" + +# RQS6HyxAdNjeAob3cee7TVXN3ptZowRBUh KMD 18021.41836725 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RQS6HyxAdNjeAob3cee7TVXN3ptZowRBUh\",\"symbol\":\"KMD\"}" +echo "18021.41836725 <- expected amount RQS6HyxAdNjeAob3cee7TVXN3ptZowRBUh" + +# RCAP5E6YMeqbBZmbXmTq7cvhruyysyhuWk KMD 41017.83396352 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RCAP5E6YMeqbBZmbXmTq7cvhruyysyhuWk\",\"symbol\":\"KMD\"}" +echo "41017.83396352 <- expected amount RCAP5E6YMeqbBZmbXmTq7cvhruyysyhuWk" + +# R9Zv5ZZprWtw427XmGfNLTsH3Goe49Ghic KMD 13263.41995905 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"R9Zv5ZZprWtw427XmGfNLTsH3Goe49Ghic\",\"symbol\":\"KMD\"}" +echo "13263.41995905 <- expected amount R9Zv5ZZprWtw427XmGfNLTsH3Goe49Ghic" + +# RUipJV9DPtvCYA81w3EwkCr5DNQ99289zN KMD 8982.68540439 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RUipJV9DPtvCYA81w3EwkCr5DNQ99289zN\",\"symbol\":\"KMD\"}" +echo "8982.68540439 <- expected amount RUipJV9DPtvCYA81w3EwkCr5DNQ99289zN" + +# RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL KMD 12356.73789711, REVS 112.00000000 +# RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL KMD 12356.73789711 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL\",\"symbol\":\"KMD\"}" +echo "12356.73789711 <- expected amount RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL" + +# RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct KMD 12561.43380413 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct\",\"symbol\":\"KMD\"}" +echo "12561.43380413 <- expected amount RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct" + +# RKyuFwhojJgYNUQjuHWEcDUouiPHCpbRS6 KMD 4453.35929709 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RKyuFwhojJgYNUQjuHWEcDUouiPHCpbRS6\",\"symbol\":\"KMD\"}" +echo "4453.35929709 <- expected amount RKyuFwhojJgYNUQjuHWEcDUouiPHCpbRS6" + +# RA9G36WwA9K95bn8Cbycq5ZnoxhSzzhhBw KMD 4521.29210647 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RA9G36WwA9K95bn8Cbycq5ZnoxhSzzhhBw\",\"symbol\":\"KMD\"}" +echo "4521.29210647 <- expected amount RA9G36WwA9K95bn8Cbycq5ZnoxhSzzhhBw" + +# RHbf3qwhmmUBw3WNR5NYoMx3YH13JjXWrv KMD 11653.72856174 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RHbf3qwhmmUBw3WNR5NYoMx3YH13JjXWrv\",\"symbol\":\"KMD\"}" +echo "11653.72856174 <- expected amount RHbf3qwhmmUBw3WNR5NYoMx3YH13JjXWrv" + +# RL2LycM1d3STMFXMN7ipcNfNejhieFeQDR KMD 1561.74292091 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RL2LycM1d3STMFXMN7ipcNfNejhieFeQDR\",\"symbol\":\"KMD\"}" +echo "1561.74292091 <- expected amount RL2LycM1d3STMFXMN7ipcNfNejhieFeQDR" + +# RDEKuSHP6Ues1gi4ex2vt9rpBEeKAqPWfv KMD 25107.55827068 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RDEKuSHP6Ues1gi4ex2vt9rpBEeKAqPWfv\",\"symbol\":\"KMD\"}" +echo "25107.55827068 <- expected amount RDEKuSHP6Ues1gi4ex2vt9rpBEeKAqPWfv" + +# RQ1JfavGVxps1wXnhCfwnAbNoXn7ei1zMt KMD 391.52338368, REVS 7.76943254 +# RQ1JfavGVxps1wXnhCfwnAbNoXn7ei1zMt KMD 391.52338368 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RQ1JfavGVxps1wXnhCfwnAbNoXn7ei1zMt\",\"symbol\":\"KMD\"}" +echo "391.52338368 <- expected amount RQ1JfavGVxps1wXnhCfwnAbNoXn7ei1zMt" + +# RAsxHJd4zrSxvhQedDeTRaANwv6eG9CYjx KMD 2212.41539458 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RAsxHJd4zrSxvhQedDeTRaANwv6eG9CYjx\",\"symbol\":\"KMD\"}" +echo "2212.41539458 <- expected amount RAsxHJd4zrSxvhQedDeTRaANwv6eG9CYjx" + +# RLADbn4XTgAbsCcENNhUPX2Kb5KcX7hfs5 KMD 12079.07428158 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RLADbn4XTgAbsCcENNhUPX2Kb5KcX7hfs5\",\"symbol\":\"KMD\"}" +echo "12079.07428158 <- expected amount RLADbn4XTgAbsCcENNhUPX2Kb5KcX7hfs5" + +# RELNTFjyhMRntuSbrvJSnG9LSt8ycmD5eh KMD 2323.95659850 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RELNTFjyhMRntuSbrvJSnG9LSt8ycmD5eh\",\"symbol\":\"KMD\"}" +echo "2323.95659850 <- expected amount RELNTFjyhMRntuSbrvJSnG9LSt8ycmD5eh" + +# RFoHKWbcKrktCAdYJVGhrJ4g8dXQ1Cvy5r KMD 682.83148523, REVS 13.54307355 +# RFoHKWbcKrktCAdYJVGhrJ4g8dXQ1Cvy5r KMD 682.83148523 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RFoHKWbcKrktCAdYJVGhrJ4g8dXQ1Cvy5r\",\"symbol\":\"KMD\"}" +echo "682.83148523 <- expected amount RFoHKWbcKrktCAdYJVGhrJ4g8dXQ1Cvy5r" + +# RVTjyRex85TVcNwy5vW7JrmtfEt9y45Sx3 KMD 48415.76246875 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RVTjyRex85TVcNwy5vW7JrmtfEt9y45Sx3\",\"symbol\":\"KMD\"}" +echo "48415.76246875 <- expected amount RVTjyRex85TVcNwy5vW7JrmtfEt9y45Sx3" + +# RM9QCciRjSeoctNUzwfVh2gY6H8Qfc2anD KMD 8133.84809475 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RM9QCciRjSeoctNUzwfVh2gY6H8Qfc2anD\",\"symbol\":\"KMD\"}" +echo "8133.84809475 <- expected amount RM9QCciRjSeoctNUzwfVh2gY6H8Qfc2anD" + +# RAaszCNodXXu9rJL6qqVMZDykXncDecTMS KMD 693.08132289 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RAaszCNodXXu9rJL6qqVMZDykXncDecTMS\",\"symbol\":\"KMD\"}" +echo "693.08132289 <- expected amount RAaszCNodXXu9rJL6qqVMZDykXncDecTMS" + +# RUxvWRVR7xEqTbxF43nE1roPXfppbsDL57 KMD 1773.66877470 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RUxvWRVR7xEqTbxF43nE1roPXfppbsDL57\",\"symbol\":\"KMD\"}" +echo "1773.66877470 <- expected amount RUxvWRVR7xEqTbxF43nE1roPXfppbsDL57" + +# RASmNV8wHNdhU78WnoFwu9aLpM4zS4EFNa KMD 2971.54458972 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RASmNV8wHNdhU78WnoFwu9aLpM4zS4EFNa\",\"symbol\":\"KMD\"}" +echo "2971.54458972 <- expected amount RASmNV8wHNdhU78WnoFwu9aLpM4zS4EFNa" + +# RGfFiiX5euPb4GCpB76VfVdrFJhPWoJZQR KMD 3351.00027124 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RGfFiiX5euPb4GCpB76VfVdrFJhPWoJZQR\",\"symbol\":\"KMD\"}" +echo "3351.00027124 <- expected amount RGfFiiX5euPb4GCpB76VfVdrFJhPWoJZQR" diff --git a/iguana/tests/REVS.batch6 b/iguana/tests/REVS.batch6 new file mode 100755 index 000000000..958a4195f --- /dev/null +++ b/iguana/tests/REVS.batch6 @@ -0,0 +1,17 @@ +# RVbdZ1ki4piJF9NNBVbgc49r7KccxJL6oc KMD 23246.75713145, REVS 66.39295712 +sleep 1 +fiat/revs sendtoaddress RVbdZ1ki4piJF9NNBVbgc49r7KccxJL6oc 66.39295712 +# RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW KMD 17002.74354061, REVS 278.99000000 +sleep 1 +fiat/revs sendtoaddress RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW 278.99000000 +# RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL KMD 12356.73789711, REVS 112.00000000 +sleep 1 +fiat/revs sendtoaddress RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL 112.00000000 +# RQ1JfavGVxps1wXnhCfwnAbNoXn7ei1zMt KMD 391.52338368, REVS 7.76943254 +sleep 1 +fiat/revs sendtoaddress RQ1JfavGVxps1wXnhCfwnAbNoXn7ei1zMt 7.76943254 +# RFoHKWbcKrktCAdYJVGhrJ4g8dXQ1Cvy5r KMD 682.83148523, REVS 13.54307355 +sleep 1 +fiat/revs sendtoaddress RFoHKWbcKrktCAdYJVGhrJ4g8dXQ1Cvy5r 13.54307355 + +# total KMD 0.00000000 REVS 478.69546321 diff --git a/iguana/tests/REVS.batch6.importaddress b/iguana/tests/REVS.batch6.importaddress new file mode 100755 index 000000000..99cc268e0 --- /dev/null +++ b/iguana/tests/REVS.batch6.importaddress @@ -0,0 +1,15 @@ +# RVbdZ1ki4piJF9NNBVbgc49r7KccxJL6oc KMD 23246.75713145, REVS 66.39295712 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RVbdZ1ki4piJF9NNBVbgc49r7KccxJL6oc\",\"symbol\":\"REVS\"}" # 66.39295712 +sleep 3 +# RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW KMD 17002.74354061, REVS 278.99000000 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW\",\"symbol\":\"REVS\"}" # 278.99000000 +sleep 3 +# RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL KMD 12356.73789711, REVS 112.00000000 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL\",\"symbol\":\"REVS\"}" # 112.00000000 +sleep 3 +# RQ1JfavGVxps1wXnhCfwnAbNoXn7ei1zMt KMD 391.52338368, REVS 7.76943254 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RQ1JfavGVxps1wXnhCfwnAbNoXn7ei1zMt\",\"symbol\":\"REVS\"}" # 7.76943254 +sleep 3 +# RFoHKWbcKrktCAdYJVGhrJ4g8dXQ1Cvy5r KMD 682.83148523, REVS 13.54307355 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RFoHKWbcKrktCAdYJVGhrJ4g8dXQ1Cvy5r\",\"symbol\":\"REVS\"}" # 13.54307355 +sleep 3 diff --git a/iguana/tests/dexgetT b/iguana/tests/dexgetT index 943f1925c..0cae93716 100755 --- a/iguana/tests/dexgetT +++ b/iguana/tests/dexgetT @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettransaction\",\"txid\":\"cad09f4c3e23ef4cde4980cc0e2b296943f22cbaac183a30f86f49f7eccfedfd\",\"symbol\":\"BTC\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettransaction\",\"txid\":\"790211d19afd88f00537c2b847772cebe01853617528990e1c1f59eb45d2f1d9\",\"symbol\":\"KMD\"}" diff --git a/iguana/tests/dexlistunspent b/iguana/tests/dexlistunspent index a651e5d4f..76f86fe2c 100755 --- a/iguana/tests/dexlistunspent +++ b/iguana/tests/dexlistunspent @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RB1cuwtKBpwZPZnwyJeznaij53ovj8Dm8i\",\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"R9YZPUTTVNcnKpuQ4JgMaxYzLXmeWA3msY\",\"symbol\":\"KMD\"}" diff --git a/iguana/tests/sign b/iguana/tests/sign index 20795f150..d4774b944 100755 --- a/iguana/tests/sign +++ b/iguana/tests/sign @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"coin\":\"SHARK\",\"method\":\"signrawtransaction\",\"params\":[\"0100000001f0c3007d723b5e88148a0e8be405148aa0b4f1ced247cec6d61f25e3bfa49f7401000000d700483045022100ce9478bcb42c784423961746a524a2579ab1c6be5e63d5ed52ccf7383f77a458022014254cd3a8524de7a3e290a17a959f00b3d55f6b2c248bb7d0138b0fa9b011430121020a4b45aeeaea23cbe3cd288a399c8a42ba567bdd4841819569a54e8ef3a597434c695221035c7ceb91140df541a12c7cbe245ec9bc53a09771e37e480c485e8fbd69fb76fd21020a4b45aeeaea23cbe3cd288a399c8a42ba567bdd4841819569a54e8ef3a597432102e505c7e3480a643e23dd7b77687751b901404d8eea9c8d0d5a4c6af12b42172553aeffffffff0470170000000000001976a9148ca6e1a181cac5c0ea1e37fd50140c8ed81b8c6988ac60361e00000000001976a914d092ccfc3da5dc4279cb328e39e7a9903395946e88ac10270000000000001976a9147f9878c75123115a00000000000000000000000088ac00127a00000000001976a914ccf0d9a519f21e939893ed3a39f2c5e9d31ec24988ac00000000\", [{\"txid\":\"749fa4bfe3251fd6c6ce47d2cef1b4a08a1405e48b0e8a14885e3b727d00c3f0\",\"vout\":1,\"scriptPubKey\":\"a914ccf0d9a519f21e939893ed3a39f2c5e9d31ec24987\",\"redeemScript\":\"5221035c7ceb91140df541a12c7cbe245ec9bc53a09771e37e480c485e8fbd69fb76fd21020a4b45aeeaea23cbe3cd288a399c8a42ba567bdd4841819569a54e8ef3a597432102e505c7e3480a643e23dd7b77687751b901404d8eea9c8d0d5a4c6af12b42172553ae\"}], [\"UurweRHDBr4BSdMJuiXkgcnueawCNBXNw2e4zQ7TT75TieeG4auT\"], \"ALL\"] }" +curl --url "http://127.0.0.1:7778" --data "{\"coin\":\"SHARK\",\"method\":\"signrawtransaction\",\"params\":[\"0100000001f0c3007d723b5e88148a0e8be405148aa0b4f1ced247cec6d61f25e3bfa49f7401000000d700483045022100d2e2af39027b46516622f5c040770f4f20032bb99a1e69dc0072c8f9409d0d860220147d24c21d54d6411eac6c2aa970a9a8caec489ee12af77c7cbb424e3f17b36c0121035c7ceb91140df541a12c7cbe245ec9bc53a09771e37e480c485e8fbd69fb76fd4c695221035c7ceb91140df541a12c7cbe245ec9bc53a09771e37e480c485e8fbd69fb76fd21020a4b45aeeaea23cbe3cd288a399c8a42ba567bdd4841819569a54e8ef3a597432102e505c7e3480a643e23dd7b77687751b901404d8eea9c8d0d5a4c6af12b42172553aeffffffff0470170000000000001976a9148ca6e1a181cac5c0ea1e37fd50140c8ed81b8c6988ac60361e00000000001976a914d092ccfc3da5dc4279cb328e39e7a9903395946e88ac10270000000000001976a9147f9878c75123115a00000000000000000000000088ac00127a00000000001976a914ccf0d9a519f21e939893ed3a39f2c5e9d31ec24988ac00000000\", [{\"txid\":\"749fa4bfe3251fd6c6ce47d2cef1b4a08a1405e48b0e8a14885e3b727d00c3f0\",\"vout\":1,\"scriptPubKey\":\"a914ccf0d9a519f21e939893ed3a39f2c5e9d31ec24987\",\"redeemScript\":\"5221035c7ceb91140df541a12c7cbe245ec9bc53a09771e37e480c485e8fbd69fb76fd21020a4b45aeeaea23cbe3cd288a399c8a42ba567bdd4841819569a54e8ef3a597432102e505c7e3480a643e23dd7b77687751b901404d8eea9c8d0d5a4c6af12b42172553ae\"}], [\"UurweRHDBr4BSdMJuiXkgcnueawCNBXNw2e4zQ7TT75TieeG4auT\"], \"ALL\"] }" diff --git a/includes/iguana_defines.h b/includes/iguana_defines.h index 942336699..333c517fb 100755 --- a/includes/iguana_defines.h +++ b/includes/iguana_defines.h @@ -122,7 +122,7 @@ extern int32_t IGUANA_NUMHELPERS; #define CADDR_TIME_VERSION 31402 #define MIN_PROTO_VERSION 209 #define MAX_BLOCK_SIZE 1000000 -#define COINBASE_MATURITY 100 +//#define COINBASE_MATURITY 100 #define _IGUANA_HDRSCOUNT 2000 #define _IGUANA_BLOCKHASHES 500 From 6495b00e56898c6622c714c222a15b0af5b42e0a Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 6 Feb 2017 20:07:46 +0200 Subject: [PATCH 005/495] batch6 part2 --- iguana/tests/KMD.batch6 | 1 + iguana/tests/KMD.batch6.txids | 118 ++++++++++++++++++++++++++++++ iguana/tests/KMD.batch6.unspents | 119 +++++++++++++++++++++++++++++++ iguana/tests/REVS.batch6 | 7 ++ 4 files changed, 245 insertions(+) create mode 100644 iguana/tests/KMD.batch6.txids create mode 100644 iguana/tests/KMD.batch6.unspents diff --git a/iguana/tests/KMD.batch6 b/iguana/tests/KMD.batch6 index d57c4e8da..e1a23e5b1 100755 --- a/iguana/tests/KMD.batch6 +++ b/iguana/tests/KMD.batch6 @@ -1,3 +1,4 @@ +sleep 99999 # RAHPGb1w6XyVYD7WbiWBzr5yxEDdtP7zWk KMD 8908.50029425 ./komodo-cli sendtoaddress RAHPGb1w6XyVYD7WbiWBzr5yxEDdtP7zWk 8908.50029425 sleep 3 diff --git a/iguana/tests/KMD.batch6.txids b/iguana/tests/KMD.batch6.txids new file mode 100644 index 000000000..93461956a --- /dev/null +++ b/iguana/tests/KMD.batch6.txids @@ -0,0 +1,118 @@ +62292e81b302d016f6935c28dbee2b9b1a28ab22a913adaedc76880cb0e1445d +8908.50029425 <- expected amount RAHPGb1w6XyVYD7WbiWBzr5yxEDdtP7zWk +f8dccda2957c854adb9181dbbf14f3c65948623e997e5372cb7e1d85522b8eaa +2306.15801572 <- expected amount RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf +a787337d17f187d3607d76329a5f9ece7c0b636fe4e7101bd8d2b899f5ad6d67 +1368.88526791 <- expected amount RHq8NpfqMJZdchhDWsXayXEM5VEimBKgSv +629cb4c07a543a281dd0353b8365ed6e8ee30a2d26bfb72655fa6b0a72be543d +106.39636971 <- expected amount RU8ZZ29f8U1LNHriwu6Tj3q6y2in9Q6LtZ +89401a02d597b262da1515c4130ee30e0a6576957573d1acd72e006b16aced37 +32892.15837201 <- expected amount RQNX8jpgQYR3WBitCrjGQ6nGt1HnX5Qcie +815c8431c567ec91f0939c4ae8c34e08507db24247cd19e3a2314db8e680d8f1 +153.99848359 <- expected amount RCzsyBmQBtVWCZURt56K6XprynMNwXUr3V +3558710185cf55790a003596f2b1facdea4785123cfb02c5323196fbe26550e9 +250.09618515 <- expected amount RXhGJR2d175Tau3qDViZcPQwxZmzqgoW56 +0faa65db35e6a0eeff48cfec24a1db646a70a0c46b252d32ec7734f958baea11 +2285.12762738 <- expected amount RRoZ5xorGhikkB2qEoVfmuiyMMm3Thq3ei +950b907aa7f0e91c01967081c1eab2ce04b748cfd5c4cecb646782cfaeabcaf9 +1660.51377862 <- expected amount RXsqMJSo3B9npdT9M57SYnRUkez1rVmQYC +16d638781418ea05812b78582dd686fc70ec5309982a20cd4da3ad2812c36de0 +15065.53304887 <- expected amount RDDMHNTWge3CMGFyKXUueNjGbsWcXmL31D +68f620f1de68116e293d89fdd248a7e2b6cde4906ab55f8da205a422b2754f15 +2667.18064500 <- expected amount RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut +3c3b26a4b995b2b0b6c0c52c037ad96a4151078895ef350e97096ec60e60b2ca +24981.55183756 <- expected amount RRu4rm9zCpK41rSMn4NPtgrmcmHXBStQda +dd5ca8219ce4df0fca938d8d4ce19c20ee71646e7cd7340d50b3704af326123b +1334.49334406 <- expected amount REvMg538sSpHUdRyCV1jJDjT63XePKLwkh +967a2b5b30b1b97ad0c6d3d8a5bd805e3de9e0aaf1e8b45bda1000ee9a862a2f +10773.51776054 <- expected amount RPD8PawM6UFBsSrYujjGa9Smfc3hT48tUF +de575fc356bd68dbe1570b95542ebe9999f0c39be8ca36f3a58c4cea0bb0ecbe +607.46792378 <- expected amount RDAtSjPgVNwUvV3cNy1DohVKumdXK5zXRs +709270113a9a5541e14d0ba1b71d28a2caa6f843e5b8daebff12c151dd162b33 +2028.62052490 <- expected amount RPAmDGUEooCPRRxDpG3KrJ3uEK7kpo1taS +4c1896b71ca2e8bcf5f66466d67353c2613ab44b2ee738d1462632ee00295bf8 +40431.89788465 <- expected amount RAJ2UXw4RskMXFJfNbmZUhZ8PjDJ4uwz2W +bd38717ae41d20ce382f6679f77f5b165aa8a754b113dd1c49a156a2a89d177c +24325.33313227 <- expected amount RNrhJLYeG7yMYhTrpkFmP7g4SoEEGZLTg9 +65805dd69c8a518c8086534f3e0b9ba1056a90b308422720062a1ea24ac0469d +26784.99417167 <- expected amount RPVfyZ5ikstBeXXZsemgWfbB85Em7BdhnA +b69fba6a6663e6a0b77f8613e777247e195f1bccc2f4a551d9ecf32376595518 +200.88047000 <- expected amount RWAjXKk7zwHj8jy8SeuS4R45EA9S572dUc +1fe4ffe4988900b23839d7ce56b7481f9748bd8ba2d17ab63c687500e89de527 +942.22930620 <- expected amount RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw +77168f495725434f2e60fe75ca9507041e8c5073a983804631bf28b023857d3b +9295.82639400 <- expected amount RUcnbCSHhpHMhQbKNk5VMgmi2vn7hGGyNQ +d420e3666e15649ad7982723c03f068b9f80cbd6dbded80009410e9eaeb63e32 +1859.16527880 <- expected amount RBP3Yq3aAkuw9HfixLWygqcSmhTWJRNvey +39fe472de31a335a5bece0e0b3b72e4d7162eda841e814388ee204878b7f6722 +726.21002139 <- expected amount RFqApCmTfnC5G4xjKojfS9HMeLGEyAEDKR +05a803cc390a3bcac92a6d17d797985a9e14601860118dbedd9d772d6813e262 +121577.72836165 <- expected amount RFnW3BXvF5U67dxB1BnuWEGaQjjBosqCwz +20c19fb029fef0be33d8b627f698d5ff74251aafb72b485a33bdb298e48a86c9 +2511.34619763 <- expected amount RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1 +4c7929dc3e4c0e47a33df0743864c59b7938395c68e630579eb1c2003b57f154 +23246.75713145 <- expected amount RVbdZ1ki4piJF9NNBVbgc49r7KccxJL6oc +a5ebcbd28dca38ae64bd75958fbe7bbbde4707b3024373d4d2fbf22aa5d41783 +83333.21036121 <- expected amount REDocWFMCjY9JDTf7WYQwyPesHZd7RUT9L +53972d809f74c9de8973ff6c5fc5a0cf3bbca4d6a5ee29fc2caea12afe354cc4 +5325.73387156 <- expected amount RMq7CwKZHNycYivj2wFfvoJp8XWJAVeDf4 +a6a0bf15c9fb617f62f0dbe7e52aacdeaf851aba361de024bf179c7394b7e16f +938.92347308 <- expected amount RJNoJwWP9xpyNMPUi7iPrLNWCxTAKZxGD8 +c308d68593e3be9b77de9bc36b5916de6d201b90ca5eea897b54404334c9c817 +484157.62468750 <- expected amount RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW +7b21532d494f3af5d2f053884f2210c6583725a296c391c8d331069302fcd42f +9683.15249375 <- expected amount RHkK2ZCbWK35bDZkojVBCXTezoS9hqZDJ2 +919a2ebedfcf6c88fa836e371b256088331f6934453168346d15bf45d96c7ea6 +8908.50029425 <- expected amount RLcnhkZr56a9z7oLLrj9ZSoKicpnxPZVVH +939271c8ead6549cccb00bdd1f49ce8ca856a7b1c9885d61503a48eedd5c9858 +502.18197380 <- expected amount RJMikLhPMUv8t3Z8xycZpzdKPwv76yKbdA +d69a774b813831055e034dcefeff61d98330ae0dbe37290a954cac3c4ec91d28 +17002.74354061 <- expected amount RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW +58d710161e3badc90af5564af473cdbf6be6bace34309e54521462adfe4d5fd2 +149751.00241450 <- expected amount RP6WfJVmgrtRT9DBywBtq48HBzBpspTU4J +333e392d27cfc8200f8fd86a4842f4dda4f81a0fadad89088da3361346e4b317 +96831.52493750 <- expected amount RF6xs65r4k2okG9uvTx3D9Zz5yXhvjPvFe +e071d015797ed3e9b508851b5dc4ac54f03756e5083024adbbe85412bbe3ce39 +18021.41836725 <- expected amount RQS6HyxAdNjeAob3cee7TVXN3ptZowRBUh +4a29d95b927c4a6b7cc004f27e80ff76b991e74895971ca0c4c024cda65fe9be +41017.83396352 <- expected amount RCAP5E6YMeqbBZmbXmTq7cvhruyysyhuWk +682512e2a527e15da96a7314968cd3fca787e4a818191a4ee4f06b65bf33354f +13263.41995905 <- expected amount R9Zv5ZZprWtw427XmGfNLTsH3Goe49Ghic +6f218e175f456f96f1b4d0e8be63dfdde022aa1a0bc160f5be961a0ef37795d1 +8982.68540439 <- expected amount RUipJV9DPtvCYA81w3EwkCr5DNQ99289zN +862f8287715462b82f455b66ce29a46a739cbf70f57f11ca5f23bb968b5c720d +12356.73789711 <- expected amount RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL +45e030fb8f98666b3f053fd70cb994be55ba0c60906b79eff28afb3f7732d12e +12561.43380413 <- expected amount RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct +e3c49fbe2d4ea57e5c83f6a72706a61178912bfe4dc18d5bfbb8835aa6a27139 +4453.35929709 <- expected amount RKyuFwhojJgYNUQjuHWEcDUouiPHCpbRS6 +826c78814f9725ff98200417d171ae0a6229bad39197a58df3dc02ab3cb6ce45 +4521.29210647 <- expected amount RA9G36WwA9K95bn8Cbycq5ZnoxhSzzhhBw +63a2314d5f88f7331ab55c696c1c978af200671a0ba89ba2c3a83c618f1a2890 +11653.72856174 <- expected amount RHbf3qwhmmUBw3WNR5NYoMx3YH13JjXWrv +1f9b50f730e18a267d4e0a1381d1a94544b8fdee8fe15b626b30f3bd6d0478a6 +1561.74292091 <- expected amount RL2LycM1d3STMFXMN7ipcNfNejhieFeQDR +1fdf240fe884fc0ca54f07e0eac9b39792dd2ddad10e5b528858f7cdb37f4762 +25107.55827068 <- expected amount RDEKuSHP6Ues1gi4ex2vt9rpBEeKAqPWfv +6d365c4ce11ccf2b5bd1635030616e73d38598de2bf8fb17a86ce1732dc3322c +391.52338368 <- expected amount RQ1JfavGVxps1wXnhCfwnAbNoXn7ei1zMt +d74721f064415a3ceffac8a8ca55cb3d0017f692c4c1e3ec6f3818f4dcc0c812 +2212.41539458 <- expected amount RAsxHJd4zrSxvhQedDeTRaANwv6eG9CYjx +ed6261d0bf246e57c9acd4b08ee29ce0dccef714fb128e1dc9d6f4dc9e99336b +12079.07428158 <- expected amount RLADbn4XTgAbsCcENNhUPX2Kb5KcX7hfs5 +8d94f05fca74b59348108a8b949f98b18410776e57654da781a538d57ff5a6d7 +2323.95659850 <- expected amount RELNTFjyhMRntuSbrvJSnG9LSt8ycmD5eh +7eaba7517f7a3027c36018d0a25f3ee540af3690729471ecd383bf1eb1313f51 +682.83148523 <- expected amount RFoHKWbcKrktCAdYJVGhrJ4g8dXQ1Cvy5r +19c01565bf79e109542aeeb45cb8dbda91963eba2b21ff76a05ae8c7b5984c8d +48415.76246875 <- expected amount RVTjyRex85TVcNwy5vW7JrmtfEt9y45Sx3 +0fe813014cf95822730981d8905f9a7a2ccf1ebb1344fbcdf3be7f7b5f542618 +8133.84809475 <- expected amount RM9QCciRjSeoctNUzwfVh2gY6H8Qfc2anD +76dd0c3f7acfc2f12d1c140f228d82753182e86374660d8651f83683bebe20b2 +693.08132289 <- expected amount RAaszCNodXXu9rJL6qqVMZDykXncDecTMS +61e32c84221d569c5b449d0992f36eff52f092abcfd029015949b537bb081969 +1773.66877470 <- expected amount RUxvWRVR7xEqTbxF43nE1roPXfppbsDL57 +93ffd2beecc84da8c6bf084509db507ed03fb12049128ef356a2d6f739716d60 +2971.54458972 <- expected amount RASmNV8wHNdhU78WnoFwu9aLpM4zS4EFNa +4264b28ca78c9bacedc50befb824e82b8fd16873a75bc02874908949ce1bdd4f +3351.00027124 <- expected amount RGfFiiX5euPb4GCpB76VfVdrFJhPWoJZQR diff --git a/iguana/tests/KMD.batch6.unspents b/iguana/tests/KMD.batch6.unspents new file mode 100644 index 000000000..6bb092eb8 --- /dev/null +++ b/iguana/tests/KMD.batch6.unspents @@ -0,0 +1,119 @@ +[{"txid":"62292e81b302d016f6935c28dbee2b9b1a28ab22a913adaedc76880cb0e1445d","vout":1,"address":"RAHPGb1w6XyVYD7WbiWBzr5yxEDdtP7zWk","account":"RAHPGb1w6XyVYD7WbiWBzr5yxEDdtP7zWk","scriptPubKey":"76a9140b0177aba4a147562e5d525beb7b326a6627f97c88ac","amount":8908.50029425,"interest":0,"confirmations":5,"spendable":false}] +8908.50029425 <- expected amount RAHPGb1w6XyVYD7WbiWBzr5yxEDdtP7zWk +[{"txid":"adf2fd2eee75f5d9fdce44b4fe4d32f62d79f5e1b0362640c76eb109b1ceb30b","vout":1,"address":"RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf","account":"RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf","scriptPubKey":"76a914240f48f11c4b0674afa8b58dab11bdb780a3a47d88ac","amount":1212.14061568,"interest":1.18837315,"confirmations":9351,"spendable":false}, {"txid":"684728bb5ff281762990da11e7463c6e992b5e98cb0cc7965a3470b8a664484a","vout":1,"address":"RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf","account":"RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf","scriptPubKey":"76a914240f48f11c4b0674afa8b58dab11bdb780a3a47d88ac","amount":1212.26932063,"interest":0.97763654,"confirmations":7634,"spendable":false}] +2306.15801572 <- expected amount RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf +[{"txid":"a787337d17f187d3607d76329a5f9ece7c0b636fe4e7101bd8d2b899f5ad6d67","vout":1,"address":"RHq8NpfqMJZdchhDWsXayXEM5VEimBKgSv","account":"RHq8NpfqMJZdchhDWsXayXEM5VEimBKgSv","scriptPubKey":"76a9145dcb3a232f8888e983b1854214b2c6c304148f3788ac","amount":1368.88526791,"interest":0,"confirmations":5,"spendable":false}] +1368.88526791 <- expected amount RHq8NpfqMJZdchhDWsXayXEM5VEimBKgSv +[{"txid":"629cb4c07a543a281dd0353b8365ed6e8ee30a2d26bfb72655fa6b0a72be543d","vout":1,"address":"RU8ZZ29f8U1LNHriwu6Tj3q6y2in9Q6LtZ","account":"RU8ZZ29f8U1LNHriwu6Tj3q6y2in9Q6LtZ","scriptPubKey":"76a914cec8926f2f56a8fef2b22f68a230e7ea2b90fdea88ac","amount":106.39636971,"interest":0,"confirmations":5,"spendable":false}] +106.39636971 <- expected amount RU8ZZ29f8U1LNHriwu6Tj3q6y2in9Q6LtZ +[{"txid":"89401a02d597b262da1515c4130ee30e0a6576957573d1acd72e006b16aced37","vout":1,"address":"RQNX8jpgQYR3WBitCrjGQ6nGt1HnX5Qcie","account":"RQNX8jpgQYR3WBitCrjGQ6nGt1HnX5Qcie","scriptPubKey":"76a914a58bdf942892f956dc5854dec7cf7113dbed332f88ac","amount":32892.15837201,"interest":0,"confirmations":5,"spendable":false}] +32892.15837201 <- expected amount RQNX8jpgQYR3WBitCrjGQ6nGt1HnX5Qcie +[{"txid":"815c8431c567ec91f0939c4ae8c34e08507db24247cd19e3a2314db8e680d8f1","vout":1,"address":"RCzsyBmQBtVWCZURt56K6XprynMNwXUr3V","account":"RCzsyBmQBtVWCZURt56K6XprynMNwXUr3V","scriptPubKey":"76a91428cabb231f90add806dfe1b833857d813b89964488ac","amount":153.99848359,"interest":0,"confirmations":5,"spendable":false}] +153.99848359 <- expected amount RCzsyBmQBtVWCZURt56K6XprynMNwXUr3V +[{"txid":"3558710185cf55790a003596f2b1facdea4785123cfb02c5323196fbe26550e9","vout":1,"address":"RXhGJR2d175Tau3qDViZcPQwxZmzqgoW56","account":"RXhGJR2d175Tau3qDViZcPQwxZmzqgoW56","scriptPubKey":"76a914f5e04666c48aca1ab1a26092e2f609c467e9a9ef88ac","amount":250.09618515,"interest":0,"confirmations":5,"spendable":false}] +250.09618515 <- expected amount RXhGJR2d175Tau3qDViZcPQwxZmzqgoW56 +[{"txid":"0faa65db35e6a0eeff48cfec24a1db646a70a0c46b252d32ec7734f958baea11","vout":1,"address":"RRoZ5xorGhikkB2qEoVfmuiyMMm3Thq3ei","account":"RRoZ5xorGhikkB2qEoVfmuiyMMm3Thq3ei","scriptPubKey":"76a914b540071a3ca6dc538a72af762bcf2b85675a1dab88ac","amount":2285.12762738,"interest":0,"confirmations":5,"spendable":false}] +2285.12762738 <- expected amount RRoZ5xorGhikkB2qEoVfmuiyMMm3Thq3ei +[{"txid":"950b907aa7f0e91c01967081c1eab2ce04b748cfd5c4cecb646782cfaeabcaf9","vout":1,"address":"RXsqMJSo3B9npdT9M57SYnRUkez1rVmQYC","account":"RXsqMJSo3B9npdT9M57SYnRUkez1rVmQYC","scriptPubKey":"76a914f7e005ef1c5f1d0d5dd94e15b2f09e27f6303eec88ac","amount":1660.51377862,"interest":0,"confirmations":5,"spendable":false}] +1660.51377862 <- expected amount RXsqMJSo3B9npdT9M57SYnRUkez1rVmQYC +[{"txid":"6ba72bac45bd935d79b4f33c42d319f15b0c4e72a650cff625563126d8faac87","vout":1,"address":"RDDMHNTWge3CMGFyKXUueNjGbsWcXmL31D","account":"RDDMHNTWge3CMGFyKXUueNjGbsWcXmL31D","scriptPubKey":"76a9142b2685d16fde2f87f6a116c03001acea69571e4188ac","amount":553085.02723026,"interest":242.58115229,"confirmations":4164,"spendable":false}, {"txid":"16d638781418ea05812b78582dd686fc70ec5309982a20cd4da3ad2812c36de0","vout":1,"address":"RDDMHNTWge3CMGFyKXUueNjGbsWcXmL31D","account":"RDDMHNTWge3CMGFyKXUueNjGbsWcXmL31D","scriptPubKey":"76a9142b2685d16fde2f87f6a116c03001acea69571e4188ac","amount":15065.53304887,"interest":0,"confirmations":5,"spendable":false}] +15065.53304887 <- expected amount RDDMHNTWge3CMGFyKXUueNjGbsWcXmL31D +[{"txid":"68f620f1de68116e293d89fdd248a7e2b6cde4906ab55f8da205a422b2754f15","vout":1,"address":"RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut","account":"RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut","scriptPubKey":"76a914a8fac0d74fded755c3ce82b2f6a12959176be56788ac","amount":2667.18064500,"interest":0,"confirmations":5,"spendable":false}, {"txid":"acd786f5b7bab14737a25d0ac2eb0e1a61743899f83571a694191a5317cc3c67","vout":1,"address":"RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut","account":"RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut","scriptPubKey":"76a914a8fac0d74fded755c3ce82b2f6a12959176be56788ac","amount":20106.39865075,"interest":13.58540449,"confirmations":6513,"spendable":false}] +2667.18064500 <- expected amount RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut +[{"txid":"3c3b26a4b995b2b0b6c0c52c037ad96a4151078895ef350e97096ec60e60b2ca","vout":1,"address":"RRu4rm9zCpK41rSMn4NPtgrmcmHXBStQda","account":"RRu4rm9zCpK41rSMn4NPtgrmcmHXBStQda","scriptPubKey":"76a914b64af5d62e56292a1c61b66e51adf3d73ce76d6a88ac","amount":24981.55183756,"interest":0,"confirmations":6,"spendable":false}] +24981.55183756 <- expected amount RRu4rm9zCpK41rSMn4NPtgrmcmHXBStQda +[{"txid":"dd5ca8219ce4df0fca938d8d4ce19c20ee71646e7cd7340d50b3704af326123b","vout":1,"address":"REvMg538sSpHUdRyCV1jJDjT63XePKLwkh","account":"REvMg538sSpHUdRyCV1jJDjT63XePKLwkh","scriptPubKey":"76a9143de00796e3201826f528a457370b49c14f5239d288ac","amount":1334.49334406,"interest":0,"confirmations":6,"spendable":false}] +1334.49334406 <- expected amount REvMg538sSpHUdRyCV1jJDjT63XePKLwkh +[{"txid":"967a2b5b30b1b97ad0c6d3d8a5bd805e3de9e0aaf1e8b45bda1000ee9a862a2f","vout":1,"address":"RPD8PawM6UFBsSrYujjGa9Smfc3hT48tUF","account":"RPD8PawM6UFBsSrYujjGa9Smfc3hT48tUF","scriptPubKey":"76a91498cd04a649fa6e2c68318e06fcd9e81d066184aa88ac","amount":10773.51776054,"interest":0,"confirmations":6,"spendable":false}] +10773.51776054 <- expected amount RPD8PawM6UFBsSrYujjGa9Smfc3hT48tUF +[{"txid":"de575fc356bd68dbe1570b95542ebe9999f0c39be8ca36f3a58c4cea0bb0ecbe","vout":1,"address":"RDAtSjPgVNwUvV3cNy1DohVKumdXK5zXRs","account":"RDAtSjPgVNwUvV3cNy1DohVKumdXK5zXRs","scriptPubKey":"76a9142aaf497d0f3c8c3b420aa96983fa066a539c2a4988ac","amount":607.46792378,"interest":0,"confirmations":5,"spendable":false}] +607.46792378 <- expected amount RDAtSjPgVNwUvV3cNy1DohVKumdXK5zXRs +[{"txid":"709270113a9a5541e14d0ba1b71d28a2caa6f843e5b8daebff12c151dd162b33","vout":1,"address":"RPAmDGUEooCPRRxDpG3KrJ3uEK7kpo1taS","account":"RPAmDGUEooCPRRxDpG3KrJ3uEK7kpo1taS","scriptPubKey":"76a914985a82002db46326b99c6e19485af882dd1cbe2788ac","amount":2028.62052490,"interest":0,"confirmations":5,"spendable":false}] +2028.62052490 <- expected amount RPAmDGUEooCPRRxDpG3KrJ3uEK7kpo1taS +[{"txid":"4c1896b71ca2e8bcf5f66466d67353c2613ab44b2ee738d1462632ee00295bf8","vout":1,"address":"RAJ2UXw4RskMXFJfNbmZUhZ8PjDJ4uwz2W","account":"RAJ2UXw4RskMXFJfNbmZUhZ8PjDJ4uwz2W","scriptPubKey":"76a9140b208683ef4dd06e2626f3b9b652fd026b94733488ac","amount":40431.89788465,"interest":0,"confirmations":5,"spendable":false}] +40431.89788465 <- expected amount RAJ2UXw4RskMXFJfNbmZUhZ8PjDJ4uwz2W +[{"txid":"bd38717ae41d20ce382f6679f77f5b165aa8a754b113dd1c49a156a2a89d177c","vout":1,"address":"RNrhJLYeG7yMYhTrpkFmP7g4SoEEGZLTg9","account":"RNrhJLYeG7yMYhTrpkFmP7g4SoEEGZLTg9","scriptPubKey":"76a91494efc12346132d73e1c94232bfad3fa28f7dbc8088ac","amount":24325.33313227,"interest":0,"confirmations":5,"spendable":false}] +24325.33313227 <- expected amount RNrhJLYeG7yMYhTrpkFmP7g4SoEEGZLTg9 +[{"txid":"65805dd69c8a518c8086534f3e0b9ba1056a90b308422720062a1ea24ac0469d","vout":1,"address":"RPVfyZ5ikstBeXXZsemgWfbB85Em7BdhnA","account":"RPVfyZ5ikstBeXXZsemgWfbB85Em7BdhnA","scriptPubKey":"76a9149bee0a38bc753ebfcd0d65fa5da4391d0366b13d88ac","amount":26784.99417167,"interest":0,"confirmations":5,"spendable":false}] +26784.99417167 <- expected amount RPVfyZ5ikstBeXXZsemgWfbB85Em7BdhnA +[{"txid":"b69fba6a6663e6a0b77f8613e777247e195f1bccc2f4a551d9ecf32376595518","vout":1,"address":"RWAjXKk7zwHj8jy8SeuS4R45EA9S572dUc","account":"RWAjXKk7zwHj8jy8SeuS4R45EA9S572dUc","scriptPubKey":"76a914e521fa89860dee436a6f1bd4fa96b3304e5f5fb888ac","amount":200.88047000,"interest":0,"confirmations":5,"spendable":false}] +200.88047000 <- expected amount RWAjXKk7zwHj8jy8SeuS4R45EA9S572dUc +[{"txid":"acc00c567dc47945768302ff4acbb89150d5003e6589c3b72dc2bd591bf4a10b","vout":14,"address":"RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw","account":"RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw","scriptPubKey":"76a9140a763e24f43c641149509cfad2a427c0eff7dfee88ac","amount":0.00399845,"interest":0,"confirmations":165,"spendable":false}, {"txid":"1fe4ffe4988900b23839d7ce56b7481f9748bd8ba2d17ab63c687500e89de527","vout":1,"address":"RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw","account":"RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw","scriptPubKey":"76a9140a763e24f43c641149509cfad2a427c0eff7dfee88ac","amount":942.22930620,"interest":0,"confirmations":5,"spendable":false}, {"txid":"16431eb5aa9a3773c2c81775eaf8a00a56d3aeb7802d1370441589f379bd7b33","vout":14,"address":"RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw","account":"RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw","scriptPubKey":"76a9140a763e24f43c641149509cfad2a427c0eff7dfee88ac","amount":0.00372134,"interest":0,"confirmations":165,"spendable":false}, {"txid":"84ee9836c5c8efcdb464e67ebf44a778dd3e8944f8b583d911fd7ac144ee7441","vout":18,"address":"RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw","account":"RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw","scriptPubKey":"76a9140a763e24f43c641149509cfad2a427c0eff7dfee88ac","amount":0.00376084,"interest":0,"confirmations":587,"spendable":false}, {"txid":"ed9d40af32e07a771b66037a5415c1131ea0406da6b89d1fef63c891af740453","vout":7,"address":"RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw","account":"RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw","scriptPubKey":"76a9140a763e24f43c641149509cfad2a427c0eff7dfee88ac","amount":0.00960203,"interest":0,"confirmations":516,"spendable":false}, {"txid":"2d1fa6ae1d9eb1596f07c8eda09332ea8e658dc52ba3953048e727039957ca6d","vout":23,"address":"RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw","account":"RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw","scriptPubKey":"76a9140a763e24f43c641149509cfad2a427c0eff7dfee88ac","amount":0.00658122,"interest":0,"confirmations":586,"spendable":false}, {"txid":"bfb3daf6ee189aec019dd5911643ad546b564d308a2485ebfe464fd6cfd21096","vout":18,"address":"RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw","account":"RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw","scriptPubKey":"76a9140a763e24f43c641149509cfad2a427c0eff7dfee88ac","amount":0.00205724,"interest":0,"confirmations":165,"spendable":false}, {"txid":"b962d6652aa5169c0ae0465d1d8c04accf16a2ba05fc9d622fab310913fcc2af","vout":28,"address":"RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw","account":"RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw","scriptPubKey":"76a9140a763e24f43c641149509cfad2a427c0eff7dfee88ac","amount":0.05205013,"interest":0,"confirmations":458,"spendable":false}, {"txid":"ac00045379ebc7e9746a21d1514b3afbe8ca0ce8de22a24ab2d2dcaddee32dd8","vout":9,"address":"RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw","account":"RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw","scriptPubKey":"76a9140a763e24f43c641149509cfad2a427c0eff7dfee88ac","amount":0.00407423,"interest":0,"confirmations":589,"spendable":false}, {"txid":"825aba076420b2218bde2c14b052f65ecdb5a6fc8643d72d378befa472e2f6f4","vout":17,"address":"RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw","account":"RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw","scriptPubKey":"76a9140a763e24f43c641149509cfad2a427c0eff7dfee88ac","amount":0.00437964,"interest":0,"confirmations":587,"spendable":false}] +942.22930620 <- expected amount RAEWV5sPjaEmw9Toa44jxchKCNLQVYnkcw +[{"txid":"77168f495725434f2e60fe75ca9507041e8c5073a983804631bf28b023857d3b","vout":1,"address":"RUcnbCSHhpHMhQbKNk5VMgmi2vn7hGGyNQ","account":"RUcnbCSHhpHMhQbKNk5VMgmi2vn7hGGyNQ","scriptPubKey":"76a914d41f1a25312622d5bb49e4611fa25db3bf4ab05a88ac","amount":9295.82639400,"interest":0,"confirmations":5,"spendable":false}] +9295.82639400 <- expected amount RUcnbCSHhpHMhQbKNk5VMgmi2vn7hGGyNQ +[{"txid":"d420e3666e15649ad7982723c03f068b9f80cbd6dbded80009410e9eaeb63e32","vout":1,"address":"RBP3Yq3aAkuw9HfixLWygqcSmhTWJRNvey","account":"RBP3Yq3aAkuw9HfixLWygqcSmhTWJRNvey","scriptPubKey":"76a914170ba0ab851469133ab4e7c3ae83a5dac5e30de688ac","amount":1859.16527880,"interest":0,"confirmations":4,"spendable":false}] +1859.16527880 <- expected amount RBP3Yq3aAkuw9HfixLWygqcSmhTWJRNvey +[{"txid":"39fe472de31a335a5bece0e0b3b72e4d7162eda841e814388ee204878b7f6722","vout":1,"address":"RFqApCmTfnC5G4xjKojfS9HMeLGEyAEDKR","account":"RFqApCmTfnC5G4xjKojfS9HMeLGEyAEDKR","scriptPubKey":"76a91447dd02a5ac602b77e5c75f0dbf0bcbf8a575a54288ac","amount":726.21002139,"interest":0,"confirmations":4,"spendable":false}] +726.21002139 <- expected amount RFqApCmTfnC5G4xjKojfS9HMeLGEyAEDKR +[{"txid":"05a803cc390a3bcac92a6d17d797985a9e14601860118dbedd9d772d6813e262","vout":1,"address":"RFnW3BXvF5U67dxB1BnuWEGaQjjBosqCwz","account":"RFnW3BXvF5U67dxB1BnuWEGaQjjBosqCwz","scriptPubKey":"76a914475bcf454d77cd5ad41005b1a05416a989a0816288ac","amount":121577.72836165,"interest":0,"confirmations":4,"spendable":false}] +121577.72836165 <- expected amount RFnW3BXvF5U67dxB1BnuWEGaQjjBosqCwz +[{"txid":"13e9b271e893f9224696d74a904696a8c25cc76f645cb27dede8a2f62cf87f6c","vout":0,"address":"RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1","account":"RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1","scriptPubKey":"76a91422311801b820cf5a169e3614cfc7e61e08cffc1c88ac","amount":999.99990000,"interest":0.10080644,"confirmations":991,"spendable":false}, {"txid":"13e9b271e893f9224696d74a904696a8c25cc76f645cb27dede8a2f62cf87f6c","vout":1,"address":"RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1","account":"RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1","scriptPubKey":"76a91422311801b820cf5a169e3614cfc7e61e08cffc1c88ac","amount":900.31368461,"interest":0.09075742,"confirmations":991,"spendable":false}, {"txid":"4f5ad6ec2d1b272e8b5bccc8f8a82924d399e6b334359a24185e85f2ed041490","vout":0,"address":"RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1","account":"RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1","scriptPubKey":"76a91422311801b820cf5a169e3614cfc7e61e08cffc1c88ac","amount":0.99990000,"interest":0,"confirmations":991,"spendable":false}, {"txid":"4f5ad6ec2d1b272e8b5bccc8f8a82924d399e6b334359a24185e85f2ed041490","vout":1,"address":"RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1","account":"RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1","scriptPubKey":"76a91422311801b820cf5a169e3614cfc7e61e08cffc1c88ac","amount":3.65643742,"interest":0,"confirmations":991,"spendable":false}, {"txid":"c8cba16908893545179be5ee114e77121c0779efafab61cf6c018bcd01a7259c","vout":1,"address":"RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1","account":"RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1","scriptPubKey":"76a91422311801b820cf5a169e3614cfc7e61e08cffc1c88ac","amount":28096.43798050,"interest":15.43760328,"confirmations":5200,"spendable":false}, {"txid":"2a61589e506db0004171196050d3a0c0d6bea3fca15d6e8a0897f7052bfb20ba","vout":1,"address":"RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1","account":"RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1","scriptPubKey":"76a91422311801b820cf5a169e3614cfc7e61e08cffc1c88ac","amount":8000,"interest":3.27868852,"confirmations":4091,"spendable":false}, {"txid":"20c19fb029fef0be33d8b627f698d5ff74251aafb72b485a33bdb298e48a86c9","vout":1,"address":"RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1","account":"RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1","scriptPubKey":"76a91422311801b820cf5a169e3614cfc7e61e08cffc1c88ac","amount":2511.34619763,"interest":0,"confirmations":4,"spendable":false}] +2511.34619763 <- expected amount RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1 +[{"txid":"4c7929dc3e4c0e47a33df0743864c59b7938395c68e630579eb1c2003b57f154","vout":1,"address":"RVbdZ1ki4piJF9NNBVbgc49r7KccxJL6oc","account":"RVbdZ1ki4piJF9NNBVbgc49r7KccxJL6oc","scriptPubKey":"76a914dedf4487a56f16b47b650bc9999d371cfc740da388ac","amount":23246.75713145,"interest":0,"confirmations":4,"spendable":false}] +23246.75713145 <- expected amount RVbdZ1ki4piJF9NNBVbgc49r7KccxJL6oc +[{"txid":"a5ebcbd28dca38ae64bd75958fbe7bbbde4707b3024373d4d2fbf22aa5d41783","vout":1,"address":"REDocWFMCjY9JDTf7WYQwyPesHZd7RUT9L","account":"REDocWFMCjY9JDTf7WYQwyPesHZd7RUT9L","scriptPubKey":"76a9143634a0aacb2230ed0f289dce9c462b24c93c57cb88ac","amount":83333.21036121,"interest":0,"confirmations":4,"spendable":false}] +83333.21036121 <- expected amount REDocWFMCjY9JDTf7WYQwyPesHZd7RUT9L +[{"txid":"53972d809f74c9de8973ff6c5fc5a0cf3bbca4d6a5ee29fc2caea12afe354cc4","vout":1,"address":"RMq7CwKZHNycYivj2wFfvoJp8XWJAVeDf4","account":"RMq7CwKZHNycYivj2wFfvoJp8XWJAVeDf4","scriptPubKey":"76a91489aac0d1e99f053be1f37274b73e2e0b49f3093f88ac","amount":5325.73387156,"interest":0,"confirmations":4,"spendable":false}] +5325.73387156 <- expected amount RMq7CwKZHNycYivj2wFfvoJp8XWJAVeDf4 +[{"txid":"a6a0bf15c9fb617f62f0dbe7e52aacdeaf851aba361de024bf179c7394b7e16f","vout":1,"address":"RJNoJwWP9xpyNMPUi7iPrLNWCxTAKZxGD8","account":"RJNoJwWP9xpyNMPUi7iPrLNWCxTAKZxGD8","scriptPubKey":"76a91463c89f21563f4742678b32e205571dac9edd994188ac","amount":938.92347308,"interest":0,"confirmations":3,"spendable":false}] +938.92347308 <- expected amount RJNoJwWP9xpyNMPUi7iPrLNWCxTAKZxGD8 +[{"txid":"807e5780d91eb5202217f491f10532d101fb7fc6ab9026f3956a008f9e409400","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"91275fa732478f74a9ee65f765483dbc5a57c3a82c199f8fbaad5f1bc1d23303","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"dba850dfbd63a8ee35a1cae81c39a32cb87606313b232a24ff831002536d4704","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"19b5e41164b4f3a30e59c8ebab3fbf76bc2db79ce3dee4c9880dc43f036f0307","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"a629bab8f075e7db954d3eb6df0671f726eb9808a395153d179214324afc6f07","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"5083cb1e8a6c0077e5adca938c871fdd978abdfb7f7b774e66528bc91030c907","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"02fbe27b66b62af352a31ed1ec73dea3d47bc310cca0f904d61ef7f0ada1060d","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"062ab739991cf71bd49671fb3a0efb0d516d07cd5ccc7b60a5e4a6c71b36350f","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":1000,"interest":0.14970059,"confirmations":1493,"spendable":false}, {"txid":"c09e2c772c3f5db197613051757e9c5a0780559ee6e33849f958d7e4f7ef0715","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"727ba924729edff97deb3455e6e017f7cbe031d9c0d9b8bc8301ccd93acc7716","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"b3ca11bfb2a20c78afcae319edb74492ea0845318354cb316a0524332788b216","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"c308d68593e3be9b77de9bc36b5916de6d201b90ca5eea897b54404334c9c817","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":484157.62468750,"interest":0,"confirmations":3,"spendable":false}, {"txid":"1d9aaae24823b044de3a13527251f3c84bea2856c7f5aec9eba7c7fb422afd17","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05970149,"confirmations":1489,"spendable":false}, {"txid":"b007dd511cf5a0970ea7726646db65aa82afec839592a7d10959408cdb100c1b","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"21e07d20570c1de1d892ddd735e637c42fb429c7d2ee0e65451192bc4e19b81b","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"6c4f959413b34fe6c14534277b27124be1da6fccb2d6e9c25d634e068a7bc71e","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":300,"interest":0.04477611,"confirmations":1489,"spendable":false}, {"txid":"7df8f61b583c8df78b4d7e44efe2ec807958687621363962a4ea5da2792a421f","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1492,"spendable":false}, {"txid":"0b47a14205453e701913ece85a815b3f932f7d63569b95670c16db2306417e1f","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"3aafb21ffe0608c49e481653611a1823399f60123ba8ebf4851aa7af8645a11f","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"bef1fe4af1f82bda2a0fcd81e75da6481b7369e978a59a807c170aa38e6fa91f","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1492,"spendable":false}, {"txid":"ec91c9105d91c3f3450201e43f0734c56b940ae23b1563e9372c1b0ba4106f21","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1489,"spendable":false}, {"txid":"48553c9d7022eb653cbb7fd5fe52b0a98373c06c7606ad82abdcaf4d4d150326","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"0bb6cb1ccf6e427ffbbff668a364f10ca656f6d3c827dd9fee43ce72f85a722c","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":300,"interest":0.04477611,"confirmations":1488,"spendable":false}, {"txid":"8826bbccfea98938674d6631b6ab4df9601d97e1f6c0b6473ccc6c597e2f5431","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":300,"interest":0.04477611,"confirmations":1489,"spendable":false}, {"txid":"0619fef6a74d346e960a87f45ffd5273dd487823b83105120e2146265e9fc831","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"6b964565d3d997cbaaafe54636bf1e86e5a19874a27062558abed718e5dbe231","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"670088345354008ae193bda24a5a8a4674a12450f208bf27ef0aa9be23508832","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":300,"interest":0.04477611,"confirmations":1489,"spendable":false}, {"txid":"46b4472d1da7c51e51fcccf2f0b419b0aea9672a57ee10344c3a9c82a8d40a34","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":1000,"interest":0.14970059,"confirmations":1493,"spendable":false}, {"txid":"0aff9fa1e7be37139ee6f18f5cb1a9c836eba34a1a7e1ea5bfde993cc4193139","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1489,"spendable":false}, {"txid":"cf0cb3a4370631454959d32b80d88c1695150a3fa0c7255fa1d6a4c0cce1553a","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":100.78493000,"interest":0.01504252,"confirmations":1487,"spendable":false}, {"txid":"ecd661ccaabdc9f0a8a61ee45a3a3c9aac0d1d419c4a6a215815ac95edbc7741","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"22a0bf44f0a4eabc7049623db8334fbef21966dd575530cb14e826cda3968044","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"affc10f2401e1c0f98e4a07b3e6320449001b1b4cde7115ab14e2ae5fa139444","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"c2de81ddc47dc7090ae455cc2b4294f08f5b4089dfe793a2e4883b22fa18e645","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":300,"interest":0.04477611,"confirmations":1488,"spendable":false}, {"txid":"71284255a2d516f251cfe8ce0c206461976de1df242f05abbbe46faee6a5344a","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"4804cf9efa718b8ba660f2ea47b72a1ec5e286eeefc6281a174b16c1f94fc84a","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"3263c4f8b757d5b00b2af9e66f160bdea3b290dd1a9301bbe049ee7825f5134d","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"f66257bfef5c195f58e2d53442ff6296a8fd0ed41baf2e26449aea07b07f2f4f","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"981e4f5027914977bd3a6d80df39f3b8ac1115e1787b4e9c3cb404cc736e4b4f","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"025d08accffca27ea1617ad42cf01c1fcf546f7a50a93996890dfac77bf07c4f","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"f2c595ef64c90b2ec2881310ba5c70f8d15d11a3a3b01c72a2eccec89d8d6052","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":300,"interest":0.04477611,"confirmations":1489,"spendable":false}, {"txid":"e026ecf3d19a4f50d8442fdc8befc2e16a4778d81f8308348f3d27116e258b53","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"fa899878520795e32a9aea9c0bd13b728030e8a24832358ef9c0d98195fc6154","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":300,"interest":0.04477611,"confirmations":1488,"spendable":false}, {"txid":"536a9f329291b822314db2824c4704dc8d18418d72dd91270e47d23d6031ea54","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"8f19b5412752a5c40fdb56bce3a0a9f2dfffdae70a85b57b71db8138b3df9557","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"5860ce8988a700e0de8d5bdcf65f3f3e32f3e370ea0a4f033a4f866087419058","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"024e60a2161be4597bd00fdd657d5c0ea7cdbd98761abff205a14f7ce85dba59","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"f724f8209d243afc9f4aaa9428cd812620f1236ee454245a37e6cd4cbb64625a","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"8d1fbc63cac4a463387b12fd439bb6845ff5868c5446671354661d0f68a6a65e","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":300,"interest":0.04477611,"confirmations":1489,"spendable":false}, {"txid":"48aa3a5d74e81934df2a4b80e1bdab601e9af5978f3a01d800699d90108d2e5f","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"1a78ad0433140e20101989c0fb7a69b7afeadaf18addf1b0a05b199023d08d5f","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"d2965a90a28b4241aa02d1b13f7122ef7c771b2d591ecf744229c9a8500cfe5f","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"e1e48c18f70b93ca5578970dd2eba1c7ec99441580cf17c526c65d8218b37563","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"62cd788b85f835a49740e9750aca27c1d5a4ae6a6e5769fbe00183c279c2d964","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":300,"interest":0.04477611,"confirmations":1489,"spendable":false}, {"txid":"90981ea70656e0a846ad84b23f0aebbb1d51f263816048f1b2284cd2235ef564","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"03fd401667d7712442dd8cf792d00ec30dcd07ca3a9ea6492a44f4cd6d5e466a","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"80241e9fad9e973cfc0a297e70edc81d142e08e9ed86fa15efc09d2495d9026f","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"5479ec849719f0369253f9ce419809209ce027242cfa44f5ea8679d932889c6f","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":2000,"interest":0.29850746,"confirmations":1485,"spendable":false}, {"txid":"a9f7b136bd5520eb20b77a6f179ef60888460875e0042d70d01cf9f58d401671","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1492,"spendable":false}, {"txid":"e041cbbfe0eedbf8b54df9977f2ec0c0db3f1c8ae06445ae3cbf252ad430d872","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"5f2d3e0b3a78b97be5d9af844b5298ee6cf7084a9a2485feff194cb909321e73","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"b05b14dd2ea9c3ce1b29ef326cf338b6fc1064666eea68c66765be39419bf373","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"e1f25099c25c8f3a0112f3882f25306237cf8d249829bf639bb0ab507fec0774","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":300,"interest":0.04477611,"confirmations":1488,"spendable":false}, {"txid":"099bb04f4f3576f9f9834580934d92cacfea422b9fd36e0b1080f5ce16a28879","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"75caf7daeee4ea97eafc6cb6a4783212e5dd9feab1936f7f220f462c5810cc79","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"e578ae300c610bbf1d8436426e961e2e777d58cc478e00589679e75b9e1b987a","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"590789e454f25eec829f792f26591960dc1158ff45ee8a4defb8dd8c431ebf7a","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"b48836f4fdc45fb4ba9b4ae6a1884df1501a4b2fd9ad76b851bf122619b9227b","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":300,"interest":0.04477611,"confirmations":1488,"spendable":false}, {"txid":"f2863cabacf0052fd0cd55d3dd02753d52f65de578c7bd05ed091a7de51f027c","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"744d2189d3790bc5d87a3bc2a984e2dc73c5502ee963346cf84c6b8300fd7f7d","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"276717656e35a4198459e4b7485361a6b4d8ab6aff5cf64b82724a5c714dd480","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"4ea6114f32f75ef7eed71b97484aae65ccea1a49d0980013b3d26d5d2234fc82","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":300,"interest":0.04477611,"confirmations":1488,"spendable":false}, {"txid":"e3d1fa8c754257a3045269debf80558f3ee1a2ce468d3881da6f489080a07984","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"17d6a5a9518866da74fb69fb5ca6cc221e2d71fa4eee30588ae20b6d658d088a","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"a1536d8deb76fad4d4b0b4a03f8e5f367ad0b033b2a9baf2abea6ffabe699a8a","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"b2af9754e5c64b660486aa2b35a3c68ef590d5f1e89bee6b8c30b9bb6c35558c","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1492,"spendable":false}, {"txid":"9c6ae30087c48d7e9e050cd65bb7fadd04aa9362324a7135a2dbba77ac4a7b93","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"d5a51d74a2333f13074ffa51a1cdde003733a886e81427c6e313467ecff90994","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"4457f7b40c8c65f271f217cd4e6355b1b56fe6d1ca6fbca1c678970e0a7ffe98","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1492,"spendable":false}, {"txid":"7ed2a1a86feddebba4807329017392ab53d827a4897e196042825324cb1b2a99","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05970149,"confirmations":1489,"spendable":false}, {"txid":"c35372647c9ad0491e4c9915b76f184b24930cb21f05462ec9a3804a70b0a49c","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"aa761327a9465a04fafd1656a38a939c1adc4fb1688d819ad101eb3b5f87ed9e","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":180,"interest":0.02686567,"confirmations":1486,"spendable":false}, {"txid":"40fea0e96f89d1cefb73ce97f6ee34b22ac43417ec89c631931654c53761fa9e","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1492,"spendable":false}, {"txid":"9c6aa75a21b6df434004f757be9915c2fa845d2ab44375feae2f08d6d371fd9e","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"d649ddb2407dd123896335833d008ea8d3ab15a549c40140a4d0a277404e839f","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"14a6ce71ff2352effd255986e5dfdd001fe0674ed35d76695f960f2d14bab89f","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"1b9f83c5360cbe7a410f7f6b806ec176540034b8c8207df67af8c5e8dae6dca0","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1492,"spendable":false}, {"txid":"54b86c687ab22aefbe94a82799467f9b35a503575511f7090f4ebde4a25978a5","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"f6ba9adb19000f1dfc58fb2ded7d92d43b5a78b9ced54a3ba3ce1463c0b499a7","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":300,"interest":0.04477611,"confirmations":1488,"spendable":false}, {"txid":"627ec49bcedcc6b7a49e2ff7a51c7daa1cb4cd753b32e8a47ab7440d1d2f53aa","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":300,"interest":0.04477611,"confirmations":1488,"spendable":false}, {"txid":"52b8ef9950b8426bded18a42c133284d9ccaeffc4c4ffdf8044b49466ebbafaa","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"3c94c62b201c1bfd0c2127c91c95e9c1f5f29d92128876b3f173377353b86fab","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"321bc2832b8c203cc1bcddfaada71508493e7e2f0f2ab96b68c5314b0d521bb2","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"a77b9ad742cbb6e69d29759e7f8e46197b8fbc0eef2bad50085aabad72e6dbb4","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"e799975f3be1e7d24e2d7f01b6874bd1dce26f55baa1d1db5416af827e48c5b5","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"3dbd316a6633e15b7cc9372a19e57884cab681b3e3218373cc82ee822867f4b8","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"b3ab76f13e43761a2b949a0ed6d19a364f0aca72dfd7d68dc5ad0b5f971e01bd","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"24aa0819f11ed5ac6510345453f4ff076b370aa84475be47fee3679bb78f3fbe","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"f15a442f257718faacb193210e63b3c4fbd9cb3a50e4bfab2b2091e10c8913bf","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05970149,"confirmations":1489,"spendable":false}, {"txid":"9f870c16d5e099da52f62c53ca71314fa6b9dc56048125d4403e2dc15fbf1ebf","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":300,"interest":0.04477611,"confirmations":1488,"spendable":false}, {"txid":"cc616b4047ecc49f392c70d8533f8bf87f9ed446bb113a645418aac7be32a9bf","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"c0bca4d782ba21f04328e0f9be21c13e910f44aafc8b3ae19b110ecdd4d26cc0","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"13ed40b51eb9cac9970729986f31723bb364febab69bad094876971fa44c18c4","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"fbeae085df68ca2b7e51c7eea1e215ae6a9f3abd583bdc7b1a9b431ce3292fc4","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"6028eebda1ce97fe95f10e59bdab57f8efa3e5330c291c6980b1b1bf7fa978c7","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"96b524029a26f1a54b1a506c55a410787840aeee8f0a211b16ca9eabfc542ccc","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"61b0e85c06a0c8e1e144baa1035ad0c344755022ed0fa79dccdb664fb3345bcd","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"05f42847ce9f9959e09ef9d588634bdf00374200e4803717b0bd8f164adbacd1","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"e0e3db77664724a4755158b0259abb87133b0d8813cc82e5ce72482777c1d0d2","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":300,"interest":0.04477611,"confirmations":1489,"spendable":false}, {"txid":"4893a81673ffacd4a37eada50f503c39e88313d680d672e5e397761cb416a3d6","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"64bf0182a211177edbad70281040fb4eac0043d63d39f3c27db97b9cca4d3ed8","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"6d8acaacc7266d88b41fb0421289773f1de0289045f95b1071e2a9a648e395db","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"9d4b9092e61c00301ce306cebb34a9a8a70be11502a20f2664dc0fd53e4baedc","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":300,"interest":0.04477611,"confirmations":1489,"spendable":false}, {"txid":"2005f72c4aaedf83803077bf3f16735f63d9b3182e0381ed3aa03bd791f772de","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":300,"interest":0.04477611,"confirmations":1488,"spendable":false}, {"txid":"aa0a23b11cead6140a99fac8ca209d08dc55993339056fa0fb78bb4a9185f4de","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"6569a82c9b88398f2b6dc01cfef2cb93d50dca7c54808f533d16b604d8ef83e2","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1492,"spendable":false}, {"txid":"554fab524e105904868a4bb1d2c24d6eadee8289e74d489a4d74aaa931703ce3","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":300,"interest":0.04477611,"confirmations":1489,"spendable":false}, {"txid":"2227fd497e6387b3ff3f4168b3d74985c3838e73f7235afdf7c7564a8c5c1ee5","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"289da36f4fc0ea5d3f934eee4985e8769378b2652fee456400cb1131ba6419e9","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":300,"interest":0.04477611,"confirmations":1488,"spendable":false}, {"txid":"5425be5e3f870ecb98cf54d5f306bf83cba7d8beff7a10dc3a6549197fb7d4e9","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"284e3463bf15f2b3ae84be19fdddfbcdb8ee6bf17cc21aefff9c4c68f72b5eeb","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"b22edde937d33f5cf62db2839aa7888122410a7f1707758e90226f9c33c1d5f0","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"c8ebe761d0cb2b25d1db4fdbe86b5b1ea55f2581cf98bbc52fa70cd3c4cc33f2","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"0e8c4ff45f80ef7564ec3324c13875793b0a494de695fb36874062451953aaf6","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05970149,"confirmations":1489,"spendable":false}, {"txid":"29b3e84ee05f46cfe93f8f2178196eb190f29a7025724ce260b6a2fd3c48f8f6","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"d1ae8c56f3c4c3747f0b47b7ab91275c3dfb55505a6304e82810a550dbff8cf9","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"566ebced9422fa78611e22ee2fb98ba28ef939e98f0210e5c42159058f14ccf9","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"2baca693091d33364c2040c104ec0936b84e96364a75636ff176fb5696ce45fa","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"dfbdd7033500952ee496ecf474de4f8046e729e3b0e47537fab332ce30fac5fa","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":300,"interest":0.04477611,"confirmations":1488,"spendable":false}, {"txid":"960ea793c7f222f791c9db52ad2112c83be6dfe0286d6aeb9d5aae845016c8fc","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"e39528b63fb5cdcf188b0293200077d6dfde2496886876a9cbe051c658b0a7fd","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1491,"spendable":false}, {"txid":"db6a9f4466ae03a6add0b286da41f86680a900c6932f83916ca40612c56825fe","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05988023,"confirmations":1492,"spendable":false}, {"txid":"ae8ccf85dcaa7490551bd64fff0a6c9c43bd0c5cedc67371a1fec13acf638aff","vout":1,"address":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","account":"RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW","scriptPubKey":"76a9142fc1bbb9ee0051b8aef8ca0a55f5d9d0e610567188ac","amount":400,"interest":0.05970149,"confirmations":1489,"spendable":false}] +484157.62468750 <- expected amount RDdhvMj7k1ekyBp42bYEzxCVBVbprkGZPW +[{"txid":"7b21532d494f3af5d2f053884f2210c6583725a296c391c8d331069302fcd42f","vout":1,"address":"RHkK2ZCbWK35bDZkojVBCXTezoS9hqZDJ2","account":"RHkK2ZCbWK35bDZkojVBCXTezoS9hqZDJ2","scriptPubKey":"76a9145ce209b68ce8d7270d8064609218edf44c054c4f88ac","amount":9683.15249375,"interest":0,"confirmations":3,"spendable":false}] +9683.15249375 <- expected amount RHkK2ZCbWK35bDZkojVBCXTezoS9hqZDJ2 +[{"txid":"919a2ebedfcf6c88fa836e371b256088331f6934453168346d15bf45d96c7ea6","vout":1,"address":"RLcnhkZr56a9z7oLLrj9ZSoKicpnxPZVVH","account":"RLcnhkZr56a9z7oLLrj9ZSoKicpnxPZVVH","scriptPubKey":"76a9147c5e30b0189ee27fccde4d9eced2962d8fb35ba988ac","amount":8908.50029425,"interest":0,"confirmations":3,"spendable":false}] +8908.50029425 <- expected amount RLcnhkZr56a9z7oLLrj9ZSoKicpnxPZVVH +[{"txid":"939271c8ead6549cccb00bdd1f49ce8ca856a7b1c9885d61503a48eedd5c9858","vout":1,"address":"RJMikLhPMUv8t3Z8xycZpzdKPwv76yKbdA","account":"RJMikLhPMUv8t3Z8xycZpzdKPwv76yKbdA","scriptPubKey":"76a914639465bcf838c2958ed7684e256a3d9e4cc4a2d588ac","amount":502.18197380,"interest":0,"confirmations":3,"spendable":false}] +502.18197380 <- expected amount RJMikLhPMUv8t3Z8xycZpzdKPwv76yKbdA +[{"txid":"d69a774b813831055e034dcefeff61d98330ae0dbe37290a954cac3c4ec91d28","vout":1,"address":"RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW","account":"RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW","scriptPubKey":"76a9140acb4e5033ce249190419732da77cc407ba5279488ac","amount":17002.74354061,"interest":0,"confirmations":3,"spendable":false}] +17002.74354061 <- expected amount RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW +[{"txid":"58d710161e3badc90af5564af473cdbf6be6bace34309e54521462adfe4d5fd2","vout":1,"address":"RP6WfJVmgrtRT9DBywBtq48HBzBpspTU4J","account":"RP6WfJVmgrtRT9DBywBtq48HBzBpspTU4J","scriptPubKey":"76a914978cb28278917e0ee5d408d33c891dcf49e08ccb88ac","amount":149751.00241450,"interest":0,"confirmations":3,"spendable":false}] +149751.00241450 <- expected amount RP6WfJVmgrtRT9DBywBtq48HBzBpspTU4J +[{"txid":"333e392d27cfc8200f8fd86a4842f4dda4f81a0fadad89088da3361346e4b317","vout":1,"address":"RF6xs65r4k2okG9uvTx3D9Zz5yXhvjPvFe","account":"RF6xs65r4k2okG9uvTx3D9Zz5yXhvjPvFe","scriptPubKey":"76a9143fe1907a756620d9cf7c4752ef97127c8aea45ca88ac","amount":96831.52493750,"interest":0,"confirmations":3,"spendable":false}] +96831.52493750 <- expected amount RF6xs65r4k2okG9uvTx3D9Zz5yXhvjPvFe +[{"txid":"e071d015797ed3e9b508851b5dc4ac54f03756e5083024adbbe85412bbe3ce39","vout":1,"address":"RQS6HyxAdNjeAob3cee7TVXN3ptZowRBUh","account":"RQS6HyxAdNjeAob3cee7TVXN3ptZowRBUh","scriptPubKey":"76a914a638cd21581308dba197c0c1003b652a84c0c6f988ac","amount":18021.41836725,"interest":0,"confirmations":3,"spendable":false}] +18021.41836725 <- expected amount RQS6HyxAdNjeAob3cee7TVXN3ptZowRBUh +[{"txid":"4a29d95b927c4a6b7cc004f27e80ff76b991e74895971ca0c4c024cda65fe9be","vout":1,"address":"RCAP5E6YMeqbBZmbXmTq7cvhruyysyhuWk","account":"RCAP5E6YMeqbBZmbXmTq7cvhruyysyhuWk","scriptPubKey":"76a9141f9ea4cf71f4648097bba9218d84d07c4785b4f588ac","amount":41017.83396352,"interest":0,"confirmations":3,"spendable":false}] +41017.83396352 <- expected amount RCAP5E6YMeqbBZmbXmTq7cvhruyysyhuWk +[{"txid":"682512e2a527e15da96a7314968cd3fca787e4a818191a4ee4f06b65bf33354f","vout":1,"address":"R9Zv5ZZprWtw427XmGfNLTsH3Goe49Ghic","account":"R9Zv5ZZprWtw427XmGfNLTsH3Goe49Ghic","scriptPubKey":"76a9140329b744779e737b298404f7328a5870196f79ff88ac","amount":13263.41995905,"interest":0,"confirmations":3,"spendable":false}] +13263.41995905 <- expected amount R9Zv5ZZprWtw427XmGfNLTsH3Goe49Ghic +[{"txid":"6f218e175f456f96f1b4d0e8be63dfdde022aa1a0bc160f5be961a0ef37795d1","vout":1,"address":"RUipJV9DPtvCYA81w3EwkCr5DNQ99289zN","account":"RUipJV9DPtvCYA81w3EwkCr5DNQ99289zN","scriptPubKey":"76a914d54306e25ebc0bc6ad368b25f702ca5b6d3905c888ac","amount":8982.68540439,"interest":0,"confirmations":3,"spendable":false}] +8982.68540439 <- expected amount RUipJV9DPtvCYA81w3EwkCr5DNQ99289zN +[{"txid":"669b331517bd24a7b6b637d671df9b4f33fde73ed24d21faef8d0a2a92143a00","vout":33,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.06570807,"interest":0,"confirmations":1798,"spendable":false}, {"txid":"aaa6bf18981da0d057aad2205b43e4e686f67c32080e9e91371dd7da37164c05","vout":19,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00946668,"interest":0,"confirmations":1415,"spendable":false}, {"txid":"3d7fc9284b42d1ca64a128abe221c0b2caefb304d1c24012c8cf70571ae6bb06","vout":7,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00581894,"interest":0,"confirmations":1248,"spendable":false}, {"txid":"fb7b7652a9897128efc727d908d5068e1697b236fcd8f9822ec6f7bac90e2f07","vout":16,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00540089,"interest":0,"confirmations":1072,"spendable":false}, {"txid":"d9645c1e1ef2ee63bb872baea818def83cabc4880a3c20d811e22d704c926807","vout":6,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.02698551,"interest":0,"confirmations":1451,"spendable":false}, {"txid":"8f65756d5588197b0200dbbc7b9d8f561a7299ee68640840a9b944df6fb62b08","vout":17,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00663093,"interest":0,"confirmations":1362,"spendable":false}, {"txid":"cc2d87680c512cf9efe954e118de1b8c2e36bf90d726f2f336b53cc2af1bda08","vout":10,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00712655,"interest":0,"confirmations":1091,"spendable":false}, {"txid":"cbed45693e1ccc36954f8190562b995b3f0c034bf47e59422942bec05b29a70b","vout":13,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00612963,"interest":0,"confirmations":1341,"spendable":false}, {"txid":"862f8287715462b82f455b66ce29a46a739cbf70f57f11ca5f23bb968b5c720d","vout":1,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":12356.73789711,"interest":0,"confirmations":3,"spendable":false}, {"txid":"d21f7b49e7b3ea178a0f836abd7eaa34438a07473c8b8cfb3de60979d6f1e910","vout":11,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00495427,"interest":0,"confirmations":1117,"spendable":false}, {"txid":"9d54eac8674c56b9f333c5b5577d29d61443c55d4ce8e02f836285e5c255df13","vout":1,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00664330,"interest":0,"confirmations":1143,"spendable":false}, {"txid":"1884b6d5ca6956805379172f21d0e07409f9ef2468641a3798676baf1777c915","vout":13,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00880341,"interest":0,"confirmations":1191,"spendable":false}, {"txid":"003b4fcdec0edc36d76e0ed43d01ea1b4d968a1bf4dfd6e797dd6de1b8f7cf16","vout":21,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00444146,"interest":0,"confirmations":1301,"spendable":false}, {"txid":"e34cdd24333ba58909a7abece7e8a0d91144348225b73f1290d013cd7284a518","vout":1,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00789659,"interest":0,"confirmations":1264,"spendable":false}, {"txid":"db7bf23ef7289be05f47d9f495b350eb2651615cf7589e7563a3b98b4d519719","vout":13,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.01026458,"interest":0,"confirmations":1645,"spendable":false}, {"txid":"c498c532661e22c5b1261ba80f32ca15151661b9b56bdc8ac027164a7905f51a","vout":19,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00613531,"interest":0,"confirmations":1251,"spendable":false}, {"txid":"2ca2ef5408b97a4646031e2d78cfafb7892848fae835f503313c8d7d34ab471b","vout":15,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00665402,"interest":0,"confirmations":1149,"spendable":false}, {"txid":"352fc051230c1d876790d922c31eb1e1d985040cfee6726cba8fc2821c424d20","vout":16,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00701349,"interest":0,"confirmations":1467,"spendable":false}, {"txid":"c3561d377aac0da1b90ef510e4e831b789fc62cca98aa627624175fe16393023","vout":6,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.01100992,"interest":0,"confirmations":2701,"spendable":false}, {"txid":"993fbe0918af1f38603b57667387bdc02e3f44b8ad6acfcdec86b76365605a23","vout":10,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.01106048,"interest":0,"confirmations":1087,"spendable":false}, {"txid":"b07fa68d7aa5b3003966eadd6a938273906f711c48c9debc59f20d81c7b35328","vout":19,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00526488,"interest":0,"confirmations":1467,"spendable":false}, {"txid":"e803179a482cfeb95fbfcb8085eb1b4e391be9251cddaeb42f8c66a23a0d312a","vout":4,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00314295,"interest":0,"confirmations":1397,"spendable":false}, {"txid":"7026d021aeb4b5b942e2acc9f256f0cc1c92d45671c5055359d5ec50fa97d72c","vout":16,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00885260,"interest":0,"confirmations":1374,"spendable":false}, {"txid":"2baa69378c4925e19eb184dcad67f205762e5487e843494dd60efcaba1ac172d","vout":3,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00421993,"interest":0,"confirmations":1115,"spendable":false}, {"txid":"99fa9c033552a6048750447489adbc2dea26622c1001632f7b8c06b4accbce30","vout":12,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00566009,"interest":0,"confirmations":1372,"spendable":false}, {"txid":"c9d4ee0b3ff4df7eea1de6f3102c9a5591f6993fdef7f42ce33f2bb482abcd32","vout":4,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.01261726,"interest":0,"confirmations":1407,"spendable":false}, {"txid":"d1f05d205d984367c14a8a8438dca9e32e76b008e1d946469ac2e5d212079533","vout":9,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.01059540,"interest":0,"confirmations":1107,"spendable":false}, {"txid":"df8bb09b02ad3e8aaebe3165ab5f96e5bec5b80e63cd6c3bf967cfb69c5b5135","vout":9,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.01986436,"interest":0,"confirmations":2716,"spendable":false}, {"txid":"88a55a4f2633c5159a1a06de9918b2bf26d566c4640295b0cc4e6e6f48538737","vout":15,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00268519,"interest":0,"confirmations":1361,"spendable":false}, {"txid":"5f4f5659d4a3acd0539fc176d5139ce51491a3cf9eb83d602cf992257bcf933d","vout":13,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.02744666,"interest":0,"confirmations":1144,"spendable":false}, {"txid":"ffbcd4500aa048e2c1aa0c37fcbab94750eb3e02d18bc71f25db07182bf16a40","vout":9,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.01112878,"interest":0,"confirmations":1160,"spendable":false}, {"txid":"57f0a89aeb568bf57b974465d3b812246b32d2398d94db331abf15370aad8041","vout":10,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.01432566,"interest":0,"confirmations":1051,"spendable":false}, {"txid":"986418ea33eaba1278cb08a2dc305489c86cf22933eadfd58f9befd820458f41","vout":14,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00856760,"interest":0,"confirmations":1101,"spendable":false}, {"txid":"11395f83c4860b64e22ca77e07116b2e96a501565cb17cda329765ab00645242","vout":1,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00943416,"interest":0,"confirmations":1462,"spendable":false}, {"txid":"b536456595ba73aba63b69fb5075b9d1f5f289398376997c3c3fdb68734b9642","vout":11,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00612259,"interest":0,"confirmations":1399,"spendable":false}, {"txid":"f8a80427d6c0ef72eb64bba08c36b789a982c9d3ab0a3777f436c8eaa8f77644","vout":19,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00521255,"interest":0,"confirmations":1356,"spendable":false}, {"txid":"188a47e31739d850615e33edf4eed1d1c744e07559eb0c760780de17330e9b46","vout":8,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00910425,"interest":0,"confirmations":1343,"spendable":false}, {"txid":"3b7c97e7332838588de3f10a1e23d8c9a10872ada9be80fde0fc1ff561c23648","vout":11,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00952047,"interest":0,"confirmations":1417,"spendable":false}, {"txid":"5339d7d749dbb3c9314b35ae70f05dedbcc4e758d1e1bcb9abc7a3fc5329f349","vout":2,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.02073963,"interest":0,"confirmations":2721,"spendable":false}, {"txid":"3ba28a1307d0363570d5b706e6dd09aef743f0d05e693832ca765394f7c41e4e","vout":19,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00621014,"interest":0,"confirmations":1297,"spendable":false}, {"txid":"bfdca7f7e09dd3ef2e1c1c49e71fa3681f88a194a53ad95b208af01137959550","vout":17,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00733389,"interest":0,"confirmations":1265,"spendable":false}, {"txid":"1734b70fcb0c2123d8049bc56f394d9b50d22dc751367c7fbfd67b4cf989b252","vout":7,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00983429,"interest":0,"confirmations":1186,"spendable":false}, {"txid":"aba1765eae6ae3775c7d47f59bf58a374f05ae403cb4b6f9d986ef1a50811e57","vout":6,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.01065549,"interest":0,"confirmations":1301,"spendable":false}, {"txid":"9a0cc13dbe59242305096c841ae42221afb5fb851c43d321df70654971d7265a","vout":6,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.02459878,"interest":0,"confirmations":2734,"spendable":false}, {"txid":"2d9cd7054519b54db703f695f17714fd6bd5489f574841c23b0bb43a4bd7ba5d","vout":5,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.01329245,"interest":0,"confirmations":1126,"spendable":false}, {"txid":"9beb21735c0930ddf6bc9ea67b8f404aa9fe80072bf76ab81faf6ec9be99905f","vout":16,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00859989,"interest":0,"confirmations":1281,"spendable":false}, {"txid":"e9b48ecc042fbb6c77e6e4b21f43692d71d0144fa2c6b7ef794184a68ba0d760","vout":13,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00785788,"interest":0,"confirmations":1347,"spendable":false}, {"txid":"6d88e4e4ed0d8967da43d1b6eee83b94ad78d14c8877d06c82ac35bb60bcd760","vout":8,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00791355,"interest":0,"confirmations":1242,"spendable":false}, {"txid":"0c9e5e42b42716372cef64e57445a773116947308efea29ac113a86121fe3e63","vout":16,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00424481,"interest":0,"confirmations":1307,"spendable":false}, {"txid":"7af339ad8a87ec08698db03043a367670f76aa8dcd3c004ba9cf0dcd1428a864","vout":17,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00685187,"interest":0,"confirmations":1264,"spendable":false}, {"txid":"7ea70f558030df794bb1fa67e4e51d1c24f6d41b1cad8ebe327682a32b8f3365","vout":17,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00695979,"interest":0,"confirmations":1127,"spendable":false}, {"txid":"8e83163da7dd6da216b1f4d0d0ea940177245c7176260d080c8d36c85bef4567","vout":16,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00546768,"interest":0,"confirmations":1334,"spendable":false}, {"txid":"31410d5f178aea4df25161ce8719163bd440c493c718fbefd730cba49e263769","vout":7,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00968797,"interest":0,"confirmations":1346,"spendable":false}, {"txid":"3994fe679613f3145d3dd27109bab353e16fd8f5fb169e31b0690226ad9b3b69","vout":2,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00503324,"interest":0,"confirmations":1411,"spendable":false}, {"txid":"dc4fcd0a5c1d801c9609f46dd6cd4ae0770070b07ea61c3d8e316f690348e369","vout":21,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00282306,"interest":0,"confirmations":1395,"spendable":false}, {"txid":"b486834231262a28acd961276d53c27218c54319e1c9a258686754552185666a","vout":11,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00610634,"interest":0,"confirmations":1386,"spendable":false}, {"txid":"b193bd9f00033ee9995a4fb9b921bdc5b5c134f91e03342a11bc36c8ff9e0b6b","vout":6,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00969490,"interest":0,"confirmations":1167,"spendable":false}, {"txid":"5046a3807224c8b371cf02039b2f2de8cd303fd34bcbabf29aff0bbf6c875d6b","vout":18,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00630832,"interest":0,"confirmations":1291,"spendable":false}, {"txid":"3210eb89537fff99348bcf376b31ca58c2328d1a67491874ea8a26661daf846f","vout":13,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00713650,"interest":0,"confirmations":1146,"spendable":false}, {"txid":"131ee5ff930695508dcc0218c8b41f054bd659072ab9f75c82a8af0282dc2771","vout":20,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00368007,"interest":0,"confirmations":1368,"spendable":false}, {"txid":"121147ed84dad42ee323b813b6f9c6a5e1cd55f720d5d037b1f2409c5826f672","vout":13,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.01811952,"interest":0,"confirmations":1296,"spendable":false}, {"txid":"febe351b6b7ae6fa9bddb43a7d0a92ff7e90d8415a1ba8abbafea5852ce6f674","vout":18,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00372863,"interest":0,"confirmations":1047,"spendable":false}, {"txid":"487905accfbfee70b6098f6f430055331f84b34f00c5f9d58a0eb7ac41993575","vout":14,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00466854,"interest":0,"confirmations":1429,"spendable":false}, {"txid":"8c2c33d01e7c5f22a7476ead0d100eddb87699f89f87882e08443b4df5045675","vout":16,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00157732,"interest":0,"confirmations":1406,"spendable":false}, {"txid":"4184c1d46c913cb09515e2f84dfe5f11222ca236262c8b2bbe3f34d4cc876476","vout":19,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00642229,"interest":0,"confirmations":1391,"spendable":false}, {"txid":"4b3ec8b011f5f22fd9f23f893e3bd6ed03cf96c47df4f2f82a41b51f638d4678","vout":16,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00893917,"interest":0,"confirmations":1355,"spendable":false}, {"txid":"7e86b5169451ee5df16795ccdeb2626190c194741df98619433e1eb0be4ca079","vout":11,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00516451,"interest":0,"confirmations":1151,"spendable":false}, {"txid":"8f3acb4469da0e43de5d726749ebe043ec9a15247e2de0b6a3cf92347d3c3f7a","vout":13,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00864817,"interest":0,"confirmations":1105,"spendable":false}, {"txid":"0a32c2ec89847d1dcae3b2a11b162299da2feddd50b0aa7e19a2d7bc20e8827b","vout":10,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00597305,"interest":0,"confirmations":1117,"spendable":false}, {"txid":"060625cd637de926bc9e7f7cdba348f2d9b747df3537347c86f81acd63bc9881","vout":1,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00783683,"interest":0,"confirmations":1323,"spendable":false}, {"txid":"2e3deaad6d080a0bf827ff288c87028fd812996a3333d1e600095abe41e3668a","vout":11,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00550427,"interest":0,"confirmations":1120,"spendable":false}, {"txid":"c9450161135bc76cb18d8779eb2e0dd619cc89710de2107ae57b2369aa596f90","vout":19,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00887483,"interest":0,"confirmations":1438,"spendable":false}, {"txid":"5fe805b8f566d242e1a432c13a69684d2827c5de2ba3d97f291fedfcf5e75191","vout":13,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00790383,"interest":0,"confirmations":1350,"spendable":false}, {"txid":"96397faab2cf65f60fb8053ca6cd97b61f2716f20ada01d8297b8a9adcb89893","vout":3,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.01200450,"interest":0,"confirmations":1102,"spendable":false}, {"txid":"f193974d77f8ccc786b55ca717b6ed4faaaebc8587d61b12cdd7f4b4f6861796","vout":13,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00761196,"interest":0,"confirmations":1440,"spendable":false}, {"txid":"aad7678ce5c8c23c45a256218a0c1b023b134d7774427d2828e4d219748b0897","vout":6,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00626419,"interest":0,"confirmations":1332,"spendable":false}, {"txid":"1d9e90ccd04a3d0fd73060f864e4379593041dd606b602a23d61b9f09ef42498","vout":20,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00462091,"interest":0,"confirmations":1267,"spendable":false}, {"txid":"a6eada7c7495789373f858a6cb8f4ac9ebb2535982ea523a43a4a9f504d94399","vout":16,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00840952,"interest":0,"confirmations":1173,"spendable":false}, {"txid":"512c2d69db68f4391d9fb4c84d80fcf53e9b3a81e31e030c8a65fdbbc7a0de9c","vout":17,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.01178953,"interest":0,"confirmations":1082,"spendable":false}, {"txid":"2c8ae4adc0b0d7c40d938a8f38afd71feaec4a3144ac63d1c1a34eb0bd3aa19f","vout":10,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00716348,"interest":0,"confirmations":1270,"spendable":false}, {"txid":"b5a92680c52711ed0b16206276a4b45d063ca1243368c9d2cf1ee492b82144a2","vout":7,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00831259,"interest":0,"confirmations":1155,"spendable":false}, {"txid":"73470f45e3e4cba240115700971b1e6240ca13b3c62293204a03c77461cd55a2","vout":3,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.01006952,"interest":0,"confirmations":1093,"spendable":false}, {"txid":"22146d8a726420d7d1078cfb6b295c88349b0baa683de8eadc57572be786c4a5","vout":13,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.01730597,"interest":0,"confirmations":1134,"spendable":false}, {"txid":"6ef90f74424ace52371d633151c535678d2281b88e9fe06c14b313bac38fe5a8","vout":15,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00744924,"interest":0,"confirmations":1413,"spendable":false}, {"txid":"2f0c130a4aaa46600f7719002830a9f83842391587c6ef49860c30dfc6749dab","vout":9,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00864042,"interest":0,"confirmations":1068,"spendable":false}, {"txid":"49bd90bedeb580d5e3fcb617a3c141b408ba12379599721a2cd7ba7152a2a6ad","vout":12,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.01154847,"interest":0,"confirmations":1078,"spendable":false}, {"txid":"9342c64732d50dea3bac94fc0bc7b954bddeac3cb8b684bd2c8204b02c40ceae","vout":8,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.01840402,"interest":0,"confirmations":2659,"spendable":false}, {"txid":"dfb11f4f1e67111ffc9d60f6efb365e3a5f11e6cef084b4172381203831382b1","vout":1,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.01870672,"interest":0,"confirmations":2637,"spendable":false}, {"txid":"e1f21b4318ab46e0d211ed97ee01a704e53d98917f23f6c818100d986bd80bb2","vout":15,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00512471,"interest":0,"confirmations":1150,"spendable":false}, {"txid":"4bb2a7c478836f7e18a4cfa806cbceaa3fd9ff9aca58f4e755855443ccb620b2","vout":1,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.02202293,"interest":0,"confirmations":2717,"spendable":false}, {"txid":"c435df68eeef82a2bde58a1812b76bb3f8c00656a522ae9b860580e3467b5cb5","vout":17,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00580545,"interest":0,"confirmations":1129,"spendable":false}, {"txid":"4865355fc1baa8421a464cce4da2d315382e540971b1bcb124bbe5d8b03a86b7","vout":13,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00877250,"interest":0,"confirmations":1187,"spendable":false}, {"txid":"23dffe7825f8c505ad7fa20c0b2965fde26f23cb993468e50c8a9b9770df8bb9","vout":19,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00694376,"interest":0,"confirmations":1053,"spendable":false}, {"txid":"cc72da120b0fd652295452da0849a6cd1152217d3b1c8f7b65e79ccaba80bcba","vout":0,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.01418229,"interest":0,"confirmations":1636,"spendable":false}, {"txid":"a39ac2fd436c43578432a44839b9ce857d0f3fe3a533113420fc3cb76e8736bb","vout":16,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00624705,"interest":0,"confirmations":1137,"spendable":false}, {"txid":"7b2f034d2b2ad151f6e6c7115f7e7aa34c69e98d96b64e3f506feded029f04bc","vout":20,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00931144,"interest":0,"confirmations":1421,"spendable":false}, {"txid":"b98558e12045289dcd83f771539a857000a95597a0f60dfd6c5e0dbc65d5c2bc","vout":7,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00676310,"interest":0,"confirmations":1125,"spendable":false}, {"txid":"d0c58ec1be2ca99a43fb15bccde428646bafe29c5be94964077e25a0f4b884be","vout":14,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00774338,"interest":0,"confirmations":1076,"spendable":false}, {"txid":"dbbd3cc00162e951394b6d42923956a81b23ae00f2e48144abf5f297568cbfbe","vout":14,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.01053496,"interest":0,"confirmations":1387,"spendable":false}, {"txid":"75e7bc18236559f4bfc7dade78ed892a81a8a1f5275b88c25539cbd927040abf","vout":16,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00440310,"interest":0,"confirmations":1050,"spendable":false}, {"txid":"c33cffe0c00e3fd2f528288c9fd25ab95b5d5c01aab3201dc5cef0a0f0a58bc0","vout":20,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00262218,"interest":0,"confirmations":1450,"spendable":false}, {"txid":"1dfff8505abbd8c3aef5881089a0d5f4783b9a70872732881dd4d5abd5f305c4","vout":13,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.01086472,"interest":0,"confirmations":1414,"spendable":false}, {"txid":"279a6adee3aedf33bdfb365e1cb63b10a358ba74c933633df74d4f192621adc4","vout":17,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00439698,"interest":0,"confirmations":1232,"spendable":false}, {"txid":"1c67dac7c847799540b0c56821a3c475ee36acf436e42bbb8a6435f3f587b7c5","vout":10,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00652334,"interest":0,"confirmations":1179,"spendable":false}, {"txid":"23bf5d2f304de41e230ba77e061644266b4c22a6b91616c4aaa3d528a062ecc5","vout":17,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00877710,"interest":0,"confirmations":1194,"spendable":false}, {"txid":"a1d338ba13653499adbf27947f6065e1bc84a8744fb8a49535008fb13b2737c9","vout":12,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.01438530,"interest":0,"confirmations":1125,"spendable":false}, {"txid":"358fcdf9fdc20abbdb8f5fdbbd9585b8165ad3b0410c24a69aa53822abf792c9","vout":16,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00307368,"interest":0,"confirmations":1269,"spendable":false}, {"txid":"cdcdcf82ac51ae1dd38f58c3c689718bc8804abad3294c45840c4b858dda1cd1","vout":7,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00511442,"interest":0,"confirmations":1294,"spendable":false}, {"txid":"585435759b98ccc0d01175b8c8d2e719a7cb3939fb07ba959d8f3ba03d7c10d8","vout":15,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.01066779,"interest":0,"confirmations":1182,"spendable":false}, {"txid":"9988778e53f3a3eb76ca68f4cb7e9560ea93610b6bcece01c05a98f387bfd9da","vout":14,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00780207,"interest":0,"confirmations":1353,"spendable":false}, {"txid":"be31e40ff1416e7f89a3e049597f3fec4344a201e8d824f7b4a3737637b015db","vout":14,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.01404766,"interest":0,"confirmations":1100,"spendable":false}, {"txid":"20f05e8062fad7d21da0d9ae38000fefb1e1931519a2bf63431ac5e314a768db","vout":12,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00749217,"interest":0,"confirmations":1141,"spendable":false}, {"txid":"aeb39206af9af3a63c4817b3047b30cf866e3f5f0de5de164dff853ad4214bdf","vout":17,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00816592,"interest":0,"confirmations":1464,"spendable":false}, {"txid":"a8b79ea22755b4b5f5f9d3a1feb70a248d19557d38810f020303602c5cbb29e2","vout":1,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.01384652,"interest":0,"confirmations":1465,"spendable":false}, {"txid":"7bc3a326e928a04b05d3836a1457ab346eead59481d4cd127b301d001c6b9ee7","vout":17,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00720479,"interest":0,"confirmations":1314,"spendable":false}, {"txid":"8d51ab86bed67202fbfa6bc06ddd33295d100295db7ba51f0cc252e1e9cf24e8","vout":22,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00497993,"interest":0,"confirmations":1282,"spendable":false}, {"txid":"981960dcf355510ab467fad6c198525b02a788ffe88c9c74565a147300ee62e9","vout":8,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00989940,"interest":0,"confirmations":1409,"spendable":false}, {"txid":"ce213ee1a323195ee310ff4d2b5cb53df827f3734fe547a6f7fe1758ae0bf4ea","vout":6,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00768125,"interest":0,"confirmations":1134,"spendable":false}, {"txid":"691119613bc98b511ee059f650deed19037213ed232f8255088cb17bd8ac44ec","vout":13,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00664659,"interest":0,"confirmations":1384,"spendable":false}, {"txid":"fd2f68b95870dfd9f561ba774f35ff3d7b36c347188967ad862bfa2dbc72a2ec","vout":10,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.02082492,"interest":0,"confirmations":2718,"spendable":false}, {"txid":"3b4c897e393b69ce33a6c859df92b6329f4573014302038011c51ccd0ec03df1","vout":18,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00415590,"interest":0,"confirmations":1321,"spendable":false}, {"txid":"a9df763b38e7a74af38f8c712f2f17345f6f86f03ce0232247b85d36ec1b41f8","vout":11,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00452971,"interest":0,"confirmations":1289,"spendable":false}, {"txid":"31831080a4abc3bd5aab9561fe1ecf153b7a1250cbab945e94d48e77215322f9","vout":17,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00487729,"interest":0,"confirmations":1060,"spendable":false}, {"txid":"7fb8dac10ca8aaa6a43dc61b648808b4ddb08bed9dcc6b60c282754b9bf1eaf9","vout":7,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.02013728,"interest":0,"confirmations":2701,"spendable":false}, {"txid":"83c4343974bbc028fd8ea6f5747ee2eb13ceb3916d0fd5e1a686a25d02f837fa","vout":8,"address":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","account":"RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL","scriptPubKey":"76a9143e4867d0286093210984cc4dc2aabdd4e1c4da4c88ac","amount":0.00651217,"interest":0,"confirmations":1112,"spendable":false}] +12356.73789711 <- expected amount RExWiEUz3GAatrkEvXNj3N6rBpzm29wRrL +[{"txid":"eb6734a2f9ff4b8297fa91867286264cf8998e33d11474773bfd3fe5e0278d0b","vout":1,"address":"RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct","account":"RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct","scriptPubKey":"76a914aeb33755d5b9797988f0ab88e00765521e10bf4388ac","amount":50303.39904535,"interest":33.09434147,"confirmations":6102,"spendable":false}, {"txid":"1c8b0cdcc1c1dd7a6f0f490fb57294427436ef99d362e06ebe17877313464e16","vout":1,"address":"RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct","account":"RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct","scriptPubKey":"76a914aeb33755d5b9797988f0ab88e00765521e10bf4388ac","amount":50006.03027000,"interest":36.23625381,"confirmations":6706,"spendable":false}, {"txid":"e1e7e0a58e522106fe4d0f88948dd5f76adfe8e3029b8da0914d9db7b5e162e7","vout":1,"address":"RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct","account":"RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct","scriptPubKey":"76a914aeb33755d5b9797988f0ab88e00765521e10bf4388ac","amount":14070.80002269,"interest":5.96220339,"confirmations":3753,"spendable":false}] +12561.43380413 <- expected amount RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct +[{"txid":"e3c49fbe2d4ea57e5c83f6a72706a61178912bfe4dc18d5bfbb8835aa6a27139","vout":1,"address":"RKyuFwhojJgYNUQjuHWEcDUouiPHCpbRS6","account":"RKyuFwhojJgYNUQjuHWEcDUouiPHCpbRS6","scriptPubKey":"76a9147564457ef3063790d1d7470ddb03cbd2dcf062ee88ac","amount":4453.35929709,"interest":0,"confirmations":3,"spendable":false}] +4453.35929709 <- expected amount RKyuFwhojJgYNUQjuHWEcDUouiPHCpbRS6 +[{"txid":"826c78814f9725ff98200417d171ae0a6229bad39197a58df3dc02ab3cb6ce45","vout":1,"address":"RA9G36WwA9K95bn8Cbycq5ZnoxhSzzhhBw","account":"RA9G36WwA9K95bn8Cbycq5ZnoxhSzzhhBw","scriptPubKey":"76a91409781a2fa8f33ffbebdb0b866001c0d080a822d488ac","amount":4521.29210647,"interest":0,"confirmations":3,"spendable":false}, {"txid":"319a048094d2c8e707b0d7e96173efbb5f1e7141258a26a5ea7275ba8f20aec5","vout":1,"address":"RA9G36WwA9K95bn8Cbycq5ZnoxhSzzhhBw","account":"RA9G36WwA9K95bn8Cbycq5ZnoxhSzzhhBw","scriptPubKey":"76a91409781a2fa8f33ffbebdb0b866001c0d080a822d488ac","amount":868087.38826767,"interest":447.46772591,"confirmations":4819,"spendable":false}] +4521.29210647 <- expected amount RA9G36WwA9K95bn8Cbycq5ZnoxhSzzhhBw +[{"txid":"63a2314d5f88f7331ab55c696c1c978af200671a0ba89ba2c3a83c618f1a2890","vout":1,"address":"RHbf3qwhmmUBw3WNR5NYoMx3YH13JjXWrv","account":"RHbf3qwhmmUBw3WNR5NYoMx3YH13JjXWrv","scriptPubKey":"76a9145b3f020bc394703a9fcfcf2365363a3002f59a1e88ac","amount":11653.72856174,"interest":0,"confirmations":3,"spendable":false}] +11653.72856174 <- expected amount RHbf3qwhmmUBw3WNR5NYoMx3YH13JjXWrv +[{"txid":"1f9b50f730e18a267d4e0a1381d1a94544b8fdee8fe15b626b30f3bd6d0478a6","vout":1,"address":"RL2LycM1d3STMFXMN7ipcNfNejhieFeQDR","account":"RL2LycM1d3STMFXMN7ipcNfNejhieFeQDR","scriptPubKey":"76a91475da926fb76e671d645cdebee9de20795e1de4db88ac","amount":1561.74292091,"interest":0,"confirmations":2,"spendable":false}] +1561.74292091 <- expected amount RL2LycM1d3STMFXMN7ipcNfNejhieFeQDR +[{"txid":"1fdf240fe884fc0ca54f07e0eac9b39792dd2ddad10e5b528858f7cdb37f4762","vout":1,"address":"RDEKuSHP6Ues1gi4ex2vt9rpBEeKAqPWfv","account":"RDEKuSHP6Ues1gi4ex2vt9rpBEeKAqPWfv","scriptPubKey":"76a9142b55c9ca9a88801686be5f9b821956f72baecdc688ac","amount":25107.55827068,"interest":0,"confirmations":2,"spendable":false}] +25107.55827068 <- expected amount RDEKuSHP6Ues1gi4ex2vt9rpBEeKAqPWfv +[{"txid":"6d365c4ce11ccf2b5bd1635030616e73d38598de2bf8fb17a86ce1732dc3322c","vout":1,"address":"RQ1JfavGVxps1wXnhCfwnAbNoXn7ei1zMt","account":"RQ1JfavGVxps1wXnhCfwnAbNoXn7ei1zMt","scriptPubKey":"76a914a188baf22bc0aa0984d9d5442c96226ce26450ed88ac","amount":391.52338368,"interest":0,"confirmations":2,"spendable":false}] +391.52338368 <- expected amount RQ1JfavGVxps1wXnhCfwnAbNoXn7ei1zMt +[{"txid":"d74721f064415a3ceffac8a8ca55cb3d0017f692c4c1e3ec6f3818f4dcc0c812","vout":1,"address":"RAsxHJd4zrSxvhQedDeTRaANwv6eG9CYjx","account":"RAsxHJd4zrSxvhQedDeTRaANwv6eG9CYjx","scriptPubKey":"76a914118b2ae1526f5bc94d4dee641ac95a0b2d4f61c988ac","amount":2212.41539458,"interest":0,"confirmations":2,"spendable":false}] +2212.41539458 <- expected amount RAsxHJd4zrSxvhQedDeTRaANwv6eG9CYjx +[{"txid":"ed6261d0bf246e57c9acd4b08ee29ce0dccef714fb128e1dc9d6f4dc9e99336b","vout":1,"address":"RLADbn4XTgAbsCcENNhUPX2Kb5KcX7hfs5","account":"RLADbn4XTgAbsCcENNhUPX2Kb5KcX7hfs5","scriptPubKey":"76a9147757bdffcab398ea09edc8299a115117d1b80eff88ac","amount":12079.07428158,"interest":0,"confirmations":2,"spendable":false}] +12079.07428158 <- expected amount RLADbn4XTgAbsCcENNhUPX2Kb5KcX7hfs5 +[{"txid":"8d94f05fca74b59348108a8b949f98b18410776e57654da781a538d57ff5a6d7","vout":1,"address":"RELNTFjyhMRntuSbrvJSnG9LSt8ycmD5eh","account":"RELNTFjyhMRntuSbrvJSnG9LSt8ycmD5eh","scriptPubKey":"76a91437728989c5bee50920a145c009827d978007059288ac","amount":2323.95659850,"interest":0,"confirmations":2,"spendable":false}] +2323.95659850 <- expected amount RELNTFjyhMRntuSbrvJSnG9LSt8ycmD5eh +[{"txid":"7eaba7517f7a3027c36018d0a25f3ee540af3690729471ecd383bf1eb1313f51","vout":1,"address":"RFoHKWbcKrktCAdYJVGhrJ4g8dXQ1Cvy5r","account":"RFoHKWbcKrktCAdYJVGhrJ4g8dXQ1Cvy5r","scriptPubKey":"76a91447819bd839f7bcc4483fd7d4741da201e0bb598d88ac","amount":682.83148523,"interest":0,"confirmations":2,"spendable":false}] +682.83148523 <- expected amount RFoHKWbcKrktCAdYJVGhrJ4g8dXQ1Cvy5r +[{"txid":"19c01565bf79e109542aeeb45cb8dbda91963eba2b21ff76a05ae8c7b5984c8d","vout":1,"address":"RVTjyRex85TVcNwy5vW7JrmtfEt9y45Sx3","account":"RVTjyRex85TVcNwy5vW7JrmtfEt9y45Sx3","scriptPubKey":"76a914dd614cc5feeafc8b73c46797771cf9ac8c91343488ac","amount":48415.76246875,"interest":0,"confirmations":2,"spendable":false}] +48415.76246875 <- expected amount RVTjyRex85TVcNwy5vW7JrmtfEt9y45Sx3 +[{"txid":"0fe813014cf95822730981d8905f9a7a2ccf1ebb1344fbcdf3be7f7b5f542618","vout":1,"address":"RM9QCciRjSeoctNUzwfVh2gY6H8Qfc2anD","account":"RM9QCciRjSeoctNUzwfVh2gY6H8Qfc2anD","scriptPubKey":"76a91482284d0e543aa213647fbffa6ac9ec16abe8c71988ac","amount":8133.84809475,"interest":0,"confirmations":2,"spendable":false}] +8133.84809475 <- expected amount RM9QCciRjSeoctNUzwfVh2gY6H8Qfc2anD +[{"txid":"fa44d50d6af4bacb6619acacf420538e012de6eeb0f436ef9c4d34f315317970","vout":1,"address":"RAaszCNodXXu9rJL6qqVMZDykXncDecTMS","account":"RAaszCNodXXu9rJL6qqVMZDykXncDecTMS","scriptPubKey":"76a9140e5082ca36cc024a4dca642c987ac4dd5947800988ac","amount":0.75495995,"interest":0,"confirmations":3108,"spendable":false}, {"txid":"76dd0c3f7acfc2f12d1c140f228d82753182e86374660d8651f83683bebe20b2","vout":1,"address":"RAaszCNodXXu9rJL6qqVMZDykXncDecTMS","account":"RAaszCNodXXu9rJL6qqVMZDykXncDecTMS","scriptPubKey":"76a9140e5082ca36cc024a4dca642c987ac4dd5947800988ac","amount":693.08132289,"interest":0,"confirmations":2,"spendable":false}] +693.08132289 <- expected amount RAaszCNodXXu9rJL6qqVMZDykXncDecTMS +[{"txid":"61e32c84221d569c5b449d0992f36eff52f092abcfd029015949b537bb081969","vout":1,"address":"RUxvWRVR7xEqTbxF43nE1roPXfppbsDL57","account":"RUxvWRVR7xEqTbxF43nE1roPXfppbsDL57","scriptPubKey":"76a914d7ee07dc677d00cab9d78fffd2e18b1af661781988ac","amount":1773.66877470,"interest":0,"confirmations":2,"spendable":false}] +1773.66877470 <- expected amount RUxvWRVR7xEqTbxF43nE1roPXfppbsDL57 +[{"txid":"93ffd2beecc84da8c6bf084509db507ed03fb12049128ef356a2d6f739716d60","vout":1,"address":"RASmNV8wHNdhU78WnoFwu9aLpM4zS4EFNa","account":"RASmNV8wHNdhU78WnoFwu9aLpM4zS4EFNa","scriptPubKey":"76a9140cc7a922f193aa8b78f5a6f4a77fdff7ec8ca54588ac","amount":2971.54458972,"interest":0,"confirmations":2,"spendable":false}] +2971.54458972 <- expected amount RASmNV8wHNdhU78WnoFwu9aLpM4zS4EFNa +[{"txid":"4264b28ca78c9bacedc50befb824e82b8fd16873a75bc02874908949ce1bdd4f","vout":1,"address":"RGfFiiX5euPb4GCpB76VfVdrFJhPWoJZQR","account":"RGfFiiX5euPb4GCpB76VfVdrFJhPWoJZQR","scriptPubKey":"76a91450f5124256108379f7d7d47feb68d9b26ff1f4a588ac","amount":3351.00027124,"interest":0,"confirmations":2,"spendable":false}] +3351.00027124 <- expected amount RGfFiiX5euPb4GCpB76VfVdrFJhPWoJZQR + diff --git a/iguana/tests/REVS.batch6 b/iguana/tests/REVS.batch6 index 958a4195f..88ba59bc4 100755 --- a/iguana/tests/REVS.batch6 +++ b/iguana/tests/REVS.batch6 @@ -1,3 +1,4 @@ +sleep 99999 # RVbdZ1ki4piJF9NNBVbgc49r7KccxJL6oc KMD 23246.75713145, REVS 66.39295712 sleep 1 fiat/revs sendtoaddress RVbdZ1ki4piJF9NNBVbgc49r7KccxJL6oc 66.39295712 @@ -15,3 +16,9 @@ sleep 1 fiat/revs sendtoaddress RFoHKWbcKrktCAdYJVGhrJ4g8dXQ1Cvy5r 13.54307355 # total KMD 0.00000000 REVS 478.69546321 +af290c5d5e12a44d46de9942f8cda407ca85bf44c9cf390523c5e21c3a851322 +f4c8e606db994bf65b788bcbd0a8976ff1287ff5d6744a0652d6aa9da284a725 +c230ad49f773fd59b84c1267d4373a7679cd231aaf1fd27329ad8e9d29708e2a +03b0b119d20d181ccc687f01c17a6017e7718f8f74f68059d4a8de3e52db0c0b +5a24fba048923f922d4e417ceac0157c56c7d03d26b0a9b2867d0013549de27c + From ca02a906ff71734b5e929a0917ba5444f54b76d5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 6 Feb 2017 21:05:22 +0200 Subject: [PATCH 006/495] test --- iguana/dpow/dpow_network.c | 2 +- iguana/tests/dexlistunspent | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 4bae54ed2..91b2a7e66 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1858,7 +1858,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) > 0 ) { num++; - //printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); + printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); if ( (retstr= dex_response(&broadcastflag,myinfo,dexp)) != 0 ) { signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,retstr,(int32_t)strlen(retstr)+1); diff --git a/iguana/tests/dexlistunspent b/iguana/tests/dexlistunspent index 76f86fe2c..2ddf10690 100755 --- a/iguana/tests/dexlistunspent +++ b/iguana/tests/dexlistunspent @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"R9YZPUTTVNcnKpuQ4JgMaxYzLXmeWA3msY\",\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RSTKuMryZW56yf3kdEXhMJG8Hy9TwvHwYs\",\"symbol\":\"KMD\"}" From dd0f66a00be1c717794c81e4c1f86f5ad89cbcaf Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 6 Feb 2017 21:12:00 +0200 Subject: [PATCH 007/495] test --- iguana/dpow/dpow_network.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 91b2a7e66..3beb8d45a 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -632,7 +632,7 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 { if ( (retstrs[j]= _dex_reqsend(myinfo,handler,0,0,data,datalen)) != 0 ) { - //printf("j.%d of max.%d M.%d (%s)\n",j,max,M,retstrs[j]); + printf("j.%d of max.%d M.%d (%s)\n",j,max,M,retstrs[j]); if ( strncmp(retstrs[j],"{\"error\":\"null return\"}",strlen("{\"error\":\"null return\"}")) != 0 && strncmp(retstrs[j],"[]",strlen("[]")) != 0 && strcmp("0",retstrs[j]) != 0 ) { if ( ++j == M ) @@ -1855,10 +1855,10 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) } if ( myinfo->repsock >= 0 ) // from clients { - if ( (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) > 0 ) + while ( (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) > 0 ) { num++; - printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); + //printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); if ( (retstr= dex_response(&broadcastflag,myinfo,dexp)) != 0 ) { signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,retstr,(int32_t)strlen(retstr)+1); @@ -1891,6 +1891,8 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) // nn_freemsg(freeptr), dexp = 0, freeptr = 0; if ( dexp != 0 ) nn_freemsg(dexp), dexp = 0; + if ( num > 1000 ) + break; } } portable_mutex_unlock(&myinfo->dpowmutex); From ae0c354e74480168e312b6caddad8b5bd58613ce Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 7 Feb 2017 05:52:07 +0200 Subject: [PATCH 008/495] test --- iguana/iguana_payments.c | 12 ++++++++++-- iguana/main.c | 3 +++ iguana/tests/deximportaddress | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index bae043847..9e3a10102 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -410,7 +410,7 @@ uint64_t iguana_interests(struct supernet_info *myinfo,struct iguana_info *coin, char *iguana_calcrawtx(struct supernet_info *myinfo,struct iguana_info *coin,cJSON **vinsp,cJSON *txobj,int64_t satoshis,char *changeaddr,int64_t txfee,cJSON *addresses,int32_t minconf,uint8_t *opreturn,int32_t oplen,int64_t burnamount,char *remoteaddr,struct vin_info *V,int32_t maxmode) { - uint8_t addrtype,rmd160[20],spendscript[IGUANA_MAXSCRIPTSIZE]; char *coinaddr; int32_t allocflag=0,max,i,j,m,n,num,spendlen; char *spendscriptstr,*rawtx=0; bits256 txid; cJSON *vins=0,*array,*item; uint64_t value,avail=0,total,change; struct iguana_outpoint *unspents = 0; + uint8_t addrtype,rmd160[20],spendscript[IGUANA_MAXSCRIPTSIZE]; char *coinaddr; int32_t allocflag=0,max,i,j,m,n,num,spendlen; char *spendscriptstr,*rawtx=0; bits256 txid; cJSON *vins=0,*array,*item; uint64_t value,avail=0,total,change,interest; struct iguana_outpoint *unspents = 0; *vinsp = 0; max = 0;//10000; satoshis += burnamount; @@ -436,6 +436,8 @@ char *iguana_calcrawtx(struct supernet_info *myinfo,struct iguana_info *coin,cJS } unspents = realloc(unspents,(1 + max) * sizeof(*unspents)); value = jdouble(item,"amount") * SATOSHIDEN; + if ( jdouble(item,"interest") != 0 ) + printf("utxo has interest of %.8f\n",jdouble(item,"interest")); iguana_outptset(myinfo,coin,&unspents[max++],jbits256(item,"txid"),jint(item,"vout"),value,spendscriptstr); avail += value; } @@ -458,7 +460,13 @@ char *iguana_calcrawtx(struct supernet_info *myinfo,struct iguana_info *coin,cJS if ( (vins= iguana_RTinputsjson(myinfo,coin,&total,satoshis + txfee,unspents,num,maxmode)) != 0 ) { if ( strcmp(coin->symbol,"KMD") == 0 ) - total += iguana_interests(myinfo,coin,vins); + { + if ( (interest= iguana_interests(myinfo,coin,vins)) != 0 ) + { + total += interest; + printf("boost total by interest %.8f\n",dstr(interest)); + } + } if ( total < (satoshis + txfee) ) { free_json(vins); diff --git a/iguana/main.c b/iguana/main.c index 0e479eb49..31524bd16 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1778,3 +1778,6 @@ void iguana_main(void *arg) iguana_launchdaemons(myinfo); } +// features +// komodod convert passphrase to privkey +// iguana init nanomsg in own thread \ No newline at end of file diff --git a/iguana/tests/deximportaddress b/iguana/tests/deximportaddress index b64cd1285..a4a923291 100755 --- a/iguana/tests/deximportaddress +++ b/iguana/tests/deximportaddress @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RHSA9ocZc77tHiFvVQ2h26AJQFsionWAXK\",\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"R9pgJYo7ZeTJPQWJYHxgmdM8uXY6Pv7NUe\",\"symbol\":\"KMD\"}" From 6d648fc82c5c7294a4df15e0940b649b35678d7a Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 7 Feb 2017 05:57:00 +0200 Subject: [PATCH 009/495] test --- iguana/dpow/dpow_network.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 3beb8d45a..60f0ef234 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1727,7 +1727,9 @@ void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t * int32_t i,j,matched,missing,n; char ipaddr[64]; if ( numipbits >= 64 ) { - printf("dpow_ipbitsadd reject from.%d numipbits.%d\n",fromid,numipbits); + static int32_t counter; + if ( counter++ < 100 ) + printf("dpow_ipbitsadd reject from.%d numipbits.%d\n",fromid,numipbits); return; } n = dp->numipbits; From d1131d53a0185780565945dc5a09664cdd059ee8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 7 Feb 2017 06:10:24 +0200 Subject: [PATCH 010/495] test --- iguana/dPoW.h | 2 +- iguana/dpow/dpow_network.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index fbb9f006d..234f895d1 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -137,7 +137,7 @@ struct dpow_info int32_t lastheight,maxblocks,SRCHEIGHT,SHORTFLAG,ratifying; struct pax_transaction *PAX; portable_mutex_t paxmutex,dexmutex; - uint32_t ipbits[64],numipbits; + uint32_t ipbits[100],numipbits; struct dpow_block **blocks; }; uint64_t dpow_notarybestk(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp); diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 60f0ef234..609885972 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1015,7 +1015,7 @@ struct dpow_nanomsghdr { bits256 srchash,desthash; struct dpow_nanoutxo ratify,notarize; - uint32_t channel,height,size,datalen,crc32,myipbits,numipbits,ipbits[64]; + uint32_t channel,height,size,datalen,crc32,myipbits,numipbits,ipbits[100]; char symbol[16]; uint8_t senderind,version0,version1,packet[]; } PACKED; @@ -1725,7 +1725,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t *ipbits,int32_t numipbits,int32_t fromid,uint32_t senderipbits) { int32_t i,j,matched,missing,n; char ipaddr[64]; - if ( numipbits >= 64 ) + if ( numipbits > sizeof(dp->ipbits)/sizeof(*dp->ipbits) ) { static int32_t counter; if ( counter++ < 100 ) From 5d8427a94b0a52bebfcc89f3de3a736abbe9837d Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 7 Feb 2017 10:27:06 +0200 Subject: [PATCH 011/495] test --- iguana/dPoW.h | 2 +- iguana/dpow/dpow_network.c | 4 ++-- iguana/tests/dexlistunspent | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 234f895d1..fbb9f006d 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -137,7 +137,7 @@ struct dpow_info int32_t lastheight,maxblocks,SRCHEIGHT,SHORTFLAG,ratifying; struct pax_transaction *PAX; portable_mutex_t paxmutex,dexmutex; - uint32_t ipbits[100],numipbits; + uint32_t ipbits[64],numipbits; struct dpow_block **blocks; }; uint64_t dpow_notarybestk(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp); diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 609885972..60f0ef234 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1015,7 +1015,7 @@ struct dpow_nanomsghdr { bits256 srchash,desthash; struct dpow_nanoutxo ratify,notarize; - uint32_t channel,height,size,datalen,crc32,myipbits,numipbits,ipbits[100]; + uint32_t channel,height,size,datalen,crc32,myipbits,numipbits,ipbits[64]; char symbol[16]; uint8_t senderind,version0,version1,packet[]; } PACKED; @@ -1725,7 +1725,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t *ipbits,int32_t numipbits,int32_t fromid,uint32_t senderipbits) { int32_t i,j,matched,missing,n; char ipaddr[64]; - if ( numipbits > sizeof(dp->ipbits)/sizeof(*dp->ipbits) ) + if ( numipbits >= 64 ) { static int32_t counter; if ( counter++ < 100 ) diff --git a/iguana/tests/dexlistunspent b/iguana/tests/dexlistunspent index 2ddf10690..7d7838709 100755 --- a/iguana/tests/dexlistunspent +++ b/iguana/tests/dexlistunspent @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RSTKuMryZW56yf3kdEXhMJG8Hy9TwvHwYs\",\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RKyuFwhojJgYNUQjuHWEcDUouiPHCpbRS6\",\"symbol\":\"KMD\"}" From d56681b7d3e2dcec8a7676d6083951312c71fdfd Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 7 Feb 2017 16:28:47 +0200 Subject: [PATCH 012/495] add back dex check address --- iguana/main.c | 1 + iguana/tests/dexlistunspent | 2 +- iguana/tests/listunspent | 2 +- includes/iguana_apideclares.h | 1 + 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/iguana/main.c b/iguana/main.c index 31524bd16..5505629e4 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1780,4 +1780,5 @@ void iguana_main(void *arg) // features // komodod convert passphrase to privkey +// Z -> Z // iguana init nanomsg in own thread \ No newline at end of file diff --git a/iguana/tests/dexlistunspent b/iguana/tests/dexlistunspent index 7d7838709..eacff16cc 100755 --- a/iguana/tests/dexlistunspent +++ b/iguana/tests/dexlistunspent @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RKyuFwhojJgYNUQjuHWEcDUouiPHCpbRS6\",\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RU58D7nNLXwD29hgC2MPgtAF458gGxnPYS\",\"symbol\":\"KMD\"}" diff --git a/iguana/tests/listunspent b/iguana/tests/listunspent index bec4770b5..7457d95e3 100755 --- a/iguana/tests/listunspent +++ b/iguana/tests/listunspent @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"coin\":\"KMD\",\"method\":\"listunspent\",\"params\":[1, 9999999, []]}" +curl --url "http://127.0.0.1:7778" --data "{\"coin\":\"KMD\",\"method\":\"listunspent\",\"params\":[1, 9999999, [\"RU58D7nNLXwD29hgC2MPgtAF458gGxnPYS\"]]}" diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index cae8b60f4..8f621e2fb 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -37,6 +37,7 @@ TWO_STRINGS(dex,sendrawtransaction,symbol,signedtx); HASH_AND_STRING_AND_INT(dex,gettxout,txid,symbol,vout); TWO_STRINGS(dex,importaddress,symbol,address); TWO_STRINGS(dex,validateaddress,symbol,address); +TWO_STRINGS(dex,checkaddress,symbol,address); TWO_STRINGS(dex,listunspent,symbol,address); TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions,symbol,address,count,skip); TWO_STRINGS(dex,kvsearch,symbol,key); From c6db73c9c635b689c52b4616a319d98c2811aa4e Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 7 Feb 2017 20:44:38 +0200 Subject: [PATCH 013/495] batch7 --- iguana/main.c | 12 +- iguana/tests/KMD.batch7 | 236 +++++++++++++++++++++++++ iguana/tests/KMD.batch7.importaddress | 234 ++++++++++++++++++++++++ iguana/tests/KMD.batch7.listunspent | 188 ++++++++++++++++++++ iguana/tests/REVS.batch7 | 14 ++ iguana/tests/REVS.batch7.importaddress | 11 ++ iguana/tests/dexlisttransactions | 8 +- iguana/tests/listunspent | 2 +- 8 files changed, 695 insertions(+), 10 deletions(-) create mode 100755 iguana/tests/KMD.batch7 create mode 100755 iguana/tests/KMD.batch7.importaddress create mode 100755 iguana/tests/KMD.batch7.listunspent create mode 100755 iguana/tests/REVS.batch7 create mode 100755 iguana/tests/REVS.batch7.importaddress diff --git a/iguana/main.c b/iguana/main.c index 5505629e4..77eb104c9 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1575,7 +1575,7 @@ void komodo_ICO_batch(cJSON *array,int32_t batchid) if ( (n= cJSON_GetArraySize(array)) > 0 ) { totalKMD = totalREVS = 0; - for (iter=3; iter<4; iter++) + for (iter=0; iter<1; iter++) for (i=0; i Date: Tue, 7 Feb 2017 22:18:39 +0200 Subject: [PATCH 014/495] batch7 --- iguana/dpow/dpow_network.c | 2 +- iguana/tests/KMD.batch7 | 1 + iguana/tests/KMD.batch7.txids | 92 +++++++++++++++++++++++++++++++ iguana/tests/KMD.batch7.unspents | 93 ++++++++++++++++++++++++++++++++ iguana/tests/REVS.batch7 | 6 +++ 5 files changed, 193 insertions(+), 1 deletion(-) create mode 100644 iguana/tests/KMD.batch7.txids create mode 100644 iguana/tests/KMD.batch7.unspents diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 60f0ef234..a0903c9c8 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -632,7 +632,7 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 { if ( (retstrs[j]= _dex_reqsend(myinfo,handler,0,0,data,datalen)) != 0 ) { - printf("j.%d of max.%d M.%d (%s)\n",j,max,M,retstrs[j]); + //printf("j.%d of max.%d M.%d (%s)\n",j,max,M,retstrs[j]); if ( strncmp(retstrs[j],"{\"error\":\"null return\"}",strlen("{\"error\":\"null return\"}")) != 0 && strncmp(retstrs[j],"[]",strlen("[]")) != 0 && strcmp("0",retstrs[j]) != 0 ) { if ( ++j == M ) diff --git a/iguana/tests/KMD.batch7 b/iguana/tests/KMD.batch7 index 780661c99..a2e06e71e 100755 --- a/iguana/tests/KMD.batch7 +++ b/iguana/tests/KMD.batch7 @@ -1,3 +1,4 @@ +sleep 9999999 # RRcW51evLjdXhEne82mejRwTf8RAMvPxbf KMD 9682.18417850 ./komodo-cli sendtoaddress RRcW51evLjdXhEne82mejRwTf8RAMvPxbf 9682.18417850 sleep 3 diff --git a/iguana/tests/KMD.batch7.txids b/iguana/tests/KMD.batch7.txids new file mode 100644 index 000000000..06a5f4ca4 --- /dev/null +++ b/iguana/tests/KMD.batch7.txids @@ -0,0 +1,92 @@ +8cd3a16bcea015bfc92f2d326e6b988bb54d247aecb3d1f2900143e8d995cfa6 +9682.18417850 <- expected amount RRcW51evLjdXhEne82mejRwTf8RAMvPxbf +9b5c2726c7839c61459eaa9710569a8e2ab0714eafe9c9fd29820365220ef33c +19824.65353390 <- expected amount RRtJZXkyye8CdgkiqqU2vDBzVL8br8v7qi +f9020d31431382ac11164ec811b9cb2d57d99bcfa08a39d11a942b798d4dc4d7 +5932.50248029 <- expected amount RRu4rm9zCpK41rSMn4NPtgrmcmHXBStQda +41798069952a568fd9f365c1c1fc763c2b01e036de731ab72183549dbdc3f2a4 +3202.01278205 <- expected amount RRHcvhUfvmTFvyju9HxYUMG7ak2rAsZUG2 +b4a4a8e4a5c8d22cdc788a0365d61c5f0e76c120a57218a63b15d4b595b5cbab +2.29796059 <- expected amount RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3 +a27f10d1ccb049c6750f3e8721e7174160dddabe152ab8f068e6a9502be8d281 +11827.69657925 <- expected amount RWdo833bYVhMUHRdr8hMs7HHVcG2UNPwcZ +12d6b517710a5cd43c8fe96673a5a196e8a0bb1af363b8b8057a07cb6f775796 +9757.57240097 <- expected amount RJ9qXMATAvg1B5B5KGtiNS8cVv37JNpw8u +6cfeb1fefded1a795f8a749ca01a700951e3bc49f6a044cbb6ca3c322d231c1b +495.97007681 <- expected amount RAMvDwi58oyArqfGseWZsYbR2BN3L7ghVX +cc31790b130925334b77409f5d517fed1fce5a2d17fec61318a151e7b8d9366e +138721.51640953 <- expected amount RFsV4VaRdzLLFHotqsxZbim2ARwP8VHxJH +1d86cb9d2359131164da3c8ff6198c4c7958da2fb406ccd346ddaa8afb09fbe6 +693.08132289 <- expected amount RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv +1f77bfa557a3bc9b6493327fb6ce05c8e15aa088864a01e39cded9cc5159cafb +1174.11345835 <- expected amount RV6bZE1shV9HufX9hztv7NdwwZXtPNGnmc +114c24ba300ea0b3c65a6c9964ab6d3f827b819a4ee1969d26af2b7208acac7b +9683.15249375 <- expected amount RY5xeuFcrPgBQTtmsrNyo8Ha85z8CsQsQA +70aabe32dc0619b4aa44fd6a6a3265185a68aa72160a861e992daa9d55dd645e +47.52053869 <- expected amount RF11xHFssjxqa4UhUtZmReeb2w8ikmzkzL +a3fb5c58e47085a89777ef9d798a802b78541644eed56ef503b7bdad86e15551 +845.90749755 <- expected amount RWEq3Sf4H93Agwxf1ARD1MaPNCfBj54Zfx +05919d2d60ea93443f212e3ca50eeb93cbbdb29c0a42d5ef1ddacfe355dfbb6b +1660.54445484 <- expected amount RFuBgn2XPbePzKwWeiXYGdsACJutKkcH3x +009c59457de9585d9358c255ee467fe55157a071ff77c391865609fda8feba01 +55313.07943406 <- expected amount RAo9Anrzy7Whzaxmp3tF5ZFTe77DPJUerN +263170b1598bf0e3b427892696ce270abf095f04b88619c56e7c1a2a9057365a +30986.08798000 <- expected amount RPEVJbazc37eXGGJhdZoN7Bo2B71kS1cBc +cb98a81a04b900342b9d1f5d656d664967c0b7cbc3048dd900e112504d0ff0f8 +34809.11928944 <- expected amount RCNwFTJFxjxEVqsbr81Ug41E3K8fCjktwj +8a5734622e1bcc9ef05db4fe24f4a63fff7ac30365dd6187b5ec8dc2278ab022 +4331.80770687 <- expected amount RKuwq4oi4mqQ2V4r54mPEthn3TBrEwu2Ni +b20de3d53333117c80dc06500f057d236046a8a77013f9c05c71f098347aead0 +880.19856168 <- expected amount RKXi56k97RZcs6CW2chTL286HSjgrEtAsN +948c6dc337fe38a331194f3096b1e313889072946fdc166a152acf8bb3faa879 +967.34693412 <- expected amount RKNkMHyMWcK84T6JJ4MRYgSUuKZqPPfGYx +56f5ff948e5fe94fc43ff48b5f4631a4bf633f3b6ea139a8ebe573df2a776472 +1192.08225695 <- expected amount RBn7LuP4xLM3Yq881BSNQ1gXCjDU8at4fr +ec23e9454fd3fcd67382c440a8f3aba51b8531ac9c55d7489d3e772f66ab8c6d +405.34611747 <- expected amount RW2xS8dpxjudqBX1hqxShP7FWn8EHYH4Rb +447bd75fe3d7af09d0405293cfda35a81f1e599ea2405c0ccc0c154fddb03eb7 +6712.04424766 <- expected amount RUqYxcjB5Hy6eqK1YDimjfXfhfp5TSyCF4 +8d6ca5f467b75964b12ff6ad645c082cea67f7c5e10c24a781078158688b4da5 +6087.83670543 <- expected amount RNvB5SiEEmGQrwFfyYXuDfeSWPDj35ypqA +dba293859a6b57a0777e8d88dbe981172afdc25f8049104db26c7208703726b3 +11792.89870264 <- expected amount RStGPxQ5amuNV4f7g8A1FhDj74qGeAXRgC +0dd51507754ba5d2fa6933531fc8e0365e6b59b6fc68d85cd100b72e2ba86ed6 +22265.01478541 <- expected amount RXiwnYTrCgxrxa5vrCuG8sUqKstu3Yn5on +b38302f4073bf1c23593cb589c6ceee8d4a98c95830a337871ece310f904a040 +9295.82639400 <- expected amount RDPhtfYMEAor4kaDfZYuDnt1LC66Qf6jMH +ae92ad1dec1b9b2c92f62ae25d2c3648d79fdf4ff26304d1a39eca73ae0bf2a0 +92958.26394000 <- expected amount RRZc1FEgEFenoLDWG7XJRiks6Xf3ZRoQc2 +c089a123b036c77f08c650f83915b631bb226bff9658fb3069c8fb7d3ee3dae0 +25176.19648375 <- expected amount RNQsZLnKUb7eNdrpkynw3rA7bFPQPXPBFA +c0c58d9473c58742315917d7edd8b35ace97551b69bc68c598e9e1b0c718f3fd +3457.58494193 <- expected amount RQYqroKgVSAdzEEnCLwaP2qffH5ApmVPM2 +dfa78b9def6be002a408233f913e095697d10300115852b044593defb5039a69 +30.59737295 <- expected amount RPyKbtBPVb3FYv5iFULNUB6bq9DdvekZuz +8c7f041d2202fbb105e989d4f6d49527b43d553378dfd6582c93a0c7c2c155ac +1506.60352500 <- expected amount RXdBJ5cWDcS38ykuggEQZh3vSztxwmG3ut +17cff8f901a6842dcf9a9cb85aedacd67361e89505e646ab091a745971f597eb +9683.15249375 <- expected amount RMpfU1RsWJK712wkiUNS9qyteZuEGGxWFy +d9d58fb3870f19e5e87dbb612efcc89d1e59e607bbec12880d59c0289187b092 +3725.18622956 <- expected amount RD8imo1AHUvE1EuTL2EXQGoCMEWAfXgFEP +2a099622708035af7e7f42f3f36757fed78fcbe00dce584bc48e7545d5285b02 +1486.32571743 <- expected amount RVosWpakrP2Cd5JcQjdhjFn9WnzvTqS9H7 +08c844c5db3d2f92b6128dff6ff6acc177f0f054f3dfa2ec0b8e7657bff31154 +7435.09663624 <- expected amount RKmvo8crdpftFSPtJ8332KN82r1vZJaBKX +b8cf96205934774f23a7c5f98cb9dd48885f87667a4bdd252746c5f8e762dd8d +9034.38127666 <- expected amount RMtNL8MfRZd4eQ99JF6fgRASVb8S2p7RWc +7f625ead60915598ddef7ef42625bb06eda260fc584e853e5a59a94f7c74d91f +258541.07773074 <- expected amount RLJ1GkGiu9jmDngdzYGNtwWffWkFYKgbuX +12590bda633745461d3200ee27b5c248e572b16e09c8385442ea74db5a51b5b4 +7315.56699076 <- expected amount REmYfd1MwrYzxW7swvXMMcuKb7u1LFeNHk +5eff92ec09f56b257b3fe9529269a608948ee7380cf710805d309535a644b777 +6679.18894509 <- expected amount RAPJuPCGMoPwfeHuckiea21LMek8BkH8Zr +773443eb515a277ba7818c875799608d6e336c9a193208fb50e17b5299346ed7 +157.99530650 <- expected amount RWKUXBUhn1NhD1w6DvRyxVokD1urauKQXm +1f037b7ce3fb940fc0a3f88b669d4f43954a9e5cae189662ad6acede2d8ca06d +661.93286780 <- expected amount RVvTxd7K5A6B5GugraTMd2peLzRgKZFMbu +b2d4583fddbbf17653f21602946034fc2d3a0ee386b0a1bfca31e9aa5535b77b +5022.01175000 <- expected amount RGEawTGXLwwV4QdHGrmmTDxZrXgyUxQHRa +2b9f7fc1b56b2742880ba89354d4f7f6a04e4538645afdb7935b91fe29dfb0cd +5206.02159816 <- expected amount RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47 +546a20e9ce42251984bbd6bc7a6c0ad2307b1a874a6ffdd4c30d089bc49e1ff1 +10312.37298338 <- expected amount RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1 diff --git a/iguana/tests/KMD.batch7.unspents b/iguana/tests/KMD.batch7.unspents new file mode 100644 index 000000000..441cad7fe --- /dev/null +++ b/iguana/tests/KMD.batch7.unspents @@ -0,0 +1,93 @@ +[{"txid":"8cd3a16bcea015bfc92f2d326e6b988bb54d247aecb3d1f2900143e8d995cfa6","vout":1,"address":"RRcW51evLjdXhEne82mejRwTf8RAMvPxbf","account":"RRcW51evLjdXhEne82mejRwTf8RAMvPxbf","scriptPubKey":"76a914b328ef280499b55a8a445c98416c0cd6c36ac76288ac","amount":9682.18417850,"interest":0,"confirmations":3,"spendable":false}] +9682.18417850 <- expected amount RRcW51evLjdXhEne82mejRwTf8RAMvPxbf +[{"txid":"9b5c2726c7839c61459eaa9710569a8e2ab0714eafe9c9fd29820365220ef33c","vout":1,"address":"RRtJZXkyye8CdgkiqqU2vDBzVL8br8v7qi","account":"RRtJZXkyye8CdgkiqqU2vDBzVL8br8v7qi","scriptPubKey":"76a914b625fba2e5361e082b25f1b77a25253dbf027a9f88ac","amount":19824.65353390,"interest":0,"confirmations":3,"spendable":false}] +19824.65353390 <- expected amount RRtJZXkyye8CdgkiqqU2vDBzVL8br8v7qi +[{"txid":"3c3b26a4b995b2b0b6c0c52c037ad96a4151078895ef350e97096ec60e60b2ca","vout":1,"address":"RRu4rm9zCpK41rSMn4NPtgrmcmHXBStQda","account":"RRu4rm9zCpK41rSMn4NPtgrmcmHXBStQda","scriptPubKey":"76a914b64af5d62e56292a1c61b66e51adf3d73ce76d6a88ac","amount":24981.55183756,"interest":3.57901888,"confirmations":1475,"spendable":false}, {"txid":"f9020d31431382ac11164ec811b9cb2d57d99bcfa08a39d11a942b798d4dc4d7","vout":1,"address":"RRu4rm9zCpK41rSMn4NPtgrmcmHXBStQda","account":"RRu4rm9zCpK41rSMn4NPtgrmcmHXBStQda","scriptPubKey":"76a914b64af5d62e56292a1c61b66e51adf3d73ce76d6a88ac","amount":5932.50248029,"interest":0,"confirmations":3,"spendable":false}] +5932.50248029 <- expected amount RRu4rm9zCpK41rSMn4NPtgrmcmHXBStQda +[{"txid":"41798069952a568fd9f365c1c1fc763c2b01e036de731ab72183549dbdc3f2a4","vout":1,"address":"RRHcvhUfvmTFvyju9HxYUMG7ak2rAsZUG2","account":"RRHcvhUfvmTFvyju9HxYUMG7ak2rAsZUG2","scriptPubKey":"76a914af96c12c96fe4f35560ec7c697164142e2b7335d88ac","amount":3202.01278205,"interest":0,"confirmations":3,"spendable":false}] +3202.01278205 <- expected amount RRHcvhUfvmTFvyju9HxYUMG7ak2rAsZUG2 +[{"txid":"47fa43dfd26ca274bceef24dce7532c6dc62f5da5bef80bb3b0f529a16785668","vout":1,"address":"RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3","account":"RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3","scriptPubKey":"76a91433dab4ba613013fc625b8a8f13dfa24ac871a57788ac","amount":8376.76881681,"interest":7.22135242,"confirmations":8398,"spendable":false}, {"txid":"6adda35ccf807130e1e184ec3be431cbca497891cfdaf2413b8f0758cb77a882","vout":1,"address":"RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3","account":"RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3","scriptPubKey":"76a91433dab4ba613013fc625b8a8f13dfa24ac871a57788ac","amount":57862.44847739,"interest":78.19249794,"confirmations":13568,"spendable":false}, {"txid":"4d36d166d161174f096725951acdf2ff7263a14ee998ecc9dfffbbb72c199d8d","vout":1,"address":"RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3","account":"RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3","scriptPubKey":"76a91433dab4ba613013fc625b8a8f13dfa24ac871a57788ac","amount":3.13113297,"interest":0,"confirmations":5635,"spendable":false}, {"txid":"b4a4a8e4a5c8d22cdc788a0365d61c5f0e76c120a57218a63b15d4b595b5cbab","vout":1,"address":"RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3","account":"RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3","scriptPubKey":"76a91433dab4ba613013fc625b8a8f13dfa24ac871a57788ac","amount":2.29796059,"interest":0,"confirmations":3,"spendable":false}] +2.29796059 <- expected amount RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3 +[{"txid":"a27f10d1ccb049c6750f3e8721e7174160dddabe152ab8f068e6a9502be8d281","vout":1,"address":"RWdo833bYVhMUHRdr8hMs7HHVcG2UNPwcZ","account":"RWdo833bYVhMUHRdr8hMs7HHVcG2UNPwcZ","scriptPubKey":"76a914ea4036a775293e12177fc8da78018cd96efceee588ac","amount":11827.69657925,"interest":0,"confirmations":3,"spendable":false}, {"txid":"e0b44fb9e74984823a307c82b70ddb7a173976fa43aec61440d9cd53654a8e93","vout":1,"address":"RWdo833bYVhMUHRdr8hMs7HHVcG2UNPwcZ","account":"RWdo833bYVhMUHRdr8hMs7HHVcG2UNPwcZ","scriptPubKey":"76a914ea4036a775293e12177fc8da78018cd96efceee588ac","amount":7885.04483652,"interest":7.58177388,"confirmations":9516,"spendable":false}] +11827.69657925 <- expected amount RWdo833bYVhMUHRdr8hMs7HHVcG2UNPwcZ +[{"txid":"12d6b517710a5cd43c8fe96673a5a196e8a0bb1af363b8b8057a07cb6f775796","vout":1,"address":"RJ9qXMATAvg1B5B5KGtiNS8cVv37JNpw8u","account":"RJ9qXMATAvg1B5B5KGtiNS8cVv37JNpw8u","scriptPubKey":"76a91461550febef639e641b15d7fdceee97e50e138ca988ac","amount":9757.57240097,"interest":0,"confirmations":3,"spendable":false}] +9757.57240097 <- expected amount RJ9qXMATAvg1B5B5KGtiNS8cVv37JNpw8u +[{"txid":"ba761c5bcab251499de8af6ebca8dd6f71e4697b69ad38a63ac6ed3f51e20705","vout":1,"address":"RAMvDwi58oyArqfGseWZsYbR2BN3L7ghVX","account":"RAMvDwi58oyArqfGseWZsYbR2BN3L7ghVX","scriptPubKey":"76a9140bdcf88401de1c3c3a1cac2e7c4d0205a2e48f6388ac","amount":40914.30625015,"interest":33.53631659,"confirmations":7981,"spendable":false}, {"txid":"3f56a88153c48bb6b1b5aa531a7dd5e90cdedd7be8bb1c0e0b036039cba21914","vout":0,"address":"RAMvDwi58oyArqfGseWZsYbR2BN3L7ghVX","account":"RAMvDwi58oyArqfGseWZsYbR2BN3L7ghVX","scriptPubKey":"76a9140bdcf88401de1c3c3a1cac2e7c4d0205a2e48f6388ac","amount":1,"interest":0,"confirmations":8579,"spendable":false}, {"txid":"6cfeb1fefded1a795f8a749ca01a700951e3bc49f6a044cbb6ca3c322d231c1b","vout":1,"address":"RAMvDwi58oyArqfGseWZsYbR2BN3L7ghVX","account":"RAMvDwi58oyArqfGseWZsYbR2BN3L7ghVX","scriptPubKey":"76a9140bdcf88401de1c3c3a1cac2e7c4d0205a2e48f6388ac","amount":495.97007681,"interest":0,"confirmations":3,"spendable":false}, {"txid":"8a621bdfa7fa034342e8f07ad4f9ccccce2c6ccf3d3b238988f53d96c7e051ae","vout":1,"address":"RAMvDwi58oyArqfGseWZsYbR2BN3L7ghVX","account":"RAMvDwi58oyArqfGseWZsYbR2BN3L7ghVX","scriptPubKey":"76a9140bdcf88401de1c3c3a1cac2e7c4d0205a2e48f6388ac","amount":29.00370000,"interest":0.02544184,"confirmations":8588,"spendable":false}] +495.97007681 <- expected amount RAMvDwi58oyArqfGseWZsYbR2BN3L7ghVX +[{"txid":"cc31790b130925334b77409f5d517fed1fce5a2d17fec61318a151e7b8d9366e","vout":1,"address":"RFsV4VaRdzLLFHotqsxZbim2ARwP8VHxJH","account":"RFsV4VaRdzLLFHotqsxZbim2ARwP8VHxJH","scriptPubKey":"76a914484d12d59bdd40cb1b3ef425c6da45533bd5913788ac","amount":138721.51640953,"interest":0,"confirmations":3,"spendable":false}] +138721.51640953 <- expected amount RFsV4VaRdzLLFHotqsxZbim2ARwP8VHxJH +[{"txid":"1d86cb9d2359131164da3c8ff6198c4c7958da2fb406ccd346ddaa8afb09fbe6","vout":1,"address":"RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv","account":"RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv","scriptPubKey":"76a91457eb94f18b82ac15ac3256119bfe398afec0c54588ac","amount":693.08132289,"interest":0,"confirmations":3,"spendable":false}] +693.08132289 <- expected amount RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv +[{"txid":"1f77bfa557a3bc9b6493327fb6ce05c8e15aa088864a01e39cded9cc5159cafb","vout":1,"address":"RV6bZE1shV9HufX9hztv7NdwwZXtPNGnmc","account":"RV6bZE1shV9HufX9hztv7NdwwZXtPNGnmc","scriptPubKey":"76a914d96189cff80b306d2efbabe71642d2f626d2bc3a88ac","amount":1174.11345835,"interest":0,"confirmations":4,"spendable":false}] +1174.11345835 <- expected amount RV6bZE1shV9HufX9hztv7NdwwZXtPNGnmc +[{"txid":"114c24ba300ea0b3c65a6c9964ab6d3f827b819a4ee1969d26af2b7208acac7b","vout":1,"address":"RY5xeuFcrPgBQTtmsrNyo8Ha85z8CsQsQA","account":"RY5xeuFcrPgBQTtmsrNyo8Ha85z8CsQsQA","scriptPubKey":"76a914fa2b1c806de870f18ad1bbaba6e9bdf65ceefae388ac","amount":9683.15249375,"interest":0,"confirmations":4,"spendable":false}] +9683.15249375 <- expected amount RY5xeuFcrPgBQTtmsrNyo8Ha85z8CsQsQA +[{"txid":"70aabe32dc0619b4aa44fd6a6a3265185a68aa72160a861e992daa9d55dd645e","vout":1,"address":"RF11xHFssjxqa4UhUtZmReeb2w8ikmzkzL","account":"RF11xHFssjxqa4UhUtZmReeb2w8ikmzkzL","scriptPubKey":"76a9143ec1a5c983beb264cbd7e3bf2c0790e7695030be88ac","amount":47.52053869,"interest":0,"confirmations":4,"spendable":false}] +47.52053869 <- expected amount RF11xHFssjxqa4UhUtZmReeb2w8ikmzkzL +[{"txid":"a3fb5c58e47085a89777ef9d798a802b78541644eed56ef503b7bdad86e15551","vout":1,"address":"RWEq3Sf4H93Agwxf1ARD1MaPNCfBj54Zfx","account":"RWEq3Sf4H93Agwxf1ARD1MaPNCfBj54Zfx","scriptPubKey":"76a914e5e83ff1e272721ac97d729720b3ed305b61013e88ac","amount":845.90749755,"interest":0,"confirmations":4,"spendable":false}] +845.90749755 <- expected amount RWEq3Sf4H93Agwxf1ARD1MaPNCfBj54Zfx +[{"txid":"05919d2d60ea93443f212e3ca50eeb93cbbdb29c0a42d5ef1ddacfe355dfbb6b","vout":1,"address":"RFuBgn2XPbePzKwWeiXYGdsACJutKkcH3x","account":"RFuBgn2XPbePzKwWeiXYGdsACJutKkcH3x","scriptPubKey":"76a914489f66ed63cb87f2221fc3e0cb2613aeb2522d0288ac","amount":1660.54445484,"interest":0,"confirmations":4,"spendable":false}] +1660.54445484 <- expected amount RFuBgn2XPbePzKwWeiXYGdsACJutKkcH3x +[{"txid":"009c59457de9585d9358c255ee467fe55157a071ff77c391865609fda8feba01","vout":1,"address":"RAo9Anrzy7Whzaxmp3tF5ZFTe77DPJUerN","account":"RAo9Anrzy7Whzaxmp3tF5ZFTe77DPJUerN","scriptPubKey":"76a91410a22d215bed9d9140eeac9ca4f3c93636ba745588ac","amount":55313.07943406,"interest":0,"confirmations":5,"spendable":false}] +55313.07943406 <- expected amount RAo9Anrzy7Whzaxmp3tF5ZFTe77DPJUerN +[{"txid":"263170b1598bf0e3b427892696ce270abf095f04b88619c56e7c1a2a9057365a","vout":1,"address":"RPEVJbazc37eXGGJhdZoN7Bo2B71kS1cBc","account":"RPEVJbazc37eXGGJhdZoN7Bo2B71kS1cBc","scriptPubKey":"76a914990ee469e018495affc758dec9739c33a30499f488ac","amount":30986.08798000,"interest":0,"confirmations":5,"spendable":false}] +30986.08798000 <- expected amount RPEVJbazc37eXGGJhdZoN7Bo2B71kS1cBc +[{"txid":"cb98a81a04b900342b9d1f5d656d664967c0b7cbc3048dd900e112504d0ff0f8","vout":1,"address":"RCNwFTJFxjxEVqsbr81Ug41E3K8fCjktwj","account":"RCNwFTJFxjxEVqsbr81Ug41E3K8fCjktwj","scriptPubKey":"76a91421fe7eaa5272c6caa9ba8bab05feb555380b7cb988ac","amount":34809.11928944,"interest":0,"confirmations":5,"spendable":false}] +34809.11928944 <- expected amount RCNwFTJFxjxEVqsbr81Ug41E3K8fCjktwj +[{"txid":"8a5734622e1bcc9ef05db4fe24f4a63fff7ac30365dd6187b5ec8dc2278ab022","vout":1,"address":"RKuwq4oi4mqQ2V4r54mPEthn3TBrEwu2Ni","account":"RKuwq4oi4mqQ2V4r54mPEthn3TBrEwu2Ni","scriptPubKey":"76a91474a4c0fc2c8592ec97b96bba19ce07dfdb105def88ac","amount":4331.80770687,"interest":0,"confirmations":5,"spendable":false}, {"txid":"7ab5fe203ae7b23957ca398484a9eb6279c0f9bc68c0d3dd0bc2c0aab8cc9d77","vout":1,"address":"RKuwq4oi4mqQ2V4r54mPEthn3TBrEwu2Ni","account":"RKuwq4oi4mqQ2V4r54mPEthn3TBrEwu2Ni","scriptPubKey":"76a91474a4c0fc2c8592ec97b96bba19ce07dfdb105def88ac","amount":195982.90265756,"interest":113.94354805,"confirmations":5638,"spendable":false}] +4331.80770687 <- expected amount RKuwq4oi4mqQ2V4r54mPEthn3TBrEwu2Ni +[{"txid":"b20de3d53333117c80dc06500f057d236046a8a77013f9c05c71f098347aead0","vout":1,"address":"RKXi56k97RZcs6CW2chTL286HSjgrEtAsN","account":"RKXi56k97RZcs6CW2chTL286HSjgrEtAsN","scriptPubKey":"76a91470701e389d34b5ee295dc624bcbf9a8aa7ae2f7488ac","amount":880.19856168,"interest":0,"confirmations":5,"spendable":false}] +880.19856168 <- expected amount RKXi56k97RZcs6CW2chTL286HSjgrEtAsN +[{"txid":"948c6dc337fe38a331194f3096b1e313889072946fdc166a152acf8bb3faa879","vout":1,"address":"RKNkMHyMWcK84T6JJ4MRYgSUuKZqPPfGYx","account":"RKNkMHyMWcK84T6JJ4MRYgSUuKZqPPfGYx","scriptPubKey":"76a9146ebe46e7db7ffb5f6276977c25dbbe4e419ac43688ac","amount":967.34693412,"interest":0,"confirmations":5,"spendable":false}] +967.34693412 <- expected amount RKNkMHyMWcK84T6JJ4MRYgSUuKZqPPfGYx +[{"txid":"56f5ff948e5fe94fc43ff48b5f4631a4bf633f3b6ea139a8ebe573df2a776472","vout":1,"address":"RBn7LuP4xLM3Yq881BSNQ1gXCjDU8at4fr","account":"RBn7LuP4xLM3Yq881BSNQ1gXCjDU8at4fr","scriptPubKey":"76a9141b685cb50d45b194ac719872f54c95651b5fa76288ac","amount":1192.08225695,"interest":0,"confirmations":5,"spendable":false}] +1192.08225695 <- expected amount RBn7LuP4xLM3Yq881BSNQ1gXCjDU8at4fr +[{"txid":"ec23e9454fd3fcd67382c440a8f3aba51b8531ac9c55d7489d3e772f66ab8c6d","vout":1,"address":"RW2xS8dpxjudqBX1hqxShP7FWn8EHYH4Rb","account":"RW2xS8dpxjudqBX1hqxShP7FWn8EHYH4Rb","scriptPubKey":"76a914e3a96d98131e45c6f3e950f75253d98419aeb8d888ac","amount":405.34611747,"interest":0,"confirmations":5,"spendable":false}, {"txid":"85d92801778b3110b4796758e85b461fa8d90f07020f79922d00d8ab623b8bce","vout":1,"address":"RW2xS8dpxjudqBX1hqxShP7FWn8EHYH4Rb","account":"RW2xS8dpxjudqBX1hqxShP7FWn8EHYH4Rb","scriptPubKey":"76a914e3a96d98131e45c6f3e950f75253d98419aeb8d888ac","amount":164046.90243912,"interest":106.52396262,"confirmations":6191,"spendable":false}, {"txid":"ee055abb21c95a20689d26fa218dcb34b0e673f12b220ebb3af5458105f82bfa","vout":1,"address":"RW2xS8dpxjudqBX1hqxShP7FWn8EHYH4Rb","account":"RW2xS8dpxjudqBX1hqxShP7FWn8EHYH4Rb","scriptPubKey":"76a914e3a96d98131e45c6f3e950f75253d98419aeb8d888ac","amount":2738.88754015,"interest":0.45196164,"confirmations":1728,"spendable":false}] +405.34611747 <- expected amount RW2xS8dpxjudqBX1hqxShP7FWn8EHYH4Rb +[{"txid":"b439fb56567136e846efbcd421806d1c6a140dd8007c66e6173cfc33a8651008","vout":1,"address":"RUqYxcjB5Hy6eqK1YDimjfXfhfp5TSyCF4","account":"RUqYxcjB5Hy6eqK1YDimjfXfhfp5TSyCF4","scriptPubKey":"76a914d689219c2fa34b4b808ab6c8c0e7564c787b579e88ac","amount":1.00443477,"interest":0,"confirmations":5999,"spendable":false}, {"txid":"447bd75fe3d7af09d0405293cfda35a81f1e599ea2405c0ccc0c154fddb03eb7","vout":1,"address":"RUqYxcjB5Hy6eqK1YDimjfXfhfp5TSyCF4","account":"RUqYxcjB5Hy6eqK1YDimjfXfhfp5TSyCF4","scriptPubKey":"76a914d689219c2fa34b4b808ab6c8c0e7564c787b579e88ac","amount":6712.04424766,"interest":0,"confirmations":5,"spendable":false}] +6712.04424766 <- expected amount RUqYxcjB5Hy6eqK1YDimjfXfhfp5TSyCF4 +[{"txid":"8d6ca5f467b75964b12ff6ad645c082cea67f7c5e10c24a781078158688b4da5","vout":1,"address":"RNvB5SiEEmGQrwFfyYXuDfeSWPDj35ypqA","account":"RNvB5SiEEmGQrwFfyYXuDfeSWPDj35ypqA","scriptPubKey":"76a914959830a2a4b30fad6b186dc78dbd3021ff994ea688ac","amount":6087.83670543,"interest":0,"confirmations":5,"spendable":false}] +6087.83670543 <- expected amount RNvB5SiEEmGQrwFfyYXuDfeSWPDj35ypqA +[{"txid":"dba293859a6b57a0777e8d88dbe981172afdc25f8049104db26c7208703726b3","vout":1,"address":"RStGPxQ5amuNV4f7g8A1FhDj74qGeAXRgC","account":"RStGPxQ5amuNV4f7g8A1FhDj74qGeAXRgC","scriptPubKey":"76a914c11c4d296001b9b7ec6dab87c740f22731f4b56288ac","amount":11792.89870264,"interest":0,"confirmations":5,"spendable":false}] +11792.89870264 <- expected amount RStGPxQ5amuNV4f7g8A1FhDj74qGeAXRgC +[{"txid":"0dd51507754ba5d2fa6933531fc8e0365e6b59b6fc68d85cd100b72e2ba86ed6","vout":1,"address":"RXiwnYTrCgxrxa5vrCuG8sUqKstu3Yn5on","account":"RXiwnYTrCgxrxa5vrCuG8sUqKstu3Yn5on","scriptPubKey":"76a914f631a6bf7e5adc02900220c10543c95d4b9c19f588ac","amount":22265.01478541,"interest":0,"confirmations":5,"spendable":false}] +22265.01478541 <- expected amount RXiwnYTrCgxrxa5vrCuG8sUqKstu3Yn5on +[{"txid":"b38302f4073bf1c23593cb589c6ceee8d4a98c95830a337871ece310f904a040","vout":1,"address":"RDPhtfYMEAor4kaDfZYuDnt1LC66Qf6jMH","account":"RDPhtfYMEAor4kaDfZYuDnt1LC66Qf6jMH","scriptPubKey":"76a9142d1be2ae97242fffbc5d7eb68deca17e6a731c4588ac","amount":9295.82639400,"interest":0,"confirmations":5,"spendable":false}] +9295.82639400 <- expected amount RDPhtfYMEAor4kaDfZYuDnt1LC66Qf6jMH +[{"txid":"ae92ad1dec1b9b2c92f62ae25d2c3648d79fdf4ff26304d1a39eca73ae0bf2a0","vout":1,"address":"RRZc1FEgEFenoLDWG7XJRiks6Xf3ZRoQc2","account":"RRZc1FEgEFenoLDWG7XJRiks6Xf3ZRoQc2","scriptPubKey":"76a914b29ca402ca2228ad8157c1df5637ed408fa4558888ac","amount":92958.26394000,"interest":0,"confirmations":5,"spendable":false}] +92958.26394000 <- expected amount RRZc1FEgEFenoLDWG7XJRiks6Xf3ZRoQc2 +[{"txid":"c089a123b036c77f08c650f83915b631bb226bff9658fb3069c8fb7d3ee3dae0","vout":1,"address":"RNQsZLnKUb7eNdrpkynw3rA7bFPQPXPBFA","account":"RNQsZLnKUb7eNdrpkynw3rA7bFPQPXPBFA","scriptPubKey":"76a914900d80c21a4f800a07b9b59c87c1693c671ff41688ac","amount":25176.19648375,"interest":0,"confirmations":5,"spendable":false}] +25176.19648375 <- expected amount RNQsZLnKUb7eNdrpkynw3rA7bFPQPXPBFA +[{"txid":"8649013884e48ce182a7514613014af5d723284902530c994ba2e084a3f0f71d","vout":1,"address":"RQYqroKgVSAdzEEnCLwaP2qffH5ApmVPM2","account":"RQYqroKgVSAdzEEnCLwaP2qffH5ApmVPM2","scriptPubKey":"76a914a77fa9f98cf8cc7152b645a54379ef8108d78a2488ac","amount":132,"interest":0.07951807,"confirmations":5881,"spendable":false}, {"txid":"77cd5371b1eceb01734458712bf80975d2e4455c970d5f4dc7fa90ba1578ab1f","vout":1,"address":"RQYqroKgVSAdzEEnCLwaP2qffH5ApmVPM2","account":"RQYqroKgVSAdzEEnCLwaP2qffH5ApmVPM2","scriptPubKey":"76a914a77fa9f98cf8cc7152b645a54379ef8108d78a2488ac","amount":500,"interest":0.30120481,"confirmations":5895,"spendable":false}, {"txid":"3d57e466010ca6b5aea5cc565da7c832f9db0fe35d437cce663ff42bd287363d","vout":1,"address":"RQYqroKgVSAdzEEnCLwaP2qffH5ApmVPM2","account":"RQYqroKgVSAdzEEnCLwaP2qffH5ApmVPM2","scriptPubKey":"76a914a77fa9f98cf8cc7152b645a54379ef8108d78a2488ac","amount":500,"interest":0.30120481,"confirmations":5898,"spendable":false}, {"txid":"7301e7c70c3451d46bb6c5754d74fd2c7ea219f360c616a64b440a4968e26873","vout":1,"address":"RQYqroKgVSAdzEEnCLwaP2qffH5ApmVPM2","account":"RQYqroKgVSAdzEEnCLwaP2qffH5ApmVPM2","scriptPubKey":"76a914a77fa9f98cf8cc7152b645a54379ef8108d78a2488ac","amount":0.00495049,"interest":0,"confirmations":1267,"spendable":false}, {"txid":"c0c58d9473c58742315917d7edd8b35ace97551b69bc68c598e9e1b0c718f3fd","vout":1,"address":"RQYqroKgVSAdzEEnCLwaP2qffH5ApmVPM2","account":"RQYqroKgVSAdzEEnCLwaP2qffH5ApmVPM2","scriptPubKey":"76a914a77fa9f98cf8cc7152b645a54379ef8108d78a2488ac","amount":3457.58494193,"interest":0,"confirmations":5,"spendable":false}] +3457.58494193 <- expected amount RQYqroKgVSAdzEEnCLwaP2qffH5ApmVPM2 +[{"txid":"dfa78b9def6be002a408233f913e095697d10300115852b044593defb5039a69","vout":1,"address":"RPyKbtBPVb3FYv5iFULNUB6bq9DdvekZuz","account":"RPyKbtBPVb3FYv5iFULNUB6bq9DdvekZuz","scriptPubKey":"76a914a128ae07bfea203567eed1d4387e9982cdb220fa88ac","amount":30.59737295,"interest":0,"confirmations":5,"spendable":false}] +30.59737295 <- expected amount RPyKbtBPVb3FYv5iFULNUB6bq9DdvekZuz +[{"txid":"8c7f041d2202fbb105e989d4f6d49527b43d553378dfd6582c93a0c7c2c155ac","vout":1,"address":"RXdBJ5cWDcS38ykuggEQZh3vSztxwmG3ut","account":"RXdBJ5cWDcS38ykuggEQZh3vSztxwmG3ut","scriptPubKey":"76a914f51a6ebba4d8af7dbddc002fb5c095ac831f00f088ac","amount":1506.60352500,"interest":0,"confirmations":5,"spendable":false}] +1506.60352500 <- expected amount RXdBJ5cWDcS38ykuggEQZh3vSztxwmG3ut +[{"txid":"17cff8f901a6842dcf9a9cb85aedacd67361e89505e646ab091a745971f597eb","vout":1,"address":"RMpfU1RsWJK712wkiUNS9qyteZuEGGxWFy","account":"RMpfU1RsWJK712wkiUNS9qyteZuEGGxWFy","scriptPubKey":"76a91489954432dfbad203078025b5d476841a7396e3de88ac","amount":9683.15249375,"interest":0,"confirmations":5,"spendable":false}] +9683.15249375 <- expected amount RMpfU1RsWJK712wkiUNS9qyteZuEGGxWFy +[{"txid":"d9d58fb3870f19e5e87dbb612efcc89d1e59e607bbec12880d59c0289187b092","vout":1,"address":"RD8imo1AHUvE1EuTL2EXQGoCMEWAfXgFEP","account":"RD8imo1AHUvE1EuTL2EXQGoCMEWAfXgFEP","scriptPubKey":"76a9142a4661c5085c948bc5d57768843e4ddecb7e622188ac","amount":3725.18622956,"interest":0,"confirmations":5,"spendable":false}] +3725.18622956 <- expected amount RD8imo1AHUvE1EuTL2EXQGoCMEWAfXgFEP +[{"txid":"2a099622708035af7e7f42f3f36757fed78fcbe00dce584bc48e7545d5285b02","vout":1,"address":"RVosWpakrP2Cd5JcQjdhjFn9WnzvTqS9H7","account":"RVosWpakrP2Cd5JcQjdhjFn9WnzvTqS9H7","scriptPubKey":"76a914e12fea0ef669739df165ea395775b0977770041488ac","amount":1486.32571743,"interest":0,"confirmations":5,"spendable":false}] +1486.32571743 <- expected amount RVosWpakrP2Cd5JcQjdhjFn9WnzvTqS9H7 +[{"txid":"08c844c5db3d2f92b6128dff6ff6acc177f0f054f3dfa2ec0b8e7657bff31154","vout":1,"address":"RKmvo8crdpftFSPtJ8332KN82r1vZJaBKX","account":"RKmvo8crdpftFSPtJ8332KN82r1vZJaBKX","scriptPubKey":"76a91473209045453cc0a8551790628ed625e1678ccfba88ac","amount":7435.09663624,"interest":0,"confirmations":5,"spendable":false}] +7435.09663624 <- expected amount RKmvo8crdpftFSPtJ8332KN82r1vZJaBKX +[{"txid":"b8cf96205934774f23a7c5f98cb9dd48885f87667a4bdd252746c5f8e762dd8d","vout":1,"address":"RMtNL8MfRZd4eQ99JF6fgRASVb8S2p7RWc","account":"RMtNL8MfRZd4eQ99JF6fgRASVb8S2p7RWc","scriptPubKey":"76a9148a48a03dcddfe7c2d599cd47d7b0baccfbe9a5fc88ac","amount":9034.38127666,"interest":0,"confirmations":5,"spendable":false}] +9034.38127666 <- expected amount RMtNL8MfRZd4eQ99JF6fgRASVb8S2p7RWc +[{"txid":"7f625ead60915598ddef7ef42625bb06eda260fc584e853e5a59a94f7c74d91f","vout":1,"address":"RLJ1GkGiu9jmDngdzYGNtwWffWkFYKgbuX","account":"RLJ1GkGiu9jmDngdzYGNtwWffWkFYKgbuX","scriptPubKey":"76a91478d0c764edacbe3d496010b4b3b27494e66fc9e488ac","amount":258541.07773074,"interest":0,"confirmations":5,"spendable":false}] +258541.07773074 <- expected amount RLJ1GkGiu9jmDngdzYGNtwWffWkFYKgbuX +[{"txid":"3eeb779849cdf59a51418dc40f593c01eb3327c4858de600919ce81b450b2b2c","vout":1,"address":"REmYfd1MwrYzxW7swvXMMcuKb7u1LFeNHk","account":"REmYfd1MwrYzxW7swvXMMcuKb7u1LFeNHk","scriptPubKey":"76a9143c35763cff259866a738482944074b9e12bf06bd88ac","amount":500.11560727,"interest":0.25258364,"confirmations":5033,"spendable":false}, {"txid":"12590bda633745461d3200ee27b5c248e572b16e09c8385442ea74db5a51b5b4","vout":1,"address":"REmYfd1MwrYzxW7swvXMMcuKb7u1LFeNHk","account":"REmYfd1MwrYzxW7swvXMMcuKb7u1LFeNHk","scriptPubKey":"76a9143c35763cff259866a738482944074b9e12bf06bd88ac","amount":7315.56699076,"interest":0,"confirmations":5,"spendable":false}] +7315.56699076 <- expected amount REmYfd1MwrYzxW7swvXMMcuKb7u1LFeNHk +[{"txid":"e1b6866c3b9d952c3a0ae3f18f4bae254fe9069b4ebde6fa43b8f99dedd5a659","vout":1,"address":"RAPJuPCGMoPwfeHuckiea21LMek8BkH8Zr","account":"RAPJuPCGMoPwfeHuckiea21LMek8BkH8Zr","scriptPubKey":"76a9140c2051abd568208f0492a2c8dee49a8bf3cbfd5c88ac","amount":51783.14581891,"interest":7.57063535,"confirmations":1515,"spendable":false}, {"txid":"5eff92ec09f56b257b3fe9529269a608948ee7380cf710805d309535a644b777","vout":1,"address":"RAPJuPCGMoPwfeHuckiea21LMek8BkH8Zr","account":"RAPJuPCGMoPwfeHuckiea21LMek8BkH8Zr","scriptPubKey":"76a9140c2051abd568208f0492a2c8dee49a8bf3cbfd5c88ac","amount":6679.18894509,"interest":0,"confirmations":5,"spendable":false}] +6679.18894509 <- expected amount RAPJuPCGMoPwfeHuckiea21LMek8BkH8Zr +[{"txid":"773443eb515a277ba7818c875799608d6e336c9a193208fb50e17b5299346ed7","vout":1,"address":"RWKUXBUhn1NhD1w6DvRyxVokD1urauKQXm","account":"RWKUXBUhn1NhD1w6DvRyxVokD1urauKQXm","scriptPubKey":"76a914e6c932eae192615292cdfe6ea6224117c980eb1a88ac","amount":157.99530650,"interest":0,"confirmations":5,"spendable":false}] +157.99530650 <- expected amount RWKUXBUhn1NhD1w6DvRyxVokD1urauKQXm +[{"txid":"1f037b7ce3fb940fc0a3f88b669d4f43954a9e5cae189662ad6acede2d8ca06d","vout":1,"address":"RVvTxd7K5A6B5GugraTMd2peLzRgKZFMbu","account":"RVvTxd7K5A6B5GugraTMd2peLzRgKZFMbu","scriptPubKey":"76a914e26f29c6a10973c4b41fd57c1ed058d3540740fc88ac","amount":661.93286780,"interest":0,"confirmations":5,"spendable":false}] +661.93286780 <- expected amount RVvTxd7K5A6B5GugraTMd2peLzRgKZFMbu +[{"txid":"b2d4583fddbbf17653f21602946034fc2d3a0ee386b0a1bfca31e9aa5535b77b","vout":1,"address":"RGEawTGXLwwV4QdHGrmmTDxZrXgyUxQHRa","account":"RGEawTGXLwwV4QdHGrmmTDxZrXgyUxQHRa","scriptPubKey":"76a9144c4ab74ba08f842ea2c3604e11a989866c6bd10288ac","amount":5022.01175000,"interest":0,"confirmations":5,"spendable":false}] +5022.01175000 <- expected amount RGEawTGXLwwV4QdHGrmmTDxZrXgyUxQHRa +[{"txid":"da043ca20ef95cf12325d8ac2cb3e33cef92db49cec3551f07be4e6308648f13","vout":1,"address":"RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47","account":"RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47","scriptPubKey":"76a9145f4bd040debae8c8bdddcad618a3de79462bcd5888ac","amount":0.02657850,"interest":0,"confirmations":3159,"spendable":false}, {"txid":"2b9f7fc1b56b2742880ba89354d4f7f6a04e4538645afdb7935b91fe29dfb0cd","vout":1,"address":"RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47","account":"RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47","scriptPubKey":"76a9145f4bd040debae8c8bdddcad618a3de79462bcd5888ac","amount":5206.02159816,"interest":0,"confirmations":5,"spendable":false}] +5206.02159816 <- expected amount RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47 +[{"txid":"6fc1d56f5275ce745877e6ac038f61615983d16d13403c9ceb89b3c9989d963a","vout":0,"address":"RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1","account":"RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1","scriptPubKey":"76a91422311801b820cf5a169e3614cfc7e61e08cffc1c88ac","amount":10533.25049043,"interest":1.09039860,"confirmations":1034,"spendable":false}, {"txid":"6fc1d56f5275ce745877e6ac038f61615983d16d13403c9ceb89b3c9989d963a","vout":1,"address":"RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1","account":"RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1","scriptPubKey":"76a91422311801b820cf5a169e3614cfc7e61e08cffc1c88ac","amount":886.89557581,"interest":0.09181113,"confirmations":1034,"spendable":false}, {"txid":"13e9b271e893f9224696d74a904696a8c25cc76f645cb27dede8a2f62cf87f6c","vout":0,"address":"RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1","account":"RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1","scriptPubKey":"76a91422311801b820cf5a169e3614cfc7e61e08cffc1c88ac","amount":999.99990000,"interest":0.24390241,"confirmations":2462,"spendable":false}, {"txid":"c8cba16908893545179be5ee114e77121c0779efafab61cf6c018bcd01a7259c","vout":1,"address":"RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1","account":"RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1","scriptPubKey":"76a91422311801b820cf5a169e3614cfc7e61e08cffc1c88ac","amount":28096.43798050,"interest":19.51141526,"confirmations":6671,"spendable":false}, {"txid":"546a20e9ce42251984bbd6bc7a6c0ad2307b1a874a6ffdd4c30d089bc49e1ff1","vout":1,"address":"RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1","account":"RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1","scriptPubKey":"76a91422311801b820cf5a169e3614cfc7e61e08cffc1c88ac","amount":10312.37298338,"interest":0,"confirmations":5,"spendable":false}] +10312.37298338 <- expected amount RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1 + diff --git a/iguana/tests/REVS.batch7 b/iguana/tests/REVS.batch7 index 377be7b1f..bf8cfbe2e 100755 --- a/iguana/tests/REVS.batch7 +++ b/iguana/tests/REVS.batch7 @@ -1,3 +1,4 @@ +sleep 9999999 # RRtJZXkyye8CdgkiqqU2vDBzVL8br8v7qi KMD 19824.65353390, REVS 393.51044761 sleep 1 fiat/revs sendtoaddress RRtJZXkyye8CdgkiqqU2vDBzVL8br8v7qi 393.51044761 @@ -12,3 +13,8 @@ sleep 1 fiat/revs sendtoaddress RKmvo8crdpftFSPtJ8332KN82r1vZJaBKX 70.73874773 # total KMD 0.00000000 REVS 3121.19219807 +563fab7a3c96c33899314d77ad37d724d5dae8febd52c6c435133c2e1450339f +2a147a839e8d6bbe9546d37dd05851657ddd3eec5dfd53a055cc2dde24f81b6f +8efec553d6e525cd2b141316ac06a09e282a13215c97ba6d18b1eccf1375a217 +0b0f8cfd256c573a584cd68c971448b2d9b90f6a6eb7fc7ae932bbcbf609518a + From 87d6423b94f4876196ae1191ad6608e7dd2509d1 Mon Sep 17 00:00:00 2001 From: ca333 Date: Thu, 9 Feb 2017 15:43:11 +0100 Subject: [PATCH 015/495] OS independant struct typedefinition --- README.md | 19 ++++++++++--------- basilisk/tradebots_SVM.h | 37 +++++++++++++++++-------------------- iguana/m_unix | 2 +- 3 files changed, 28 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 02e8c4218..2d49a0b55 100755 --- a/README.md +++ b/README.md @@ -23,11 +23,11 @@ iguana: most efficient bitcoin core implementation that can simultaneously be fu komodo: this is the top secret project I cant talk about publicly yet > #TL;DR# -> -> ```sudo apt-get update; sudo apt-get install git libcurl4-openssl-dev build-essential; git clone https://github.com/jl777/SuperNET; cd SuperNET; ./m_onetime m_unix;``` -> -> The above one line gets SuperNET installed, built and launched for unix. -> +> +> ```sudo apt-get update; sudo apt-get install git libcurl4-openssl-dev build-essential libnanomsg-dev; git clone https://github.com/jl777/SuperNET; cd SuperNET; ./m_onetime m_unix;``` +> +> The above one line gets SuperNET installed, built and launched for unix. +> > After that ```./m_unix``` updates to latest. > *Continue below at "Running".* @@ -44,6 +44,8 @@ The above two definitions need to be changed to match the mingw install on your You need to make sure the nacl sdk is properly installed and you are able to build the examples. Now you will need to get the external libs, which can be built from scratch using naclports or there use the reference builds of libcurl.a and libz.a in the SuperNET/crypto777/pnacl_libs. You can just copy those over into $(NACL_SDK_ROOT)//lib/pnacl. +##For android## +You have to build a native libnanomsg for android. This section is work in progress. Contact ca333@protonmail.ch for assistance on building latest iguana for android. #ONETIME# Now you are ready to build. @@ -103,14 +105,14 @@ Internally, all paths convert the request into a standard SuperNET JSON request. Another approach is to use the bitcoin RPC syntax via: curl --url "http://127.0.0.1:7778" --data "{\"coin\":\"BTCD\",\"method\":\"getinfo\",\"params\":[]}" the params:[] array is where the standard bitcoin parameters go, the only change that is needed is to specify the coin -alternatively {"agent":"SuperNET","method":"bitcoinrpc","coin":"BTCD"} will set the coin +alternatively {"agent":"SuperNET","method":"bitcoinrpc","coin":"BTCD"} will set the coin to use for bitcoin RPC calls. this will suffice in single coin environments curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana",\"method\":\"test\"}" curl --url "http://127.0.0.1:7778/iguana/test" -> html page with results curl --url "http://127.0.0.1:7778/api/iguana/test" -> just json text http://127.0.0.1:7778 -> superugly GUI -http://127.0.0.1:7778/iguana/test +http://127.0.0.1:7778/iguana/test http://127.0.0.1:7778/api/iguana/test postCall('{"agent":"iguana","method":"test"}'} iguana_JSON("{\"agent\":\"iguana",\"method\":\"test\"}"); -> direct C function call @@ -124,7 +126,7 @@ iguana can be invoked with a command line argument. if it is a name of a file, i "exchanges" -> { "name":"", ... } "apikey", "apisecret", "userid", "tradepassword" these are as expected "pollgap" -> gap between each access to exchange for getting prices - + on OSX mksquashfs is not native, you will need to install fuse: https://osxfuse.github.io/ and a squashfs for mac: https://github.com/vasi/squashfuse ********** @@ -221,4 +223,3 @@ sudo service ntp start Now things should be ready. To update and run notary node: pkill iguana; ./m_LP; tests/notaryinit - diff --git a/basilisk/tradebots_SVM.h b/basilisk/tradebots_SVM.h index d1deef80d..44165de51 100755 --- a/basilisk/tradebots_SVM.h +++ b/basilisk/tradebots_SVM.h @@ -20,16 +20,14 @@ //#include typedef float svmtype; -#ifdef WIN32 + // fadedreamz@gmail.com - added for successful compilation, however, for MSVC probably require a particular OpenCL SDK // to work with it (e,g nvidia or amd SDK) -typedef struct fake_opencl_double { +typedef struct fake_opencl_double { //use a struct for double2 typedefinition on all OS - ca333@protonmail.ch double x; double y; }double2; -#else -typedef double double2 __attribute__((ext_vector_type(2))); -#endif + #define MAX_VECTORS (1440 * 365 * 5) #define MAIN_MAXCORES 16 #define c_to_refc(c) (c) @@ -192,7 +190,7 @@ void ocas_purge(struct ocas_vars *vars) fatal("dot_expanded_features not implemented"); return(0); } - + static inline void add_expanded_features(register double *W,register double y,register int c,register int selector,register int numfeatures) { fatal("add_expanded_features not implemented"); @@ -226,7 +224,7 @@ static inline double calc_ocas_output(register struct ocas_vars *vars,register i // printf("%f ",sum); return(sum); } - + static inline void add_ocas_output(register double y,register struct ocas_vars *vars,register int selector,register int c,register int weekind,register int answerind,register double *W,register double *new_a,register int numfeatures) { register int coeffi; @@ -321,7 +319,7 @@ static inline double _dbufave(register double *buf,register int len) sum = 0.; return(sum); } - + static inline void add_newcut_entry(register struct ocas_vars *vars,register int answerind,register int *new_cut,register int i,register int weekind,register double y) { weekind <<= 1; @@ -403,7 +401,7 @@ static int _increasing_double(const void *a,const void *b) #undef double_a #undef double_b } - + static inline void calc_ocas_strategy(register struct ocas_vars *vars,register int answerind,register double C,register int numfeatures,register int len,register int *weekinds,register int *new_cut,register double *W,register double *oldW,register double *output,register double *old_output,register double2 *hpfb) { double answermag; @@ -782,11 +780,11 @@ static void ocas_print(struct ocas_vars *vars,int answerind,int ishwm,double C) //printf("ocas_print.A%d\n",answerind); //printf("%s.A%02d %4d %8.2f | QP %9.3f QD %9.3f [%9.4f %7.3f] SV.%d %4d | M%9.6f (%9.6f max %8.1f %9.6f) %s.A%02d %9.6f%%\n", dispvals[0] = vars->Q_P[answerind]/1000000000.; dispvals[1] = (C * vars->Q_D[answerind])/1000000000.; - dispvals[2] = (vars->Q_P[answerind]-C * vars->Q_D[answerind]) / 1000000000; + dispvals[2] = (vars->Q_P[answerind]-C * vars->Q_D[answerind]) / 1000000000; dispvals[3] = (vars->Q_P[answerind]-C * vars->Q_D[answerind]) / MAX(1,fabs(vars->Q_P[answerind])); printf("%3d %d.A%02d +%d -%d",vars->nohwm[answerind],vars->refc,answerind,vars->good[answerind],vars->bad[answerind]); printf(" %4d %8.2f |QP %9.3f QD %10.2f [%11.2f %9.1f] SV.%3d %3d |M%9.3f errs.%-6d %-8.0f %5.2f%% errs %6.5f A%9.6f W0%9.6f D%11.9f\n",//[%7.4f%%]\n", - vars->numIt[answerind],vars->ocas_time/1000,dispvals[0],dispvals[1],dispvals[2],dispvals[3], + vars->numIt[answerind],vars->ocas_time/1000,dispvals[0],dispvals[1],dispvals[2],dispvals[3], vars->nNZAlpha[answerind], vars->numlhs[answerind], // PTRS->lastmetrics[answerind],PTRS->learningrates[answerind][0],PTRS->maxiters[answerind],PTRS->learningrates[answerind][1], vars->lastmetrics[answerind][0],vars->trn_err[answerind],vars->maxiters[answerind],vars->perc[answerind], @@ -827,8 +825,8 @@ static inline void finish_ocasiter(register int answerind,register struct ocas_v vars->errperc[answerind] = (100 * (double)vars->trn_err[answerind])/(double)MAX(1,vars->len[answerind]); vars->Q_P[answerind] = 0.5*vars->sq_norm_W[answerind] + (C * vars->xi[answerind]); vars->ocas_time = (vars->output_time + vars->w_time + vars->add_time + vars->sort_time + vars->qp_solver_time); - ocas_print(vars,answerind,0,C); -} + ocas_print(vars,answerind,0,C); +} static inline int ocas_iter(struct ocas_vars *vars,int max_nohwm) { @@ -947,8 +945,8 @@ static inline int init_ocas_vars(int numthreads,int selector,long answerindmask, { int answerind,lastanswerind,retval = 0; lastanswerind = TRADEBOTS_NUMANSWERS; - vars->maxlen = maxlen; - vars->numthreads = numthreads; + vars->maxlen = maxlen; + vars->numthreads = numthreads; vars->selector = selector; //printf("init_ocas_vars lastanswerind.%d\n",lastanswerind); for (answerind=0; answerindlen[answerind]); if ( vars->len[answerind] > 0 )//&& (answerindmask == -1L || ((1L<refc = c_to_refc(c); vars->c = c; vars->C = C; - vars->numfeatures = numfeatures; vars->maxlhs = maxlhs; + vars->refc = c_to_refc(c); vars->c = c; vars->C = C; + vars->numfeatures = numfeatures; vars->maxlhs = maxlhs; if ( vars->CLspaces[answerind] == 0 ) vars->CLspaces[answerind] = myaligned_alloc(sizeof(*vars->CLspaces[answerind])); vars->answerabsaves[answerind] = answerabsave[answerind]; @@ -972,7 +970,7 @@ static inline int init_ocas_vars(int numthreads,int selector,long answerindmask, //printf("mask.%lx init_ocas_vars selector.%d weekinds[0].%p\n",answerindmask,selector,vars->weekinds[0]); return(retval); } - + void ocas_init(struct ocas_vars *vars,int32_t c,int32_t numfeatures,int32_t starti,int32_t endi) { struct ocas_CLbuffers *ptr; struct ocas_lhsbuffers *lhs; @@ -1061,7 +1059,7 @@ void ocas_init(struct ocas_vars *vars,int32_t c,int32_t numfeatures,int32_t star vars->output_time = vars->sort_time = vars->w_time = vars->qp_solver_time = vars->ocas_time = vars->add_time = 0; vars->startweekind = starti; vars->endweekind = endi; } - + int32_t ocas_gen(int32_t c,int32_t numfeatures,int32_t starti,int32_t endi) { int32_t i; struct ocas_vars *vars = calloc(1,sizeof(*vars)); @@ -1072,4 +1070,3 @@ int32_t ocas_gen(int32_t c,int32_t numfeatures,int32_t starti,int32_t endi) return(0); } #endif - diff --git a/iguana/m_unix b/iguana/m_unix index 7859bb3c9..8517b1135 100755 --- a/iguana/m_unix +++ b/iguana/m_unix @@ -9,4 +9,4 @@ cd secp256k1; ./m_unix; cd .. cd ../crypto777; ./m_unix; cd ../iguana gcc -g -fno-aggressive-loop-optimizations -Wno-deprecated -c *.c ../basilisk/basilisk.c ../gecko/gecko.c ../datachain/datachain.c gcc -g -fno-aggressive-loop-optimizations -Wno-deprecated -c main.c iguana777.c iguana_bundles.c ../basilisk/basilisk.c -gcc -g -o ../agents/iguana *.o ../agents/libcrypto777.a -lpthread -lm +gcc -g -o ../agents/iguana *.o ../agents/libcrypto777.a -lpthread -lm -lnanomsg From 222be34db39d7e7230c66ee3864a490269faae47 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Feb 2017 21:52:05 +0200 Subject: [PATCH 016/495] kmd_lookup --- basilisk/basilisk.c | 1 + basilisk/basilisk_bitcoin.c | 60 ++--- iguana/dPoW.h | 4 + iguana/iguana_init.c | 1 + iguana/iguana_notary.c | 21 +- iguana/kmd_lookup.h | 426 ++++++++++++++++++++++++++++++++++ includes/iguana_apideclares.h | 2 + includes/iguana_structs.h | 1 + 8 files changed, 476 insertions(+), 40 deletions(-) create mode 100755 iguana/kmd_lookup.h diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 18126ece7..0eaeb4998 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -908,6 +908,7 @@ void basilisks_loop(void *arg) } endmilli = startmilli + 30; } + kmd_bitcoinscan(); } else { diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index 321ba0c50..ee9ae2fb6 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -22,36 +22,6 @@ };*/ #ifdef bitcoincancalculatebalances -int64_t bitcoin_value(struct iguana_info *coin,bits256 txid,int16_t vout,char *coinaddr) -{ - char params[512],str[65]; char *curlstr; cJSON *txobj,*vouts,*item,*sobj,*addrs; int32_t j,m,n; int64_t value = 0; - sprintf(params,"[\"%s\", 1]",bits256_str(str,txid)); - if ( (curlstr= bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getrawtransaction",params)) != 0 ) - { - if ( (txobj= cJSON_Parse(curlstr)) != 0 ) - { - if ( (vouts= jarray(&n,txobj,"vout")) != 0 && vout < n ) - { - item = jitem(vouts,vout); - if ( (sobj= jobj(item,"scriptPubKey")) != 0 && (addrs= jarray(&m,sobj,"addresses")) != 0 ) - { - for (j=0; jsymbol,coin->chain->serverport,coin->chain->userpass,"getrawtransaction",params)) != 0 ) + { + if ( (txobj= cJSON_Parse(curlstr)) != 0 ) + { + if ( (vouts= jarray(&n,txobj,"vout")) != 0 && vout < n ) + { + item = jitem(vouts,vout); + if ( (sobj= jobj(item,"scriptPubKey")) != 0 && (addrs= jarray(&m,sobj,"addresses")) != 0 ) + { + for (j=0; jsymbol), OS_portable_path(dirname); portable_mutex_init(&coin->RTmutex); + portable_mutex_init(&coin->kmdmutex); portable_mutex_init(&coin->peers_mutex); portable_mutex_init(&coin->blocks_mutex); portable_mutex_init(&coin->special_mutex); diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 85e495c6f..b3689e49d 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -657,16 +657,6 @@ TWO_STRINGS(dex,validateaddress,symbol,address) return(_dex_validateaddress(myinfo,symbol,address)); } -TWO_STRINGS(dex,listunspent,symbol,address) -{ - return(_dex_listunspent(myinfo,symbol,address)); -} - -TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions,symbol,address,count,skip) -{ - return(_dex_listtransactions(myinfo,symbol,address,count,skip)); -} - STRING_ARG(dex,getnotaries,symbol) { return(_dex_getnotaries(myinfo,symbol)); @@ -698,6 +688,17 @@ THREE_STRINGS_AND_THREE_INTS(dex,kvupdate,symbol,key,value,flags,unused,unusedb) } else return(clonestr("{\"error\":\"free updates only on KV chain\"}")); } +#include "kmd_lookup.h" + +TWO_STRINGS(dex,listunspent,symbol,address) +{ + return(_dex_listunspent(myinfo,symbol,address)); +} + +TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions,symbol,address,count,skip) +{ + return(_dex_listtransactions(myinfo,symbol,address,count,skip)); +} #include "../includes/iguana_apiundefs.h" diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h new file mode 100755 index 000000000..f553b0b2b --- /dev/null +++ b/iguana/kmd_lookup.h @@ -0,0 +1,426 @@ +/****************************************************************************** + * Copyright © 2014-2017 The SuperNET Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * SuperNET software, including this file may be copied, modified, propagated * + * or distributed except according to the terms contained in the LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +#ifndef INCLUDE_KMDLOOKUP_H +#define INCLUDE_KMDLOOKUP_H + +struct kmd_voutinfo +{ + bits256 spendtxid; + uint64_t amount; + uint16_t spendvini; + uint8_t type_rmd160[21], pad; +} PACKED; + +struct kmd_transaction +{ + bits256 txid; int32_t height,numvouts; uint32_t timestamp,pad; + struct kmd_voutinfo vouts[]; +}; + +struct kmd_transactionhh +{ + UT_hash_handle hh; + struct kmd_transaction *tx; + int32_t numvouts; + struct kmd_transactionhh *ptrs[]; +}; + +struct kmd_addresshh +{ + UT_hash_handle hh; + uint8_t type_rmd160[21], pad; + struct kmd_transactionhh *prev,*lastprev; +}; + +struct kmd_addresshh *_kmd_address(struct iguana_info *coin,uint8_t type_rmd160[21]) +{ + struct kmd_addresshh *addr; + portable_mutex_lock(&coin->kmdmutex); + HASH_FIND(hh,coin->kmd_addresses,type_rmd160,21,addr); + portable_mutex_unlock(&coin->kmdmutex); + return(addr); +} + +struct kmd_addresshh *_kmd_addressadd(struct iguana_info *coin,uint8_t type_rmd160[21]) +{ + struct kmd_addresshh *addr; + addr = calloc(1,sizeof(*addr)); + memcpy(addr->type_rmd160,type_rmd160,21); + portable_mutex_lock(&coin->kmdmutex); + { + char coinaddr[64]; + bitcoin_address(coinaddr,type_rmd160[0],&type_rmd160[1],20); + printf("%s NEW ADDRESS.(%s)\n",coin->symbol,coinaddr); + } + HASH_ADD_KEYPTR(hh,coin->kmd_addresses,addr->type_rmd160,21,addr); + portable_mutex_unlock(&coin->kmdmutex); + return(addr); +} + +struct kmd_addresshh *kmd_address(struct iguana_info *coin,char *coinaddr) +{ + uint8_t type_rmd160[21]; + bitcoin_addr2rmd160(&type_rmd160[0],&type_rmd160[1],coinaddr); + return(_kmd_address(coin,type_rmd160)); +} + +struct kmd_transactionhh *kmd_transaction(struct iguana_info *coin,bits256 txid) +{ + struct kmd_transactionhh *tx; + portable_mutex_lock(&coin->kmdmutex); + HASH_FIND(hh,coin->kmd_transactions,txid.bytes,sizeof(txid),tx); + portable_mutex_unlock(&coin->kmdmutex); + return(tx); +} + +int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vini,bits256 txid,int32_t vout) +{ + struct kmd_transactionhh *ptr,*spendptr; + if ( (ptr= kmd_transaction(coin,txid)) != 0 && vout < ptr->numvouts && (spendptr= kmd_transaction(coin,spendtxid)) != 0 ) + { + ptr->ptrs[(vout<<1) + 1] = spendptr; + ptr->tx->vouts[vout].spendtxid = spendtxid; + ptr->tx->vouts[vout].spendvini = vini; + return(0); + } + return(-1); +} + +void kmd_transactionvout(struct iguana_info *coin,struct kmd_transactionhh *ptr,int32_t vout,uint64_t amount,uint8_t type_rmd160[21],bits256 spendtxid,int32_t spendvini) +{ + struct kmd_addresshh *addr; struct kmd_transaction *tx = 0; + if ( vout < ptr->numvouts && (tx= ptr->tx) != 0 ) + { + tx->vouts[vout].spendtxid = spendtxid; + tx->vouts[vout].spendvini = spendvini; + tx->vouts[vout].amount = amount; + memcpy(tx->vouts[vout].type_rmd160,type_rmd160,21); + if ( coin->kmd_didinit != 0 && coin->kmd_txidfp != 0 ) + fwrite(tx,1,sizeof(*tx) + tx->numvouts*sizeof(*tx->vouts),coin->kmd_txidfp); + if ( (addr= _kmd_address(coin,type_rmd160)) == 0 ) + addr = _kmd_addressadd(coin,type_rmd160); + if ( addr != 0 ) + { + if ( addr->prev != ptr ) + { + ptr->ptrs[vout << 1] = addr->prev; + addr->lastprev = addr->prev; + addr->prev = ptr; + } + else + { + printf("tricky case same address in different vouts, make sure backlink is right\n"); + ptr->ptrs[vout<<1] = addr->lastprev; + } + } else printf("kmd_transactionvout unexpected null addr\n"); + } else printf("vout.%d wont fit into numvouts.[%d] or null tx.%p\n",vout,ptr->numvouts,tx); +} + +struct kmd_transactionhh *kmd_transactionadd(struct iguana_info *coin,struct kmd_transaction *tx,int32_t numvouts) +{ + struct kmd_transactionhh *ptr; char str[65]; + if ( (ptr= kmd_transaction(coin,tx->txid)) == 0 ) + { + ptr = calloc(1,sizeof(*ptr) + (sizeof(*ptr->ptrs)*numvouts*2)); + ptr->numvouts = numvouts; + ptr->tx = tx; + portable_mutex_lock(&coin->kmdmutex); + char str[65]; printf("%s ht.%d u.%u NEW TXID.(%s) vouts.[%d]\n",coin->symbol,tx->height,tx->timestamp,bits256_str(str,tx->txid),numvouts); + HASH_ADD_KEYPTR(hh,coin->kmd_transactions,tx->txid.bytes,sizeof(tx->txid),ptr); + portable_mutex_unlock(&coin->kmdmutex); + } else printf("warning adding already existing txid %s\n",bits256_str(str,tx->txid)); + return(ptr); +} + +struct kmd_transaction *kmd_transactionalloc(bits256 txid,int32_t height,uint32_t timestamp,int32_t numvouts) +{ + struct kmd_transaction *tx; + tx = calloc(1,sizeof(*tx) + sizeof(struct kmd_voutinfo)*numvouts); + tx->numvouts = numvouts; + tx->txid = txid; + tx->height = height; + tx->timestamp = timestamp; + return(tx); +} + +void kmd_flushfiles(struct iguana_info *coin) +{ + if ( coin->kmd_txidfp != 0 ) + fflush(coin->kmd_txidfp); +} + +FILE *kmd_txidinit(struct iguana_info *coin) +{ + int32_t i; FILE *fp; char fname[1024]; struct kmd_transactionhh *ptr; struct kmd_transaction T,*tx; struct kmd_voutinfo V; long lastpos=0; + sprintf(fname,"%s/%s/TRANSACTIONS",GLOBAL_DBDIR,coin->symbol); + if ( (fp= fopen(fname,"rb+")) != 0 ) + { + while ( fread(&T,1,sizeof(T),fp) == sizeof(T) ) + { + if ( (tx= kmd_transactionalloc(T.txid,T.height,T.timestamp,T.numvouts)) != 0 ) + { + if ( (ptr= kmd_transactionadd(coin,tx,T.numvouts)) != 0 ) + { + for (i=0; i coin->kmd_height ) + coin->kmd_height = T.height; + } + else break; + } + } else break; + } + fseek(fp,lastpos,SEEK_SET); + } else fp = fopen(fname,"wb"); + return(fp); +} + +cJSON *kmd_transactionjson(struct kmd_transactionhh *ptr,char *typestr) +{ + int32_t i; char coinaddr[64]; cJSON *item,*array,*obj = cJSON_CreateObject(); + array = cJSON_CreateArray(); + jaddstr(obj,"type",typestr); + jaddbits256(obj,"txid",ptr->tx->txid); + jaddnum(obj,"height",ptr->tx->height); + jaddnum(obj,"timestamp",ptr->tx->timestamp); + for (i=0; inumvouts; i++) + { + item = cJSON_CreateObject(); + bitcoin_address(coinaddr,ptr->tx->vouts[i].type_rmd160[0],&ptr->tx->vouts[i].type_rmd160[1],20); + jaddnum(item,coinaddr,dstr(ptr->tx->vouts[i].amount)); + jaddi(array,item); + } + jadd(obj,"vouts",array); + return(obj); +} + +cJSON *kmd_unspentjson(struct kmd_transaction *tx,int32_t vout) +{ + cJSON *item = cJSON_CreateObject(); + jaddbits256(item,"txid",tx->txid); + jaddnum(item,"vout",vout); + jaddnum(item,"amount",dstr(tx->vouts[vout].amount)); + return(item); +} + +int32_t kmd_height(struct iguana_info *coin) +{ + char params[64],*curlstr; cJSON *curljson; int32_t height = 0; + strcpy(params,"[]"); + if ( (curlstr= bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getinfo",params)) != 0 ) + { + if ( (curljson= cJSON_Parse(curlstr)) != 0 ) + { + height = juint(curljson,"blocks"); + free_json(curljson); + } + free(curlstr); + } + return(height); +} + +cJSON *kmd_listtransactions(struct iguana_info *coin,char *coinaddr) +{ + struct kmd_addresshh *addr; struct kmd_transactionhh *ptr,*spent; uint8_t type_rmd160[21]; int32_t i,height; cJSON *array = cJSON_CreateArray(); + if ( (height= kmd_height(coin)) > coin->kmd_height+3 ) + return(cJSON_Parse("[]")); + bitcoin_addr2rmd160(&type_rmd160[0],&type_rmd160[1],coinaddr); + if ( (addr= _kmd_address(coin,type_rmd160)) != 0 && (ptr= addr->prev) != 0 && ptr->tx != 0 ) + { + jaddi(array,kmd_transactionjson(ptr,"received")); + for (i=0; inumvouts; i++) + { + if ( memcmp(ptr->tx->vouts[i].type_rmd160,type_rmd160,21) == 0 && (spent= ptr->ptrs[(i<<1)+1]) != 0 ) + jaddi(array,kmd_transactionjson(spent,"sent")); + } + } + return(array); +} + +cJSON *kmd_listunspent(struct iguana_info *coin,char *coinaddr) +{ + struct kmd_addresshh *addr; struct kmd_transactionhh *ptr,*spent; uint8_t type_rmd160[21]; int32_t i,height; cJSON *array = cJSON_CreateArray(); + if ( (height= kmd_height(coin)) > coin->kmd_height+3 ) + return(cJSON_Parse("[]")); + bitcoin_addr2rmd160(&type_rmd160[0],&type_rmd160[1],coinaddr); + if ( (addr= _kmd_address(coin,type_rmd160)) != 0 && (ptr= addr->prev) != 0 && ptr->tx != 0 ) + { + for (i=0; inumvouts; i++) + { + if ( memcmp(ptr->tx->vouts[i].type_rmd160,type_rmd160,21) == 0 && (spent= ptr->ptrs[(i<<1)+1]) == 0 ) + jaddi(array,kmd_unspentjson(ptr->tx,i)); + } + } + return(array); +} + +char *kmd_bitcoinblockhashstr(char *coinstr,char *serverport,char *userpass,int32_t height) +{ + char numstr[128],*blockhashstr=0; bits256 hash2; struct iguana_info *coin; + sprintf(numstr,"%d",height); + if ( (blockhashstr= bitcoind_passthru(coinstr,serverport,userpass,"getblockhash",numstr)) == 0 ) + return(0); + hash2 = bits256_conv(blockhashstr); + if ( blockhashstr == 0 || blockhashstr[0] == 0 || bits256_nonz(hash2) == 0 ) + { + printf("couldnt get blockhash for %u, probably curl is disabled\n",height); + if ( blockhashstr != 0 ) + free(blockhashstr); + if ( height == 0 ) + { + if ( (coin= iguana_coinfind(coinstr)) != 0 ) + { + bits256_str(numstr,*(bits256 *)coin->chain->genesis_hashdata); + return(clonestr(numstr)); + } + } + return(0); + } + return(blockhashstr); +} + +cJSON *kmd_blockjson(int32_t *heightp,char *coinstr,char *serverport,char *userpass,char *blockhashstr,int32_t height) +{ + cJSON *json = 0; int32_t flag = 0; char buf[1024],*blocktxt = 0; + if ( blockhashstr == 0 ) + blockhashstr = kmd_bitcoinblockhashstr(coinstr,serverport,userpass,height), flag = 1; + if ( blockhashstr != 0 ) + { + sprintf(buf,"\"%s\"",blockhashstr); + blocktxt = bitcoind_passthru(coinstr,serverport,userpass,"getblock",buf); + //printf("get_blockjson.(%d %s) %s\n",height,blockhashstr,blocktxt); + if ( blocktxt != 0 && blocktxt[0] != 0 && (json= cJSON_Parse(blocktxt)) != 0 && heightp != 0 ) + if ( (*heightp= juint(json,"height")) != height ) + *heightp = -1; + if ( flag != 0 && blockhashstr != 0 ) + free(blockhashstr); + if ( blocktxt != 0 ) + free(blocktxt); + } + return(json); +} + +int32_t _kmd_bitcoinscan(struct iguana_info *coin) +{ + int32_t h,num=0,loadheight,i,n,numtxids,numvins,numvouts,flag=0,height=-1; cJSON *txjson,*vouts,*vins,*blockjson,*txids,*vout,*vin,*sobj,*addresses; bits256 zero,txid; char *curlstr,params[128],str[65]; struct kmd_transactionhh *ptr; struct kmd_transaction *tx; uint8_t type_rmd160[21]; + if ( coin->kmd_didinit == 0 ) + { + if ( (coin->kmd_txidfp= kmd_txidinit(coin)) == 0 ) + printf("error initializing %s.kmd lookups\n",coin->symbol); + coin->kmd_didinit = 1; + } + height = kmd_height(coin); + loadheight = coin->kmd_height; + while ( loadheight < height ) + { + if ( loadheight == 0 ) + { + loadheight++; + continue; + } + flag = 0; + if ( (blockjson= kmd_blockjson(&h,coin->symbol,coin->chain->serverport,coin->chain->userpass,0,loadheight)) != 0 ) + { + if ( (txids= jarray(&numtxids,blockjson,"tx")) != 0 ) + { + for (i=0; isymbol,coin->chain->serverport,coin->chain->userpass,"getrawtransaction",params)) != 0 ) + { + if ( (txjson= cJSON_Parse(curlstr)) != 0 ) + { + txid = jbits256(txjson,"txid"); + if ( kmd_transaction(coin,txid) != 0 ) + { + printf("already have txid.%s\n",bits256_str(str,txid)); + free_json(txjson); + free(curlstr); + continue; + } + vouts = jarray(&numvouts,txjson,"vout"); + vins = jarray(&numvins,txjson,"vin"); + if ( (tx= kmd_transactionalloc(txid,loadheight-jint(txjson,"confirmations"),jint(txjson,"blocktime"),numvouts)) != 0 ) + { + if ( (ptr= kmd_transactionadd(coin,tx,numvouts)) != 0 ) + { + for (i=0; ikmd_height = loadheight++; + if ( flag == 0 || num > 100 ) + break; + } + return(num); +} + +void kmd_bitcoinscan() +{ + char *retstr; cJSON *array; int32_t i,n; struct iguana_info *coin; + if ( (retstr= dpow_notarychains(0,0,0,0)) != 0 ) + { + if ( (array= cJSON_Parse(retstr)) != 0 ) + { + if ( (n= cJSON_GetArraySize(array)) > 0 ) + { + for (i=0; isymbol,"BTC") != 0 ) + _kmd_bitcoinscan(coin); + } + } + free_json(array); + } + free(retstr); + } +} + +#endif diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 8f621e2fb..5fb316041 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -42,6 +42,8 @@ TWO_STRINGS(dex,listunspent,symbol,address); TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions,symbol,address,count,skip); TWO_STRINGS(dex,kvsearch,symbol,key); THREE_STRINGS_AND_THREE_INTS(dex,kvupdate,symbol,key,value,flags,unused,unusedb); +TWO_STRINGS(dex,listunspent2,symbol,coinaddr); +TWO_STRINGS(dex,listtransactions2,symbol,coinaddr); TWO_STRINGS(zcash,passthru,function,hex); TWO_STRINGS(komodo,passthru,function,hex); diff --git a/includes/iguana_structs.h b/includes/iguana_structs.h index 167aca829..7b5a0b4d0 100755 --- a/includes/iguana_structs.h +++ b/includes/iguana_structs.h @@ -536,6 +536,7 @@ struct iguana_info struct iguana_block *RTblocks[65536]; uint8_t *RTrawdata[65536]; int32_t RTrecvlens[65536],RTnumtx[65536]; struct iguana_RTtxid *RTdataset; struct iguana_RTaddr *RTaddrs; struct hashstr_item *alladdresses; + struct kmd_transactionhh *kmd_transactions; struct kmd_addresshh *kmd_addresses; portable_mutex_t kmdmutex; FILE *kmd_txidfp; int32_t kmd_didinit,kmd_height; }; struct vin_signer { bits256 privkey; char coinaddr[64]; uint8_t siglen,sig[80],rmd160[20],pubkey[66]; }; From 83baf6d456d13ae87643f4f622ada0f93c31fae9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Feb 2017 22:05:51 +0200 Subject: [PATCH 017/495] test --- iguana/dPoW.h | 2 +- iguana/iguana_notary.c | 34 ++++++++++++++++++++++++++++++---- iguana/kmd_lookup.h | 28 ++++++++++++++++++++++------ includes/iguana_apideclares.h | 4 ++-- 4 files changed, 55 insertions(+), 13 deletions(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index c1625a473..2b26bf466 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -191,7 +191,7 @@ cJSON *dpow_checkaddress(struct supernet_info *myinfo,struct iguana_info *coin,c void dex_channelsend(struct supernet_info *myinfo,bits256 srchash,bits256 desthash,uint32_t channel,uint32_t msgid,uint8_t *data,int32_t datalen); void kmd_bitcoinscan(); struct iguana_info *iguana_coinfind(char *symbol); -cJSON *kmd_listtransactions(struct iguana_info *coin,char *coinaddr); +cJSON *kmd_listtransactions(struct iguana_info *coin,char *coinaddr,int32_t count,int32_t skip); cJSON *kmd_listunspent(struct iguana_info *coin,char *coinaddr); #endif diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index b3689e49d..bc42a5dba 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -612,6 +612,16 @@ HASH_AND_STRING_AND_INT(dex,gettxout,txid,symbol,vout) return(_dex_gettxout(myinfo,symbol,txid,vout)); } +TWO_STRINGS(dex,listunspent,symbol,address) +{ + return(_dex_listunspent(myinfo,symbol,address)); +} + +TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions,symbol,address,count,skip) +{ + return(_dex_listtransactions(myinfo,symbol,address,count,skip)); +} + STRING_ARG(dex,getinfo,symbol) { return(_dex_getinfo(myinfo,symbol)); @@ -690,14 +700,30 @@ THREE_STRINGS_AND_THREE_INTS(dex,kvupdate,symbol,key,value,flags,unused,unusedb) #include "kmd_lookup.h" -TWO_STRINGS(dex,listunspent,symbol,address) +TWO_STRINGS(dex,listunspent2,symbol,address) { - return(_dex_listunspent(myinfo,symbol,address)); + cJSON *retjson; + if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 ) + { + if ( strcmp(coin->symbol,"BTC") == 0 ) + return(clonestr("[]")); + if ( (retjson= kmd_listunspent(coin,address)) != 0 ) + return(jprint(retjson,1)); + } + return(clonestr("{\"error\":\"listunspent2 null symbol, address or coin\"}")); } -TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions,symbol,address,count,skip) +TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions2,symbol,address,count,skip) { - return(_dex_listtransactions(myinfo,symbol,address,count,skip)); + cJSON *retjson; + if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 ) + { + if ( strcmp(coin->symbol,"BTC") == 0 ) + return(clonestr("[]")); + if ( (retjson= kmd_listtransactions(coin,address,count,skip)) != 0 ) + return(jprint(retjson,1)); + } + return(clonestr("{\"error\":\"listunspent2 null symbol, address or coin\"}")); } #include "../includes/iguana_apiundefs.h" diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index f553b0b2b..ffb7a87af 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -240,19 +240,35 @@ int32_t kmd_height(struct iguana_info *coin) return(height); } -cJSON *kmd_listtransactions(struct iguana_info *coin,char *coinaddr) +cJSON *kmd_listtransactions(struct iguana_info *coin,char *coinaddr,int32_t count,int32_t skip) { - struct kmd_addresshh *addr; struct kmd_transactionhh *ptr,*spent; uint8_t type_rmd160[21]; int32_t i,height; cJSON *array = cJSON_CreateArray(); + struct kmd_addresshh *addr; struct kmd_transactionhh *ptr,*spent,*prev=0; uint8_t type_rmd160[21]; int32_t i,height,counter=0; cJSON *array = cJSON_CreateArray(); if ( (height= kmd_height(coin)) > coin->kmd_height+3 ) return(cJSON_Parse("[]")); bitcoin_addr2rmd160(&type_rmd160[0],&type_rmd160[1],coinaddr); if ( (addr= _kmd_address(coin,type_rmd160)) != 0 && (ptr= addr->prev) != 0 && ptr->tx != 0 ) { - jaddi(array,kmd_transactionjson(ptr,"received")); - for (i=0; inumvouts; i++) + while ( ptr != 0 ) { - if ( memcmp(ptr->tx->vouts[i].type_rmd160,type_rmd160,21) == 0 && (spent= ptr->ptrs[(i<<1)+1]) != 0 ) - jaddi(array,kmd_transactionjson(spent,"sent")); + if ( counter >= skip && counter < count+skip ) + jaddi(array,kmd_transactionjson(ptr,"received")); + if ( ++counter >= count+skip ) + break; + for (i=0; inumvouts; i++) + { + if ( memcmp(ptr->tx->vouts[i].type_rmd160,type_rmd160,21) == 0 && (spent= ptr->ptrs[(i<<1)+1]) != 0 ) + { + if ( counter >= skip && counter < count+skip ) + jaddi(array,kmd_transactionjson(spent,"sent")); + if ( ++counter >= count+skip ) + break; + if ( ptr->ptrs[i << 1] != 0 ) + prev = ptr->ptrs[i << 1]; + } + } + if ( counter >= count+skip ) + break; + ptr = prev; } } return(array); diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 5fb316041..8b475475d 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -42,8 +42,8 @@ TWO_STRINGS(dex,listunspent,symbol,address); TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions,symbol,address,count,skip); TWO_STRINGS(dex,kvsearch,symbol,key); THREE_STRINGS_AND_THREE_INTS(dex,kvupdate,symbol,key,value,flags,unused,unusedb); -TWO_STRINGS(dex,listunspent2,symbol,coinaddr); -TWO_STRINGS(dex,listtransactions2,symbol,coinaddr); +TWO_STRINGS(dex,listunspent2,symbol,address); +TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions2,symbol,address,count,skip); TWO_STRINGS(zcash,passthru,function,hex); TWO_STRINGS(komodo,passthru,function,hex); From f317200af8d8f5042911a71984e01f206b99a72c Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Feb 2017 22:08:05 +0200 Subject: [PATCH 018/495] test --- iguana/kmd_lookup.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index ffb7a87af..a73783158 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -363,7 +363,7 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) for (i=0; isymbol,coin->chain->serverport,coin->chain->userpass,"getrawtransaction",params)) != 0 ) { if ( (txjson= cJSON_Parse(curlstr)) != 0 ) From 02c9b5a19c65ad83dea815524016093d0950d6a9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Feb 2017 22:13:36 +0200 Subject: [PATCH 019/495] test --- iguana/kmd_lookup.h | 2 +- iguana/main.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index a73783158..a8fd09eb9 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -165,7 +165,7 @@ void kmd_flushfiles(struct iguana_info *coin) FILE *kmd_txidinit(struct iguana_info *coin) { int32_t i; FILE *fp; char fname[1024]; struct kmd_transactionhh *ptr; struct kmd_transaction T,*tx; struct kmd_voutinfo V; long lastpos=0; - sprintf(fname,"%s/%s/TRANSACTIONS",GLOBAL_DBDIR,coin->symbol); + sprintf(fname,"%s/TRANSACTIONS/%s",GLOBAL_DBDIR,coin->symbol); if ( (fp= fopen(fname,"rb+")) != 0 ) { while ( fread(&T,1,sizeof(T),fp) == sizeof(T) ) diff --git a/iguana/main.c b/iguana/main.c index 77eb104c9..a679eb328 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -670,6 +670,7 @@ void iguana_ensuredirs() sprintf(dirname,"%s",GLOBAL_GENESISDIR), OS_ensure_directory(dirname); sprintf(dirname,"%s",GLOBAL_CONFSDIR), OS_ensure_directory(dirname); sprintf(dirname,"%s",GLOBAL_DBDIR), OS_ensure_directory(dirname); + sprintf(dirname,"%s/TRANSACTIONS",GLOBAL_DBDIR), OS_ensure_directory(dirname); sprintf(dirname,"%s/purgeable",GLOBAL_DBDIR), OS_ensure_directory(dirname); sprintf(dirname,"%s",GLOBAL_TMPDIR), OS_ensure_directory(dirname); sprintf(dirname,"%s",GLOBAL_VALIDATEDIR), OS_ensure_directory(dirname); From 1ed200e73c4a4a8ecce2c242d4a7139e3de27152 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Feb 2017 22:18:43 +0200 Subject: [PATCH 020/495] test --- iguana/kmd_lookup.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index a8fd09eb9..478c2ee0d 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -356,7 +356,7 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) continue; } flag = 0; - if ( (blockjson= kmd_blockjson(&h,coin->symbol,coin->chain->serverport,coin->chain->userpass,0,loadheight)) != 0 ) + if ( (blockjson= kmd_blockjson(&h,coin->symbol,coin->chain->serverport,coin->chain->userpass,0,loadheight+1)) != 0 ) { if ( (txids= jarray(&numtxids,blockjson,"tx")) != 0 ) { @@ -430,7 +430,10 @@ void kmd_bitcoinscan() for (i=0; isymbol,"BTC") != 0 ) - _kmd_bitcoinscan(coin); + { + if ( strcmp("KMD",coin->symbol) == 0 ) + _kmd_bitcoinscan(coin); + } } } free_json(array); From 59268c1444102435e7ed98537a997b79a16398a0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Feb 2017 22:21:41 +0200 Subject: [PATCH 021/495] test --- iguana/kmd_lookup.h | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 478c2ee0d..05e62da08 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -421,6 +421,7 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) void kmd_bitcoinscan() { char *retstr; cJSON *array; int32_t i,n; struct iguana_info *coin; + return; if ( (retstr= dpow_notarychains(0,0,0,0)) != 0 ) { if ( (array= cJSON_Parse(retstr)) != 0 ) From e241a38dfb6c0fb0df488e0274739a1880d6e84f Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Feb 2017 09:01:48 +0200 Subject: [PATCH 022/495] test --- iguana/dpow/dpow_fsm.c | 2 +- iguana/kmd_lookup.h | 25 +++++++++++++++++-------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index 6a4b8340d..a01f74444 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -125,7 +125,7 @@ int32_t dpow_checkutxo(struct supernet_info *myinfo,struct dpow_info *dp,struct int32_t haveutxo,completed,minutxo,n; bits256 signedtxid; cJSON *addresses; char *rawtx,*sendtx; if ( strcmp("BTC",coin->symbol) == 0 ) { - minutxo = 9; + minutxo = 49; n = 50; } else diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 05e62da08..d9ac93d5d 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -164,7 +164,7 @@ void kmd_flushfiles(struct iguana_info *coin) FILE *kmd_txidinit(struct iguana_info *coin) { - int32_t i; FILE *fp; char fname[1024]; struct kmd_transactionhh *ptr; struct kmd_transaction T,*tx; struct kmd_voutinfo V; long lastpos=0; + int32_t i; FILE *fp; char fname[1024],str[65]; struct kmd_transactionhh *ptr,*tmp; struct kmd_transaction T,*tx; struct kmd_voutinfo V,*vptr; long lastpos=0; sprintf(fname,"%s/TRANSACTIONS/%s",GLOBAL_DBDIR,coin->symbol); if ( (fp= fopen(fname,"rb+")) != 0 ) { @@ -172,6 +172,7 @@ FILE *kmd_txidinit(struct iguana_info *coin) { if ( (tx= kmd_transactionalloc(T.txid,T.height,T.timestamp,T.numvouts)) != 0 ) { + printf("INIT %s.[%d] ht.%d %u\n",bits256_str(str,T.txid),T.numvouts,T.height,T.timestamp); if ( (ptr= kmd_transactionadd(coin,tx,T.numvouts)) != 0 ) { for (i=0; ikmd_transactions,ptr,tmp) + { + for (i=0; inumvouts; i++) + { + vptr = &ptr->tx->vouts[i]; + if ( vptr->spendvini >= 0 && bits256_nonz(vptr->spendtxid) != 0 ) + { + if ( (ptr->ptrs[(i<<1) + 1]= kmd_transaction(coin,vptr->spendtxid)) == 0 ) + printf("cant find %s spend.%d\n",bits256_str(str,vptr->spendtxid),i); + } + } + } } else fp = fopen(fname,"wb"); return(fp); } @@ -347,16 +360,12 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) coin->kmd_didinit = 1; } height = kmd_height(coin); - loadheight = coin->kmd_height; + loadheight = coin->kmd_height+1; while ( loadheight < height ) { - if ( loadheight == 0 ) - { - loadheight++; - continue; - } flag = 0; - if ( (blockjson= kmd_blockjson(&h,coin->symbol,coin->chain->serverport,coin->chain->userpass,0,loadheight+1)) != 0 ) + printf("load ht.%d\n",loadheight); + if ( (blockjson= kmd_blockjson(&h,coin->symbol,coin->chain->serverport,coin->chain->userpass,0,loadheight)) != 0 ) { if ( (txids= jarray(&numtxids,blockjson,"tx")) != 0 ) { From 613f25c68e1c21b948168f906ff0981d436c6634 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Feb 2017 09:37:19 +0200 Subject: [PATCH 023/495] test --- iguana/kmd_lookup.h | 1 - iguana/tests/sendtoaddress | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index d9ac93d5d..48eb0e958 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -430,7 +430,6 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) void kmd_bitcoinscan() { char *retstr; cJSON *array; int32_t i,n; struct iguana_info *coin; - return; if ( (retstr= dpow_notarychains(0,0,0,0)) != 0 ) { if ( (array= cJSON_Parse(retstr)) != 0 ) diff --git a/iguana/tests/sendtoaddress b/iguana/tests/sendtoaddress index fa108b11e..e31a3af56 100755 --- a/iguana/tests/sendtoaddress +++ b/iguana/tests/sendtoaddress @@ -1,3 +1,3 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"coin\":\"BTCD\",\"method\":\"sendtoaddress\",\"params\":[\"RVQV5spiARDTqfwBCxstWnMbrT6Q8mhRYz\", 0.15, \"testcomment\", \"sendcomment\"]}" +curl --url "http://127.0.0.1:7778" --data "{\"coin\":\"KMD\",\"method\":\"sendtoaddress\",\"params\":[\"RVQV5spiARDTqfwBCxstWnMbrT6Q8mhRYz\", 0.15, \"testcomment\", \"sendcomment\"]}" From b7bae51e5a1bb87cfd346699b96731ab373e734e Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Feb 2017 09:44:20 +0200 Subject: [PATCH 024/495] test --- iguana/kmd_lookup.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 48eb0e958..c9357066c 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -89,6 +89,8 @@ struct kmd_transactionhh *kmd_transaction(struct iguana_info *coin,bits256 txid) int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vini,bits256 txid,int32_t vout) { struct kmd_transactionhh *ptr,*spendptr; + if ( bits256_nonz(txid) == 0 || vout < 0 ) + return(0); // coinbase must be if ( (ptr= kmd_transaction(coin,txid)) != 0 && vout < ptr->numvouts && (spendptr= kmd_transaction(coin,spendtxid)) != 0 ) { ptr->ptrs[(vout<<1) + 1] = spendptr; @@ -246,6 +248,7 @@ int32_t kmd_height(struct iguana_info *coin) if ( (curljson= cJSON_Parse(curlstr)) != 0 ) { height = juint(curljson,"blocks"); + printf("kmd_height.%d (%s)\n",height,jprint(curljson,0)); free_json(curljson); } free(curlstr); From 0a2158d7456a3dcc94b6696e4a06683453ff8334 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Feb 2017 09:59:18 +0200 Subject: [PATCH 025/495] test --- iguana/kmd_lookup.h | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index c9357066c..5c71aea1c 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -248,7 +248,7 @@ int32_t kmd_height(struct iguana_info *coin) if ( (curljson= cJSON_Parse(curlstr)) != 0 ) { height = juint(curljson,"blocks"); - printf("kmd_height.%d (%s)\n",height,jprint(curljson,0)); + //printf("kmd_height.%d (%s)\n",height,jprint(curljson,0)); free_json(curljson); } free(curlstr); @@ -290,6 +290,26 @@ cJSON *kmd_listtransactions(struct iguana_info *coin,char *coinaddr,int32_t coun return(array); } +cJSON *kmd_gettxin(struct iguana_info *coin,bits256 txid,int32_t vout) +{ + struct kmd_transactionhh *ptr,*spendptr; struct kmd_transaction *tx; cJSON *retjson; + if ( (ptr= kmd_transaction(coin,txid)) != 0 && (tx= ptr->tx) != 0 ) + { + if ( vout >= ptr->numvouts ) + return(cJSON_Parse("{\"error\":\"vout too big\"}")); + if ( (spendptr= ptr->ptrs[(vout << 1) + 1]) != 0 ) + { + retjson = cJSON_CreateObject(); + jaddstr(retjson,"result","success"); + jaddstr(retjson,"status","spent"); + jaddbits256(retjson,"txid",txid); + jaddbits256(retjson,"spendtxid",tx->vouts[vout].spendtxid); + jaddnum(retjson,"vin",tx->vouts[vout].spendvini); + } else return(cJSON_Parse("{\"result\":\"success\",\"status\":\"unspent\"}")); + } + return(cJSON_Parse("{\"error\":\"txid not found\"}")); +} + cJSON *kmd_listunspent(struct iguana_info *coin,char *coinaddr) { struct kmd_addresshh *addr; struct kmd_transactionhh *ptr,*spent; uint8_t type_rmd160[21]; int32_t i,height; cJSON *array = cJSON_CreateArray(); @@ -390,7 +410,7 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) } vouts = jarray(&numvouts,txjson,"vout"); vins = jarray(&numvins,txjson,"vin"); - if ( (tx= kmd_transactionalloc(txid,loadheight-jint(txjson,"confirmations"),jint(txjson,"blocktime"),numvouts)) != 0 ) + if ( (tx= kmd_transactionalloc(txid,loadheight,jint(txjson,"blocktime"),numvouts)) != 0 ) { if ( (ptr= kmd_transactionadd(coin,tx,numvouts)) != 0 ) { From 5a11a68af44ae9ef7397027c5a3ed5c1353325c7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Feb 2017 10:18:48 +0200 Subject: [PATCH 026/495] test --- iguana/dPoW.h | 2 ++ iguana/iguana_notary.c | 14 +++++++++++++ iguana/kmd_lookup.h | 39 +++++++++++++++++++++++++++-------- includes/iguana_apideclares.h | 2 ++ 4 files changed, 48 insertions(+), 9 deletions(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 2b26bf466..b36dcd986 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -193,5 +193,7 @@ void kmd_bitcoinscan(); struct iguana_info *iguana_coinfind(char *symbol); cJSON *kmd_listtransactions(struct iguana_info *coin,char *coinaddr,int32_t count,int32_t skip); cJSON *kmd_listunspent(struct iguana_info *coin,char *coinaddr); +cJSON *kmd_listspent(struct iguana_info *coin,char *coinaddr); +cJSON *kmd_gettxin(struct iguana_info *coin,bits256 txid,int32_t vout); #endif diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index bc42a5dba..17db03c29 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -726,6 +726,20 @@ TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions2,symbol,address,count,skip) return(clonestr("{\"error\":\"listunspent2 null symbol, address or coin\"}")); } +HASH_AND_STRING_AND_INT(dex,gettxin,txid,symbol,vout) +{ + if ( symbol != 0 && (coin= iguana_coinfind(symbol)) != 0 ) + return(jprint(kmd_gettxin(coin,txid,vout),1)); + return(clonestr("{\"error\":\"listspent null symbol, address or coin\"}")); +} + +TWO_STRINGS(dex,listspent,symbol,address) +{ + if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 ) + return(jprint(kmd_listspent(coin,address),1)); + return(clonestr("{\"error\":\"listspent null symbol, address or coin\"}")); +} + #include "../includes/iguana_apiundefs.h" diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 5c71aea1c..60d2984bf 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -310,23 +310,44 @@ cJSON *kmd_gettxin(struct iguana_info *coin,bits256 txid,int32_t vout) return(cJSON_Parse("{\"error\":\"txid not found\"}")); } -cJSON *kmd_listunspent(struct iguana_info *coin,char *coinaddr) +cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode) { - struct kmd_addresshh *addr; struct kmd_transactionhh *ptr,*spent; uint8_t type_rmd160[21]; int32_t i,height; cJSON *array = cJSON_CreateArray(); + struct kmd_addresshh *addr; struct kmd_transactionhh *ptr,*spent,*prev=0; uint8_t type_rmd160[21]; int32_t i,height; cJSON *array = cJSON_CreateArray(); if ( (height= kmd_height(coin)) > coin->kmd_height+3 ) return(cJSON_Parse("[]")); bitcoin_addr2rmd160(&type_rmd160[0],&type_rmd160[1],coinaddr); if ( (addr= _kmd_address(coin,type_rmd160)) != 0 && (ptr= addr->prev) != 0 && ptr->tx != 0 ) { - for (i=0; inumvouts; i++) + while ( ptr != 0 ) { - if ( memcmp(ptr->tx->vouts[i].type_rmd160,type_rmd160,21) == 0 && (spent= ptr->ptrs[(i<<1)+1]) == 0 ) - jaddi(array,kmd_unspentjson(ptr->tx,i)); + prev = 0; + for (i=0; inumvouts; i++) + { + if ( memcmp(ptr->tx->vouts[i].type_rmd160,type_rmd160,21) == 0 ) + { + spent = ptr->ptrs[(i<<1) + 1]; + if ( (mode == 0 && spent == 0) || (mode == 1 && spent != 0) ) + jaddi(array,kmd_unspentjson(ptr->tx,i)); + if ( ptr->ptrs[i<<1] != 0 ) + prev = ptr->ptrs[i<<1]; + } + } + ptr = prev; } } return(array); } +cJSON *kmd_listunspent(struct iguana_info *coin,char *coinaddr) +{ + return(kmd_listaddress(coin,coinaddr,0)); +} + +cJSON *kmd_listspent(struct iguana_info *coin,char *coinaddr) +{ + return(kmd_listaddress(coin,coinaddr,1)); +} + char *kmd_bitcoinblockhashstr(char *coinstr,char *serverport,char *userpass,int32_t height) { char numstr[128],*blockhashstr=0; bits256 hash2; struct iguana_info *coin; @@ -387,7 +408,6 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) while ( loadheight < height ) { flag = 0; - printf("load ht.%d\n",loadheight); if ( (blockjson= kmd_blockjson(&h,coin->symbol,coin->chain->serverport,coin->chain->userpass,0,loadheight)) != 0 ) { if ( (txids= jarray(&numtxids,blockjson,"tx")) != 0 ) @@ -420,7 +440,7 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) if ( (sobj= jobj(vout,"scriptPubKey")) != 0 && (addresses= jarray(&n,sobj,"addresses")) != 0 ) { kmd_transactionvout(coin,ptr,i,jdouble(vout,"value")*SATOSHIDEN,type_rmd160,zero,-1); - } + } else flag++; } for (i=0; ikmd_height = loadheight++; - if ( flag == 0 || num > 100 ) + if ( flag != 0 || num > 100 ) break; + coin->kmd_height = loadheight++; } return(num); } diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 8b475475d..20386be5b 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -44,6 +44,8 @@ TWO_STRINGS(dex,kvsearch,symbol,key); THREE_STRINGS_AND_THREE_INTS(dex,kvupdate,symbol,key,value,flags,unused,unusedb); TWO_STRINGS(dex,listunspent2,symbol,address); TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions2,symbol,address,count,skip); +HASH_AND_STRING_AND_INT(dex,gettxin,txid,symbol,vout); +TWO_STRINGS(dex,listspent,symbol,address); TWO_STRINGS(zcash,passthru,function,hex); TWO_STRINGS(komodo,passthru,function,hex); From 0b5923903e6c7879c5b0ed56e0ae38a84f3e8dd6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Feb 2017 10:35:37 +0200 Subject: [PATCH 027/495] test --- iguana/iguana_notary.c | 15 ++++++++--- iguana/kmd_lookup.h | 49 +++++++++++++++++++++++++++++------ iguana/tests/dexgetbalance | 2 ++ iguana/tests/dexgettxin | 2 ++ iguana/tests/dexlistspent | 2 ++ includes/iguana_apideclares.h | 1 + 6 files changed, 59 insertions(+), 12 deletions(-) create mode 100755 iguana/tests/dexgetbalance create mode 100755 iguana/tests/dexgettxin create mode 100755 iguana/tests/dexlistspent diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 17db03c29..f96419c6b 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -710,7 +710,7 @@ TWO_STRINGS(dex,listunspent2,symbol,address) if ( (retjson= kmd_listunspent(coin,address)) != 0 ) return(jprint(retjson,1)); } - return(clonestr("{\"error\":\"listunspent2 null symbol, address or coin\"}")); + return(clonestr("{\"error\":\"dex listunspent2 null symbol, address or coin\"}")); } TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions2,symbol,address,count,skip) @@ -723,21 +723,28 @@ TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions2,symbol,address,count,skip) if ( (retjson= kmd_listtransactions(coin,address,count,skip)) != 0 ) return(jprint(retjson,1)); } - return(clonestr("{\"error\":\"listunspent2 null symbol, address or coin\"}")); + return(clonestr("{\"error\":\"dex listunspent2 null symbol, address or coin\"}")); } HASH_AND_STRING_AND_INT(dex,gettxin,txid,symbol,vout) { if ( symbol != 0 && (coin= iguana_coinfind(symbol)) != 0 ) return(jprint(kmd_gettxin(coin,txid,vout),1)); - return(clonestr("{\"error\":\"listspent null symbol, address or coin\"}")); + return(clonestr("{\"error\":\"dex listspent null symbol, address or coin\"}")); } TWO_STRINGS(dex,listspent,symbol,address) { if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 ) return(jprint(kmd_listspent(coin,address),1)); - return(clonestr("{\"error\":\"listspent null symbol, address or coin\"}")); + return(clonestr("{\"error\":\"dex listspent null symbol, address or coin\"}")); +} + +TWO_STRINGS(dex,getbalance,symbol,address) +{ + if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 ) + return(jprint(kmd_getbalance(coin,address),1)); + return(clonestr("{\"error\":\"dex getbalance null symbol, address or coin\"}")); } #include "../includes/iguana_apiundefs.h" diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 60d2984bf..38770e51c 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -348,6 +348,36 @@ cJSON *kmd_listspent(struct iguana_info *coin,char *coinaddr) return(kmd_listaddress(coin,coinaddr,1)); } +cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) +{ + cJSON *array,*retjson; int32_t iter; uint64_t spent=0,unspent=0,value; + for (iter=0; iter<2; iter++) + { + if ( (array= kmd_listaddress(coin,coinaddr,iter)) != 0 ) + { + if ( (n= cJSON_GetArraySize(array)) > 0 ) + { + for (i=0; isymbol,coin->chain->serverport,coin->chain->userpass,"getrawtransaction",params)) != 0 ) { if ( (txjson= cJSON_Parse(curlstr)) != 0 ) { - txid = jbits256(txjson,"txid"); - if ( kmd_transaction(coin,txid) != 0 ) + if ( bits256_cmp(txid,jbits256(txjson,"txid")) != 0 ) { - printf("already have txid.%s\n",bits256_str(str,txid)); - free_json(txjson); - free(curlstr); + printf("txid mismatch error ht.%d i.%d\n",loadheight,i); continue; } - vouts = jarray(&numvouts,txjson,"vout"); + vouts = jarray(&numvouts,txjson,"vout"); vins = jarray(&numvins,txjson,"vin"); if ( (tx= kmd_transactionalloc(txid,loadheight,jint(txjson,"blocktime"),numvouts)) != 0 ) { @@ -464,7 +497,7 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) } free_json(blockjson); } - if ( flag != 0 || num > 100 ) + if ( flag != 0 || num > 1000 ) break; coin->kmd_height = loadheight++; } diff --git a/iguana/tests/dexgetbalance b/iguana/tests/dexgetbalance new file mode 100755 index 000000000..bf11e3524 --- /dev/null +++ b/iguana/tests/dexgetbalance @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listbalance\",\"address\":\"RU58D7nNLXwD29hgC2MPgtAF458gGxnPYS\",\"symbol\":\"KMD\"}" diff --git a/iguana/tests/dexgettxin b/iguana/tests/dexgettxin new file mode 100755 index 000000000..70abbb1db --- /dev/null +++ b/iguana/tests/dexgettxin @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettxin\",\"vout\":0,\"txid\":\"cad09f4c3e23ef4cde4980cc0e2b296943f22cbaac183a30f86f49f7eccfedfd\",\"symbol\":\"KMD\"}" diff --git a/iguana/tests/dexlistspent b/iguana/tests/dexlistspent new file mode 100755 index 000000000..9b2a2c3d9 --- /dev/null +++ b/iguana/tests/dexlistspent @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listspent\",\"address\":\"RU58D7nNLXwD29hgC2MPgtAF458gGxnPYS\",\"symbol\":\"KMD\"}" diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 20386be5b..1be32ab77 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -46,6 +46,7 @@ TWO_STRINGS(dex,listunspent2,symbol,address); TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions2,symbol,address,count,skip); HASH_AND_STRING_AND_INT(dex,gettxin,txid,symbol,vout); TWO_STRINGS(dex,listspent,symbol,address); +TWO_STRINGS(dex,getbalance,symbol,address); TWO_STRINGS(zcash,passthru,function,hex); TWO_STRINGS(komodo,passthru,function,hex); From d24920c91169c3c5eb2ef08f3e1fde9e3d81286f Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Feb 2017 10:37:07 +0200 Subject: [PATCH 028/495] test --- iguana/kmd_lookup.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 38770e51c..00a388730 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -350,7 +350,7 @@ cJSON *kmd_listspent(struct iguana_info *coin,char *coinaddr) cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) { - cJSON *array,*retjson; int32_t iter; uint64_t spent=0,unspent=0,value; + cJSON *array,*retjson,*item; int32_t iter,i,n; uint64_t spent=0,unspent=0,value; for (iter=0; iter<2; iter++) { if ( (array= kmd_listaddress(coin,coinaddr,iter)) != 0 ) @@ -359,7 +359,7 @@ cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) { for (i=0; i Date: Fri, 10 Feb 2017 10:56:40 +0200 Subject: [PATCH 029/495] test --- iguana/kmd_lookup.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 00a388730..d645771ed 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -124,7 +124,7 @@ void kmd_transactionvout(struct iguana_info *coin,struct kmd_transactionhh *ptr, } else { - printf("tricky case same address in different vouts, make sure backlink is right\n"); + //printf("tricky case same address in different vouts, make sure backlink is right\n"); ptr->ptrs[vout<<1] = addr->lastprev; } } else printf("kmd_transactionvout unexpected null addr\n"); @@ -302,7 +302,11 @@ cJSON *kmd_gettxin(struct iguana_info *coin,bits256 txid,int32_t vout) retjson = cJSON_CreateObject(); jaddstr(retjson,"result","success"); jaddstr(retjson,"status","spent"); + jaddnum(retjson,"height",tx->height); + jaddnum(retjson,"timestamp",tx->timestamp); jaddbits256(retjson,"txid",txid); + jaddnum(retjson,"vout",vout); + jaddnum(retjson,"value",dstr(tx->vouts[vout].amount)); jaddbits256(retjson,"spendtxid",tx->vouts[vout].spendtxid); jaddnum(retjson,"vin",tx->vouts[vout].spendvini); } else return(cJSON_Parse("{\"result\":\"success\",\"status\":\"unspent\"}")); @@ -473,7 +477,7 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) if ( (sobj= jobj(vout,"scriptPubKey")) != 0 && (addresses= jarray(&n,sobj,"addresses")) != 0 ) { kmd_transactionvout(coin,ptr,i,jdouble(vout,"value")*SATOSHIDEN,type_rmd160,zero,-1); - } else flag++; + } } for (i=0; i Date: Fri, 10 Feb 2017 11:00:23 +0200 Subject: [PATCH 030/495] test --- iguana/kmd_lookup.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index d645771ed..9aeab13f3 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -88,7 +88,7 @@ struct kmd_transactionhh *kmd_transaction(struct iguana_info *coin,bits256 txid) int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vini,bits256 txid,int32_t vout) { - struct kmd_transactionhh *ptr,*spendptr; + struct kmd_transactionhh *ptr,*spendptr=0; if ( bits256_nonz(txid) == 0 || vout < 0 ) return(0); // coinbase must be if ( (ptr= kmd_transaction(coin,txid)) != 0 && vout < ptr->numvouts && (spendptr= kmd_transaction(coin,spendtxid)) != 0 ) @@ -98,6 +98,7 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi ptr->tx->vouts[vout].spendvini = vini; return(0); } + printf("vin error vout.%d vs ptr %p [%d] spent.%p\n",vout,ptr,ptr!=0?ptr->numvouts:-1,spendptr); return(-1); } From f0479758ef551dd486de1cef8cbc8380bb753bec Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Feb 2017 11:15:57 +0200 Subject: [PATCH 031/495] test --- iguana/dPoW.h | 9 ++++++ iguana/dpow/dpow_network.c | 64 +++++++++++++++++++++++++++++++++++++- iguana/dpow/dpow_rpc.c | 30 ++++++++++++++++++ iguana/iguana_notary.c | 27 ++++++++++------ iguana/tests/dexgetbalance | 2 +- 5 files changed, 121 insertions(+), 11 deletions(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index b36dcd986..013407cf3 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -175,9 +175,12 @@ char *_dex_getblockhash(struct supernet_info *myinfo,char *symbol,int32_t height char *_dex_getbestblockhash(struct supernet_info *myinfo,char *symbol); char *_dex_sendrawtransaction(struct supernet_info *myinfo,char *symbol,char *signedtx); char *_dex_gettxout(struct supernet_info *myinfo,char *symbol,bits256 txid,int32_t vout); +char *_dex_gettxin(struct supernet_info *myinfo,char *symbol,bits256 txid,int32_t vout); char *_dex_importaddress(struct supernet_info *myinfo,char *symbol,char *address); char *_dex_validateaddress(struct supernet_info *myinfo,char *symbol,char *address); char *_dex_listunspent(struct supernet_info *myinfo,char *symbol,char *address); +char *_dex_listspent(struct supernet_info *myinfo,char *symbol,char *address); +char *_dex_getbalance(struct supernet_info *myinfo,char *symbol,char *address); char *_dex_listtransactions(struct supernet_info *myinfo,char *symbol,char *coinaddr,int32_t count,int32_t skip); char *_dex_alladdresses(struct supernet_info *myinfo,char *symbol); int32_t _dex_getheight(struct supernet_info *myinfo,char *symbol); @@ -190,10 +193,16 @@ cJSON *dpow_checkaddress(struct supernet_info *myinfo,struct iguana_info *coin,c void dex_channelsend(struct supernet_info *myinfo,bits256 srchash,bits256 desthash,uint32_t channel,uint32_t msgid,uint8_t *data,int32_t datalen); void kmd_bitcoinscan(); +cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr); struct iguana_info *iguana_coinfind(char *symbol); cJSON *kmd_listtransactions(struct iguana_info *coin,char *coinaddr,int32_t count,int32_t skip); cJSON *kmd_listunspent(struct iguana_info *coin,char *coinaddr); cJSON *kmd_listspent(struct iguana_info *coin,char *coinaddr); cJSON *kmd_gettxin(struct iguana_info *coin,bits256 txid,int32_t vout); +cJSON *dpow_listspent(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr); +cJSON *dpow_getbalance(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr); +cJSON *dpow_gettxin(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t vout); + + #endif diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index a0903c9c8..2a5ed4b1e 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -476,6 +476,14 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d retstr = jprint(retjson,1); } } + else if ( dexreq.func == 'x' ) + { + if ( (retjson= dpow_gettxin(myinfo,coin,dexreq.hash,dexreq.shortarg)) != 0 ) + { + dpow_randipbits(myinfo,coin,retjson); + retstr = jprint(retjson,1); + } + } else if ( dexreq.func == 'H' ) { hash2 = dpow_getblockhash(myinfo,coin,dexreq.intarg); @@ -491,6 +499,14 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d retstr = jprint(retjson,1); } } + else if ( dexreq.func == 'b' ) + { + if ( (retjson= dpow_getbalance(myinfo,coin,(char *)&dexp->packet[datalen])) != 0 ) + { + dpow_randipbits(myinfo,coin,retjson); + retstr = jprint(retjson,1); + } + } else if ( dexreq.func == 'I' ) { if ( (retjson= dpow_getinfo(myinfo,coin)) != 0 ) @@ -527,6 +543,14 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d retstr = jprint(retjson,1); } } + else if ( dexreq.func == 's' ) + { + if ( (retjson= dpow_listspent(myinfo,coin,(char *)&dexp->packet[datalen])) != 0 ) + { + dpow_randipbits(myinfo,coin,retjson); + retstr = jprint(retjson,1); + } + } else if ( dexreq.func == 'P' ) { hash2 = dpow_getbestblockhash(myinfo,coin); @@ -764,6 +788,18 @@ char *_dex_gettxout(struct supernet_info *myinfo,char *symbol,bits256 txid,int32 return(_dex_sendrequest(myinfo,&dexreq,3,"value")); } +char *_dex_gettxin(struct supernet_info *myinfo,char *symbol,bits256 txid,int32_t vout) +{ + struct dex_request dexreq; + //char str[65]; printf("gettxout(%s %s %d)\n",symbol,bits256_str(str,txid),vout); + memset(&dexreq,0,sizeof(dexreq)); + safecopy(dexreq.name,symbol,sizeof(dexreq.name)); + dexreq.hash = txid; + dexreq.shortarg = vout; + dexreq.func = 'x'; + return(_dex_sendrequest(myinfo,&dexreq,3,"value")); +} + char *_dex_kvupdate(struct supernet_info *myinfo,char *symbol,char *key,char *value,int32_t flags) { struct dex_request dexreq; char keyvalue[IGUANA_MAXSCRIPTSIZE]; int32_t keylen,valuesize; @@ -918,7 +954,33 @@ char *_dex_listunspent(struct supernet_info *myinfo,char *symbol,char *address) struct dex_request dexreq; char *retstr; memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); - dexreq.func = 'U'; + dexreq.func = 's'; + if ( (retstr= _dex_sendrequeststr(myinfo,&dexreq,address,0,1,"")) != 0 ) + { + //printf("UNSPENTS.(%s)\n",retstr); + } + return(_dex_arrayreturn(retstr)); +} + +char *_dex_listspent(struct supernet_info *myinfo,char *symbol,char *address) +{ + struct dex_request dexreq; char *retstr; + memset(&dexreq,0,sizeof(dexreq)); + safecopy(dexreq.name,symbol,sizeof(dexreq.name)); + dexreq.func = 's'; + if ( (retstr= _dex_sendrequeststr(myinfo,&dexreq,address,0,1,"")) != 0 ) + { + //printf("UNSPENTS.(%s)\n",retstr); + } + return(_dex_arrayreturn(retstr)); +} + +char *_dex_getbalance(struct supernet_info *myinfo,char *symbol,char *address) +{ + struct dex_request dexreq; char *retstr; + memset(&dexreq,0,sizeof(dexreq)); + safecopy(dexreq.name,symbol,sizeof(dexreq.name)); + dexreq.func = 'b'; if ( (retstr= _dex_sendrequeststr(myinfo,&dexreq,address,0,1,"")) != 0 ) { //printf("UNSPENTS.(%s)\n",retstr); diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index ea148965b..9cb3057e7 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -405,6 +405,36 @@ cJSON *dpow_listunspent(struct supernet_info *myinfo,struct iguana_info *coin,ch return(json); } +cJSON *dpow_listspent(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr) +{ + if ( myinfo->IAMNOTARY != 0 ) + return(kmd_listspent(coin,coinaddr)); + else + { + return(0); + } +} + +cJSON *dpow_getbalance(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr) +{ + if ( myinfo->IAMNOTARY != 0 ) + return(kmd_getbalance(coin,coinaddr)); + else + { + return(0); + } +} + +cJSON *dpow_gettxin(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t vout) +{ + if ( myinfo->IAMNOTARY != 0 ) + return(kmd_gettxin(coin,txid,vout)); + else + { + return(0); + } +} + cJSON *dpow_listtransactions(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr,int32_t count,int32_t skip) { char buf[128],*retstr; cJSON *json = 0; diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index f96419c6b..d26473e85 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -728,23 +728,32 @@ TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions2,symbol,address,count,skip) HASH_AND_STRING_AND_INT(dex,gettxin,txid,symbol,vout) { - if ( symbol != 0 && (coin= iguana_coinfind(symbol)) != 0 ) - return(jprint(kmd_gettxin(coin,txid,vout),1)); - return(clonestr("{\"error\":\"dex listspent null symbol, address or coin\"}")); + if ( myinfo->IAMNOTARY != 0 ) + { + if ( symbol != 0 && (coin= iguana_coinfind(symbol)) != 0 ) + return(jprint(kmd_gettxin(coin,txid,vout),1)); + return(clonestr("{\"error\":\"dex listspent null symbol, address or coin\"}")); + } else return(_dex_gettxin(myinfo,symbol,txid,vout)); } TWO_STRINGS(dex,listspent,symbol,address) { - if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 ) - return(jprint(kmd_listspent(coin,address),1)); - return(clonestr("{\"error\":\"dex listspent null symbol, address or coin\"}")); + if ( myinfo->IAMNOTARY != 0 ) + { + if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 ) + return(jprint(kmd_listspent(coin,address),1)); + return(clonestr("{\"error\":\"dex listspent null symbol, address or coin\"}")); + } else return(_dex_listspent(myinfo,symbol,address)); } TWO_STRINGS(dex,getbalance,symbol,address) { - if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 ) - return(jprint(kmd_getbalance(coin,address),1)); - return(clonestr("{\"error\":\"dex getbalance null symbol, address or coin\"}")); + if ( myinfo->IAMNOTARY != 0 ) + { + if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 ) + return(jprint(kmd_getbalance(coin,address),1)); + return(clonestr("{\"error\":\"dex getbalance null symbol, address or coin\"}")); + } else return(_dex_getbalance(myinfo,symbol,address)); } #include "../includes/iguana_apiundefs.h" diff --git a/iguana/tests/dexgetbalance b/iguana/tests/dexgetbalance index bf11e3524..d0f90e62b 100755 --- a/iguana/tests/dexgetbalance +++ b/iguana/tests/dexgetbalance @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listbalance\",\"address\":\"RU58D7nNLXwD29hgC2MPgtAF458gGxnPYS\",\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getbalance\",\"address\":\"RU58D7nNLXwD29hgC2MPgtAF458gGxnPYS\",\"symbol\":\"KMD\"}" From b3c84e3a91c90b48d1d1ebfb351ca6eff491d710 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Feb 2017 11:17:08 +0200 Subject: [PATCH 032/495] test --- iguana/kmd_lookup.h | 1 - 1 file changed, 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 9aeab13f3..bd6222093 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -487,7 +487,6 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) { printf("error i.%d of numvins.%d\n",i,numvins); flag++; - break; } } } From 8aae47eb2383b57915517cbed1923d53f56f0759 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Feb 2017 11:17:31 +0200 Subject: [PATCH 033/495] test --- iguana/kmd_lookup.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index bd6222093..54a4beee9 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -485,7 +485,7 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) vin = jitem(vins,i); if ( kmd_transactionvin(coin,txid,i,jbits256(vin,"txid"),jint(vin,"vout")) < 0 ) { - printf("error i.%d of numvins.%d\n",i,numvins); + printf("error i.%d of numvins.%d (%s)\n",i,numvins,jprint(vin,0)); flag++; } } From 6bd8b4744e9b9e04d1121bf6a7ce20f22ea744f7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Feb 2017 11:17:53 +0200 Subject: [PATCH 034/495] test --- iguana/kmd_lookup.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 54a4beee9..4cbe3d97c 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -501,7 +501,7 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) } free_json(blockjson); } - if ( flag != 0 || num > 1000 ) + if ( flag != 0 || num > 5000 ) break; coin->kmd_height = loadheight++; } From 98407340f29900af8fdea230dc2d178cc9b38c00 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Feb 2017 11:23:27 +0200 Subject: [PATCH 035/495] test --- iguana/kmd_lookup.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 4cbe3d97c..6ed595221 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -472,13 +472,15 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) { if ( (ptr= kmd_transactionadd(coin,tx,numvouts)) != 0 ) { + sobj = addresses = 0; for (i=0; i Date: Fri, 10 Feb 2017 15:02:43 +0200 Subject: [PATCH 036/495] test --- iguana/kmd_lookup.h | 46 ++++++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 6ed595221..46648ab1d 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -98,7 +98,7 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi ptr->tx->vouts[vout].spendvini = vini; return(0); } - printf("vin error vout.%d vs ptr %p [%d] spent.%p\n",vout,ptr,ptr!=0?ptr->numvouts:-1,spendptr); + char str[65]; printf("vin error %s vout.%d vs ptr %p [%d] spent.%p\n",bits256_str(str,txid),vout,ptr,ptr!=0?ptr->numvouts:-1,spendptr); return(-1); } @@ -431,7 +431,7 @@ cJSON *kmd_blockjson(int32_t *heightp,char *coinstr,char *serverport,char *userp int32_t _kmd_bitcoinscan(struct iguana_info *coin) { - int32_t h,num=0,loadheight,i,n,numtxids,numvins,numvouts,flag=0,height=-1; cJSON *txjson,*vouts,*vins,*blockjson,*txids,*vout,*vin,*sobj,*addresses; bits256 zero,txid; char *curlstr,params[128],str[65]; struct kmd_transactionhh *ptr; struct kmd_transaction *tx; uint8_t type_rmd160[21]; + int32_t h,num=0,loadheight,i,n,j,iter,numtxids,numvins,numvouts,flag=0,height=-1; cJSON *txjson,*vouts,*vins,*blockjson,*txids,*vout,*vin,*sobj,*addresses; bits256 zero,txid; char *curlstr,params[128],str[65]; struct kmd_transactionhh *ptr; struct kmd_transaction *tx; uint8_t type_rmd160[21]; if ( coin->kmd_didinit == 0 ) { if ( (coin->kmd_txidfp= kmd_txidinit(coin)) == 0 ) @@ -447,13 +447,14 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) { if ( (txids= jarray(&numtxids,blockjson,"tx")) != 0 ) { + for (iter=0; i<2; iter++) for (i=0; itx; + } + if ( ptr != 0 && tx != 0 ) + { + if ( iter == 0 ) { sobj = addresses = 0; - for (i=0; i Date: Fri, 10 Feb 2017 15:08:28 +0200 Subject: [PATCH 037/495] test --- iguana/kmd_lookup.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 46648ab1d..440703556 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -319,7 +319,10 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode) { struct kmd_addresshh *addr; struct kmd_transactionhh *ptr,*spent,*prev=0; uint8_t type_rmd160[21]; int32_t i,height; cJSON *array = cJSON_CreateArray(); if ( (height= kmd_height(coin)) > coin->kmd_height+3 ) + { + printf("height.%d > kmd_height.%d\n",height,coin->kmd_height); return(cJSON_Parse("[]")); + } bitcoin_addr2rmd160(&type_rmd160[0],&type_rmd160[1],coinaddr); if ( (addr= _kmd_address(coin,type_rmd160)) != 0 && (ptr= addr->prev) != 0 && ptr->tx != 0 ) { @@ -360,6 +363,7 @@ cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) { if ( (array= kmd_listaddress(coin,coinaddr,iter)) != 0 ) { + fprintf(stderr,"%s ",jprint(array,0)); if ( (n= cJSON_GetArraySize(array)) > 0 ) { for (i=0; i Date: Fri, 10 Feb 2017 15:13:12 +0200 Subject: [PATCH 038/495] test --- iguana/kmd_lookup.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 440703556..7ad92e33f 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -141,10 +141,10 @@ struct kmd_transactionhh *kmd_transactionadd(struct iguana_info *coin,struct kmd ptr->numvouts = numvouts; ptr->tx = tx; portable_mutex_lock(&coin->kmdmutex); - char str[65]; printf("%s ht.%d u.%u NEW TXID.(%s) vouts.[%d]\n",coin->symbol,tx->height,tx->timestamp,bits256_str(str,tx->txid),numvouts); + //char str[65]; printf("%s ht.%d u.%u NEW TXID.(%s) vouts.[%d]\n",coin->symbol,tx->height,tx->timestamp,bits256_str(str,tx->txid),numvouts); HASH_ADD_KEYPTR(hh,coin->kmd_transactions,tx->txid.bytes,sizeof(tx->txid),ptr); portable_mutex_unlock(&coin->kmdmutex); - } else printf("warning adding already existing txid %s\n",bits256_str(str,tx->txid)); + } // else printf("warning adding already existing txid %s\n",bits256_str(str,tx->txid)); return(ptr); } @@ -175,7 +175,7 @@ FILE *kmd_txidinit(struct iguana_info *coin) { if ( (tx= kmd_transactionalloc(T.txid,T.height,T.timestamp,T.numvouts)) != 0 ) { - printf("INIT %s.[%d] ht.%d %u\n",bits256_str(str,T.txid),T.numvouts,T.height,T.timestamp); + //printf("INIT %s.[%d] ht.%d %u\n",bits256_str(str,T.txid),T.numvouts,T.height,T.timestamp); if ( (ptr= kmd_transactionadd(coin,tx,T.numvouts)) != 0 ) { for (i=0; i Date: Fri, 10 Feb 2017 15:46:39 +0200 Subject: [PATCH 039/495] test --- iguana/kmd_lookup.h | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 7ad92e33f..e66891e01 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -51,6 +51,12 @@ struct kmd_addresshh *_kmd_address(struct iguana_info *coin,uint8_t type_rmd160[ portable_mutex_lock(&coin->kmdmutex); HASH_FIND(hh,coin->kmd_addresses,type_rmd160,21,addr); portable_mutex_unlock(&coin->kmdmutex); + if ( addr != 0 ) + { + char coinaddr[64]; + bitcoin_address(coinaddr,type_rmd160[0],&type_rmd160[1],20); + printf("%s found (%s)\n",coin->symbol,coinaddr); + } return(addr); } @@ -134,7 +140,7 @@ void kmd_transactionvout(struct iguana_info *coin,struct kmd_transactionhh *ptr, struct kmd_transactionhh *kmd_transactionadd(struct iguana_info *coin,struct kmd_transaction *tx,int32_t numvouts) { - struct kmd_transactionhh *ptr; char str[65]; + struct kmd_transactionhh *ptr; //char str[65]; if ( (ptr= kmd_transaction(coin,tx->txid)) == 0 ) { ptr = calloc(1,sizeof(*ptr) + (sizeof(*ptr->ptrs)*numvouts*2)); @@ -447,6 +453,8 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) while ( loadheight < height ) { flag = 0; + if ( (loadheight % 1000) == 0 ) + printf("loading ht.%d\n",loadheight); if ( (blockjson= kmd_blockjson(&h,coin->symbol,coin->chain->serverport,coin->chain->userpass,0,loadheight)) != 0 ) { if ( (txids= jarray(&numtxids,blockjson,"tx")) != 0 ) From 85779d4fb6f374303868cc5ca6f2f6db8668f9ef Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Feb 2017 15:49:15 +0200 Subject: [PATCH 040/495] test --- iguana/kmd_lookup.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index e66891e01..f8ac3f8cf 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -65,12 +65,12 @@ struct kmd_addresshh *_kmd_addressadd(struct iguana_info *coin,uint8_t type_rmd1 struct kmd_addresshh *addr; addr = calloc(1,sizeof(*addr)); memcpy(addr->type_rmd160,type_rmd160,21); - portable_mutex_lock(&coin->kmdmutex); { char coinaddr[64]; bitcoin_address(coinaddr,type_rmd160[0],&type_rmd160[1],20); printf("%s NEW ADDRESS.(%s)\n",coin->symbol,coinaddr); } + portable_mutex_lock(&coin->kmdmutex); HASH_ADD_KEYPTR(hh,coin->kmd_addresses,addr->type_rmd160,21,addr); portable_mutex_unlock(&coin->kmdmutex); return(addr); @@ -121,6 +121,7 @@ void kmd_transactionvout(struct iguana_info *coin,struct kmd_transactionhh *ptr, fwrite(tx,1,sizeof(*tx) + tx->numvouts*sizeof(*tx->vouts),coin->kmd_txidfp); if ( (addr= _kmd_address(coin,type_rmd160)) == 0 ) addr = _kmd_addressadd(coin,type_rmd160); + printf("addr.%p\n",addr); if ( addr != 0 ) { if ( addr->prev != ptr ) From e63788fa663be3ec8512ec8a3929b57e3ced9a42 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Feb 2017 15:54:00 +0200 Subject: [PATCH 041/495] test --- iguana/kmd_lookup.h | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index f8ac3f8cf..cf5ebcc07 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -111,6 +111,7 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi void kmd_transactionvout(struct iguana_info *coin,struct kmd_transactionhh *ptr,int32_t vout,uint64_t amount,uint8_t type_rmd160[21],bits256 spendtxid,int32_t spendvini) { struct kmd_addresshh *addr; struct kmd_transaction *tx = 0; + printf("ht.%d VOUT %d %.8f\n",ptr->tx->height,vout,dstr(amount)); if ( vout < ptr->numvouts && (tx= ptr->tx) != 0 ) { tx->vouts[vout].spendtxid = spendtxid; @@ -190,15 +191,19 @@ FILE *kmd_txidinit(struct iguana_info *coin) if ( fread(&V,1,sizeof(V),fp) == sizeof(V) ) { kmd_transactionvout(coin,ptr,i,V.amount,V.type_rmd160,V.spendtxid,V.spendvini); - } else break; + } + else + { + printf("error loading vout.%d ht.%d\n",i,T.height); + break; + } } if ( i == T.numvouts ) { lastpos = ftell(fp); if ( T.height > coin->kmd_height ) coin->kmd_height = T.height; - } - else break; + } else break; } } else break; } From 73919b4313174c2d7aa99ce469b13c9bc961a4a4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Feb 2017 15:56:17 +0200 Subject: [PATCH 042/495] test --- iguana/kmd_lookup.h | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index cf5ebcc07..bdf3d5aad 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -493,6 +493,7 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) { if ( (tx= kmd_transactionalloc(txid,loadheight,jint(txjson,"blocktime"),numvouts)) != 0 ) ptr = kmd_transactionadd(coin,tx,numvouts); + else printf("error init tx ptr.%p tx.%p\n",ptr,tx); } else { From 1c768401ea86c85325c3006a516d01a1b860fc05 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Feb 2017 15:59:30 +0200 Subject: [PATCH 043/495] test --- iguana/kmd_lookup.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index bdf3d5aad..739103949 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -511,7 +511,7 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) if ( (sobj= jobj(vout,"scriptPubKey")) != 0 && (addresses= jarray(&n,sobj,"addresses")) != 0 ) { kmd_transactionvout(coin,ptr,j,jdouble(vout,"value")*SATOSHIDEN,type_rmd160,zero,-1); - } // else printf("missing sobj.%p or addresses.%p (%s)\n",sobj,addresses,jprint(vout,0)); likely OP_RETURN + } else printf("missing sobj.%p or addresses.%p (%s)\n",sobj,addresses,jprint(vout,0)); //likely OP_RETURN sobj = addresses = 0; } } @@ -527,9 +527,9 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) } } } - } + } else printf("incomplete at ht.%d i.%d %p %p\n",loadheight,i,ptr,tx); free_json(txjson); - } + } else printf("parseerror.(%s)\n",curlstr); free(curlstr); } } From d8aa91da046fb2a294fb4d609c9c5219611aa687 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Feb 2017 16:01:02 +0200 Subject: [PATCH 044/495] test --- iguana/kmd_lookup.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 739103949..3a2e46a02 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -465,7 +465,7 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) { if ( (txids= jarray(&numtxids,blockjson,"tx")) != 0 ) { - for (iter=0; i<2; iter++) + for (iter=0; iter<2; iter++) for (i=0; i Date: Fri, 10 Feb 2017 16:04:09 +0200 Subject: [PATCH 045/495] test --- iguana/kmd_lookup.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 3a2e46a02..5bcff9aa3 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -55,7 +55,7 @@ struct kmd_addresshh *_kmd_address(struct iguana_info *coin,uint8_t type_rmd160[ { char coinaddr[64]; bitcoin_address(coinaddr,type_rmd160[0],&type_rmd160[1],20); - printf("%s found (%s)\n",coin->symbol,coinaddr); + printf("%s found (%s) %02x\n",coin->symbol,coinaddr,type_rmd160[0]); } return(addr); } @@ -68,7 +68,7 @@ struct kmd_addresshh *_kmd_addressadd(struct iguana_info *coin,uint8_t type_rmd1 { char coinaddr[64]; bitcoin_address(coinaddr,type_rmd160[0],&type_rmd160[1],20); - printf("%s NEW ADDRESS.(%s)\n",coin->symbol,coinaddr); + printf("%s NEW ADDRESS.(%s) %02x\n",coin->symbol,coinaddr,type_rmd160[0]); } portable_mutex_lock(&coin->kmdmutex); HASH_ADD_KEYPTR(hh,coin->kmd_addresses,addr->type_rmd160,21,addr); From 665601f421cc29ba979b50bb8721c823522be614 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Feb 2017 16:06:08 +0200 Subject: [PATCH 046/495] test --- iguana/kmd_lookup.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 5bcff9aa3..df3698027 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -510,8 +510,9 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) vout = jitem(vouts,j); if ( (sobj= jobj(vout,"scriptPubKey")) != 0 && (addresses= jarray(&n,sobj,"addresses")) != 0 ) { + bitcoin_addr2rmd160(&type_rmd160[0],&type_rmd160[1],jstri(addresses,0)); kmd_transactionvout(coin,ptr,j,jdouble(vout,"value")*SATOSHIDEN,type_rmd160,zero,-1); - } else printf("missing sobj.%p or addresses.%p (%s)\n",sobj,addresses,jprint(vout,0)); //likely OP_RETURN + } // else printf("missing sobj.%p or addresses.%p (%s)\n",sobj,addresses,jprint(vout,0)); //likely OP_RETURN sobj = addresses = 0; } } From 96c834dc324427687ce6e6023ae4263a2ac6e24a Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Feb 2017 16:08:35 +0200 Subject: [PATCH 047/495] test --- iguana/kmd_lookup.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index df3698027..2d3e15277 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -51,7 +51,7 @@ struct kmd_addresshh *_kmd_address(struct iguana_info *coin,uint8_t type_rmd160[ portable_mutex_lock(&coin->kmdmutex); HASH_FIND(hh,coin->kmd_addresses,type_rmd160,21,addr); portable_mutex_unlock(&coin->kmdmutex); - if ( addr != 0 ) + if ( addr != 0 && 0 ) { char coinaddr[64]; bitcoin_address(coinaddr,type_rmd160[0],&type_rmd160[1],20); @@ -111,7 +111,7 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi void kmd_transactionvout(struct iguana_info *coin,struct kmd_transactionhh *ptr,int32_t vout,uint64_t amount,uint8_t type_rmd160[21],bits256 spendtxid,int32_t spendvini) { struct kmd_addresshh *addr; struct kmd_transaction *tx = 0; - printf("ht.%d VOUT %d %.8f\n",ptr->tx->height,vout,dstr(amount)); + //printf("ht.%d VOUT %d %.8f\n",ptr->tx->height,vout,dstr(amount)); if ( vout < ptr->numvouts && (tx= ptr->tx) != 0 ) { tx->vouts[vout].spendtxid = spendtxid; @@ -122,7 +122,6 @@ void kmd_transactionvout(struct iguana_info *coin,struct kmd_transactionhh *ptr, fwrite(tx,1,sizeof(*tx) + tx->numvouts*sizeof(*tx->vouts),coin->kmd_txidfp); if ( (addr= _kmd_address(coin,type_rmd160)) == 0 ) addr = _kmd_addressadd(coin,type_rmd160); - printf("addr.%p\n",addr); if ( addr != 0 ) { if ( addr->prev != ptr ) From 289538b41d0703146c69cb9fb08d07673b562176 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Feb 2017 16:10:39 +0200 Subject: [PATCH 048/495] test --- iguana/kmd_lookup.h | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 2d3e15277..ab4129e2b 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -65,6 +65,7 @@ struct kmd_addresshh *_kmd_addressadd(struct iguana_info *coin,uint8_t type_rmd1 struct kmd_addresshh *addr; addr = calloc(1,sizeof(*addr)); memcpy(addr->type_rmd160,type_rmd160,21); + if ( 0 ) { char coinaddr[64]; bitcoin_address(coinaddr,type_rmd160[0],&type_rmd160[1],20); From d9eee478d2c3a3832bc79cbd1c928f62238acd1b Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Feb 2017 20:20:25 +0200 Subject: [PATCH 049/495] batch8 --- iguana/kmd_lookup.h | 2 +- iguana/main.c | 6 +- iguana/tests/KMD.batch7.listunspent | 291 +++++++++++-------------- iguana/tests/KMD.batch8 | 189 ++++++++++++++++ iguana/tests/KMD.batch8.importaddress | 187 ++++++++++++++++ iguana/tests/REVS.batch8 | 23 ++ iguana/tests/REVS.batch8.importaddress | 21 ++ 7 files changed, 551 insertions(+), 168 deletions(-) create mode 100755 iguana/tests/KMD.batch8 create mode 100755 iguana/tests/KMD.batch8.importaddress create mode 100755 iguana/tests/REVS.batch8 create mode 100755 iguana/tests/REVS.batch8.importaddress diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index ab4129e2b..8d5989b7e 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -395,7 +395,7 @@ cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) jaddstr(retjson,"result","success"); jaddnum(retjson,"unspents",dstr(unspent)); jaddnum(retjson,"spents",dstr(spent)); - jaddnum(retjson,"balance",dstr(unspent - spent)); + jaddnum(retjson,"balance",dstr(unspent) - dstr(spent)); return(retjson); } diff --git a/iguana/main.c b/iguana/main.c index a679eb328..e922b7dc0 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1576,7 +1576,7 @@ void komodo_ICO_batch(cJSON *array,int32_t batchid) if ( (n= cJSON_GetArraySize(array)) > 0 ) { totalKMD = totalREVS = 0; - for (iter=0; iter<1; iter++) + for (iter=3; iter<4; iter++) for (i=0; i Date: Sat, 11 Feb 2017 10:25:09 +0200 Subject: [PATCH 050/495] test --- iguana/dpow/dpow_network.c | 2 +- iguana/tests/KMD.batch8 | 1 + ...ch7.listunspent => KMD.batch8.listunspent} | 0 iguana/tests/KMD.batch8.txids | 72 +++++++++++++++++++ iguana/tests/REVS.batch8 | 10 +++ 5 files changed, 84 insertions(+), 1 deletion(-) rename iguana/tests/{KMD.batch7.listunspent => KMD.batch8.listunspent} (100%) create mode 100644 iguana/tests/KMD.batch8.txids diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 2a5ed4b1e..0bc7c1e4f 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -954,7 +954,7 @@ char *_dex_listunspent(struct supernet_info *myinfo,char *symbol,char *address) struct dex_request dexreq; char *retstr; memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); - dexreq.func = 's'; + dexreq.func = 'U'; if ( (retstr= _dex_sendrequeststr(myinfo,&dexreq,address,0,1,"")) != 0 ) { //printf("UNSPENTS.(%s)\n",retstr); diff --git a/iguana/tests/KMD.batch8 b/iguana/tests/KMD.batch8 index 2be9d637a..53dca1caf 100755 --- a/iguana/tests/KMD.batch8 +++ b/iguana/tests/KMD.batch8 @@ -1,3 +1,4 @@ +sleep 999999 # REbMisMicS8W7LUqBPJwkVfYHxNfSeW7d8 KMD 11472.96269487 ./komodo-cli sendtoaddress REbMisMicS8W7LUqBPJwkVfYHxNfSeW7d8 11472.96269487 sleep 3 diff --git a/iguana/tests/KMD.batch7.listunspent b/iguana/tests/KMD.batch8.listunspent similarity index 100% rename from iguana/tests/KMD.batch7.listunspent rename to iguana/tests/KMD.batch8.listunspent diff --git a/iguana/tests/KMD.batch8.txids b/iguana/tests/KMD.batch8.txids new file mode 100644 index 000000000..db8f60d15 --- /dev/null +++ b/iguana/tests/KMD.batch8.txids @@ -0,0 +1,72 @@ +e706793cdd5ca2502b15067c429e31dd64ac37a9f7503b80685118dd3f0f2b33 +11472.96269487 <- expected amount REbMisMicS8W7LUqBPJwkVfYHxNfSeW7d8 +c742705c385577030a48fb6e6cae157373f39a5330d2536d91c7b9a5fbd8a51b +914.10663775 <- expected amount RKprtuU6cDvhMGPwJAbycWY8gYtyyWrJBV +86edf4d8240f695f1241d317c5b6a2132927680aa2b5022d540f901b40a501fc +840.13904995 <- expected amount R9ctRNEYWbE5zDmT77Xhz22Fr1LpPVj8CG +5b4c1b73e41f8f15f52d86fb53626b9672c49d44bb73dcc618632c4c35b55996 +23492.49573707 <- expected amount RWq87C4y7KBfy95otyvkgyCf18LfXV2vcG +38ae41db2fb95299e8201453f17341021ae25ffa28911bf2e68573f07bcbecec +2584.32223431 <- expected amount RC8jWr1QQsRyo1pDkue8AxGs58Wyz4F3wZ +75fe74a840973f2901f6f8b18f6d4191e70c4edd6a2d0ced5024482d2bd218eb +1278.17612917 <- expected amount RQGJHTEwF7TcpCGHCdRZHZVcmngwucWdXX +4fd4a96c77cfaa80cb88e3cdcde880ea1dd15c478f2dbd3bac9cbafd0470da86 +17042.34838900 <- expected amount RAuq7MzV7DgjB2bLJJ9LunEj9P3zUMiNrS +166593bf7c22faa0f7d685e5040373362a99b86c61176a59578aca1f67985866 +1198.78675406 <- expected amount RWC11HxcX18hxm38NTZ6U5EMA9uSPzTJ3a +8db1f874f62ea9a74892aee5de46e07904c6a328e1d2fb89944c038587086349 +952.88812828 <- expected amount RCownUMXktAgPvzwpALnGimCA1RDJoTvx1 +91805b62414de7bf4452a827d34dfb797d531e5bd069cb0229028358d75e3a84 +6594.40160977 <- expected amount RSk32hhDqxGpFLNXBaza9e9HsSwEMmJJyM +9619461676f16f6d792c02ee1cf2c3c4895088c1031c767263086b3d7ebd744b +9295.82639400 <- expected amount RJyZ9XSE4b18JQWyxPFxTzNXqfkre6aF3j +8bb6c95663c93d5d91a0b9ebbb1bc01d3c8e776c76e9e6b7ecc449a9c4bf9795 +30681.77405788 <- expected amount RFkQHrVHb7xiFgjmhz1tvbrYJ8DcEH33ns +0926ad92015e3d3a4313bcc43ae55382b6e0212aaef4ef2629a67f29e39d00cc +257.45731805 <- expected amount RQKz3VoxhXq3aKqx2YLZnFMEjQGQ9ZU8S8 +32097e87a4ae016c886035284962c77d755c86717db9fc23bfdb31ec852a1517 +1163.91492974 <- expected amount RLHX9dCaUDnvCa7GEragjBJv9wCAXUqfYM +eef0c4739bc5a43997fed140af0d9ec884b232726cab5ce6bf37bf77466c37bc +188643.68073877 <- expected amount RJCBezf4HwreDsMK6tCm5YtcZtfBfeY3wL +4edbfa109229b18d241820c38c92183f87b3a74f7214d6f2470554e483701ba4 +99.43583265 <- expected amount RPyKbtBPVb3FYv5iFULNUB6bq9DdvekZuz +e3a2b2d44d9ddb41f8cfaaf3e077409cdb80c3fe6be29b29801d447f36bd73e0 +1394.37395910 <- expected amount RPJDJKyCnHUEcSJCXPCcCVgAyYzTJQY9KU +6ffe858cd590d0237468450794fe5a5d38c7074f3e7ea4afaba36f511136557a +24207.88123437 <- expected amount RLi74YPDmXDf2UAiBoTqEwUayqX76cXb3h +3d33a0b167cdad93222d4d349f65b38aea97307e9fd73f230164eea2e2e3d339 +17160.85255783 <- expected amount RH7cfyUkBwrLbxfWBggcbV3UgzaAHyy3J8 +c0a1609c53754a8c27f1435458f17a0f6c2ca49245929cc90b29a8120efe50c1 +203188.29997688 <- expected amount REopaxhMho1ffQ9fpqC6YLKaAS8D2Q2Twe +8cef57eecc08b69ed854d1ea77e7a3968050edd47973a36519499794ee5e5316 +2316.21007650 <- expected amount RPD3kfdgogsPGbXefBdRt4QpiDZXFHwqan +61891b96d6e4fcc42a2509618744e19df94d3949a45118a66e00408a052d1d62 +968.31524937 <- expected amount RGXyii2bqVefbqGmXtuaG19WQY5xa7f9qH +a1cb58ed4b02702c86dbb8c3a718d8f58ebc36704129618a3926a2e6c2add782 +1663.06468462 <- expected amount RG7jKgxwFPKNPy4MFxXaBr7TRDEzR2sSkV +92f853441f10b27af1f7bfa310c8407cf57b787bde24f9c5718f88dd2b412005 +929.58263940 <- expected amount RC63RYx695o7ve2fdjRtcXKqw4QwzTjqDn +4b86fcfbce4df5dc114c7ae8a8b12b6897ca3d3a5ccff395d7c668b1caa40b6e +91422.85735610 <- expected amount RLJ1GkGiu9jmDngdzYGNtwWffWkFYKgbuX +55282c7553eb17fa7d74c67aeb112e19effb4930cd8df184e18223dc3d1a4803 +693.08132289 <- expected amount RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv +c776090ef42630fa404ab43f36ed53b656c9dd69d19f3c5a380ff2939194f160 +138920.34502737 <- expected amount RKmZ2U9SYweYcUCuVugKmyfiawpPzXX8JB +4d75910e5b0db53220ca8ebc1ea5e7ee8bfd5b9934ce2fbe65dbf429fc5320f6 +9683.15249375 <- expected amount RTUeFxM12wv69Mf5JcXFZGx9qVbGYtPf99 +3a3b068904ee87f157d0b3b7f2c7ab7252d0b9be1fcb0178f2bf2bfff04bc344 +1422.54025612 <- expected amount RG2cAef3JbCXiQkzPgrqS52HAQrBzJiAy4 +137664f7fecf790ed3c944b91870c11206a5e12774716403cee9b66903d3055c +6041.35757346 <- expected amount RLzSA37kWBnxCz3yTspTLg1Y85ai18LZoN +4f489677f35c8c3844e039330310c1e1c85aa41e368ae6caeff517040ed0f773 +3571.37913637 <- expected amount REmYfd1MwrYzxW7swvXMMcuKb7u1LFeNHk +4efa01883041a797c20a1d320d36e3a2cff2b9958b28254ed88306a1448b7752 +0.29002598 <- expected amount RMuS51q7GuPd2jF8aYmRuD8vAwY3GpjhEB +fc195c8a97098890334c2291229d518cf03156100184dd9bb26fb548630bc387 +25106.60529680 <- expected amount RXdBJ5cWDcS38ykuggEQZh3vSztxwmG3ut +0569eae7e77315a56d78fc110d6130441d4fdac9e5fe27d32739055a959bb1ee +48415.76246875 <- expected amount RPm9bzUBbWbhqPdnydRxFnEk5XXxxcdMPw +744f5222411621ef1a9764beda4bd64795269a18759b83ee0d9a442889403a62 +2420.78820090 <- expected amount RUoGAwzyNUF1F22TkPq2Jx7cQVQk8Yn6Gu +8463044c21af1d44490760ac94ad05c279716ac8149e4cbf30b42b2ca987c386 +6266.60868209 <- expected amount REsjYn44yH4W9JcGiQND95mfJV98jzip9i diff --git a/iguana/tests/REVS.batch8 b/iguana/tests/REVS.batch8 index b6eabbf87..d3f78263e 100755 --- a/iguana/tests/REVS.batch8 +++ b/iguana/tests/REVS.batch8 @@ -1,3 +1,4 @@ +sleep 999999 # RWq87C4y7KBfy95otyvkgyCf18LfXV2vcG KMD 23492.49573707, REVS 189.50500057 sleep 1 fiat/revs sendtoaddress RWq87C4y7KBfy95otyvkgyCf18LfXV2vcG 189.50500057 @@ -21,3 +22,12 @@ sleep 1 fiat/revs sendtoaddress RKmZ2U9SYweYcUCuVugKmyfiawpPzXX8JB 835.32960760 # total KMD 0.00000000 REVS 4598.20711317 + +fae0e4e8f3ad348dff687f9baa3e9975d4d893a38cd45190b60f61868a577ca4 +edc160137ddb19dc7d00ddce6c35589ad5ab3ab6fee7cfb53090ee512a6595a9 +d745bfb6e8fb32fff521b249be86ee8dba904c03738755420b7980a8350160a8 +931c7d187b641c681c8f75a03da9849053504a95f55534af3385e3426fc4c5ea +e2598e462f81aff6d57c48adf224983a5b8c72f2c396096651c6e354b6c43928 +ac9e2a40a4d565587cb73616d179ae90592a60b3cfc628f84e42a4533d3e3c51 +d86e7b79d0aac2347804e0c11baac74e985005fcba8edffb5b9c359c05a08bb0 + From 76894fca807ba7ba6cc4a813e574f52dbb248b4d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 11:04:29 +0200 Subject: [PATCH 051/495] test --- iguana/kmd_lookup.h | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 8d5989b7e..a1db90f94 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -368,14 +368,13 @@ cJSON *kmd_listspent(struct iguana_info *coin,char *coinaddr) return(kmd_listaddress(coin,coinaddr,1)); } -cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) +int64_t _kmd_getbalance(struct iguana_info *coin,char *coinaddr,int64_t *unspentp,int64_t *spentp) { - cJSON *array,*retjson,*item; int32_t iter,i,n; uint64_t spent=0,unspent=0,value; + int32_t iter,i,n; cJSON *array,*item; int64_t value; for (iter=0; iter<2; iter++) { if ( (array= kmd_listaddress(coin,coinaddr,iter)) != 0 ) { - fprintf(stderr,"%s ",jprint(array,0)); if ( (n= cJSON_GetArraySize(array)) > 0 ) { for (i=0; ikmd_addresses,addr,tmp) + { + bitcoin_address(address,addr->type_rmd160[0],&addr->type_rmd160[1],20); + s = u = 0; + balance += _kmd_getbalance(coin,address,&u,&s); + printf("%s (%.8f - %.8f) %.8f -> %.8f\n",address,dstr(u),dstr(s),dstr(u)-dstr(s),dstr(balance)); + unspent += u; + spent += s; + } + } else balance = _kmd_getbalance(coin,coinaddr,&unspent,&spent); retjson = cJSON_CreateObject(); jaddstr(retjson,"result","success"); jaddnum(retjson,"unspents",dstr(unspent)); jaddnum(retjson,"spents",dstr(spent)); - jaddnum(retjson,"balance",dstr(unspent) - dstr(spent)); + jaddnum(retjson,"balance",dstr(balance)); return(retjson); } From 3a76246e003d4f0c54719ddde8f3e74ab9c39b5f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 11:11:38 +0200 Subject: [PATCH 052/495] test --- iguana/kmd_lookup.h | 11 ++++++++--- iguana/tests/dexgetsupply | 2 ++ includes/iguana_structs.h | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) create mode 100755 iguana/tests/dexgetsupply diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index a1db90f94..de1d8ec0b 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -330,10 +330,14 @@ cJSON *kmd_gettxin(struct iguana_info *coin,bits256 txid,int32_t vout) cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode) { struct kmd_addresshh *addr; struct kmd_transactionhh *ptr,*spent,*prev=0; uint8_t type_rmd160[21]; int32_t i,height; cJSON *array = cJSON_CreateArray(); - if ( (height= kmd_height(coin)) > coin->kmd_height+3 ) + if ( time(NULL) > coin->kmd_lasttime+30 ) { - printf("height.%d > kmd_height.%d\n",height,coin->kmd_height); - return(cJSON_Parse("[]")); + coin->kmd_lasttime = (uint32_t)time(NULL); + if ( (height= kmd_height(coin)) > coin->kmd_height+3 ) + { + printf("height.%d > kmd_height.%d\n",height,coin->kmd_height); + return(cJSON_Parse("[]")); + } } bitcoin_addr2rmd160(&type_rmd160[0],&type_rmd160[1],coinaddr); if ( (addr= _kmd_address(coin,type_rmd160)) != 0 && (ptr= addr->prev) != 0 && ptr->tx != 0 ) @@ -352,6 +356,7 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode) prev = ptr->ptrs[i<<1]; } } + printf("%s ht.%d prev.%p\n",coinaddr,ptr->tx->height,prev); ptr = prev; } } diff --git a/iguana/tests/dexgetsupply b/iguana/tests/dexgetsupply new file mode 100755 index 000000000..bb8cd941e --- /dev/null +++ b/iguana/tests/dexgetsupply @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getbalance\",\"address\":\"*\",\"symbol\":\"KMD\"}" diff --git a/includes/iguana_structs.h b/includes/iguana_structs.h index 7b5a0b4d0..3f2a174f3 100755 --- a/includes/iguana_structs.h +++ b/includes/iguana_structs.h @@ -536,7 +536,7 @@ struct iguana_info struct iguana_block *RTblocks[65536]; uint8_t *RTrawdata[65536]; int32_t RTrecvlens[65536],RTnumtx[65536]; struct iguana_RTtxid *RTdataset; struct iguana_RTaddr *RTaddrs; struct hashstr_item *alladdresses; - struct kmd_transactionhh *kmd_transactions; struct kmd_addresshh *kmd_addresses; portable_mutex_t kmdmutex; FILE *kmd_txidfp; int32_t kmd_didinit,kmd_height; + struct kmd_transactionhh *kmd_transactions; struct kmd_addresshh *kmd_addresses; portable_mutex_t kmdmutex; FILE *kmd_txidfp; int32_t kmd_didinit,kmd_height; uint32_t kmd_lasttime; }; struct vin_signer { bits256 privkey; char coinaddr[64]; uint8_t siglen,sig[80],rmd160[20],pubkey[66]; }; From 945e52a44878833de396de7a1854ddf02d8e8da3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 11:13:12 +0200 Subject: [PATCH 053/495] test --- iguana/kmd_lookup.h | 1 - 1 file changed, 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index de1d8ec0b..b2f9d140c 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -356,7 +356,6 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode) prev = ptr->ptrs[i<<1]; } } - printf("%s ht.%d prev.%p\n",coinaddr,ptr->tx->height,prev); ptr = prev; } } From c2230ea1c68b9226dddaf5765638daa79070aa4d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 11:16:28 +0200 Subject: [PATCH 054/495] test --- iguana/kmd_lookup.h | 1 + iguana/tests/dexgetsupply | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index b2f9d140c..2ed0d0a92 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -217,6 +217,7 @@ FILE *kmd_txidinit(struct iguana_info *coin) { if ( (ptr->ptrs[(i<<1) + 1]= kmd_transaction(coin,vptr->spendtxid)) == 0 ) printf("cant find %s spend.%d\n",bits256_str(str,vptr->spendtxid),i); + else printf("set spent.%p ht.%d vout.%d\n",ptr->ptrs[(i<<1)+1],ptr->tx->height,i); } } } diff --git a/iguana/tests/dexgetsupply b/iguana/tests/dexgetsupply index bb8cd941e..f9a891a2e 100755 --- a/iguana/tests/dexgetsupply +++ b/iguana/tests/dexgetsupply @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getbalance\",\"address\":\"*\",\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getbalance\",\"address\":\"*\",\"symbol\":\"KMD\",\"timeout\":10000}" From 06867ce632e819fcc6b9cee71cf2853cd5b90055 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 11:23:58 +0200 Subject: [PATCH 055/495] test --- iguana/kmd_lookup.h | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 2ed0d0a92..5b0770754 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -34,6 +34,7 @@ struct kmd_transactionhh { UT_hash_handle hh; struct kmd_transaction *tx; + long fpos; int32_t numvouts; struct kmd_transactionhh *ptrs[]; }; @@ -101,8 +102,16 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi if ( (ptr= kmd_transaction(coin,txid)) != 0 && vout < ptr->numvouts && (spendptr= kmd_transaction(coin,spendtxid)) != 0 ) { ptr->ptrs[(vout<<1) + 1] = spendptr; - ptr->tx->vouts[vout].spendtxid = spendtxid; - ptr->tx->vouts[vout].spendvini = vini; + if ( bits256_cmp(ptr->tx->vouts[vout].spendtxid,spendtxid) != 0 || ptr->tx->vouts[vout].spendvini != vini ) + { + ptr->tx->vouts[vout].spendtxid = spendtxid; + ptr->tx->vouts[vout].spendvini = vini; + if ( coin->kmd_txidfp != 0 ) + { + fseek(coin->kmd_txidfp,ptr->fpos + sizeof(*ptr->tx) + sizeof(*ptr->tx->vouts)*vout,SEEK_SET); + fwrite(&ptr->tx->vouts[vout],1,sizeof(ptr->tx->vouts[vout]),coin->kmd_txidfp); + } + } return(0); } char str[65]; printf("vin error %s vout.%d vs ptr %p [%d] spent.%p\n",bits256_str(str,txid),vout,ptr,ptr!=0?ptr->numvouts:-1,spendptr); @@ -120,7 +129,10 @@ void kmd_transactionvout(struct iguana_info *coin,struct kmd_transactionhh *ptr, tx->vouts[vout].amount = amount; memcpy(tx->vouts[vout].type_rmd160,type_rmd160,21); if ( coin->kmd_didinit != 0 && coin->kmd_txidfp != 0 ) + { + ptr->fpos = ftell(coin->kmd_txidfp); fwrite(tx,1,sizeof(*tx) + tx->numvouts*sizeof(*tx->vouts),coin->kmd_txidfp); + } if ( (addr= _kmd_address(coin,type_rmd160)) == 0 ) addr = _kmd_addressadd(coin,type_rmd160); if ( addr != 0 ) @@ -186,6 +198,7 @@ FILE *kmd_txidinit(struct iguana_info *coin) //printf("INIT %s.[%d] ht.%d %u\n",bits256_str(str,T.txid),T.numvouts,T.height,T.timestamp); if ( (ptr= kmd_transactionadd(coin,tx,T.numvouts)) != 0 ) { + ptr->fpos = lastpos; for (i=0; ikmd_transactions,ptr,tmp) { + printf("scan for spends ht.%d\n",ptr->tx->height); for (i=0; inumvouts; i++) { vptr = &ptr->tx->vouts[i]; From 065614c0bb34ee04f3ad2bf99c78d4e0c8471071 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 11:26:00 +0200 Subject: [PATCH 056/495] test --- iguana/kmd_lookup.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 5b0770754..6b1442780 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -108,6 +108,7 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi ptr->tx->vouts[vout].spendvini = vini; if ( coin->kmd_txidfp != 0 ) { + printf("write out spent ht.%d vout.%d\n",ptr->tx->height,vout); fseek(coin->kmd_txidfp,ptr->fpos + sizeof(*ptr->tx) + sizeof(*ptr->tx->vouts)*vout,SEEK_SET); fwrite(&ptr->tx->vouts[vout],1,sizeof(ptr->tx->vouts[vout]),coin->kmd_txidfp); } @@ -223,7 +224,7 @@ FILE *kmd_txidinit(struct iguana_info *coin) fseek(fp,lastpos,SEEK_SET); HASH_ITER(hh,coin->kmd_transactions,ptr,tmp) { - printf("scan for spends ht.%d\n",ptr->tx->height); + //printf("scan for spends ht.%d\n",ptr->tx->height); for (i=0; inumvouts; i++) { vptr = &ptr->tx->vouts[i]; From beff0052fac5ce25d731b8cc397f4f1462cc9ca9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 11:27:42 +0200 Subject: [PATCH 057/495] test --- iguana/kmd_lookup.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 6b1442780..21cf48f99 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -96,7 +96,7 @@ struct kmd_transactionhh *kmd_transaction(struct iguana_info *coin,bits256 txid) int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vini,bits256 txid,int32_t vout) { - struct kmd_transactionhh *ptr,*spendptr=0; + struct kmd_transactionhh *ptr,*spendptr=0; long savepos; if ( bits256_nonz(txid) == 0 || vout < 0 ) return(0); // coinbase must be if ( (ptr= kmd_transaction(coin,txid)) != 0 && vout < ptr->numvouts && (spendptr= kmd_transaction(coin,spendtxid)) != 0 ) @@ -109,8 +109,10 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi if ( coin->kmd_txidfp != 0 ) { printf("write out spent ht.%d vout.%d\n",ptr->tx->height,vout); + savepos = ftell(coin->kmd_txidfp); fseek(coin->kmd_txidfp,ptr->fpos + sizeof(*ptr->tx) + sizeof(*ptr->tx->vouts)*vout,SEEK_SET); fwrite(&ptr->tx->vouts[vout],1,sizeof(ptr->tx->vouts[vout]),coin->kmd_txidfp); + fseek(coin->kmd_txidfp,savepos,SEEK_SET); } } return(0); From e05bc95a03a2050604a6f15ecc2f5137de2f605a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 11:59:47 +0200 Subject: [PATCH 058/495] test --- basilisk/basilisk.c | 3 ++- iguana/iguana777.h | 2 +- iguana/iguana_notary.c | 11 +++++++++++ iguana/kmd_lookup.h | 36 +++++++++++++++++------------------ iguana/main.c | 1 + iguana/tests/dexexplorer | 2 ++ includes/iguana_apideclares.h | 1 + includes/iguana_structs.h | 2 +- 8 files changed, 37 insertions(+), 21 deletions(-) create mode 100755 iguana/tests/dexexplorer diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 0eaeb4998..b300439b3 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -908,7 +908,6 @@ void basilisks_loop(void *arg) } endmilli = startmilli + 30; } - kmd_bitcoinscan(); } else { @@ -918,6 +917,8 @@ void basilisks_loop(void *arg) endmilli = startmilli + 500; else endmilli = startmilli + 1000; } + if ( myinfo->DEXEXPLORER != 0 ) + kmd_bitcoinscan(); if ( myinfo->expiration != 0 && (myinfo->dexsock >= 0 || myinfo->IAMLP != 0 || myinfo->DEXactive > time(NULL)) ) { //fprintf(stderr,"H "); diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 258e42c90..648eea8c1 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -137,7 +137,7 @@ struct supernet_info uint8_t logs[256],exps[510]; struct message_info msgids[8192]; double *svmfeatures; - uint8_t notaries[64][33]; int32_t numnotaries; + uint8_t notaries[64][33]; int32_t numnotaries,DEXEXPLORER; }; #include "../includes/iguana_funcs.h" diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index d26473e85..368ca4852 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -756,6 +756,17 @@ TWO_STRINGS(dex,getbalance,symbol,address) } else return(_dex_getbalance(myinfo,symbol,address)); } +STRING_ARG(dex,explorer,symbol) +{ + if ( symbol != 0 && (coin= iguana_coinfind(symbol)) != 0 ) + { + myinfo->DEXEXPLORER = 1; + coin->DEXEXPLORER = 1; + return(clonestr("{\"result\":\"success\"}")); + } + return(clonestr("{\"error\":\"coin not active\"}")); +} + #include "../includes/iguana_apiundefs.h" diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 21cf48f99..042f335ff 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -108,7 +108,7 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi ptr->tx->vouts[vout].spendvini = vini; if ( coin->kmd_txidfp != 0 ) { - printf("write out spent ht.%d vout.%d\n",ptr->tx->height,vout); + //printf("write out spent ht.%d vout.%d\n",ptr->tx->height,vout); savepos = ftell(coin->kmd_txidfp); fseek(coin->kmd_txidfp,ptr->fpos + sizeof(*ptr->tx) + sizeof(*ptr->tx->vouts)*vout,SEEK_SET); fwrite(&ptr->tx->vouts[vout],1,sizeof(ptr->tx->vouts[vout]),coin->kmd_txidfp); @@ -368,7 +368,7 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode) if ( memcmp(ptr->tx->vouts[i].type_rmd160,type_rmd160,21) == 0 ) { spent = ptr->ptrs[(i<<1) + 1]; - if ( (mode == 0 && spent == 0) || (mode == 1 && spent != 0) ) + if ( (mode == 0 && spent == 0) || (mode == 1 && spent != 0) || mode == 2 ) jaddi(array,kmd_unspentjson(ptr->tx,i)); if ( ptr->ptrs[i<<1] != 0 ) prev = ptr->ptrs[i<<1]; @@ -390,10 +390,10 @@ cJSON *kmd_listspent(struct iguana_info *coin,char *coinaddr) return(kmd_listaddress(coin,coinaddr,1)); } -int64_t _kmd_getbalance(struct iguana_info *coin,char *coinaddr,int64_t *unspentp,int64_t *spentp) +int64_t _kmd_getbalance(struct iguana_info *coin,char *coinaddr,int64_t *receivedp,int64_t *sentp) { int32_t iter,i,n; cJSON *array,*item; int64_t value; - for (iter=0; iter<2; iter++) + for (iter=1; iter<=2; iter++) { if ( (array= kmd_listaddress(coin,coinaddr,iter)) != 0 ) { @@ -404,37 +404,37 @@ int64_t _kmd_getbalance(struct iguana_info *coin,char *coinaddr,int64_t *unspent item = jitem(array,i); if ( (value= jdouble(item,"amount")*SATOSHIDEN) != 0 || (value= jdouble(item,"value")*SATOSHIDEN) != 0 ) { - if ( iter == 0 ) - *unspentp += value; - else *spentp += value; + if ( iter == 2 ) + *receivedp += value; + else *sentp += value; } } } free_json(array); } } - return(*unspentp - *spentp); + return(*receivedp - *sentp); } cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) { - cJSON *retjson; int64_t s,u,spent=0,unspent=0,balance=0; struct kmd_addresshh *addr,*tmp; char address[64]; + cJSON *retjson; int64_t s,r,sent=0,received=0,balance=0; struct kmd_addresshh *addr,*tmp; char address[64]; if ( strcmp(coinaddr,"*") == 0 ) { HASH_ITER(hh,coin->kmd_addresses,addr,tmp) { bitcoin_address(address,addr->type_rmd160[0],&addr->type_rmd160[1],20); - s = u = 0; - balance += _kmd_getbalance(coin,address,&u,&s); - printf("%s (%.8f - %.8f) %.8f -> %.8f\n",address,dstr(u),dstr(s),dstr(u)-dstr(s),dstr(balance)); - unspent += u; - spent += s; + s = r = 0; + balance += _kmd_getbalance(coin,address,&r,&s); + printf("%s (%.8f - %.8f) %.8f -> %.8f\n",address,dstr(r),dstr(s),dstr(r)-dstr(s),dstr(balance)); + received += r; + sent += s; } - } else balance = _kmd_getbalance(coin,coinaddr,&unspent,&spent); + } else balance = _kmd_getbalance(coin,coinaddr,&received,&sent); retjson = cJSON_CreateObject(); jaddstr(retjson,"result","success"); - jaddnum(retjson,"unspents",dstr(unspent)); - jaddnum(retjson,"spents",dstr(spent)); + jaddnum(retjson,"received",dstr(received)); + jaddnum(retjson,"sent",dstr(sent)); jaddnum(retjson,"balance",dstr(balance)); return(retjson); } @@ -588,7 +588,7 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) void kmd_bitcoinscan() { - char *retstr; cJSON *array; int32_t i,n; struct iguana_info *coin; + char *retstr; cJSON *array; int32_t i,n; struct iguana_info *coin; // scan allcoins also if ( (retstr= dpow_notarychains(0,0,0,0)) != 0 ) { if ( (array= cJSON_Parse(retstr)) != 0 ) diff --git a/iguana/main.c b/iguana/main.c index e922b7dc0..1e2dfc0b6 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1710,6 +1710,7 @@ void iguana_main(void *arg) { myinfo->rpcport = IGUANA_NOTARYPORT; myinfo->IAMNOTARY = 1; + myinfo->DEXEXPLORER = 1; } } #ifdef IGUANA_OSTESTS diff --git a/iguana/tests/dexexplorer b/iguana/tests/dexexplorer new file mode 100755 index 000000000..460ce8631 --- /dev/null +++ b/iguana/tests/dexexplorer @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"explorer\",\"symbol\":\"KMD\"}" diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 1be32ab77..105f0888b 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -47,6 +47,7 @@ TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions2,symbol,address,count,skip); HASH_AND_STRING_AND_INT(dex,gettxin,txid,symbol,vout); TWO_STRINGS(dex,listspent,symbol,address); TWO_STRINGS(dex,getbalance,symbol,address); +STRING_ARG(dex,explorer,symbol); TWO_STRINGS(zcash,passthru,function,hex); TWO_STRINGS(komodo,passthru,function,hex); diff --git a/includes/iguana_structs.h b/includes/iguana_structs.h index 3f2a174f3..df1590757 100755 --- a/includes/iguana_structs.h +++ b/includes/iguana_structs.h @@ -536,7 +536,7 @@ struct iguana_info struct iguana_block *RTblocks[65536]; uint8_t *RTrawdata[65536]; int32_t RTrecvlens[65536],RTnumtx[65536]; struct iguana_RTtxid *RTdataset; struct iguana_RTaddr *RTaddrs; struct hashstr_item *alladdresses; - struct kmd_transactionhh *kmd_transactions; struct kmd_addresshh *kmd_addresses; portable_mutex_t kmdmutex; FILE *kmd_txidfp; int32_t kmd_didinit,kmd_height; uint32_t kmd_lasttime; + struct kmd_transactionhh *kmd_transactions; struct kmd_addresshh *kmd_addresses; portable_mutex_t kmdmutex; FILE *kmd_txidfp; int32_t kmd_didinit,kmd_height,DEXEXPLORER; uint32_t kmd_lasttime; }; struct vin_signer { bits256 privkey; char coinaddr[64]; uint8_t siglen,sig[80],rmd160[20],pubkey[66]; }; From c76f01845ad5f201b51f003a555f1d771b85881f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 12:03:37 +0200 Subject: [PATCH 059/495] test --- iguana/kmd_lookup.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 042f335ff..699dbcc1d 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -16,6 +16,8 @@ #ifndef INCLUDE_KMDLOOKUP_H #define INCLUDE_KMDLOOKUP_H +#define KMD_EXPLORER_LAG 3 + struct kmd_voutinfo { bits256 spendtxid; @@ -234,7 +236,7 @@ FILE *kmd_txidinit(struct iguana_info *coin) { if ( (ptr->ptrs[(i<<1) + 1]= kmd_transaction(coin,vptr->spendtxid)) == 0 ) printf("cant find %s spend.%d\n",bits256_str(str,vptr->spendtxid),i); - else printf("set spent.%p ht.%d vout.%d\n",ptr->ptrs[(i<<1)+1],ptr->tx->height,i); + //else printf("set spent.%p ht.%d vout.%d\n",ptr->ptrs[(i<<1)+1],ptr->tx->height,i); } } } @@ -496,7 +498,7 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) } height = kmd_height(coin); loadheight = coin->kmd_height+1; - while ( loadheight < height ) + while ( loadheight < height-KMD_EXPLORER_LAG ) { flag = 0; if ( (loadheight % 1000) == 0 ) From 2410b664379e3dedf1e7a0d7be00f918aeffbaad Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 12:06:22 +0200 Subject: [PATCH 060/495] test --- iguana/kmd_lookup.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 699dbcc1d..49924bffd 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -421,6 +421,7 @@ int64_t _kmd_getbalance(struct iguana_info *coin,char *coinaddr,int64_t *receive cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) { cJSON *retjson; int64_t s,r,sent=0,received=0,balance=0; struct kmd_addresshh *addr,*tmp; char address[64]; + retjson = cJSON_CreateObject(); if ( strcmp(coinaddr,"*") == 0 ) { HASH_ITER(hh,coin->kmd_addresses,addr,tmp) @@ -432,8 +433,9 @@ cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) received += r; sent += s; } + if ( strcmp("KMD",coin->symbol) == 0 ) + jaddnum(retjson,"interestpaid",dstr(balance)-dstr(coin->kmd_height*3)); } else balance = _kmd_getbalance(coin,coinaddr,&received,&sent); - retjson = cJSON_CreateObject(); jaddstr(retjson,"result","success"); jaddnum(retjson,"received",dstr(received)); jaddnum(retjson,"sent",dstr(sent)); From e8f77ecf8f8ba0ac1862546af277fab5838a8487 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 12:12:08 +0200 Subject: [PATCH 061/495] test --- iguana/kmd_lookup.h | 2 +- iguana/tests/dexgetsupply | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 49924bffd..e0d72caac 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -200,7 +200,7 @@ FILE *kmd_txidinit(struct iguana_info *coin) { if ( (tx= kmd_transactionalloc(T.txid,T.height,T.timestamp,T.numvouts)) != 0 ) { - //printf("INIT %s.[%d] ht.%d %u\n",bits256_str(str,T.txid),T.numvouts,T.height,T.timestamp); + printf("INIT %s.[%d] ht.%d %u\n",bits256_str(str,T.txid),T.numvouts,T.height,T.timestamp); if ( (ptr= kmd_transactionadd(coin,tx,T.numvouts)) != 0 ) { ptr->fpos = lastpos; diff --git a/iguana/tests/dexgetsupply b/iguana/tests/dexgetsupply index f9a891a2e..6c5ccae29 100755 --- a/iguana/tests/dexgetsupply +++ b/iguana/tests/dexgetsupply @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getbalance\",\"address\":\"*\",\"symbol\":\"KMD\",\"timeout\":10000}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getbalance\",\"address\":\"*\",\"symbol\":\"KMD\",\"timeout\":30000}" From 11ad6d85d4295c5c25f7e4de5047557b8d25592b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 12:14:41 +0200 Subject: [PATCH 062/495] test --- iguana/kmd_lookup.h | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index e0d72caac..9e1cff0d0 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -115,6 +115,7 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi fseek(coin->kmd_txidfp,ptr->fpos + sizeof(*ptr->tx) + sizeof(*ptr->tx->vouts)*vout,SEEK_SET); fwrite(&ptr->tx->vouts[vout],1,sizeof(ptr->tx->vouts[vout]),coin->kmd_txidfp); fseek(coin->kmd_txidfp,savepos,SEEK_SET); + fflush(coin->kmd_txidfp); } } return(0); From 79e531ad3fb77bd2a5b23db417b9dde5d92fc393 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 12:28:27 +0200 Subject: [PATCH 063/495] test --- iguana/kmd_lookup.h | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 9e1cff0d0..fd03e497a 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -28,7 +28,7 @@ struct kmd_voutinfo struct kmd_transaction { - bits256 txid; int32_t height,numvouts; uint32_t timestamp,pad; + bits256 txid; int32_t height,numvouts,numvins; uint32_t timestamp,pad; struct kmd_voutinfo vouts[]; }; @@ -37,7 +37,7 @@ struct kmd_transactionhh UT_hash_handle hh; struct kmd_transaction *tx; long fpos; - int32_t numvouts; + int32_t numvouts,numvins; struct kmd_transactionhh *ptrs[]; }; @@ -134,11 +134,6 @@ void kmd_transactionvout(struct iguana_info *coin,struct kmd_transactionhh *ptr, tx->vouts[vout].spendvini = spendvini; tx->vouts[vout].amount = amount; memcpy(tx->vouts[vout].type_rmd160,type_rmd160,21); - if ( coin->kmd_didinit != 0 && coin->kmd_txidfp != 0 ) - { - ptr->fpos = ftell(coin->kmd_txidfp); - fwrite(tx,1,sizeof(*tx) + tx->numvouts*sizeof(*tx->vouts),coin->kmd_txidfp); - } if ( (addr= _kmd_address(coin,type_rmd160)) == 0 ) addr = _kmd_addressadd(coin,type_rmd160); if ( addr != 0 ) @@ -174,11 +169,12 @@ struct kmd_transactionhh *kmd_transactionadd(struct iguana_info *coin,struct kmd return(ptr); } -struct kmd_transaction *kmd_transactionalloc(bits256 txid,int32_t height,uint32_t timestamp,int32_t numvouts) +struct kmd_transaction *kmd_transactionalloc(bits256 txid,int32_t height,uint32_t timestamp,int32_t numvouts,int32_t numvins) { struct kmd_transaction *tx; tx = calloc(1,sizeof(*tx) + sizeof(struct kmd_voutinfo)*numvouts); tx->numvouts = numvouts; + tx->numvouts = numvins; tx->txid = txid; tx->height = height; tx->timestamp = timestamp; @@ -199,7 +195,7 @@ FILE *kmd_txidinit(struct iguana_info *coin) { while ( fread(&T,1,sizeof(T),fp) == sizeof(T) ) { - if ( (tx= kmd_transactionalloc(T.txid,T.height,T.timestamp,T.numvouts)) != 0 ) + if ( (tx= kmd_transactionalloc(T.txid,T.height,T.timestamp,T.numvouts,T.numvins)) != 0 ) { printf("INIT %s.[%d] ht.%d %u\n",bits256_str(str,T.txid),T.numvouts,T.height,T.timestamp); if ( (ptr= kmd_transactionadd(coin,tx,T.numvouts)) != 0 ) @@ -227,6 +223,15 @@ FILE *kmd_txidinit(struct iguana_info *coin) } else break; } fseek(fp,lastpos,SEEK_SET); + /*HASH_ITER(hh,coin->kmd_transactions,ptr,tmp) + { + for (i=0; inumvins; i++) + { + vptr = &ptr->tx->vouts[i]; + if ( kmd_transactionvin(coin,ptr->tx->txid,i,ptr->tx->vins[i].txid,ptr->tx->vins[i].vout) < 0 ) + printf("error vini.%d ht.%d\n",i,ptr->tx->height); + } + }*/ HASH_ITER(hh,coin->kmd_transactions,ptr,tmp) { //printf("scan for spends ht.%d\n",ptr->tx->height); @@ -354,7 +359,7 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode) if ( time(NULL) > coin->kmd_lasttime+30 ) { coin->kmd_lasttime = (uint32_t)time(NULL); - if ( (height= kmd_height(coin)) > coin->kmd_height+3 ) + if ( (height= kmd_height(coin)) > coin->kmd_height+KMD_EXPLORER_LAG ) { printf("height.%d > kmd_height.%d\n",height,coin->kmd_height); return(cJSON_Parse("[]")); @@ -536,7 +541,7 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) ptr = 0; if ( iter == 0 ) { - if ( (tx= kmd_transactionalloc(txid,loadheight,jint(txjson,"blocktime"),numvouts)) != 0 ) + if ( (tx= kmd_transactionalloc(txid,loadheight,jint(txjson,"blocktime"),numvouts,numvins)) != 0 ) ptr = kmd_transactionadd(coin,tx,numvouts); else printf("error init tx ptr.%p tx.%p\n",ptr,tx); } @@ -560,9 +565,15 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) } // else printf("missing sobj.%p or addresses.%p (%s)\n",sobj,addresses,jprint(vout,0)); //likely OP_RETURN sobj = addresses = 0; } + if ( coin->kmd_txidfp != 0 ) + { + ptr->fpos = ftell(coin->kmd_txidfp); + fwrite(tx,1,sizeof(*tx) + tx->numvouts*sizeof(*tx->vouts),coin->kmd_txidfp); + } } else { + ptr->numvins = numvins; for (j=0; j Date: Sat, 11 Feb 2017 12:36:44 +0200 Subject: [PATCH 064/495] test --- iguana/kmd_lookup.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index fd03e497a..187b1446f 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -132,6 +132,8 @@ void kmd_transactionvout(struct iguana_info *coin,struct kmd_transactionhh *ptr, { tx->vouts[vout].spendtxid = spendtxid; tx->vouts[vout].spendvini = spendvini; + if ( bits256_nonz(spendtxid) != 0 && spendvini >= 0 ) + kmd_transactionvin(coin,spendtxid,spendvini,tx->txid,vout); tx->vouts[vout].amount = amount; memcpy(tx->vouts[vout].type_rmd160,type_rmd160,21); if ( (addr= _kmd_address(coin,type_rmd160)) == 0 ) @@ -246,7 +248,7 @@ FILE *kmd_txidinit(struct iguana_info *coin) } } } - } else fp = fopen(fname,"wb"); + } else fp = fopen(fname,"wb+"); return(fp); } @@ -435,7 +437,7 @@ cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) bitcoin_address(address,addr->type_rmd160[0],&addr->type_rmd160[1],20); s = r = 0; balance += _kmd_getbalance(coin,address,&r,&s); - printf("%s (%.8f - %.8f) %.8f -> %.8f\n",address,dstr(r),dstr(s),dstr(r)-dstr(s),dstr(balance)); + printf("{\"address\":\"%s\",\"received\":%.8f,\"sent\":%.8f,\"balance\":%.8f,\"supply\":%.8f}\n",address,dstr(r),dstr(s),dstr(r)-dstr(s),dstr(balance)); received += r; sent += s; } From d0e09f4ee5daebb14c34fee8f20091e7c2e64b50 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 12:53:02 +0200 Subject: [PATCH 065/495] test --- iguana/kmd_lookup.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 187b1446f..5e16da11b 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -132,8 +132,8 @@ void kmd_transactionvout(struct iguana_info *coin,struct kmd_transactionhh *ptr, { tx->vouts[vout].spendtxid = spendtxid; tx->vouts[vout].spendvini = spendvini; - if ( bits256_nonz(spendtxid) != 0 && spendvini >= 0 ) - kmd_transactionvin(coin,spendtxid,spendvini,tx->txid,vout); + //if ( bits256_nonz(spendtxid) != 0 && spendvini >= 0 ) + // kmd_transactionvin(coin,spendtxid,spendvini,tx->txid,vout); tx->vouts[vout].amount = amount; memcpy(tx->vouts[vout].type_rmd160,type_rmd160,21); if ( (addr= _kmd_address(coin,type_rmd160)) == 0 ) @@ -243,7 +243,9 @@ FILE *kmd_txidinit(struct iguana_info *coin) if ( vptr->spendvini >= 0 && bits256_nonz(vptr->spendtxid) != 0 ) { if ( (ptr->ptrs[(i<<1) + 1]= kmd_transaction(coin,vptr->spendtxid)) == 0 ) + { printf("cant find %s spend.%d\n",bits256_str(str,vptr->spendtxid),i); + } //else printf("set spent.%p ht.%d vout.%d\n",ptr->ptrs[(i<<1)+1],ptr->tx->height,i); } } From c7b7ce9a03155b4196e9f2e0815943aafd9d3bc3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 12:58:48 +0200 Subject: [PATCH 066/495] test --- iguana/kmd_lookup.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 5e16da11b..6fd169358 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -98,7 +98,7 @@ struct kmd_transactionhh *kmd_transaction(struct iguana_info *coin,bits256 txid) int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vini,bits256 txid,int32_t vout) { - struct kmd_transactionhh *ptr,*spendptr=0; long savepos; + struct kmd_transactionhh *ptr,*spendptr=0; long savepos; struct kmd_transaction T; if ( bits256_nonz(txid) == 0 || vout < 0 ) return(0); // coinbase must be if ( (ptr= kmd_transaction(coin,txid)) != 0 && vout < ptr->numvouts && (spendptr= kmd_transaction(coin,spendtxid)) != 0 ) @@ -112,10 +112,14 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi { //printf("write out spent ht.%d vout.%d\n",ptr->tx->height,vout); savepos = ftell(coin->kmd_txidfp); - fseek(coin->kmd_txidfp,ptr->fpos + sizeof(*ptr->tx) + sizeof(*ptr->tx->vouts)*vout,SEEK_SET); - fwrite(&ptr->tx->vouts[vout],1,sizeof(ptr->tx->vouts[vout]),coin->kmd_txidfp); + fseek(coin->kmd_txidfp,ptr->fpos,SEEK_SET); + if ( fread(&T,1,sizeof(T),coin->kmd_txidfp) == sizeof(T) && bits256_cmp(T.txid,ptr->tx->txid) == 0 && T.numvouts == ptr->tx->numvouts ) + { + fseek(coin->kmd_txidfp,ptr->fpos + sizeof(*ptr->tx) + sizeof(*ptr->tx->vouts)*vout,SEEK_SET); + fwrite(&ptr->tx->vouts[vout],1,sizeof(ptr->tx->vouts[vout]),coin->kmd_txidfp); + fflush(coin->kmd_txidfp); + } else printf("vin write validation error ht.%d vout.%d\n",ptr->tx->height,vout); fseek(coin->kmd_txidfp,savepos,SEEK_SET); - fflush(coin->kmd_txidfp); } } return(0); From f253fce01da003054fcc4fa18eab1bcc84f8fd98 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 13:00:43 +0200 Subject: [PATCH 067/495] test --- iguana/kmd_lookup.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 6fd169358..03b589464 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -137,7 +137,7 @@ void kmd_transactionvout(struct iguana_info *coin,struct kmd_transactionhh *ptr, tx->vouts[vout].spendtxid = spendtxid; tx->vouts[vout].spendvini = spendvini; //if ( bits256_nonz(spendtxid) != 0 && spendvini >= 0 ) - // kmd_transactionvin(coin,spendtxid,spendvini,tx->txid,vout); + // ptr->ptrs[(vout<<1) + 1] = kmd_transaction(coin,spendtxid); tx->vouts[vout].amount = amount; memcpy(tx->vouts[vout].type_rmd160,type_rmd160,21); if ( (addr= _kmd_address(coin,type_rmd160)) == 0 ) From c25a3d0a7a15422c710870e34760b802e1a1a167 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 13:06:59 +0200 Subject: [PATCH 068/495] test --- iguana/kmd_lookup.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 03b589464..2a5cc7ae5 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -30,7 +30,7 @@ struct kmd_transaction { bits256 txid; int32_t height,numvouts,numvins; uint32_t timestamp,pad; struct kmd_voutinfo vouts[]; -}; +} PACKED; struct kmd_transactionhh { @@ -118,7 +118,7 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi fseek(coin->kmd_txidfp,ptr->fpos + sizeof(*ptr->tx) + sizeof(*ptr->tx->vouts)*vout,SEEK_SET); fwrite(&ptr->tx->vouts[vout],1,sizeof(ptr->tx->vouts[vout]),coin->kmd_txidfp); fflush(coin->kmd_txidfp); - } else printf("vin write validation error ht.%d vout.%d\n",ptr->tx->height,vout); + } else printf("vin write validation error ht.%d vout.%d fpos.%ld\n",ptr->tx->height,vout,ptr->fpos); fseek(coin->kmd_txidfp,savepos,SEEK_SET); } } From 52befb8e0b5dcf36b5e166b36d1b05382b6327fe Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 13:11:49 +0200 Subject: [PATCH 069/495] test --- iguana/kmd_lookup.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 2a5cc7ae5..4664e6d43 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -110,6 +110,7 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi ptr->tx->vouts[vout].spendvini = vini; if ( coin->kmd_txidfp != 0 ) { + char str[65],str2[65]; //printf("write out spent ht.%d vout.%d\n",ptr->tx->height,vout); savepos = ftell(coin->kmd_txidfp); fseek(coin->kmd_txidfp,ptr->fpos,SEEK_SET); @@ -118,7 +119,7 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi fseek(coin->kmd_txidfp,ptr->fpos + sizeof(*ptr->tx) + sizeof(*ptr->tx->vouts)*vout,SEEK_SET); fwrite(&ptr->tx->vouts[vout],1,sizeof(ptr->tx->vouts[vout]),coin->kmd_txidfp); fflush(coin->kmd_txidfp); - } else printf("vin write validation error ht.%d vout.%d fpos.%ld\n",ptr->tx->height,vout,ptr->fpos); + } else printf("vin write validation error ht.%d vout.%d fpos.%ld %s vs %s [%d vs %d]\n",ptr->tx->height,vout,ptr->fpos,bits256_str(str,T.txid),bits256_str(str2,ptr->tx->txid),T.numvouts,ptr->tx->numvouts); fseek(coin->kmd_txidfp,savepos,SEEK_SET); } } From 0936c1bb85d9889389736c089b32c95dbe56364d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 13:19:16 +0200 Subject: [PATCH 070/495] test --- iguana/kmd_lookup.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 4664e6d43..668a6a3f1 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -108,7 +108,7 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi { ptr->tx->vouts[vout].spendtxid = spendtxid; ptr->tx->vouts[vout].spendvini = vini; - if ( coin->kmd_txidfp != 0 ) + if ( coin->kmd_txidfp != 0 && 0 ) { char str[65],str2[65]; //printf("write out spent ht.%d vout.%d\n",ptr->tx->height,vout); From 73bcd77414e22156814da244e08a03a856bdf1e4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 13:26:58 +0200 Subject: [PATCH 071/495] test --- iguana/kmd_lookup.h | 22 +++++++++++++++++++++- includes/iguana_structs.h | 2 +- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 668a6a3f1..d4c24d3a5 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -192,6 +192,8 @@ void kmd_flushfiles(struct iguana_info *coin) { if ( coin->kmd_txidfp != 0 ) fflush(coin->kmd_txidfp); + if ( coin->kmd_spendfp != 0 ) + fflush(coin->kmd_spendfp); } FILE *kmd_txidinit(struct iguana_info *coin) @@ -509,8 +511,13 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) int32_t h,num=0,loadheight,i,n,j,iter,numtxids,numvins,numvouts,flag=0,height=-1; cJSON *txjson,*vouts,*vins,*blockjson,*txids,*vout,*vin,*sobj,*addresses; bits256 zero,txid; char *curlstr,params[128],str[65]; struct kmd_transactionhh *ptr; struct kmd_transaction *tx; uint8_t type_rmd160[21]; if ( coin->kmd_didinit == 0 ) { + char fname[1024]; if ( (coin->kmd_txidfp= kmd_txidinit(coin)) == 0 ) printf("error initializing %s.kmd lookups\n",coin->symbol); + sprintf(fname,"%s/TRANSACTIONS/%s",GLOBAL_DBDIR,coin->symbol); + if ( (coin->kmd_spendfp= fopen(fname,"rb+")) != 0 ) + fseek(coin->kmd_spendfp,0,SEEK_END); + else coin->kmd_spendfp = fopen(fname,"wb+"); coin->kmd_didinit = 1; } height = kmd_height(coin); @@ -583,14 +590,27 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) else { ptr->numvins = numvins; + if ( coin->kmd_spendfp != 0 ) + { + fwrite(&tx->txid,1,sizeof(tx->txid),coin->kmd_spendfp); + fwrite(&numvins,1,sizeof(numvins),coin->kmd_spendfp); + } for (j=0; jkmd_spendfp != 0 ) + { + fwrite(&spenttxid,1,sizeof(spenttxid),coin->kmd_spendfp); + fwrite(&spentvout,1,sizeof(spentvout),coin->kmd_spendfp); + } } } } else printf("incomplete at ht.%d i.%d %p %p\n",loadheight,i,ptr,tx); diff --git a/includes/iguana_structs.h b/includes/iguana_structs.h index df1590757..bce61a08c 100755 --- a/includes/iguana_structs.h +++ b/includes/iguana_structs.h @@ -536,7 +536,7 @@ struct iguana_info struct iguana_block *RTblocks[65536]; uint8_t *RTrawdata[65536]; int32_t RTrecvlens[65536],RTnumtx[65536]; struct iguana_RTtxid *RTdataset; struct iguana_RTaddr *RTaddrs; struct hashstr_item *alladdresses; - struct kmd_transactionhh *kmd_transactions; struct kmd_addresshh *kmd_addresses; portable_mutex_t kmdmutex; FILE *kmd_txidfp; int32_t kmd_didinit,kmd_height,DEXEXPLORER; uint32_t kmd_lasttime; + struct kmd_transactionhh *kmd_transactions; struct kmd_addresshh *kmd_addresses; portable_mutex_t kmdmutex; FILE *kmd_txidfp,*kmd_spendfp; int32_t kmd_didinit,kmd_height,DEXEXPLORER; uint32_t kmd_lasttime; }; struct vin_signer { bits256 privkey; char coinaddr[64]; uint8_t siglen,sig[80],rmd160[20],pubkey[66]; }; From ad81365eb4a9f8d83eba4e3853d090c230eb341c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 13:28:42 +0200 Subject: [PATCH 072/495] test --- iguana/kmd_lookup.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index d4c24d3a5..c31488091 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -514,7 +514,7 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) char fname[1024]; if ( (coin->kmd_txidfp= kmd_txidinit(coin)) == 0 ) printf("error initializing %s.kmd lookups\n",coin->symbol); - sprintf(fname,"%s/TRANSACTIONS/%s",GLOBAL_DBDIR,coin->symbol); + sprintf(fname,"%s/TRANSACTIONS/%s.spends",GLOBAL_DBDIR,coin->symbol); if ( (coin->kmd_spendfp= fopen(fname,"rb+")) != 0 ) fseek(coin->kmd_spendfp,0,SEEK_END); else coin->kmd_spendfp = fopen(fname,"wb+"); From 732e44e60dc72da097eaf986e5b492fe7440680e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 18:25:43 +0200 Subject: [PATCH 073/495] test --- iguana/dPoW.h | 2 ++ iguana/dpow/dpow_network.c | 42 +++++++++++++++++++++-- iguana/iguana777.c | 3 ++ iguana/iguana_notary.c | 64 +++++++++++++++++++++------------- iguana/kmd_lookup.h | 70 +++++++++++++++++++++++++++----------- 5 files changed, 135 insertions(+), 46 deletions(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 013407cf3..28517e6e0 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -179,9 +179,11 @@ char *_dex_gettxin(struct supernet_info *myinfo,char *symbol,bits256 txid,int32_ char *_dex_importaddress(struct supernet_info *myinfo,char *symbol,char *address); char *_dex_validateaddress(struct supernet_info *myinfo,char *symbol,char *address); char *_dex_listunspent(struct supernet_info *myinfo,char *symbol,char *address); +char *_dex_listunspent2(struct supernet_info *myinfo,char *symbol,char *address); char *_dex_listspent(struct supernet_info *myinfo,char *symbol,char *address); char *_dex_getbalance(struct supernet_info *myinfo,char *symbol,char *address); char *_dex_listtransactions(struct supernet_info *myinfo,char *symbol,char *coinaddr,int32_t count,int32_t skip); +char *_dex_listtransactions2(struct supernet_info *myinfo,char *symbol,char *coinaddr,int32_t count,int32_t skip); char *_dex_alladdresses(struct supernet_info *myinfo,char *symbol); int32_t _dex_getheight(struct supernet_info *myinfo,char *symbol); char *_dex_getnotaries(struct supernet_info *myinfo,char *symbol); diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 0bc7c1e4f..bb9450b6c 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -543,6 +543,14 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d retstr = jprint(retjson,1); } } + else if ( dexreq.func == 'u' ) + { + if ( (retjson= kmd_listunspent(coin,(char *)&dexp->packet[datalen])) != 0 ) + { + dpow_randipbits(myinfo,coin,retjson); + retstr = jprint(retjson,1); + } + } else if ( dexreq.func == 's' ) { if ( (retjson= dpow_listspent(myinfo,coin,(char *)&dexp->packet[datalen])) != 0 ) @@ -574,6 +582,15 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d retstr = jprint(retjson,1); } } + else if ( dexreq.func == '2' ) + { + //printf("call list.(%s %d %d)\n",(char *)&dexp->packet[datalen],dexreq.shortarg,dexreq.intarg); + if ( (retjson= kmd_listtransactions(coin,(char *)&dexp->packet[datalen],dexreq.shortarg,dexreq.intarg)) != 0 ) + { + dpow_randipbits(myinfo,coin,retjson); + retstr = jprint(retjson,1); + } + } else if ( dexreq.func == 'C' ) { if ( (retjson= dpow_checkaddress(myinfo,coin,(char *)&dexp->packet[datalen])) != 0 ) @@ -949,12 +966,12 @@ char *_dex_validateaddress(struct supernet_info *myinfo,char *symbol,char *addre return(_dex_sendrequeststr(myinfo,&dexreq,address,0,1,"")); } -char *_dex_listunspent(struct supernet_info *myinfo,char *symbol,char *address) +char *_dex_listunspentarg(struct supernet_info *myinfo,char *symbol,char *address,uint8_t arg) { struct dex_request dexreq; char *retstr; memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); - dexreq.func = 'U'; + dexreq.func = arg; if ( (retstr= _dex_sendrequeststr(myinfo,&dexreq,address,0,1,"")) != 0 ) { //printf("UNSPENTS.(%s)\n",retstr); @@ -962,6 +979,16 @@ char *_dex_listunspent(struct supernet_info *myinfo,char *symbol,char *address) return(_dex_arrayreturn(retstr)); } +char *_dex_listunspent(struct supernet_info *myinfo,char *symbol,char *address) +{ + return(_dex_listunspentarg(myinfo,symbol,address,'U')); +} + +char *_dex_listunspent2(struct supernet_info *myinfo,char *symbol,char *address) +{ + return(_dex_listunspentarg(myinfo,symbol,address,'u')); +} + char *_dex_listspent(struct supernet_info *myinfo,char *symbol,char *address) { struct dex_request dexreq; char *retstr; @@ -999,6 +1026,17 @@ char *_dex_listtransactions(struct supernet_info *myinfo,char *symbol,char *addr return(_dex_arrayreturn(_dex_sendrequeststr(myinfo,&dexreq,address,0,1,""))); } +char *_dex_listtransactions2(struct supernet_info *myinfo,char *symbol,char *address,int32_t count,int32_t skip) +{ + struct dex_request dexreq; + memset(&dexreq,0,sizeof(dexreq)); + safecopy(dexreq.name,symbol,sizeof(dexreq.name)); + dexreq.intarg = skip; + dexreq.shortarg = count; + dexreq.func = '2'; + return(_dex_arrayreturn(_dex_sendrequeststr(myinfo,&dexreq,address,0,1,""))); +} + int32_t dex_crc32find(struct supernet_info *myinfo,uint32_t crc32) { int32_t i,firstz = -1; diff --git a/iguana/iguana777.c b/iguana/iguana777.c index 947ff0515..2ec4754cc 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -885,7 +885,10 @@ void iguana_coinloop(void *arg) coins++; coin = coins[0]; if ( (coin->notarychain= iguana_isnotarychain(coin->symbol)) >= 0 ) + { coin->VALIDATENODE = 0; + coin->DEXEXPLORER = myinfo->DEXEXPLORER; + } //if ( coin->FULLNODE > 0 ) // coin->notarychain = -1; printf("begin coinloop[%d] %s notarychain.%d\n",n,coin->symbol,coin->notarychain); diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 368ca4852..41b7f48f6 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -703,57 +703,73 @@ THREE_STRINGS_AND_THREE_INTS(dex,kvupdate,symbol,key,value,flags,unused,unusedb) TWO_STRINGS(dex,listunspent2,symbol,address) { cJSON *retjson; - if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 ) + if ( myinfo->DEXEXPLORER != 0 ) { - if ( strcmp(coin->symbol,"BTC") == 0 ) - return(clonestr("[]")); - if ( (retjson= kmd_listunspent(coin,address)) != 0 ) - return(jprint(retjson,1)); + if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 ) + { + if ( strcmp(coin->symbol,"BTC") == 0 || coin->DEXEXPLORER == 0 ) + return(clonestr("[]")); + if ( (retjson= kmd_listunspent(coin,address)) != 0 ) + return(jprint(retjson,1)); + } } - return(clonestr("{\"error\":\"dex listunspent2 null symbol, address or coin\"}")); + if ( symbol != 0 && address != 0 ) + return(_dex_listunspent2(myinfo,symbol,address)); + else return(clonestr("{\"error\":\"dex listunspent2 null symbol, address or coin\"}")); } TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions2,symbol,address,count,skip) { cJSON *retjson; - if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 ) + if ( myinfo->DEXEXPLORER != 0 ) { - if ( strcmp(coin->symbol,"BTC") == 0 ) - return(clonestr("[]")); - if ( (retjson= kmd_listtransactions(coin,address,count,skip)) != 0 ) - return(jprint(retjson,1)); + if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 ) + { + if ( strcmp(coin->symbol,"BTC") == 0 || coin->DEXEXPLORER == 0 ) + return(clonestr("[]")); + if ( (retjson= kmd_listtransactions(coin,address,count,skip)) != 0 ) + return(jprint(retjson,1)); + } } - return(clonestr("{\"error\":\"dex listunspent2 null symbol, address or coin\"}")); + if ( symbol != 0 && address != 0 ) + return(_dex_listtransactions2(myinfo,symbol,address,count,skip)); + else return(clonestr("{\"error\":\"dex listunspent2 null symbol, address or coin\"}")); } HASH_AND_STRING_AND_INT(dex,gettxin,txid,symbol,vout) { - if ( myinfo->IAMNOTARY != 0 ) + if ( myinfo->DEXEXPLORER != 0 ) { - if ( symbol != 0 && (coin= iguana_coinfind(symbol)) != 0 ) + if ( symbol != 0 && (coin= iguana_coinfind(symbol)) != 0 && coin->DEXEXPLORER != 0 ) return(jprint(kmd_gettxin(coin,txid,vout),1)); - return(clonestr("{\"error\":\"dex listspent null symbol, address or coin\"}")); - } else return(_dex_gettxin(myinfo,symbol,txid,vout)); + } + if ( symbol != 0 ) + return(_dex_gettxin(myinfo,symbol,txid,vout)); + else return(clonestr("{\"error\":\"dex gettxin null symbolor coin\"}")); } TWO_STRINGS(dex,listspent,symbol,address) { - if ( myinfo->IAMNOTARY != 0 ) + if ( myinfo->DEXEXPLORER != 0 ) { - if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 ) + if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 && coin->DEXEXPLORER != 0 ) return(jprint(kmd_listspent(coin,address),1)); - return(clonestr("{\"error\":\"dex listspent null symbol, address or coin\"}")); - } else return(_dex_listspent(myinfo,symbol,address)); + } + if ( symbol != 0 && address != 0 ) + return(_dex_listspent(myinfo,symbol,address)); + else return(clonestr("{\"error\":\"dex listspent null symbol, address or coin\"}")); } TWO_STRINGS(dex,getbalance,symbol,address) { - if ( myinfo->IAMNOTARY != 0 ) + if ( myinfo->DEXEXPLORER != 0 ) { - if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 ) + if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 && coin->DEXEXPLORER != 0 ) return(jprint(kmd_getbalance(coin,address),1)); - return(clonestr("{\"error\":\"dex getbalance null symbol, address or coin\"}")); - } else return(_dex_getbalance(myinfo,symbol,address)); + } + if ( symbol != 0 && address != 0 ) + return(_dex_getbalance(myinfo,symbol,address)); + else return(clonestr("{\"error\":\"dex getbalance null symbol, address or coin\"}")); } STRING_ARG(dex,explorer,symbol) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index c31488091..e52ad1c36 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -28,7 +28,7 @@ struct kmd_voutinfo struct kmd_transaction { - bits256 txid; int32_t height,numvouts,numvins; uint32_t timestamp,pad; + bits256 txid; int32_t height,numvouts,numvins; uint32_t timestamp; struct kmd_voutinfo vouts[]; } PACKED; @@ -44,8 +44,8 @@ struct kmd_transactionhh struct kmd_addresshh { UT_hash_handle hh; - uint8_t type_rmd160[21], pad; struct kmd_transactionhh *prev,*lastprev; + uint8_t type_rmd160[21], pad; }; struct kmd_addresshh *_kmd_address(struct iguana_info *coin,uint8_t type_rmd160[21]) @@ -98,7 +98,7 @@ struct kmd_transactionhh *kmd_transaction(struct iguana_info *coin,bits256 txid) int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vini,bits256 txid,int32_t vout) { - struct kmd_transactionhh *ptr,*spendptr=0; long savepos; struct kmd_transaction T; + struct kmd_transactionhh *ptr,*spendptr=0; if ( bits256_nonz(txid) == 0 || vout < 0 ) return(0); // coinbase must be if ( (ptr= kmd_transaction(coin,txid)) != 0 && vout < ptr->numvouts && (spendptr= kmd_transaction(coin,spendtxid)) != 0 ) @@ -108,7 +108,7 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi { ptr->tx->vouts[vout].spendtxid = spendtxid; ptr->tx->vouts[vout].spendvini = vini; - if ( coin->kmd_txidfp != 0 && 0 ) + /*if ( coin->kmd_txidfp != 0 && 0 ) { char str[65],str2[65]; //printf("write out spent ht.%d vout.%d\n",ptr->tx->height,vout); @@ -121,7 +121,7 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi fflush(coin->kmd_txidfp); } else printf("vin write validation error ht.%d vout.%d fpos.%ld %s vs %s [%d vs %d]\n",ptr->tx->height,vout,ptr->fpos,bits256_str(str,T.txid),bits256_str(str2,ptr->tx->txid),T.numvouts,ptr->tx->numvouts); fseek(coin->kmd_txidfp,savepos,SEEK_SET); - } + }*/ } return(0); } @@ -232,15 +232,48 @@ FILE *kmd_txidinit(struct iguana_info *coin) } else break; } fseek(fp,lastpos,SEEK_SET); - /*HASH_ITER(hh,coin->kmd_transactions,ptr,tmp) + HASH_ITER(hh,coin->kmd_transactions,ptr,tmp) { - for (i=0; inumvins; i++) + //printf("scan for spends ht.%d\n",ptr->tx->height); + for (i=0; inumvouts; i++) { vptr = &ptr->tx->vouts[i]; - if ( kmd_transactionvin(coin,ptr->tx->txid,i,ptr->tx->vins[i].txid,ptr->tx->vins[i].vout) < 0 ) - printf("error vini.%d ht.%d\n",i,ptr->tx->height); + if ( vptr->spendvini >= 0 && bits256_nonz(vptr->spendtxid) != 0 ) + { + if ( (ptr->ptrs[(i<<1) + 1]= kmd_transaction(coin,vptr->spendtxid)) == 0 ) + { + printf("cant find %s spend.%d\n",bits256_str(str,vptr->spendtxid),i); + } + //else printf("set spent.%p ht.%d vout.%d\n",ptr->ptrs[(i<<1)+1],ptr->tx->height,i); + } + } + } + } else fp = fopen(fname,"wb+"); + return(fp); +} + +FILE *kmd_spendinit(struct iguana_info *coin) +{ + int32_t i,numvins,spentvout; FILE *fp; char fname[1024],str[65]; bits256 txid,spenttxid; struct kmd_transactionhh *ptr,*tmp; struct kmd_voutinfo *vptr; long lastpos=0; + sprintf(fname,"%s/TRANSACTIONS/%s.spends",GLOBAL_DBDIR,coin->symbol); + if ( (fp= fopen(fname,"rb+")) != 0 ) + { + while ( fread(&txid,1,sizeof(txid),fp) == sizeof(txid) ) + { + if ( fread(&numvins,1,sizeof(numvins),fp) == sizeof(numvins) ) + { + for (i=0; ikmd_transactions,ptr,tmp) { //printf("scan for spends ht.%d\n",ptr->tx->height); @@ -249,11 +282,10 @@ FILE *kmd_txidinit(struct iguana_info *coin) vptr = &ptr->tx->vouts[i]; if ( vptr->spendvini >= 0 && bits256_nonz(vptr->spendtxid) != 0 ) { - if ( (ptr->ptrs[(i<<1) + 1]= kmd_transaction(coin,vptr->spendtxid)) == 0 ) + if ( ptr->ptrs[(i<<1) + 1] != kmd_transaction(coin,vptr->spendtxid) ) { - printf("cant find %s spend.%d\n",bits256_str(str,vptr->spendtxid),i); + printf("mismatch %s spend.%d %p %p\n",bits256_str(str,vptr->spendtxid),i,ptr->ptrs[(i<<1) + 1],kmd_transaction(coin,vptr->spendtxid)); } - //else printf("set spent.%p ht.%d vout.%d\n",ptr->ptrs[(i<<1)+1],ptr->tx->height,i); } } } @@ -446,7 +478,8 @@ cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) bitcoin_address(address,addr->type_rmd160[0],&addr->type_rmd160[1],20); s = r = 0; balance += _kmd_getbalance(coin,address,&r,&s); - printf("{\"address\":\"%s\",\"received\":%.8f,\"sent\":%.8f,\"balance\":%.8f,\"supply\":%.8f}\n",address,dstr(r),dstr(s),dstr(r)-dstr(s),dstr(balance)); + if ( (r - s) > 100000*SATOSHIDEN ) + printf("{\"address\":\"%s\",\"received\":%.8f,\"sent\":%.8f,\"balance\":%.8f,\"supply\":%.8f}\n",address,dstr(r),dstr(s),dstr(r)-dstr(s),dstr(balance)); received += r; sent += s; } @@ -511,13 +544,10 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) int32_t h,num=0,loadheight,i,n,j,iter,numtxids,numvins,numvouts,flag=0,height=-1; cJSON *txjson,*vouts,*vins,*blockjson,*txids,*vout,*vin,*sobj,*addresses; bits256 zero,txid; char *curlstr,params[128],str[65]; struct kmd_transactionhh *ptr; struct kmd_transaction *tx; uint8_t type_rmd160[21]; if ( coin->kmd_didinit == 0 ) { - char fname[1024]; if ( (coin->kmd_txidfp= kmd_txidinit(coin)) == 0 ) - printf("error initializing %s.kmd lookups\n",coin->symbol); - sprintf(fname,"%s/TRANSACTIONS/%s.spends",GLOBAL_DBDIR,coin->symbol); - if ( (coin->kmd_spendfp= fopen(fname,"rb+")) != 0 ) - fseek(coin->kmd_spendfp,0,SEEK_END); - else coin->kmd_spendfp = fopen(fname,"wb+"); + printf("error initializing %s.kmd txid\n",coin->symbol); + else if ( (coin->kmd_spendfp= kmd_spendinit(coin)) == 0 ) + printf("error initializing %s.kmd spend\n",coin->symbol); coin->kmd_didinit = 1; } height = kmd_height(coin); From 5d79ce607e1ef2cf10aa251736df850e0e5247e5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 18:32:28 +0200 Subject: [PATCH 074/495] test --- iguana/kmd_lookup.h | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index e52ad1c36..0bdb3504b 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -198,7 +198,7 @@ void kmd_flushfiles(struct iguana_info *coin) FILE *kmd_txidinit(struct iguana_info *coin) { - int32_t i; FILE *fp; char fname[1024],str[65]; struct kmd_transactionhh *ptr,*tmp; struct kmd_transaction T,*tx; struct kmd_voutinfo V,*vptr; long lastpos=0; + int32_t i; FILE *fp; char fname[1024],str[65]; struct kmd_transactionhh *ptr; struct kmd_transaction T,*tx; struct kmd_voutinfo V; long lastpos=0; sprintf(fname,"%s/TRANSACTIONS/%s",GLOBAL_DBDIR,coin->symbol); if ( (fp= fopen(fname,"rb+")) != 0 ) { @@ -231,23 +231,8 @@ FILE *kmd_txidinit(struct iguana_info *coin) } } else break; } + printf("finished txidinit fpos %ld vs lastpos %ld\n",ftell(fp),lastpos); fseek(fp,lastpos,SEEK_SET); - HASH_ITER(hh,coin->kmd_transactions,ptr,tmp) - { - //printf("scan for spends ht.%d\n",ptr->tx->height); - for (i=0; inumvouts; i++) - { - vptr = &ptr->tx->vouts[i]; - if ( vptr->spendvini >= 0 && bits256_nonz(vptr->spendtxid) != 0 ) - { - if ( (ptr->ptrs[(i<<1) + 1]= kmd_transaction(coin,vptr->spendtxid)) == 0 ) - { - printf("cant find %s spend.%d\n",bits256_str(str,vptr->spendtxid),i); - } - //else printf("set spent.%p ht.%d vout.%d\n",ptr->ptrs[(i<<1)+1],ptr->tx->height,i); - } - } - } } else fp = fopen(fname,"wb+"); return(fp); } @@ -268,11 +253,18 @@ FILE *kmd_spendinit(struct iguana_info *coin) fread(&spentvout,1,sizeof(spentvout),fp) == sizeof(spentvout) ) { if ( kmd_transactionvin(coin,txid,i,spenttxid,spentvout) < 0 ) + { printf("error adding spend %s %d of %d\n",bits256_str(str,txid),i,numvins); - } + break; + } + } else break; } - } + if ( i == numvins ) + lastpos = ftell(fp); + else break; + } else break; } + printf("finished spendinit fpos %ld vs lastpos %ld\n",ftell(fp),lastpos); fseek(fp,lastpos,SEEK_SET); HASH_ITER(hh,coin->kmd_transactions,ptr,tmp) { @@ -556,7 +548,7 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) { flag = 0; if ( (loadheight % 1000) == 0 ) - printf("loading ht.%d\n",loadheight); + printf("loading ht.%d %s\n",loadheight,jprint(kmd_getbalance(coin,"*"),1)); if ( (blockjson= kmd_blockjson(&h,coin->symbol,coin->chain->serverport,coin->chain->userpass,0,loadheight)) != 0 ) { if ( (txids= jarray(&numtxids,blockjson,"tx")) != 0 ) From a0462023b42b7feeea3fa1f12198a70eb167f522 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 18:43:36 +0200 Subject: [PATCH 075/495] test --- iguana/kmd_lookup.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 0bdb3504b..16ea1865f 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -137,8 +137,6 @@ void kmd_transactionvout(struct iguana_info *coin,struct kmd_transactionhh *ptr, { tx->vouts[vout].spendtxid = spendtxid; tx->vouts[vout].spendvini = spendvini; - //if ( bits256_nonz(spendtxid) != 0 && spendvini >= 0 ) - // ptr->ptrs[(vout<<1) + 1] = kmd_transaction(coin,spendtxid); tx->vouts[vout].amount = amount; memcpy(tx->vouts[vout].type_rmd160,type_rmd160,21); if ( (addr= _kmd_address(coin,type_rmd160)) == 0 ) @@ -209,6 +207,8 @@ FILE *kmd_txidinit(struct iguana_info *coin) printf("INIT %s.[%d] ht.%d %u\n",bits256_str(str,T.txid),T.numvouts,T.height,T.timestamp); if ( (ptr= kmd_transactionadd(coin,tx,T.numvouts)) != 0 ) { + if ( ptr != kmd_transaction(coin,tx->txid) ) + printf("ERROR: %p != %p for ht.%d\n",ptr,kmd_transaction(coin,tx->txid),tx->height); ptr->fpos = lastpos; for (i=0; i Date: Sat, 11 Feb 2017 18:50:59 +0200 Subject: [PATCH 076/495] test --- iguana/kmd_lookup.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 16ea1865f..d59009e3f 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -476,12 +476,15 @@ cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) sent += s; } if ( strcmp("KMD",coin->symbol) == 0 ) - jaddnum(retjson,"interestpaid",dstr(balance)-dstr(coin->kmd_height*3)); + jaddnum(retjson,"interestpaid",dstr(balance) - 100000000*SATOSHIDEN - (coin->kmd_height*3)); } else balance = _kmd_getbalance(coin,coinaddr,&received,&sent); jaddstr(retjson,"result","success"); jaddnum(retjson,"received",dstr(received)); jaddnum(retjson,"sent",dstr(sent)); jaddnum(retjson,"balance",dstr(balance)); + jaddnum(retjson,"height",coin->kmd_height); + if ( strcmp("KMD",coin->symbol) == 0 ) + jaddnum(retjson,"mined",coin->kmd_height*3); return(retjson); } From 4a17176f211cd80cfe84b0cb700b53792b601798 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 19:29:23 +0200 Subject: [PATCH 077/495] test --- iguana/kmd_lookup.h | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index d59009e3f..bae54e47c 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -108,20 +108,6 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi { ptr->tx->vouts[vout].spendtxid = spendtxid; ptr->tx->vouts[vout].spendvini = vini; - /*if ( coin->kmd_txidfp != 0 && 0 ) - { - char str[65],str2[65]; - //printf("write out spent ht.%d vout.%d\n",ptr->tx->height,vout); - savepos = ftell(coin->kmd_txidfp); - fseek(coin->kmd_txidfp,ptr->fpos,SEEK_SET); - if ( fread(&T,1,sizeof(T),coin->kmd_txidfp) == sizeof(T) && bits256_cmp(T.txid,ptr->tx->txid) == 0 && T.numvouts == ptr->tx->numvouts ) - { - fseek(coin->kmd_txidfp,ptr->fpos + sizeof(*ptr->tx) + sizeof(*ptr->tx->vouts)*vout,SEEK_SET); - fwrite(&ptr->tx->vouts[vout],1,sizeof(ptr->tx->vouts[vout]),coin->kmd_txidfp); - fflush(coin->kmd_txidfp); - } else printf("vin write validation error ht.%d vout.%d fpos.%ld %s vs %s [%d vs %d]\n",ptr->tx->height,vout,ptr->fpos,bits256_str(str,T.txid),bits256_str(str2,ptr->tx->txid),T.numvouts,ptr->tx->numvouts); - fseek(coin->kmd_txidfp,savepos,SEEK_SET); - }*/ } return(0); } @@ -433,9 +419,9 @@ cJSON *kmd_listspent(struct iguana_info *coin,char *coinaddr) return(kmd_listaddress(coin,coinaddr,1)); } -int64_t _kmd_getbalance(struct iguana_info *coin,char *coinaddr,int64_t *receivedp,int64_t *sentp) +int64_t _kmd_getbalance(struct iguana_info *coin,char *coinaddr,uint64_t *receivedp,uint64_t *sentp) { - int32_t iter,i,n; cJSON *array,*item; int64_t value; + int32_t iter,i,n; cJSON *array,*item; uint64_t value; for (iter=1; iter<=2; iter++) { if ( (array= kmd_listaddress(coin,coinaddr,iter)) != 0 ) @@ -461,7 +447,7 @@ int64_t _kmd_getbalance(struct iguana_info *coin,char *coinaddr,int64_t *receive cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) { - cJSON *retjson; int64_t s,r,sent=0,received=0,balance=0; struct kmd_addresshh *addr,*tmp; char address[64]; + cJSON *retjson; uint64_t s,r,sent=0,received=0; int64_t balance=0; struct kmd_addresshh *addr,*tmp; char address[64]; retjson = cJSON_CreateObject(); if ( strcmp(coinaddr,"*") == 0 ) { From 52f938aa77ecb87bafd6030e47ecc63610a14be0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 19:55:32 +0200 Subject: [PATCH 078/495] test --- iguana/kmd_lookup.h | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index bae54e47c..78216586f 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -419,7 +419,7 @@ cJSON *kmd_listspent(struct iguana_info *coin,char *coinaddr) return(kmd_listaddress(coin,coinaddr,1)); } -int64_t _kmd_getbalance(struct iguana_info *coin,char *coinaddr,uint64_t *receivedp,uint64_t *sentp) +int64_t _kmd_getbalance(struct iguana_info *coin,char *coinaddr,uint64_t *receivedp,uint64_t *sentp,double *fbalancep) { int32_t iter,i,n; cJSON *array,*item; uint64_t value; for (iter=1; iter<=2; iter++) @@ -434,8 +434,8 @@ int64_t _kmd_getbalance(struct iguana_info *coin,char *coinaddr,uint64_t *receiv if ( (value= jdouble(item,"amount")*SATOSHIDEN) != 0 || (value= jdouble(item,"value")*SATOSHIDEN) != 0 ) { if ( iter == 2 ) - *receivedp += value; - else *sentp += value; + *receivedp += value, *fbalancep += dstr(value); + else *sentp += value, *fbalancep -= dstr(value); } } } @@ -447,27 +447,31 @@ int64_t _kmd_getbalance(struct iguana_info *coin,char *coinaddr,uint64_t *receiv cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) { - cJSON *retjson; uint64_t s,r,sent=0,received=0; int64_t balance=0; struct kmd_addresshh *addr,*tmp; char address[64]; + cJSON *retjson; double netbalance=0.,fbalance; uint64_t s,r,sent=0,received=0; int64_t balance=0; struct kmd_addresshh *addr,*tmp; char address[64]; retjson = cJSON_CreateObject(); + fbalance = 0.; if ( strcmp(coinaddr,"*") == 0 ) { HASH_ITER(hh,coin->kmd_addresses,addr,tmp) { bitcoin_address(address,addr->type_rmd160[0],&addr->type_rmd160[1],20); s = r = 0; - balance += _kmd_getbalance(coin,address,&r,&s); - if ( (r - s) > 100000*SATOSHIDEN ) + balance += _kmd_getbalance(coin,address,&r,&s,&fbalance); + if ( (r - s) > 1000000*SATOSHIDEN ) printf("{\"address\":\"%s\",\"received\":%.8f,\"sent\":%.8f,\"balance\":%.8f,\"supply\":%.8f}\n",address,dstr(r),dstr(s),dstr(r)-dstr(s),dstr(balance)); received += r; sent += s; + netbalance += fbalance; } if ( strcmp("KMD",coin->symbol) == 0 ) jaddnum(retjson,"interestpaid",dstr(balance) - 100000000*SATOSHIDEN - (coin->kmd_height*3)); - } else balance = _kmd_getbalance(coin,coinaddr,&received,&sent); + } else balance = _kmd_getbalance(coin,coinaddr,&received,&sent,&netbalance); jaddstr(retjson,"result","success"); jaddnum(retjson,"received",dstr(received)); jaddnum(retjson,"sent",dstr(sent)); - jaddnum(retjson,"balance",dstr(balance)); + if ( fabs(netbalance*SATOSHIDEN - balance) > 1 ) + jaddnum(retjson,"balance",netbalance); + else jaddnum(retjson,"balance",dstr(balance)); jaddnum(retjson,"height",coin->kmd_height); if ( strcmp("KMD",coin->symbol) == 0 ) jaddnum(retjson,"mined",coin->kmd_height*3); @@ -537,7 +541,7 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) { flag = 0; if ( (loadheight % 1000) == 0 ) - printf("loading ht.%d %s\n",loadheight,jprint(kmd_getbalance(coin,"*"),1)); + printf("loading ht.%d\n",loadheight);//,jprint(kmd_getbalance(coin,"*"),1)); if ( (blockjson= kmd_blockjson(&h,coin->symbol,coin->chain->serverport,coin->chain->userpass,0,loadheight)) != 0 ) { if ( (txids= jarray(&numtxids,blockjson,"tx")) != 0 ) From db6fb376fcb018776da456af5c8b35209b6a7d23 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 20:09:21 +0200 Subject: [PATCH 079/495] test --- iguana/kmd_lookup.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 78216586f..8f4ef2b25 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -241,7 +241,7 @@ FILE *kmd_spendinit(struct iguana_info *coin) if ( kmd_transactionvin(coin,txid,i,spenttxid,spentvout) < 0 ) { printf("error adding spend %s %d of %d\n",bits256_str(str,txid),i,numvins); - break; + //break; } } else break; } @@ -616,6 +616,8 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) vin = jitem(vins,j); spenttxid = jbits256(vin,"txid"); spentvout = jint(vin,"vout"); + if ( bits256_nonz(spenttxid) == 0 || spentvout < 0 ) + printf("null spenttxid ht.%d j.%d spentvout.%d\n",loadheight,j,spentvout); if ( kmd_transactionvin(coin,txid,j,spenttxid,spentvout) < 0 ) { printf("error i.%d of numvins.%d (%s)\n",j,numvins,jprint(vin,0)); From c66bed5f59e342628278189d0b69a19dc0f56f1b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 20:11:16 +0200 Subject: [PATCH 080/495] test --- iguana/dpow/dpow_rpc.c | 6 +++--- iguana/iguana_notary.c | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 9cb3057e7..dae988c04 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -407,7 +407,7 @@ cJSON *dpow_listunspent(struct supernet_info *myinfo,struct iguana_info *coin,ch cJSON *dpow_listspent(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr) { - if ( myinfo->IAMNOTARY != 0 ) + if ( myinfo->DEXEXPLORER != 0 ) return(kmd_listspent(coin,coinaddr)); else { @@ -417,7 +417,7 @@ cJSON *dpow_listspent(struct supernet_info *myinfo,struct iguana_info *coin,char cJSON *dpow_getbalance(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr) { - if ( myinfo->IAMNOTARY != 0 ) + if ( myinfo->DEXEXPLORER != 0 ) return(kmd_getbalance(coin,coinaddr)); else { @@ -427,7 +427,7 @@ cJSON *dpow_getbalance(struct supernet_info *myinfo,struct iguana_info *coin,cha cJSON *dpow_gettxin(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t vout) { - if ( myinfo->IAMNOTARY != 0 ) + if ( myinfo->DEXEXPLORER != 0 ) return(kmd_gettxin(coin,txid,vout)); else { diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 41b7f48f6..a6b28971f 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -766,6 +766,7 @@ TWO_STRINGS(dex,getbalance,symbol,address) { if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 && coin->DEXEXPLORER != 0 ) return(jprint(kmd_getbalance(coin,address),1)); + else printf("DEXEXPLORER.%d\n",coin->DEXEXPLORER); } if ( symbol != 0 && address != 0 ) return(_dex_getbalance(myinfo,symbol,address)); From 9277553c7b258b54df4a32cc2bd7b98a6a0bebd2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 20:16:56 +0200 Subject: [PATCH 081/495] test --- iguana/iguana777.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/iguana777.c b/iguana/iguana777.c index 2ec4754cc..f3243efb3 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -891,7 +891,7 @@ void iguana_coinloop(void *arg) } //if ( coin->FULLNODE > 0 ) // coin->notarychain = -1; - printf("begin coinloop[%d] %s notarychain.%d\n",n,coin->symbol,coin->notarychain); + printf("begin coinloop[%d] %s notarychain.%d DEXEXPLORER.%d\n",n,coin->symbol,coin->notarychain,coin->DEXEXPLORER); memset(zero.bytes,0,sizeof(zero)); while ( 1 ) { From 390fc4941b5510ef6ad26d41a07043070111f44f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 20:23:11 +0200 Subject: [PATCH 082/495] test --- iguana/kmd_lookup.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 8f4ef2b25..ce294d9f0 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -111,7 +111,7 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi } return(0); } - char str[65]; printf("vin error %s vout.%d vs ptr %p [%d] spent.%p\n",bits256_str(str,txid),vout,ptr,ptr!=0?ptr->numvouts:-1,spendptr); + char str[65]; printf("vin error %s vout.%d vs ptr %p [%d] spent.%p\n",bits256_str(str,spendtxid),vout,ptr,ptr!=0?ptr->numvouts:-1,spendptr); return(-1); } From d0253b4f5e0e3fed864c81ff3c33eba21c73939a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 20:32:43 +0200 Subject: [PATCH 083/495] test --- iguana/kmd_lookup.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index ce294d9f0..635b0bef5 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -111,7 +111,7 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi } return(0); } - char str[65]; printf("vin error %s vout.%d vs ptr %p [%d] spent.%p\n",bits256_str(str,spendtxid),vout,ptr,ptr!=0?ptr->numvouts:-1,spendptr); + char str[65]; printf("vin error %s vout.%d of %d vs ptr %p [%d] spent.%p\n",bits256_str(str,spendtxid),vout,ptr->numvouts,ptr,ptr!=0?ptr->numvouts:-1,spendptr); return(-1); } From 973e4958f232943669ff5c7f7fa409a37f4d39d5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 20:36:10 +0200 Subject: [PATCH 084/495] test --- iguana/kmd_lookup.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 635b0bef5..6a0e2725e 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -607,7 +607,7 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) ptr->numvins = numvins; if ( coin->kmd_spendfp != 0 ) { - fwrite(&tx->txid,1,sizeof(tx->txid),coin->kmd_spendfp); + fwrite(&txid,1,sizeof(txid),coin->kmd_spendfp); fwrite(&numvins,1,sizeof(numvins),coin->kmd_spendfp); } for (j=0; j Date: Sat, 11 Feb 2017 20:50:58 +0200 Subject: [PATCH 085/495] test --- iguana/iguana_notary.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index a6b28971f..956d551be 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -707,6 +707,8 @@ TWO_STRINGS(dex,listunspent2,symbol,address) { if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 ) { + if ( coin != 0 ) + coin->DEXEXPLORER = myinfo->DEXEXPLORER * myinfo->IAMNOTARY * (iguana_isnotarychain(coin->symbol) >= 0); if ( strcmp(coin->symbol,"BTC") == 0 || coin->DEXEXPLORER == 0 ) return(clonestr("[]")); if ( (retjson= kmd_listunspent(coin,address)) != 0 ) @@ -725,6 +727,8 @@ TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions2,symbol,address,count,skip) { if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 ) { + if ( coin != 0 ) + coin->DEXEXPLORER = myinfo->DEXEXPLORER * myinfo->IAMNOTARY * (iguana_isnotarychain(coin->symbol) >= 0); if ( strcmp(coin->symbol,"BTC") == 0 || coin->DEXEXPLORER == 0 ) return(clonestr("[]")); if ( (retjson= kmd_listtransactions(coin,address,count,skip)) != 0 ) @@ -742,6 +746,8 @@ HASH_AND_STRING_AND_INT(dex,gettxin,txid,symbol,vout) { if ( symbol != 0 && (coin= iguana_coinfind(symbol)) != 0 && coin->DEXEXPLORER != 0 ) return(jprint(kmd_gettxin(coin,txid,vout),1)); + if ( coin != 0 ) + coin->DEXEXPLORER = myinfo->DEXEXPLORER * myinfo->IAMNOTARY * (iguana_isnotarychain(coin->symbol) >= 0); } if ( symbol != 0 ) return(_dex_gettxin(myinfo,symbol,txid,vout)); @@ -754,6 +760,8 @@ TWO_STRINGS(dex,listspent,symbol,address) { if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 && coin->DEXEXPLORER != 0 ) return(jprint(kmd_listspent(coin,address),1)); + if ( coin != 0 ) + coin->DEXEXPLORER = myinfo->DEXEXPLORER * myinfo->IAMNOTARY * (iguana_isnotarychain(coin->symbol) >= 0); } if ( symbol != 0 && address != 0 ) return(_dex_listspent(myinfo,symbol,address)); @@ -766,7 +774,8 @@ TWO_STRINGS(dex,getbalance,symbol,address) { if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 && coin->DEXEXPLORER != 0 ) return(jprint(kmd_getbalance(coin,address),1)); - else printf("DEXEXPLORER.%d\n",coin->DEXEXPLORER); + if ( coin != 0 ) + coin->DEXEXPLORER = myinfo->DEXEXPLORER * myinfo->IAMNOTARY * (iguana_isnotarychain(coin->symbol) >= 0); } if ( symbol != 0 && address != 0 ) return(_dex_getbalance(myinfo,symbol,address)); From d9c9061b3d9d1805bc7dcf02b6a029773ba1caca Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 20:52:39 +0200 Subject: [PATCH 086/495] test --- iguana/kmd_lookup.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 6a0e2725e..b08404830 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -540,8 +540,8 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) while ( loadheight < height-KMD_EXPLORER_LAG ) { flag = 0; - if ( (loadheight % 1000) == 0 ) - printf("loading ht.%d\n",loadheight);//,jprint(kmd_getbalance(coin,"*"),1)); + if ( (loadheight % 10000) == 0 ) + printf("loading ht.%d\n",loadheight,jprint(kmd_getbalance(coin,"*"),1)); if ( (blockjson= kmd_blockjson(&h,coin->symbol,coin->chain->serverport,coin->chain->userpass,0,loadheight)) != 0 ) { if ( (txids= jarray(&numtxids,blockjson,"tx")) != 0 ) From ef5262e5a023486a7bbb20c0f4f3705833c17e11 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 20:52:57 +0200 Subject: [PATCH 087/495] test --- iguana/kmd_lookup.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index b08404830..a0e9b16ac 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -541,7 +541,7 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) { flag = 0; if ( (loadheight % 10000) == 0 ) - printf("loading ht.%d\n",loadheight,jprint(kmd_getbalance(coin,"*"),1)); + printf("loading ht.%d %s\n",loadheight,jprint(kmd_getbalance(coin,"*"),1)); if ( (blockjson= kmd_blockjson(&h,coin->symbol,coin->chain->serverport,coin->chain->userpass,0,loadheight)) != 0 ) { if ( (txids= jarray(&numtxids,blockjson,"tx")) != 0 ) From a469261f1558a2730f0d7e4902023106804022fd Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 21:05:26 +0200 Subject: [PATCH 088/495] test --- iguana/kmd_lookup.h | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index a0e9b16ac..5dc100509 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -144,13 +144,14 @@ void kmd_transactionvout(struct iguana_info *coin,struct kmd_transactionhh *ptr, } else printf("vout.%d wont fit into numvouts.[%d] or null tx.%p\n",vout,ptr->numvouts,tx); } -struct kmd_transactionhh *kmd_transactionadd(struct iguana_info *coin,struct kmd_transaction *tx,int32_t numvouts) +struct kmd_transactionhh *kmd_transactionadd(struct iguana_info *coin,struct kmd_transaction *tx,int32_t numvouts,int32_t numvins) { struct kmd_transactionhh *ptr; //char str[65]; if ( (ptr= kmd_transaction(coin,tx->txid)) == 0 ) { ptr = calloc(1,sizeof(*ptr) + (sizeof(*ptr->ptrs)*numvouts*2)); ptr->numvouts = numvouts; + ptr->numvins = numvins; ptr->tx = tx; portable_mutex_lock(&coin->kmdmutex); //char str[65]; printf("%s ht.%d u.%u NEW TXID.(%s) vouts.[%d]\n",coin->symbol,tx->height,tx->timestamp,bits256_str(str,tx->txid),numvouts); @@ -190,12 +191,14 @@ FILE *kmd_txidinit(struct iguana_info *coin) { if ( (tx= kmd_transactionalloc(T.txid,T.height,T.timestamp,T.numvouts,T.numvins)) != 0 ) { - printf("INIT %s.[%d] ht.%d %u\n",bits256_str(str,T.txid),T.numvouts,T.height,T.timestamp); - if ( (ptr= kmd_transactionadd(coin,tx,T.numvouts)) != 0 ) + printf("INIT %s.[%d] vins.[%d] ht.%d %u\n",bits256_str(str,T.txid),T.numvouts,T.numvins,T.height,T.timestamp); + if ( (ptr= kmd_transactionadd(coin,tx,T.numvouts,T.numvins)) != 0 ) { if ( ptr != kmd_transaction(coin,tx->txid) ) printf("ERROR: %p != %p for ht.%d\n",ptr,kmd_transaction(coin,tx->txid),tx->height); ptr->fpos = lastpos; + ptr->numvins = T.numvins; + ptr->numvouts = T.numvouts; for (i=0; i Date: Sat, 11 Feb 2017 21:11:03 +0200 Subject: [PATCH 089/495] test --- iguana/kmd_lookup.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 5dc100509..30ab46223 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -111,7 +111,7 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi } return(0); } - char str[65]; printf("vin error %s vout.%d of %d vs ptr %p [%d] spent.%p\n",bits256_str(str,spendtxid),vout,ptr->numvouts,ptr,ptr!=0?ptr->numvouts:-1,spendptr); + char str[65]; printf("vin error %s vout.%d of %d vs ptr %p [%d] spent.%p\n",bits256_str(str,txid),vout,ptr->numvouts,ptr,ptr!=0?ptr->numvouts:-1,spendptr); return(-1); } @@ -166,7 +166,7 @@ struct kmd_transaction *kmd_transactionalloc(bits256 txid,int32_t height,uint32_ struct kmd_transaction *tx; tx = calloc(1,sizeof(*tx) + sizeof(struct kmd_voutinfo)*numvouts); tx->numvouts = numvouts; - tx->numvouts = numvins; + tx->numvins = numvins; tx->txid = txid; tx->height = height; tx->timestamp = timestamp; @@ -607,7 +607,6 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) } else { - ptr->numvins = numvins; if ( coin->kmd_spendfp != 0 ) { fwrite(&txid,1,sizeof(txid),coin->kmd_spendfp); From 95374ae4b63a7e8d991d57d2122ff40f04bf178f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 21:19:47 +0200 Subject: [PATCH 090/495] test --- iguana/kmd_lookup.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 30ab46223..2381d3270 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -450,7 +450,7 @@ int64_t _kmd_getbalance(struct iguana_info *coin,char *coinaddr,uint64_t *receiv cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) { - cJSON *retjson; double netbalance=0.,fbalance; uint64_t s,r,sent=0,received=0; int64_t balance=0; struct kmd_addresshh *addr,*tmp; char address[64]; + cJSON *retjson; double netbalance=0.,fbalance; uint64_t s,r,sent=0,received=0; int64_t balance=0; struct kmd_addresshh *addr,*tmp; char address[64]; int32_t height = coin->kmd_height+1; retjson = cJSON_CreateObject(); fbalance = 0.; if ( strcmp(coinaddr,"*") == 0 ) @@ -460,14 +460,14 @@ cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) bitcoin_address(address,addr->type_rmd160[0],&addr->type_rmd160[1],20); s = r = 0; balance += _kmd_getbalance(coin,address,&r,&s,&fbalance); + netbalance += fbalance; if ( (r - s) > 1000000*SATOSHIDEN ) printf("{\"address\":\"%s\",\"received\":%.8f,\"sent\":%.8f,\"balance\":%.8f,\"supply\":%.8f}\n",address,dstr(r),dstr(s),dstr(r)-dstr(s),dstr(balance)); received += r; sent += s; - netbalance += fbalance; } if ( strcmp("KMD",coin->symbol) == 0 ) - jaddnum(retjson,"interestpaid",dstr(balance) - 100000000*SATOSHIDEN - (coin->kmd_height*3)); + jaddnum(retjson,"interestpaid",dstr(balance) - 100000000 - (height*3)); } else balance = _kmd_getbalance(coin,coinaddr,&received,&sent,&netbalance); jaddstr(retjson,"result","success"); jaddnum(retjson,"received",dstr(received)); @@ -475,9 +475,9 @@ cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) if ( fabs(netbalance*SATOSHIDEN - balance) > 1 ) jaddnum(retjson,"balance",netbalance); else jaddnum(retjson,"balance",dstr(balance)); - jaddnum(retjson,"height",coin->kmd_height); + jaddnum(retjson,"height",height); if ( strcmp("KMD",coin->symbol) == 0 ) - jaddnum(retjson,"mined",coin->kmd_height*3); + jaddnum(retjson,"mined",height*3); return(retjson); } From 9c000063d2f98304292ea6c594ab2e692f126291 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 21:22:57 +0200 Subject: [PATCH 091/495] test --- iguana/kmd_lookup.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 2381d3270..9a33bdab9 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -461,8 +461,8 @@ cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) s = r = 0; balance += _kmd_getbalance(coin,address,&r,&s,&fbalance); netbalance += fbalance; - if ( (r - s) > 1000000*SATOSHIDEN ) - printf("{\"address\":\"%s\",\"received\":%.8f,\"sent\":%.8f,\"balance\":%.8f,\"supply\":%.8f}\n",address,dstr(r),dstr(s),dstr(r)-dstr(s),dstr(balance)); + if ( (r - s) > 100000*SATOSHIDEN ) + printf("{\"address\":\"%s\",\"received\":%.8f,\"sent\":%.8f,\"balance\":%.8f,\"supply\":%.8f,\"supplyf\":%.8f}\n",address,dstr(r),dstr(s),dstr(r)-dstr(s),dstr(balance),netbalance); received += r; sent += s; } From 885fb379abba8a4e9f9e1d648ebacd6b0b4caab4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 21:26:23 +0200 Subject: [PATCH 092/495] test --- iguana/kmd_lookup.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 9a33bdab9..72c1c39a4 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -472,9 +472,10 @@ cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) jaddstr(retjson,"result","success"); jaddnum(retjson,"received",dstr(received)); jaddnum(retjson,"sent",dstr(sent)); - if ( fabs(netbalance*SATOSHIDEN - balance) > 1 ) - jaddnum(retjson,"balance",netbalance); - else jaddnum(retjson,"balance",dstr(balance)); + //if ( fabs(netbalance*SATOSHIDEN - balance) > 1 ) + jaddnum(retjson,"balancef",netbalance); + //else + jaddnum(retjson,"balance",dstr(balance)); jaddnum(retjson,"height",height); if ( strcmp("KMD",coin->symbol) == 0 ) jaddnum(retjson,"mined",height*3); From 2a79336152aae583fcfca0cbc857c611fd9d87bc Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 21:32:27 +0200 Subject: [PATCH 093/495] test --- iguana/kmd_lookup.h | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 72c1c39a4..94e00f024 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -422,7 +422,7 @@ cJSON *kmd_listspent(struct iguana_info *coin,char *coinaddr) return(kmd_listaddress(coin,coinaddr,1)); } -int64_t _kmd_getbalance(struct iguana_info *coin,char *coinaddr,uint64_t *receivedp,uint64_t *sentp,double *fbalancep) +int64_t _kmd_getbalance(struct iguana_info *coin,char *coinaddr,uint64_t *receivedp,uint64_t *sentp) { int32_t iter,i,n; cJSON *array,*item; uint64_t value; for (iter=1; iter<=2; iter++) @@ -437,8 +437,8 @@ int64_t _kmd_getbalance(struct iguana_info *coin,char *coinaddr,uint64_t *receiv if ( (value= jdouble(item,"amount")*SATOSHIDEN) != 0 || (value= jdouble(item,"value")*SATOSHIDEN) != 0 ) { if ( iter == 2 ) - *receivedp += value, *fbalancep += dstr(value); - else *sentp += value, *fbalancep -= dstr(value); + *receivedp += value; + else *sentp += value; } } } @@ -459,16 +459,22 @@ cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) { bitcoin_address(address,addr->type_rmd160[0],&addr->type_rmd160[1],20); s = r = 0; - balance += _kmd_getbalance(coin,address,&r,&s,&fbalance); - netbalance += fbalance; + balance += _kmd_getbalance(coin,address,&r,&s); + netbalance += dstr(r); + netbalance -= dstr(s); if ( (r - s) > 100000*SATOSHIDEN ) - printf("{\"address\":\"%s\",\"received\":%.8f,\"sent\":%.8f,\"balance\":%.8f,\"supply\":%.8f,\"supplyf\":%.8f}\n",address,dstr(r),dstr(s),dstr(r)-dstr(s),dstr(balance),netbalance); + printf("{\"address\":\"%s\",\"received\":%.8f,\"sent\":%.8f,\"balance\":%.8f,\"supply\":%.8f,\"supplyf\":%.8f}\n",address,dstr(r),dstr(s),dstr(r)-dstr(s),dstr(balance),netbalance+0.5); received += r; sent += s; } if ( strcmp("KMD",coin->symbol) == 0 ) jaddnum(retjson,"interestpaid",dstr(balance) - 100000000 - (height*3)); - } else balance = _kmd_getbalance(coin,coinaddr,&received,&sent,&netbalance); + } + else + { + balance = _kmd_getbalance(coin,coinaddr,&received,&sent); + netbalance = dstr(balance); + } jaddstr(retjson,"result","success"); jaddnum(retjson,"received",dstr(received)); jaddnum(retjson,"sent",dstr(sent)); From 26571d60602f8c4ae44361f3bbc3e3e0219cd975 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 21:35:13 +0200 Subject: [PATCH 094/495] test --- iguana/kmd_lookup.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 94e00f024..b24aabbdb 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -183,7 +183,7 @@ void kmd_flushfiles(struct iguana_info *coin) FILE *kmd_txidinit(struct iguana_info *coin) { - int32_t i; FILE *fp; char fname[1024],str[65]; struct kmd_transactionhh *ptr; struct kmd_transaction T,*tx; struct kmd_voutinfo V; long lastpos=0; + int32_t i; FILE *fp; char fname[1024]; struct kmd_transactionhh *ptr; struct kmd_transaction T,*tx; struct kmd_voutinfo V; long lastpos=0; sprintf(fname,"%s/TRANSACTIONS/%s",GLOBAL_DBDIR,coin->symbol); if ( (fp= fopen(fname,"rb+")) != 0 ) { @@ -191,7 +191,7 @@ FILE *kmd_txidinit(struct iguana_info *coin) { if ( (tx= kmd_transactionalloc(T.txid,T.height,T.timestamp,T.numvouts,T.numvins)) != 0 ) { - printf("INIT %s.[%d] vins.[%d] ht.%d %u\n",bits256_str(str,T.txid),T.numvouts,T.numvins,T.height,T.timestamp); + //printf("INIT %s.[%d] vins.[%d] ht.%d %u\n",bits256_str(str,T.txid),T.numvouts,T.numvins,T.height,T.timestamp); if ( (ptr= kmd_transactionadd(coin,tx,T.numvouts,T.numvins)) != 0 ) { if ( ptr != kmd_transaction(coin,tx->txid) ) @@ -463,7 +463,7 @@ cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) netbalance += dstr(r); netbalance -= dstr(s); if ( (r - s) > 100000*SATOSHIDEN ) - printf("{\"address\":\"%s\",\"received\":%.8f,\"sent\":%.8f,\"balance\":%.8f,\"supply\":%.8f,\"supplyf\":%.8f}\n",address,dstr(r),dstr(s),dstr(r)-dstr(s),dstr(balance),netbalance+0.5); + printf("{\"address\":\"%s\",\"received\":%.8f,\"sent\":%.8f,\"balance\":%.8f,\"supply\":%.8f,\"supplyf\":%.8f}\n",address,dstr(r),dstr(s),dstr(r)-dstr(s),dstr(balance),netbalance+1./(SATOSHIDEN*2)); received += r; sent += s; } From 00380e95e49473130dd47d7abe8ebd69fa986174 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 21:39:49 +0200 Subject: [PATCH 095/495] test --- iguana/kmd_lookup.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index b24aabbdb..42235058c 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -463,7 +463,7 @@ cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) netbalance += dstr(r); netbalance -= dstr(s); if ( (r - s) > 100000*SATOSHIDEN ) - printf("{\"address\":\"%s\",\"received\":%.8f,\"sent\":%.8f,\"balance\":%.8f,\"supply\":%.8f,\"supplyf\":%.8f}\n",address,dstr(r),dstr(s),dstr(r)-dstr(s),dstr(balance),netbalance+1./(SATOSHIDEN*2)); + printf("{\"address\":\"%s\",\"received\":%.8f,\"sent\":%.8f,\"balance\":%.8f,\"supply\":%.8f,\"supplyf\":%.8f}\n",address,dstr(r),dstr(s),dstr(r)-dstr(s),dstr(balance),netbalance); received += r; sent += s; } @@ -479,7 +479,7 @@ cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) jaddnum(retjson,"received",dstr(received)); jaddnum(retjson,"sent",dstr(sent)); //if ( fabs(netbalance*SATOSHIDEN - balance) > 1 ) - jaddnum(retjson,"balancef",netbalance); + jaddnum(retjson,"balancef",netbalance+1./(SATOSHIDEN*2)); //else jaddnum(retjson,"balance",dstr(balance)); jaddnum(retjson,"height",height); From e1700c58b436588e664b95a1d9d91f72b477a362 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 22:43:35 +0200 Subject: [PATCH 096/495] test --- iguana/kmd_lookup.h | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 42235058c..bf50460ae 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -106,6 +106,8 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi ptr->ptrs[(vout<<1) + 1] = spendptr; if ( bits256_cmp(ptr->tx->vouts[vout].spendtxid,spendtxid) != 0 || ptr->tx->vouts[vout].spendvini != vini ) { + if ( bits256_nonz(ptr->tx->vouts[vout].spendtxid) != 0 ) + printf("ht.%d vout.%d overwriting nonz spend\n",ptr->tx->height,vout); ptr->tx->vouts[vout].spendtxid = spendtxid; ptr->tx->vouts[vout].spendvini = vini; } @@ -400,10 +402,17 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode) if ( memcmp(ptr->tx->vouts[i].type_rmd160,type_rmd160,21) == 0 ) { spent = ptr->ptrs[(i<<1) + 1]; + if ( strcmp("RFpYbieWuKm2ZsTaKeWkrrEdeSkVzhqX8x",coinaddr) == 0 ) + printf("[%d] %s ht.%d amount %.8f spent.%p\n",coin->kmd_height,coinaddr,ptr->tx->height,dstr(ptr->tx->vouts[i].amount),spent); if ( (mode == 0 && spent == 0) || (mode == 1 && spent != 0) || mode == 2 ) jaddi(array,kmd_unspentjson(ptr->tx,i)); if ( ptr->ptrs[i<<1] != 0 ) - prev = ptr->ptrs[i<<1]; + { + if ( prev == 0 ) + prev = ptr->ptrs[i<<1]; + else if ( prev != ptr->ptrs[i<<1] ) + printf("%s ht.%d prev.%p != %p\n",coinaddr,ptr->tx->height,prev,ptr->ptrs[i<<1]); + } } } ptr = prev; @@ -479,7 +488,7 @@ cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) jaddnum(retjson,"received",dstr(received)); jaddnum(retjson,"sent",dstr(sent)); //if ( fabs(netbalance*SATOSHIDEN - balance) > 1 ) - jaddnum(retjson,"balancef",netbalance+1./(SATOSHIDEN*2)); + jaddnum(retjson,"balancef",netbalance+1./(SATOSHIDEN*2)-SMALLVAL); //else jaddnum(retjson,"balance",dstr(balance)); jaddnum(retjson,"height",height); @@ -551,7 +560,7 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) { flag = 0; if ( (loadheight % 10000) == 0 ) - printf("loading ht.%d %s\n",loadheight,jprint(kmd_getbalance(coin,"*"),1)); + printf("loading ht.%d\n",loadheight);//,jprint(kmd_getbalance(coin,"*"),1)); if ( (blockjson= kmd_blockjson(&h,coin->symbol,coin->chain->serverport,coin->chain->userpass,0,loadheight)) != 0 ) { if ( (txids= jarray(&numtxids,blockjson,"tx")) != 0 ) From 88e31c0138cb52bed8142ae1eb5e59c71bc7d064 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 22:51:30 +0200 Subject: [PATCH 097/495] test --- iguana/kmd_lookup.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index bf50460ae..9f6d2d772 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -402,7 +402,7 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode) if ( memcmp(ptr->tx->vouts[i].type_rmd160,type_rmd160,21) == 0 ) { spent = ptr->ptrs[(i<<1) + 1]; - if ( strcmp("RFpYbieWuKm2ZsTaKeWkrrEdeSkVzhqX8x",coinaddr) == 0 ) + //if ( strcmp("RFpYbieWuKm2ZsTaKeWkrrEdeSkVzhqX8x",coinaddr) == 0 ) printf("[%d] %s ht.%d amount %.8f spent.%p\n",coin->kmd_height,coinaddr,ptr->tx->height,dstr(ptr->tx->vouts[i].amount),spent); if ( (mode == 0 && spent == 0) || (mode == 1 && spent != 0) || mode == 2 ) jaddi(array,kmd_unspentjson(ptr->tx,i)); From 866b65bf73b564b03b7fa077efb3c28b9b249829 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 22:57:06 +0200 Subject: [PATCH 098/495] test --- iguana/kmd_lookup.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 9f6d2d772..c79c88885 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -402,7 +402,7 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode) if ( memcmp(ptr->tx->vouts[i].type_rmd160,type_rmd160,21) == 0 ) { spent = ptr->ptrs[(i<<1) + 1]; - //if ( strcmp("RFpYbieWuKm2ZsTaKeWkrrEdeSkVzhqX8x",coinaddr) == 0 ) + if ( strcmp("RFpYbieWuKm2ZsTaKeWkrrEdeSkVzhqX8x",coinaddr) == 0 ) printf("[%d] %s ht.%d amount %.8f spent.%p\n",coin->kmd_height,coinaddr,ptr->tx->height,dstr(ptr->tx->vouts[i].amount),spent); if ( (mode == 0 && spent == 0) || (mode == 1 && spent != 0) || mode == 2 ) jaddi(array,kmd_unspentjson(ptr->tx,i)); @@ -471,7 +471,7 @@ cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) balance += _kmd_getbalance(coin,address,&r,&s); netbalance += dstr(r); netbalance -= dstr(s); - if ( (r - s) > 100000*SATOSHIDEN ) + if ( 1 || (r - s) > 100000*SATOSHIDEN ) printf("{\"address\":\"%s\",\"received\":%.8f,\"sent\":%.8f,\"balance\":%.8f,\"supply\":%.8f,\"supplyf\":%.8f}\n",address,dstr(r),dstr(s),dstr(r)-dstr(s),dstr(balance),netbalance); received += r; sent += s; From 8112019c369ac4b45daad9fafdf26cd3c0b33cb3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Feb 2017 05:45:50 +0200 Subject: [PATCH 099/495] test --- iguana/kmd_lookup.h | 6 +++++- iguana/tests/dexlistunspent | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index c79c88885..a381fe047 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -108,6 +108,10 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi { if ( bits256_nonz(ptr->tx->vouts[vout].spendtxid) != 0 ) printf("ht.%d vout.%d overwriting nonz spend\n",ptr->tx->height,vout); + uint8_t type_rmd160[21]; char str[65]; + bitcoin_addr2rmd160(&type_rmd160[0],&type_rmd160[1],"RR5yAkzaxJeCVTwvpgCGsNcSPAZjeq3av4"); + if ( memcmp(type_rmd160,ptr->tx->vouts[vout].type_rmd160,21) == 0 ) + printf("RR5yAkzaxJeCVTwvpgCGsNcSPAZjeq3av4 spend %.8f by %s/%d\n",dstr(ptr->tx->vouts[vout].amount),bits256_str(str,spendtxid),vini); ptr->tx->vouts[vout].spendtxid = spendtxid; ptr->tx->vouts[vout].spendvini = vini; } @@ -471,7 +475,7 @@ cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) balance += _kmd_getbalance(coin,address,&r,&s); netbalance += dstr(r); netbalance -= dstr(s); - if ( 1 || (r - s) > 100000*SATOSHIDEN ) + if ( (r - s) > 100000*SATOSHIDEN ) printf("{\"address\":\"%s\",\"received\":%.8f,\"sent\":%.8f,\"balance\":%.8f,\"supply\":%.8f,\"supplyf\":%.8f}\n",address,dstr(r),dstr(s),dstr(r)-dstr(s),dstr(balance),netbalance); received += r; sent += s; diff --git a/iguana/tests/dexlistunspent b/iguana/tests/dexlistunspent index eacff16cc..c038fe5fb 100755 --- a/iguana/tests/dexlistunspent +++ b/iguana/tests/dexlistunspent @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RU58D7nNLXwD29hgC2MPgtAF458gGxnPYS\",\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RW3gz9fEadohRLZerK9r8zXkugk5swWHrf\",\"symbol\":\"KMD\"}" From 30f8bab6c9359fc68e83c2ade10acee91654c6ee Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Feb 2017 05:53:43 +0200 Subject: [PATCH 100/495] test --- iguana/kmd_lookup.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index a381fe047..202618840 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -111,7 +111,7 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi uint8_t type_rmd160[21]; char str[65]; bitcoin_addr2rmd160(&type_rmd160[0],&type_rmd160[1],"RR5yAkzaxJeCVTwvpgCGsNcSPAZjeq3av4"); if ( memcmp(type_rmd160,ptr->tx->vouts[vout].type_rmd160,21) == 0 ) - printf("RR5yAkzaxJeCVTwvpgCGsNcSPAZjeq3av4 spend %.8f by %s/%d\n",dstr(ptr->tx->vouts[vout].amount),bits256_str(str,spendtxid),vini); + printf("RR5yAkzaxJeCVTwvpgCGsNcSPAZjeq3av4 spend %.8f by %s/%d %p\n",dstr(ptr->tx->vouts[vout].amount),bits256_str(str,spendtxid),vini,spendptr); ptr->tx->vouts[vout].spendtxid = spendtxid; ptr->tx->vouts[vout].spendvini = vini; } @@ -398,6 +398,7 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode) bitcoin_addr2rmd160(&type_rmd160[0],&type_rmd160[1],coinaddr); if ( (addr= _kmd_address(coin,type_rmd160)) != 0 && (ptr= addr->prev) != 0 && ptr->tx != 0 ) { + printf("addr->prev %p\n",ptr); while ( ptr != 0 ) { prev = 0; @@ -406,7 +407,7 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode) if ( memcmp(ptr->tx->vouts[i].type_rmd160,type_rmd160,21) == 0 ) { spent = ptr->ptrs[(i<<1) + 1]; - if ( strcmp("RFpYbieWuKm2ZsTaKeWkrrEdeSkVzhqX8x",coinaddr) == 0 ) + //if ( strcmp("RFpYbieWuKm2ZsTaKeWkrrEdeSkVzhqX8x",coinaddr) == 0 ) printf("[%d] %s ht.%d amount %.8f spent.%p\n",coin->kmd_height,coinaddr,ptr->tx->height,dstr(ptr->tx->vouts[i].amount),spent); if ( (mode == 0 && spent == 0) || (mode == 1 && spent != 0) || mode == 2 ) jaddi(array,kmd_unspentjson(ptr->tx,i)); @@ -421,7 +422,7 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode) } ptr = prev; } - } + } else printf("no valid entry for (%s)\n",coinaddr); return(array); } From 9bc168545b7e92d6bd88f0cb7c3efb676959a802 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Feb 2017 05:59:55 +0200 Subject: [PATCH 101/495] test --- iguana/kmd_lookup.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 202618840..820ada97a 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -111,7 +111,7 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi uint8_t type_rmd160[21]; char str[65]; bitcoin_addr2rmd160(&type_rmd160[0],&type_rmd160[1],"RR5yAkzaxJeCVTwvpgCGsNcSPAZjeq3av4"); if ( memcmp(type_rmd160,ptr->tx->vouts[vout].type_rmd160,21) == 0 ) - printf("RR5yAkzaxJeCVTwvpgCGsNcSPAZjeq3av4 spend %.8f by %s/%d %p\n",dstr(ptr->tx->vouts[vout].amount),bits256_str(str,spendtxid),vini,spendptr); + printf("RR5yAkzaxJeCVTwvpgCGsNcSPAZjeq3av4 %p vout.%d spend %.8f by %s/%d %p\n",ptr,vout,dstr(ptr->tx->vouts[vout].amount),bits256_str(str,spendtxid),vini,spendptr); ptr->tx->vouts[vout].spendtxid = spendtxid; ptr->tx->vouts[vout].spendvini = vini; } @@ -398,7 +398,7 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode) bitcoin_addr2rmd160(&type_rmd160[0],&type_rmd160[1],coinaddr); if ( (addr= _kmd_address(coin,type_rmd160)) != 0 && (ptr= addr->prev) != 0 && ptr->tx != 0 ) { - printf("addr->prev %p\n",ptr); + printf("addr->prev %p numvouts.%d\n",ptr,ptr->numvouts); while ( ptr != 0 ) { prev = 0; @@ -408,7 +408,7 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode) { spent = ptr->ptrs[(i<<1) + 1]; //if ( strcmp("RFpYbieWuKm2ZsTaKeWkrrEdeSkVzhqX8x",coinaddr) == 0 ) - printf("[%d] %s ht.%d amount %.8f spent.%p\n",coin->kmd_height,coinaddr,ptr->tx->height,dstr(ptr->tx->vouts[i].amount),spent); + printf("mode.%d [%d] %s ht.%d amount %.8f spent.%p\n",mode,coin->kmd_height,coinaddr,ptr->tx->height,dstr(ptr->tx->vouts[i].amount),spent); if ( (mode == 0 && spent == 0) || (mode == 1 && spent != 0) || mode == 2 ) jaddi(array,kmd_unspentjson(ptr->tx,i)); if ( ptr->ptrs[i<<1] != 0 ) From ac2013d7102a581ae04b388f47ad0edf5e853c02 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Feb 2017 06:04:30 +0200 Subject: [PATCH 102/495] test --- iguana/kmd_lookup.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 820ada97a..a88ec2b49 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -385,16 +385,16 @@ cJSON *kmd_gettxin(struct iguana_info *coin,bits256 txid,int32_t vout) cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode) { - struct kmd_addresshh *addr; struct kmd_transactionhh *ptr,*spent,*prev=0; uint8_t type_rmd160[21]; int32_t i,height; cJSON *array = cJSON_CreateArray(); - if ( time(NULL) > coin->kmd_lasttime+30 ) + struct kmd_addresshh *addr; struct kmd_transactionhh *ptr,*spent,*prev=0; uint8_t type_rmd160[21]; int32_t i; cJSON *array = cJSON_CreateArray(); + /*if ( time(NULL) > coin->kmd_lasttime+30 ) { coin->kmd_lasttime = (uint32_t)time(NULL); - if ( (height= kmd_height(coin)) > coin->kmd_height+KMD_EXPLORER_LAG ) + if ( (height= kmd_height(coin)) > coin->kmd_height+KMD_EXPLORER_LAG*2 ) { printf("height.%d > kmd_height.%d\n",height,coin->kmd_height); return(cJSON_Parse("[]")); } - } + }*/ bitcoin_addr2rmd160(&type_rmd160[0],&type_rmd160[1],coinaddr); if ( (addr= _kmd_address(coin,type_rmd160)) != 0 && (ptr= addr->prev) != 0 && ptr->tx != 0 ) { From 9dd2a5abbec6577e6de1fcdb451f9eb3de7c4b59 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Feb 2017 06:07:28 +0200 Subject: [PATCH 103/495] test --- iguana/kmd_lookup.h | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index a88ec2b49..62271fbb1 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -108,10 +108,10 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi { if ( bits256_nonz(ptr->tx->vouts[vout].spendtxid) != 0 ) printf("ht.%d vout.%d overwriting nonz spend\n",ptr->tx->height,vout); - uint8_t type_rmd160[21]; char str[65]; - bitcoin_addr2rmd160(&type_rmd160[0],&type_rmd160[1],"RR5yAkzaxJeCVTwvpgCGsNcSPAZjeq3av4"); - if ( memcmp(type_rmd160,ptr->tx->vouts[vout].type_rmd160,21) == 0 ) - printf("RR5yAkzaxJeCVTwvpgCGsNcSPAZjeq3av4 %p vout.%d spend %.8f by %s/%d %p\n",ptr,vout,dstr(ptr->tx->vouts[vout].amount),bits256_str(str,spendtxid),vini,spendptr); + //uint8_t type_rmd160[21]; char str[65]; + //bitcoin_addr2rmd160(&type_rmd160[0],&type_rmd160[1],"RR5yAkzaxJeCVTwvpgCGsNcSPAZjeq3av4"); + //if ( memcmp(type_rmd160,ptr->tx->vouts[vout].type_rmd160,21) == 0 ) + // printf("RR5yAkzaxJeCVTwvpgCGsNcSPAZjeq3av4 %p vout.%d spend %.8f by %s/%d %p\n",ptr,vout,dstr(ptr->tx->vouts[vout].amount),bits256_str(str,spendtxid),vini,spendptr); ptr->tx->vouts[vout].spendtxid = spendtxid; ptr->tx->vouts[vout].spendvini = vini; } @@ -328,8 +328,8 @@ int32_t kmd_height(struct iguana_info *coin) cJSON *kmd_listtransactions(struct iguana_info *coin,char *coinaddr,int32_t count,int32_t skip) { struct kmd_addresshh *addr; struct kmd_transactionhh *ptr,*spent,*prev=0; uint8_t type_rmd160[21]; int32_t i,height,counter=0; cJSON *array = cJSON_CreateArray(); - if ( (height= kmd_height(coin)) > coin->kmd_height+3 ) - return(cJSON_Parse("[]")); + //if ( (height= kmd_height(coin)) > coin->kmd_height+KMD_EXPLORER_LAG ) + // return(cJSON_Parse("[]")); bitcoin_addr2rmd160(&type_rmd160[0],&type_rmd160[1],coinaddr); if ( (addr= _kmd_address(coin,type_rmd160)) != 0 && (ptr= addr->prev) != 0 && ptr->tx != 0 ) { @@ -398,7 +398,6 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode) bitcoin_addr2rmd160(&type_rmd160[0],&type_rmd160[1],coinaddr); if ( (addr= _kmd_address(coin,type_rmd160)) != 0 && (ptr= addr->prev) != 0 && ptr->tx != 0 ) { - printf("addr->prev %p numvouts.%d\n",ptr,ptr->numvouts); while ( ptr != 0 ) { prev = 0; @@ -408,7 +407,7 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode) { spent = ptr->ptrs[(i<<1) + 1]; //if ( strcmp("RFpYbieWuKm2ZsTaKeWkrrEdeSkVzhqX8x",coinaddr) == 0 ) - printf("mode.%d [%d] %s ht.%d amount %.8f spent.%p\n",mode,coin->kmd_height,coinaddr,ptr->tx->height,dstr(ptr->tx->vouts[i].amount),spent); + // printf("mode.%d [%d] %s ht.%d amount %.8f spent.%p\n",mode,coin->kmd_height,coinaddr,ptr->tx->height,dstr(ptr->tx->vouts[i].amount),spent); if ( (mode == 0 && spent == 0) || (mode == 1 && spent != 0) || mode == 2 ) jaddi(array,kmd_unspentjson(ptr->tx,i)); if ( ptr->ptrs[i<<1] != 0 ) From ef3e82c86f4c94b4de996b13cef9e7472d6b5591 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Feb 2017 06:09:58 +0200 Subject: [PATCH 104/495] test --- iguana/kmd_lookup.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 62271fbb1..537a081ca 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -327,7 +327,7 @@ int32_t kmd_height(struct iguana_info *coin) cJSON *kmd_listtransactions(struct iguana_info *coin,char *coinaddr,int32_t count,int32_t skip) { - struct kmd_addresshh *addr; struct kmd_transactionhh *ptr,*spent,*prev=0; uint8_t type_rmd160[21]; int32_t i,height,counter=0; cJSON *array = cJSON_CreateArray(); + struct kmd_addresshh *addr; struct kmd_transactionhh *ptr,*spent,*prev=0; uint8_t type_rmd160[21]; int32_t i,counter=0; cJSON *array = cJSON_CreateArray(); //if ( (height= kmd_height(coin)) > coin->kmd_height+KMD_EXPLORER_LAG ) // return(cJSON_Parse("[]")); bitcoin_addr2rmd160(&type_rmd160[0],&type_rmd160[1],coinaddr); @@ -395,6 +395,8 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode) return(cJSON_Parse("[]")); } }*/ + if ( strcmp("1111111111111111111114oLvT2",coinaddr) == 0 ) // null rmd160 from coinbase + return(cJSON_Parse("[]")); bitcoin_addr2rmd160(&type_rmd160[0],&type_rmd160[1],coinaddr); if ( (addr= _kmd_address(coin,type_rmd160)) != 0 && (ptr= addr->prev) != 0 && ptr->tx != 0 ) { From 7118c627d63a50b53f5895749a6d7f582330e99c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Feb 2017 06:35:52 +0200 Subject: [PATCH 105/495] test --- iguana/tests/dexlisttransactions2 | 2 ++ 1 file changed, 2 insertions(+) create mode 100755 iguana/tests/dexlisttransactions2 diff --git a/iguana/tests/dexlisttransactions2 b/iguana/tests/dexlisttransactions2 new file mode 100755 index 000000000..ba225b1dd --- /dev/null +++ b/iguana/tests/dexlisttransactions2 @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listtransactions2\",\"address\":\"RDobQ77wnMY8Me7RAL9oiFqVNvwkqqgPRF\",\"count\":100,\"skip\":0,\"symbol\":\"KMD\"}" From c9d21926d23e69213b1033eb96a30acd6a041949 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Feb 2017 06:41:41 +0200 Subject: [PATCH 106/495] test --- iguana/kmd_lookup.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 537a081ca..2e0e0d23e 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -330,11 +330,14 @@ cJSON *kmd_listtransactions(struct iguana_info *coin,char *coinaddr,int32_t coun struct kmd_addresshh *addr; struct kmd_transactionhh *ptr,*spent,*prev=0; uint8_t type_rmd160[21]; int32_t i,counter=0; cJSON *array = cJSON_CreateArray(); //if ( (height= kmd_height(coin)) > coin->kmd_height+KMD_EXPLORER_LAG ) // return(cJSON_Parse("[]")); + if ( count == 0 ) + count = 100; bitcoin_addr2rmd160(&type_rmd160[0],&type_rmd160[1],coinaddr); if ( (addr= _kmd_address(coin,type_rmd160)) != 0 && (ptr= addr->prev) != 0 && ptr->tx != 0 ) { while ( ptr != 0 ) { + prev = 0; if ( counter >= skip && counter < count+skip ) jaddi(array,kmd_transactionjson(ptr,"received")); if ( ++counter >= count+skip ) From 98d63a579506d16f4e9cd5266f022d42f5aad73c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Feb 2017 06:59:38 +0200 Subject: [PATCH 107/495] test --- iguana/kmd_lookup.h | 86 ++++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 2e0e0d23e..1a16d0376 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -308,6 +308,18 @@ cJSON *kmd_unspentjson(struct kmd_transaction *tx,int32_t vout) return(item); } +cJSON *kmd_spentjson(struct kmd_transaction *tx,int32_t vout) +{ + cJSON *item = cJSON_CreateObject(); + jaddstr(item,"type","sent"); + jaddbits256(item,"txid",tx->txid); + jaddnum(item,"vout",vout); + jaddnum(item,"amount",dstr(tx->vouts[vout].amount)); + jaddbits256(item,"spentdtxid",tx->vouts[vout].spendtxid); + jaddnum(item,"vin",tx->vouts[vout].spendvini); + return(item); +} + int32_t kmd_height(struct iguana_info *coin) { char params[64],*curlstr; cJSON *curljson; int32_t height = 0; @@ -325,43 +337,6 @@ int32_t kmd_height(struct iguana_info *coin) return(height); } -cJSON *kmd_listtransactions(struct iguana_info *coin,char *coinaddr,int32_t count,int32_t skip) -{ - struct kmd_addresshh *addr; struct kmd_transactionhh *ptr,*spent,*prev=0; uint8_t type_rmd160[21]; int32_t i,counter=0; cJSON *array = cJSON_CreateArray(); - //if ( (height= kmd_height(coin)) > coin->kmd_height+KMD_EXPLORER_LAG ) - // return(cJSON_Parse("[]")); - if ( count == 0 ) - count = 100; - bitcoin_addr2rmd160(&type_rmd160[0],&type_rmd160[1],coinaddr); - if ( (addr= _kmd_address(coin,type_rmd160)) != 0 && (ptr= addr->prev) != 0 && ptr->tx != 0 ) - { - while ( ptr != 0 ) - { - prev = 0; - if ( counter >= skip && counter < count+skip ) - jaddi(array,kmd_transactionjson(ptr,"received")); - if ( ++counter >= count+skip ) - break; - for (i=0; inumvouts; i++) - { - if ( memcmp(ptr->tx->vouts[i].type_rmd160,type_rmd160,21) == 0 && (spent= ptr->ptrs[(i<<1)+1]) != 0 ) - { - if ( counter >= skip && counter < count+skip ) - jaddi(array,kmd_transactionjson(spent,"sent")); - if ( ++counter >= count+skip ) - break; - if ( ptr->ptrs[i << 1] != 0 ) - prev = ptr->ptrs[i << 1]; - } - } - if ( counter >= count+skip ) - break; - ptr = prev; - } - } - return(array); -} - cJSON *kmd_gettxin(struct iguana_info *coin,bits256 txid,int32_t vout) { struct kmd_transactionhh *ptr,*spendptr; struct kmd_transaction *tx; cJSON *retjson; @@ -386,9 +361,11 @@ cJSON *kmd_gettxin(struct iguana_info *coin,bits256 txid,int32_t vout) return(cJSON_Parse("{\"error\":\"txid not found\"}")); } -cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode) +cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode,cJSON *array) { - struct kmd_addresshh *addr; struct kmd_transactionhh *ptr,*spent,*prev=0; uint8_t type_rmd160[21]; int32_t i; cJSON *array = cJSON_CreateArray(); + struct kmd_addresshh *addr; struct kmd_transactionhh *ptr,*spent,*prev=0; uint8_t type_rmd160[21]; int32_t i; + if ( array == 0 ) + array = cJSON_CreateArray(); /*if ( time(NULL) > coin->kmd_lasttime+30 ) { coin->kmd_lasttime = (uint32_t)time(NULL); @@ -414,7 +391,18 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode) //if ( strcmp("RFpYbieWuKm2ZsTaKeWkrrEdeSkVzhqX8x",coinaddr) == 0 ) // printf("mode.%d [%d] %s ht.%d amount %.8f spent.%p\n",mode,coin->kmd_height,coinaddr,ptr->tx->height,dstr(ptr->tx->vouts[i].amount),spent); if ( (mode == 0 && spent == 0) || (mode == 1 && spent != 0) || mode == 2 ) - jaddi(array,kmd_unspentjson(ptr->tx,i)); + { + if ( mode == 0 ) + jaddi(array,kmd_unspentjson(ptr->tx,i)); + else if ( mode == 1 ) + jaddi(array,kmd_spentjson(ptr->tx,i)); + else if ( mode == 2 ) + { + if ( spent != 0 ) + jaddi(array,kmd_spentjson(ptr->tx,i)); + else jaddi(array,kmd_unspentjson(ptr->tx,i)); + } + } if ( ptr->ptrs[i<<1] != 0 ) { if ( prev == 0 ) @@ -432,12 +420,24 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode) cJSON *kmd_listunspent(struct iguana_info *coin,char *coinaddr) { - return(kmd_listaddress(coin,coinaddr,0)); + return(kmd_listaddress(coin,coinaddr,0,0)); } cJSON *kmd_listspent(struct iguana_info *coin,char *coinaddr) { - return(kmd_listaddress(coin,coinaddr,1)); + return(kmd_listaddress(coin,coinaddr,1,0)); +} + +cJSON *kmd_listtransactions(struct iguana_info *coin,char *coinaddr,int32_t count,int32_t skip) +{ + cJSON *array = cJSON_CreateArray(); + //if ( (height= kmd_height(coin)) > coin->kmd_height+KMD_EXPLORER_LAG ) + // return(cJSON_Parse("[]")); + if ( count == 0 ) + count = 100; + array = kmd_listaddress(coin,coinaddr,2,0); + array = kmd_listaddress(coin,coinaddr,1,array); + return(array); } int64_t _kmd_getbalance(struct iguana_info *coin,char *coinaddr,uint64_t *receivedp,uint64_t *sentp) @@ -445,7 +445,7 @@ int64_t _kmd_getbalance(struct iguana_info *coin,char *coinaddr,uint64_t *receiv int32_t iter,i,n; cJSON *array,*item; uint64_t value; for (iter=1; iter<=2; iter++) { - if ( (array= kmd_listaddress(coin,coinaddr,iter)) != 0 ) + if ( (array= kmd_listaddress(coin,coinaddr,iter,0)) != 0 ) { if ( (n= cJSON_GetArraySize(array)) > 0 ) { From c4915b095406c5dac942f507c08d92f5e8ad062e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Feb 2017 07:06:54 +0200 Subject: [PATCH 108/495] test --- iguana/kmd_lookup.h | 45 +++++++++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 1a16d0376..e5b00b676 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -361,9 +361,9 @@ cJSON *kmd_gettxin(struct iguana_info *coin,bits256 txid,int32_t vout) return(cJSON_Parse("{\"error\":\"txid not found\"}")); } -cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode,cJSON *array) +cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode,cJSON *array,int32_t fulltx) { - struct kmd_addresshh *addr; struct kmd_transactionhh *ptr,*spent,*prev=0; uint8_t type_rmd160[21]; int32_t i; + struct kmd_addresshh *addr; struct kmd_transactionhh *ptr,*spent,*prev=0; uint8_t type_rmd160[21]; int32_t i,flag = 0; if ( array == 0 ) array = cJSON_CreateArray(); /*if ( time(NULL) > coin->kmd_lasttime+30 ) @@ -392,15 +392,32 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode,cJSO // printf("mode.%d [%d] %s ht.%d amount %.8f spent.%p\n",mode,coin->kmd_height,coinaddr,ptr->tx->height,dstr(ptr->tx->vouts[i].amount),spent); if ( (mode == 0 && spent == 0) || (mode == 1 && spent != 0) || mode == 2 ) { - if ( mode == 0 ) - jaddi(array,kmd_unspentjson(ptr->tx,i)); - else if ( mode == 1 ) - jaddi(array,kmd_spentjson(ptr->tx,i)); - else if ( mode == 2 ) + if ( fulltx == 0 ) { - if ( spent != 0 ) + if ( mode == 0 ) + jaddi(array,kmd_unspentjson(ptr->tx,i)); + else if ( mode == 1 ) jaddi(array,kmd_spentjson(ptr->tx,i)); - else jaddi(array,kmd_unspentjson(ptr->tx,i)); + else if ( mode == 2 ) + { + if ( spent != 0 ) + jaddi(array,kmd_spentjson(ptr->tx,i)); + else jaddi(array,kmd_unspentjson(ptr->tx,i)); + } + } + else if ( flag == 0 ) + { + if ( mode == 0 ) + jaddi(array,kmd_transactionjson(ptr,"received")); + else if ( mode == 1 ) + jaddi(array,kmd_transactionjson(ptr,"sent")); + else if ( mode == 2 ) + { + jaddi(array,kmd_transactionjson(ptr,"received")); + if ( spent != 0 ) + jaddi(array,kmd_transactionjson(ptr,"sent")); + } + flag = 1; } } if ( ptr->ptrs[i<<1] != 0 ) @@ -420,12 +437,12 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode,cJSO cJSON *kmd_listunspent(struct iguana_info *coin,char *coinaddr) { - return(kmd_listaddress(coin,coinaddr,0,0)); + return(kmd_listaddress(coin,coinaddr,0,0,0)); } cJSON *kmd_listspent(struct iguana_info *coin,char *coinaddr) { - return(kmd_listaddress(coin,coinaddr,1,0)); + return(kmd_listaddress(coin,coinaddr,1,0,0)); } cJSON *kmd_listtransactions(struct iguana_info *coin,char *coinaddr,int32_t count,int32_t skip) @@ -435,8 +452,8 @@ cJSON *kmd_listtransactions(struct iguana_info *coin,char *coinaddr,int32_t coun // return(cJSON_Parse("[]")); if ( count == 0 ) count = 100; - array = kmd_listaddress(coin,coinaddr,2,0); - array = kmd_listaddress(coin,coinaddr,1,array); + array = kmd_listaddress(coin,coinaddr,2,0,1); + array = kmd_listaddress(coin,coinaddr,1,array,1); return(array); } @@ -445,7 +462,7 @@ int64_t _kmd_getbalance(struct iguana_info *coin,char *coinaddr,uint64_t *receiv int32_t iter,i,n; cJSON *array,*item; uint64_t value; for (iter=1; iter<=2; iter++) { - if ( (array= kmd_listaddress(coin,coinaddr,iter,0)) != 0 ) + if ( (array= kmd_listaddress(coin,coinaddr,iter,0,0)) != 0 ) { if ( (n= cJSON_GetArraySize(array)) > 0 ) { From e488a85c8db6e17d09f83b772a767ac6f6f4ea67 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Feb 2017 07:09:11 +0200 Subject: [PATCH 109/495] test --- iguana/kmd_lookup.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index e5b00b676..031ba6bcd 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -400,9 +400,9 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode,cJSO jaddi(array,kmd_spentjson(ptr->tx,i)); else if ( mode == 2 ) { + jaddi(array,kmd_unspentjson(ptr->tx,i)); if ( spent != 0 ) jaddi(array,kmd_spentjson(ptr->tx,i)); - else jaddi(array,kmd_unspentjson(ptr->tx,i)); } } else if ( flag == 0 ) @@ -410,12 +410,12 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode,cJSO if ( mode == 0 ) jaddi(array,kmd_transactionjson(ptr,"received")); else if ( mode == 1 ) - jaddi(array,kmd_transactionjson(ptr,"sent")); + jaddi(array,kmd_transactionjson(spent,"sent")); else if ( mode == 2 ) { jaddi(array,kmd_transactionjson(ptr,"received")); if ( spent != 0 ) - jaddi(array,kmd_transactionjson(ptr,"sent")); + jaddi(array,kmd_transactionjson(spent,"sent")); } flag = 1; } From ab4bf7b94be46779544e2bc989725ddcb70e8e6f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Feb 2017 07:12:56 +0200 Subject: [PATCH 110/495] test --- iguana/kmd_lookup.h | 1 - 1 file changed, 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 031ba6bcd..79689054c 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -453,7 +453,6 @@ cJSON *kmd_listtransactions(struct iguana_info *coin,char *coinaddr,int32_t coun if ( count == 0 ) count = 100; array = kmd_listaddress(coin,coinaddr,2,0,1); - array = kmd_listaddress(coin,coinaddr,1,array,1); return(array); } From 2a751036cc71e75aa2d9864784424fc39e72defb Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Feb 2017 07:14:40 +0200 Subject: [PATCH 111/495] test --- iguana/kmd_lookup.h | 2 +- iguana/tests/dexlistunspent2 | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100755 iguana/tests/dexlistunspent2 diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 79689054c..4d4c99e33 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -400,9 +400,9 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode,cJSO jaddi(array,kmd_spentjson(ptr->tx,i)); else if ( mode == 2 ) { - jaddi(array,kmd_unspentjson(ptr->tx,i)); if ( spent != 0 ) jaddi(array,kmd_spentjson(ptr->tx,i)); + else jaddi(array,kmd_unspentjson(ptr->tx,i)); } } else if ( flag == 0 ) diff --git a/iguana/tests/dexlistunspent2 b/iguana/tests/dexlistunspent2 new file mode 100755 index 000000000..721db4bf8 --- /dev/null +++ b/iguana/tests/dexlistunspent2 @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent2\",\"address\":\"RW3gz9fEadohRLZerK9r8zXkugk5swWHrf\",\"symbol\":\"KMD\"}" From be7a8124d25dd78c5b7442edf01df284f7aa8cc9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Feb 2017 07:24:18 +0200 Subject: [PATCH 112/495] test --- iguana/kmd_lookup.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 4d4c99e33..2dbd491fe 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -410,7 +410,7 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode,cJSO if ( mode == 0 ) jaddi(array,kmd_transactionjson(ptr,"received")); else if ( mode == 1 ) - jaddi(array,kmd_transactionjson(spent,"sent")); + jaddi(array,kmd_transactionjson(ptr,"sent")); else if ( mode == 2 ) { jaddi(array,kmd_transactionjson(ptr,"received")); From 065d55d5e2a9e21a75daad484c26fcac5662befa Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Feb 2017 07:37:18 +0200 Subject: [PATCH 113/495] test --- iguana/kmd_lookup.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 2dbd491fe..3c72fc0ae 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -414,8 +414,8 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode,cJSO else if ( mode == 2 ) { jaddi(array,kmd_transactionjson(ptr,"received")); - if ( spent != 0 ) - jaddi(array,kmd_transactionjson(spent,"sent")); + //if ( spent != 0 ) + // jaddi(array,kmd_transactionjson(spent,"sent")); } flag = 1; } @@ -453,6 +453,7 @@ cJSON *kmd_listtransactions(struct iguana_info *coin,char *coinaddr,int32_t coun if ( count == 0 ) count = 100; array = kmd_listaddress(coin,coinaddr,2,0,1); + array = kmd_listaddress(coin,coinaddr,1,array,1); return(array); } From c8e47611465a1264f959bde77d1075291264028f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Feb 2017 07:38:13 +0200 Subject: [PATCH 114/495] test --- iguana/kmd_lookup.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 3c72fc0ae..593775d1b 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -410,7 +410,7 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode,cJSO if ( mode == 0 ) jaddi(array,kmd_transactionjson(ptr,"received")); else if ( mode == 1 ) - jaddi(array,kmd_transactionjson(ptr,"sent")); + jaddi(array,kmd_transactionjson(spent,"sent")); else if ( mode == 2 ) { jaddi(array,kmd_transactionjson(ptr,"received")); From 26653d2f471fb86da55604a61bd98389737e9f1d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Feb 2017 07:39:42 +0200 Subject: [PATCH 115/495] test --- iguana/kmd_lookup.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 593775d1b..22a6bb7ec 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -410,12 +410,12 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode,cJSO if ( mode == 0 ) jaddi(array,kmd_transactionjson(ptr,"received")); else if ( mode == 1 ) - jaddi(array,kmd_transactionjson(spent,"sent")); + jaddi(array,kmd_transactionjson(ptr,"sent")); else if ( mode == 2 ) { jaddi(array,kmd_transactionjson(ptr,"received")); //if ( spent != 0 ) - // jaddi(array,kmd_transactionjson(spent,"sent")); + jaddi(array,kmd_transactionjson(spent,"sent")); } flag = 1; } From a31acc34c886061b0c25a3b4a21384eed604063c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Feb 2017 07:40:02 +0200 Subject: [PATCH 116/495] test --- iguana/kmd_lookup.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 22a6bb7ec..dd495539a 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -414,8 +414,8 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode,cJSO else if ( mode == 2 ) { jaddi(array,kmd_transactionjson(ptr,"received")); - //if ( spent != 0 ) - jaddi(array,kmd_transactionjson(spent,"sent")); + if ( spent != 0 ) + jaddi(array,kmd_transactionjson(spent,"sent")); } flag = 1; } From c49024d131d60c7a4f0c1bd92c401c854493d3f3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Feb 2017 07:45:14 +0200 Subject: [PATCH 117/495] test --- iguana/kmd_lookup.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index dd495539a..2f2b91c5b 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -124,7 +124,12 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi void kmd_transactionvout(struct iguana_info *coin,struct kmd_transactionhh *ptr,int32_t vout,uint64_t amount,uint8_t type_rmd160[21],bits256 spendtxid,int32_t spendvini) { struct kmd_addresshh *addr; struct kmd_transaction *tx = 0; - //printf("ht.%d VOUT %d %.8f\n",ptr->tx->height,vout,dstr(amount)); + { + char coinaddr[64],str[65]; + bitcoin_address(coinaddr,type_rmd160[0],&type_rmd160[1],20); + if ( strcmp(coinaddr,"") == 0 ) + printf("%s ht.%d %s VOUT %d %.8f\n",coinaddr,ptr->tx->height,bits256_str(str,ptr->tx->txid),vout,dstr(amount)); + } if ( vout < ptr->numvouts && (tx= ptr->tx) != 0 ) { tx->vouts[vout].spendtxid = spendtxid; From 79f58fced17380674f895c77ce78d289613d3a86 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Feb 2017 08:06:13 +0200 Subject: [PATCH 118/495] test --- iguana/kmd_lookup.h | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 2f2b91c5b..387fbe07f 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -127,7 +127,7 @@ void kmd_transactionvout(struct iguana_info *coin,struct kmd_transactionhh *ptr, { char coinaddr[64],str[65]; bitcoin_address(coinaddr,type_rmd160[0],&type_rmd160[1],20); - if ( strcmp(coinaddr,"") == 0 ) + if ( strcmp(coinaddr,"RCsKEQ3r5Xxw4ZtK4CH9VzvfGpTFMdPpsh") == 0 ) printf("%s ht.%d %s VOUT %d %.8f\n",coinaddr,ptr->tx->height,bits256_str(str,ptr->tx->txid),vout,dstr(amount)); } if ( vout < ptr->numvouts && (tx= ptr->tx) != 0 ) @@ -415,12 +415,15 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode,cJSO if ( mode == 0 ) jaddi(array,kmd_transactionjson(ptr,"received")); else if ( mode == 1 ) - jaddi(array,kmd_transactionjson(ptr,"sent")); - else if ( mode == 2 ) { jaddi(array,kmd_transactionjson(ptr,"received")); + jaddi(array,kmd_transactionjson(spent,"sent")); + } + else if ( mode == 2 ) + { if ( spent != 0 ) - jaddi(array,kmd_transactionjson(spent,"sent")); + jaddi(array,kmd_transactionjson(ptr,"spent")); + else jaddi(array,kmd_transactionjson(ptr,"received")); } flag = 1; } From 60ffb1fb14de1f28a8922c340bb06438a9a25ebe Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Feb 2017 08:10:53 +0200 Subject: [PATCH 119/495] test --- iguana/kmd_lookup.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 387fbe07f..ab0e3a8d5 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -460,8 +460,8 @@ cJSON *kmd_listtransactions(struct iguana_info *coin,char *coinaddr,int32_t coun // return(cJSON_Parse("[]")); if ( count == 0 ) count = 100; - array = kmd_listaddress(coin,coinaddr,2,0,1); - array = kmd_listaddress(coin,coinaddr,1,array,1); + array = kmd_listaddress(coin,coinaddr,0,0,0); + array = kmd_listaddress(coin,coinaddr,1,array,0); return(array); } From e91280d2d3690a6321402e223af6fd3841587360 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Feb 2017 08:15:49 +0200 Subject: [PATCH 120/495] test --- iguana/kmd_lookup.h | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index ab0e3a8d5..c325d84b9 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -313,7 +313,7 @@ cJSON *kmd_unspentjson(struct kmd_transaction *tx,int32_t vout) return(item); } -cJSON *kmd_spentjson(struct kmd_transaction *tx,int32_t vout) +cJSON *kmd_spentjson(struct kmd_transaction *tx,int32_t vout,struct kmd_transactionhh *spent) { cJSON *item = cJSON_CreateObject(); jaddstr(item,"type","sent"); @@ -322,6 +322,10 @@ cJSON *kmd_spentjson(struct kmd_transaction *tx,int32_t vout) jaddnum(item,"amount",dstr(tx->vouts[vout].amount)); jaddbits256(item,"spentdtxid",tx->vouts[vout].spendtxid); jaddnum(item,"vin",tx->vouts[vout].spendvini); + if ( spent != 0 ) + { + jadd(item,"paid",kmd_transactionjson(spent,"paid")); + } return(item); } @@ -402,11 +406,11 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode,cJSO if ( mode == 0 ) jaddi(array,kmd_unspentjson(ptr->tx,i)); else if ( mode == 1 ) - jaddi(array,kmd_spentjson(ptr->tx,i)); + jaddi(array,kmd_spentjson(ptr->tx,i,spent)); else if ( mode == 2 ) { if ( spent != 0 ) - jaddi(array,kmd_spentjson(ptr->tx,i)); + jaddi(array,kmd_spentjson(ptr->tx,i,spent)); else jaddi(array,kmd_unspentjson(ptr->tx,i)); } } From 66e31258095544394c37ddbe60430635e1170a11 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Feb 2017 08:20:58 +0200 Subject: [PATCH 121/495] test --- iguana/kmd_lookup.h | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index c325d84b9..28b2af098 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -307,6 +307,7 @@ cJSON *kmd_transactionjson(struct kmd_transactionhh *ptr,char *typestr) cJSON *kmd_unspentjson(struct kmd_transaction *tx,int32_t vout) { cJSON *item = cJSON_CreateObject(); + jaddstr(item,"type","received"); jaddbits256(item,"txid",tx->txid); jaddnum(item,"vout",vout); jaddnum(item,"amount",dstr(tx->vouts[vout].amount)); From f83d9417efa579357805eafc867cce77f59ddf36 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Feb 2017 08:23:37 +0200 Subject: [PATCH 122/495] test --- iguana/kmd_lookup.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 28b2af098..45ca2914e 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -308,6 +308,8 @@ cJSON *kmd_unspentjson(struct kmd_transaction *tx,int32_t vout) { cJSON *item = cJSON_CreateObject(); jaddstr(item,"type","received"); + jaddnum(item,"height",tx->height); + jaddnum(item,"timestamp",tx->timestamp); jaddbits256(item,"txid",tx->txid); jaddnum(item,"vout",vout); jaddnum(item,"amount",dstr(tx->vouts[vout].amount)); From 24a5e172b5ac888349f93d6327d6c166252edb60 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Feb 2017 08:26:25 +0200 Subject: [PATCH 123/495] test --- iguana/kmd_lookup.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 45ca2914e..1e1024127 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -320,10 +320,12 @@ cJSON *kmd_spentjson(struct kmd_transaction *tx,int32_t vout,struct kmd_transact { cJSON *item = cJSON_CreateObject(); jaddstr(item,"type","sent"); + jaddnum(item,"height",tx->height); + jaddnum(item,"timestamp",tx->timestamp); jaddbits256(item,"txid",tx->txid); jaddnum(item,"vout",vout); jaddnum(item,"amount",dstr(tx->vouts[vout].amount)); - jaddbits256(item,"spentdtxid",tx->vouts[vout].spendtxid); + jaddbits256(item,"spendtxid",tx->vouts[vout].spendtxid); jaddnum(item,"vin",tx->vouts[vout].spendvini); if ( spent != 0 ) { From be3b87f65732fbdd8d86ec81f18616c8f4dfc324 Mon Sep 17 00:00:00 2001 From: fadedreamz Date: Sun, 12 Feb 2017 01:49:20 -0500 Subject: [PATCH 124/495] memory allocation failure temporary fix, with a small memory leask for unmapping the mapped file, updated vs build file Signed-off-by: fadedreamz --- crypto777/OS_portable.h | 4 ++++ crypto777/iguana_OS.c | 4 ++++ iguana.vcxproj | 8 ++++---- iguana/iguana_ramchain.c | 3 --- includes/iguana_defines.h | 3 ++- 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/crypto777/OS_portable.h b/crypto777/OS_portable.h index d1baed4e0..540abd5e1 100755 --- a/crypto777/OS_portable.h +++ b/crypto777/OS_portable.h @@ -365,8 +365,12 @@ void escape_code(char *escaped,char *str); void SaM_PrepareIndices(); // iguana_serdes.c +#ifndef IGUANA_LOG2PACKETSIZE #define IGUANA_LOG2PACKETSIZE 22 +#endif +#ifndef IGUANA_MAXPACKETSIZE #define IGUANA_MAXPACKETSIZE (1 << IGUANA_LOG2PACKETSIZE) +#endif struct iguana_msghdr { uint8_t netmagic[4]; char command[12]; uint8_t serdatalen[4],hash[4]; } PACKED; int32_t iguana_rwnum(int32_t rwflag,uint8_t *serialized,int32_t len,void *endianedp); diff --git a/crypto777/iguana_OS.c b/crypto777/iguana_OS.c index 5363f2135..cbc4e0c87 100755 --- a/crypto777/iguana_OS.c +++ b/crypto777/iguana_OS.c @@ -658,7 +658,11 @@ int64_t OS_copyfile(char *src,char *dest,int32_t cmpflag) { if ( (destfp= fopen(OS_compatible_path(dest),"wb")) != 0 ) { +#ifdef WIN32 + allocsize = 1024 * 1024 * 8L; +#else allocsize = 1024 * 1024 * 128L; +#endif buf = mycalloc('F',1,allocsize); while ( (len= fread(buf,1,allocsize,srcfp)) > 0 ) if ( (long)fwrite(buf,1,len,destfp) != len ) diff --git a/iguana.vcxproj b/iguana.vcxproj index 290de16b1..e7a0d7a57 100644 --- a/iguana.vcxproj +++ b/iguana.vcxproj @@ -90,7 +90,7 @@ Level2 Disabled - _CRT_SECURE_NO_WARNINGS;NATIVE_WINDOWS;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;NATIVE_WINDOWS;WIN32;_DEBUG;_CONSOLE;IGUANA_LOG2PACKETSIZE=20;IGUANA_MAXPACKETSIZE=1572864;%(PreprocessorDefinitions) 1Byte .\iguana;%(AdditionalIncludeDirectories) @@ -107,7 +107,7 @@ Level3 Disabled - _DEBUG;_CONSOLE;NATIVE_WINDOWS;WIN32;%(PreprocessorDefinitions) + _DEBUG;_CONSOLE;NATIVE_WINDOWS;WIN32;IGUANA_LOG2PACKETSIZE=20;IGUANA_MAXPACKETSIZE=1572864;%(PreprocessorDefinitions) 1Byte @@ -125,7 +125,7 @@ MaxSpeed true true - _CRT_SECURE_NO_WARNINGS;NATIVE_WINDOWS;WIN32;_CONSOLE;NDEBUG;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;NATIVE_WINDOWS;WIN32;_CONSOLE;NDEBUG;IGUANA_LOG2PACKETSIZE=20;IGUANA_MAXPACKETSIZE=1572864;%(PreprocessorDefinitions) 1Byte @@ -145,7 +145,7 @@ MaxSpeed true true - WIN64;_WIN64;_CRT_SECURE_NO_WARNINGS;NATIVE_WINDOWS;WIN32;_CONSOLE;NDEBUG;%(PreprocessorDefinitions) + WIN64;_WIN64;_CRT_SECURE_NO_WARNINGS;NATIVE_WINDOWS;WIN32;_CONSOLE;NDEBUG;IGUANA_LOG2PACKETSIZE=20;IGUANA_MAXPACKETSIZE=1572864;%(PreprocessorDefinitions) 1Byte MultiThreaded diff --git a/iguana/iguana_ramchain.c b/iguana/iguana_ramchain.c index 7ed8867fc..6f02973c3 100755 --- a/iguana/iguana_ramchain.c +++ b/iguana/iguana_ramchain.c @@ -2188,9 +2188,6 @@ void iguana_bundlemapfree(struct iguana_info *coin,struct OS_memspace *mem,struc { for (j=starti; j<=endi; j++) { - //printf("R[%d]\n",j); - R[j].fileptr = 0; - R[j].filesize = 0; iguana_ramchain_free(coin,&R[j],1); } myfree(R,n * sizeof(*R)); diff --git a/includes/iguana_defines.h b/includes/iguana_defines.h index 333c517fb..ba7e106cb 100755 --- a/includes/iguana_defines.h +++ b/includes/iguana_defines.h @@ -62,8 +62,9 @@ #define IGUANA_LOG2MAXPEERS 11 // cant exceed 13 bits as ramchain unspents has bitfield #define IGUANA_MAXPEERS (1 << IGUANA_LOG2MAXPEERS) +#ifndef IGUANA_MAXPACKETSIZE #define IGUANA_MAXPACKETSIZE (1 << IGUANA_LOG2PACKETSIZE) - +#endif //#define IGUANA_MAXFILEITEMS 8192 #define IGUANA_RECENTPEER (3600 * 24 * 7) From 9939a59cc2e668d8f0f8c36d5069c8ceb91b96f9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Feb 2017 13:30:43 +0200 Subject: [PATCH 125/495] test --- iguana/kmd_lookup.h | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 1e1024127..461e3980a 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -285,7 +285,7 @@ FILE *kmd_spendinit(struct iguana_info *coin) return(fp); } -cJSON *kmd_transactionjson(struct kmd_transactionhh *ptr,char *typestr) +cJSON *kmd_transactionjson(int32_t height,struct kmd_transactionhh *ptr,char *typestr) { int32_t i; char coinaddr[64]; cJSON *item,*array,*obj = cJSON_CreateObject(); array = cJSON_CreateArray(); @@ -304,7 +304,7 @@ cJSON *kmd_transactionjson(struct kmd_transactionhh *ptr,char *typestr) return(obj); } -cJSON *kmd_unspentjson(struct kmd_transaction *tx,int32_t vout) +cJSON *kmd_unspentjson(int32_t height,struct kmd_transaction *tx,int32_t vout) { cJSON *item = cJSON_CreateObject(); jaddstr(item,"type","received"); @@ -316,10 +316,11 @@ cJSON *kmd_unspentjson(struct kmd_transaction *tx,int32_t vout) return(item); } -cJSON *kmd_spentjson(struct kmd_transaction *tx,int32_t vout,struct kmd_transactionhh *spent) +cJSON *kmd_spentjson(int32_t height,struct kmd_transaction *tx,int32_t vout,struct kmd_transactionhh *spent) { cJSON *item = cJSON_CreateObject(); jaddstr(item,"type","sent"); + jaddnum(item,"confirmations",height - tx->height); jaddnum(item,"height",tx->height); jaddnum(item,"timestamp",tx->timestamp); jaddbits256(item,"txid",tx->txid); @@ -329,7 +330,7 @@ cJSON *kmd_spentjson(struct kmd_transaction *tx,int32_t vout,struct kmd_transact jaddnum(item,"vin",tx->vouts[vout].spendvini); if ( spent != 0 ) { - jadd(item,"paid",kmd_transactionjson(spent,"paid")); + jadd(item,"paid",kmd_transactionjson(height,spent,"paid")); } return(item); } @@ -409,30 +410,30 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode,cJSO if ( fulltx == 0 ) { if ( mode == 0 ) - jaddi(array,kmd_unspentjson(ptr->tx,i)); + jaddi(array,kmd_unspentjson(coin->kmd_height,ptr->tx,i)); else if ( mode == 1 ) - jaddi(array,kmd_spentjson(ptr->tx,i,spent)); + jaddi(array,kmd_spentjson(coin->kmd_height,ptr->tx,i,spent)); else if ( mode == 2 ) { if ( spent != 0 ) - jaddi(array,kmd_spentjson(ptr->tx,i,spent)); - else jaddi(array,kmd_unspentjson(ptr->tx,i)); + jaddi(array,kmd_spentjson(coin->kmd_height,ptr->tx,i,spent)); + else jaddi(array,kmd_unspentjson(coin->kmd_height,ptr->tx,i)); } } else if ( flag == 0 ) { if ( mode == 0 ) - jaddi(array,kmd_transactionjson(ptr,"received")); + jaddi(array,kmd_transactionjson(coin->kmd_height,ptr,"received")); else if ( mode == 1 ) { - jaddi(array,kmd_transactionjson(ptr,"received")); - jaddi(array,kmd_transactionjson(spent,"sent")); + jaddi(array,kmd_transactionjson(coin->kmd_height,ptr,"received")); + jaddi(array,kmd_transactionjson(coin->kmd_height,spent,"sent")); } else if ( mode == 2 ) { if ( spent != 0 ) - jaddi(array,kmd_transactionjson(ptr,"spent")); - else jaddi(array,kmd_transactionjson(ptr,"received")); + jaddi(array,kmd_transactionjson(coin->kmd_height,ptr,"spent")); + else jaddi(array,kmd_transactionjson(coin->kmd_height,ptr,"received")); } flag = 1; } From 4b1cbfe76f55b68e2bdc7dd864950d1b8a58a8c9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Feb 2017 19:08:45 +0200 Subject: [PATCH 126/495] test --- iguana/kmd_lookup.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 461e3980a..f36da20d5 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -117,7 +117,7 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi } return(0); } - char str[65]; printf("vin error %s vout.%d of %d vs ptr %p [%d] spent.%p\n",bits256_str(str,txid),vout,ptr->numvouts,ptr,ptr!=0?ptr->numvouts:-1,spendptr); + char str[65]; printf("vin error %s vout.%d of %d vs ptr %p [%d] spent.%p\n",bits256_str(str,txid),vout,ptr!=0?ptr->numvouts:-1,ptr,ptr!=0?ptr->numvouts:-1,spendptr); return(-1); } From b5b7a98d9500810b5ebe8b4da9bd4f68b03d9f90 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 13 Feb 2017 00:21:01 +0200 Subject: [PATCH 127/495] test --- iguana/kmd_lookup.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index f36da20d5..15a03a84b 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -703,7 +703,7 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) } free_json(blockjson); } - if ( flag != 0 || num > 5000 ) + if ( flag != 0 || num > 1000 ) break; coin->kmd_height = loadheight++; } From 24aa2d0946ae067545ec041e61a7ce94fcfd5845 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 13 Feb 2017 02:18:24 +0200 Subject: [PATCH 128/495] test --- crypto777/bitcoind_RPC.c | 4 ++-- iguana/kmd_lookup.h | 2 +- iguana/tests/dexgetsupply | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/crypto777/bitcoind_RPC.c b/crypto777/bitcoind_RPC.c index 2d31acdd2..bb885d7be 100755 --- a/crypto777/bitcoind_RPC.c +++ b/crypto777/bitcoind_RPC.c @@ -206,13 +206,13 @@ try_again: free(s.ptr); return(0); } - else if ( numretries >= 2 ) + else if ( numretries >= 3 ) { + printf( "curl_easy_perform() failed: %s %s.(%s %s), retries: %d\n",curl_easy_strerror(res),debugstr,url,command,numretries); //printf("Maximum number of retries exceeded!\n"); free(s.ptr); return(0); } - printf( "curl_easy_perform() failed: %s %s.(%s %s), retries: %d\n",curl_easy_strerror(res),debugstr,url,command,numretries); free(s.ptr); sleep((1< 1000 ) + if ( flag != 0 || num > 500 ) break; coin->kmd_height = loadheight++; } diff --git a/iguana/tests/dexgetsupply b/iguana/tests/dexgetsupply index 6c5ccae29..9d843eb19 100755 --- a/iguana/tests/dexgetsupply +++ b/iguana/tests/dexgetsupply @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getbalance\",\"address\":\"*\",\"symbol\":\"KMD\",\"timeout\":30000}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getbalance\",\"address\":\"*\",\"symbol\":\"KMD\",\"timeout\":600000}" From eed24fd6be6202e087535d4e691bdea83c15450f Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 13 Feb 2017 02:22:51 +0200 Subject: [PATCH 129/495] test --- crypto777/bitcoind_RPC.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto777/bitcoind_RPC.c b/crypto777/bitcoind_RPC.c index bb885d7be..71a1b437c 100755 --- a/crypto777/bitcoind_RPC.c +++ b/crypto777/bitcoind_RPC.c @@ -206,7 +206,7 @@ try_again: free(s.ptr); return(0); } - else if ( numretries >= 3 ) + else if ( numretries >= 4 ) { printf( "curl_easy_perform() failed: %s %s.(%s %s), retries: %d\n",curl_easy_strerror(res),debugstr,url,command,numretries); //printf("Maximum number of retries exceeded!\n"); From 86e49d750266a05f0239d2e7362ec12a9ba6af18 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 13 Feb 2017 22:27:55 +0200 Subject: [PATCH 130/495] batch9 --- iguana/main.c | 4 +- iguana/tests/KMD.batch9 | 253 +++++++++++++++++++++++++ iguana/tests/KMD.batch9.importaddress | 251 ++++++++++++++++++++++++ iguana/tests/KMD.batch9.listunspent | 200 +++++++++++++++++++ iguana/tests/REVS.batch9 | 20 ++ iguana/tests/REVS.batch9.importaddress | 18 ++ 6 files changed, 744 insertions(+), 2 deletions(-) create mode 100755 iguana/tests/KMD.batch9 create mode 100755 iguana/tests/KMD.batch9.importaddress create mode 100755 iguana/tests/KMD.batch9.listunspent create mode 100755 iguana/tests/REVS.batch9 create mode 100755 iguana/tests/REVS.batch9.importaddress diff --git a/iguana/main.c b/iguana/main.c index 1e2dfc0b6..d469e7d30 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1612,7 +1612,7 @@ void komodo_ICO_batch(cJSON *array,int32_t batchid) printf("# %s KMD %.8f\n",coinaddr,dstr(kmdamount)); if ( (iter & 1) == 0 ) { - if ( 1 ) + if ( 0 ) { printf("curl --url \"http://127.0.0.1:7778\" --data \"{\\\"agent\\\":\\\"dex\\\",\\\"method\\\":\\\"importaddress\\\",\\\"address\\\":\\\"%s\\\",\\\"symbol\\\":\\\"KMD\\\"}\" # %.8f\n",coinaddr,dstr(kmdamount)); printf("sleep 3\n"); @@ -1676,7 +1676,7 @@ void iguana_main(void *arg) else printf("ENDIAN ERROR\n"); mycalloc(0,0,0); #ifdef __APPLE__ - char *batchstr,*batchstr2; cJSON *batchjson; long batchsize; char fname[512],fname2[512]; int32_t batchid = 9; + char *batchstr,*batchstr2; cJSON *batchjson; long batchsize; char fname[512],fname2[512]; int32_t batchid = 10; sprintf(fname,"REVS.raw"), sprintf(fname2,"REVS.rawtxids"); if ( 0 && (batchstr= OS_filestr(&batchsize,fname)) != 0 && (batchstr2= OS_filestr(&batchsize,fname2)) != 0 ) { diff --git a/iguana/tests/KMD.batch9 b/iguana/tests/KMD.batch9 new file mode 100755 index 000000000..e13df79af --- /dev/null +++ b/iguana/tests/KMD.batch9 @@ -0,0 +1,253 @@ +# RPFYcaJ1hLGSNeMAyPyNmFeJaXPKMSPtbL KMD 2225.74637484, REVS 44.17250867 +# RPFYcaJ1hLGSNeMAyPyNmFeJaXPKMSPtbL KMD 2225.74637484 +./komodo-cli sendtoaddress RPFYcaJ1hLGSNeMAyPyNmFeJaXPKMSPtbL 2225.74637484 +sleep 3 +echo "2225.74637484 <- expected amount RPFYcaJ1hLGSNeMAyPyNmFeJaXPKMSPtbL" + +# RQMnsa46FhvHnwg7M1DsUKnh8GPTbUqCJ5 KMD 71.93221162, REVS 1.27173666 +# RQMnsa46FhvHnwg7M1DsUKnh8GPTbUqCJ5 KMD 71.93221162 +./komodo-cli sendtoaddress RQMnsa46FhvHnwg7M1DsUKnh8GPTbUqCJ5 71.93221162 +sleep 3 +echo "71.93221162 <- expected amount RQMnsa46FhvHnwg7M1DsUKnh8GPTbUqCJ5" + +# RJ8xVxojynDtLj4MVY1Tsxvkv4Sbwajutc KMD 929.58263940 +./komodo-cli sendtoaddress RJ8xVxojynDtLj4MVY1Tsxvkv4Sbwajutc 929.58263940 +sleep 3 +echo "929.58263940 <- expected amount RJ8xVxojynDtLj4MVY1Tsxvkv4Sbwajutc" + +# RSEGac8BnijkbygChtYXnMnLUpAvWvhHWb KMD 38642.70360624 +./komodo-cli sendtoaddress RSEGac8BnijkbygChtYXnMnLUpAvWvhHWb 38642.70360624 +sleep 3 +echo "38642.70360624 <- expected amount RSEGac8BnijkbygChtYXnMnLUpAvWvhHWb" + +# RKQPNcePppEkV4CMXZrwqEMAvRHbruKVdF KMD 338.77820389 +./komodo-cli sendtoaddress RKQPNcePppEkV4CMXZrwqEMAvRHbruKVdF 338.77820389 +sleep 3 +echo "338.77820389 <- expected amount RKQPNcePppEkV4CMXZrwqEMAvRHbruKVdF" + +# RNHXPTTCq6tMb7xV52ermT9s6k29HN2TJC KMD 3010.53084291 +./komodo-cli sendtoaddress RNHXPTTCq6tMb7xV52ermT9s6k29HN2TJC 3010.53084291 +sleep 3 +echo "3010.53084291 <- expected amount RNHXPTTCq6tMb7xV52ermT9s6k29HN2TJC" + +# RHptgvQVXDWFckRfgocRbEWxbQoPBKsWcy KMD 9683.15249375 +./komodo-cli sendtoaddress RHptgvQVXDWFckRfgocRbEWxbQoPBKsWcy 9683.15249375 +sleep 3 +echo "9683.15249375 <- expected amount RHptgvQVXDWFckRfgocRbEWxbQoPBKsWcy" + +# RFutyg6w7miN1FPvJiNwTzV1NfJ4Y4HGt1 KMD 1318.49290289 +./komodo-cli sendtoaddress RFutyg6w7miN1FPvJiNwTzV1NfJ4Y4HGt1 1318.49290289 +sleep 3 +echo "1318.49290289 <- expected amount RFutyg6w7miN1FPvJiNwTzV1NfJ4Y4HGt1" + +# RGMX8qe4DgbPTXTYZXmLowXf6hriQuzhyC KMD 1696.59450723 +./komodo-cli sendtoaddress RGMX8qe4DgbPTXTYZXmLowXf6hriQuzhyC 1696.59450723 +sleep 3 +echo "1696.59450723 <- expected amount RGMX8qe4DgbPTXTYZXmLowXf6hriQuzhyC" + +# RVN1oyNtmgWGteHfdiQcnzUUHz48STqxg4 KMD 9294.89681136 +./komodo-cli sendtoaddress RVN1oyNtmgWGteHfdiQcnzUUHz48STqxg4 9294.89681136 +sleep 3 +echo "9294.89681136 <- expected amount RVN1oyNtmgWGteHfdiQcnzUUHz48STqxg4" + +# RQQgVtao1Li8RmvhUaZR3DYLMEv1boWiSN KMD 3873.26099750 +./komodo-cli sendtoaddress RQQgVtao1Li8RmvhUaZR3DYLMEv1boWiSN 3873.26099750 +sleep 3 +echo "3873.26099750 <- expected amount RQQgVtao1Li8RmvhUaZR3DYLMEv1boWiSN" + +# RJNbZ57kzkNkA4fBmKynhXFddH4njTbUcX KMD 48410.92089250 +./komodo-cli sendtoaddress RJNbZ57kzkNkA4fBmKynhXFddH4njTbUcX 48410.92089250 +sleep 3 +echo "48410.92089250 <- expected amount RJNbZ57kzkNkA4fBmKynhXFddH4njTbUcX" + +# REM9dVPx7ZkMKEVyFnNJ9CDJGCmE8UL1vg KMD 24342.54200516 +./komodo-cli sendtoaddress REM9dVPx7ZkMKEVyFnNJ9CDJGCmE8UL1vg 24342.54200516 +sleep 3 +echo "24342.54200516 <- expected amount REM9dVPx7ZkMKEVyFnNJ9CDJGCmE8UL1vg" + +# RKdNj83UsxCDPHKh6AyN28nGtUVxJZywuy KMD 224445.72348323 +./komodo-cli sendtoaddress RKdNj83UsxCDPHKh6AyN28nGtUVxJZywuy 224445.72348323 +sleep 3 +echo "224445.72348323 <- expected amount RKdNj83UsxCDPHKh6AyN28nGtUVxJZywuy" + +# RKBoXULPPTR2QyAH6axGTsXncbT8mfGS2u KMD 4163.75557231 +./komodo-cli sendtoaddress RKBoXULPPTR2QyAH6axGTsXncbT8mfGS2u 4163.75557231 +sleep 3 +echo "4163.75557231 <- expected amount RKBoXULPPTR2QyAH6axGTsXncbT8mfGS2u" + +# RLu1gA75ySXwnYsimbUdtJr6xFJTqXrKJW KMD 1060.11153500 +./komodo-cli sendtoaddress RLu1gA75ySXwnYsimbUdtJr6xFJTqXrKJW 1060.11153500 +sleep 3 +echo "1060.11153500 <- expected amount RLu1gA75ySXwnYsimbUdtJr6xFJTqXrKJW" + +# RMJXpqJjgPrbNCpLnug3LKzqjYCJ2AmDVM KMD 5526.71509918 +./komodo-cli sendtoaddress RMJXpqJjgPrbNCpLnug3LKzqjYCJ2AmDVM 5526.71509918 +sleep 3 +echo "5526.71509918 <- expected amount RMJXpqJjgPrbNCpLnug3LKzqjYCJ2AmDVM" + +# RW8FwjCAcV8SWJaT1r8aKiFHXit5pfPkVb KMD 163809.81597006, REVS 3251.55110000 +# RW8FwjCAcV8SWJaT1r8aKiFHXit5pfPkVb KMD 163809.81597006 +./komodo-cli sendtoaddress RW8FwjCAcV8SWJaT1r8aKiFHXit5pfPkVb 163809.81597006 +sleep 3 +echo "163809.81597006 <- expected amount RW8FwjCAcV8SWJaT1r8aKiFHXit5pfPkVb" + +# RDSVuxLxeFYLqisj9Tdk5ThB5PzY7HBptN KMD 968.31524937 +./komodo-cli sendtoaddress RDSVuxLxeFYLqisj9Tdk5ThB5PzY7HBptN 968.31524937 +sleep 3 +echo "968.31524937 <- expected amount RDSVuxLxeFYLqisj9Tdk5ThB5PzY7HBptN" + +# RSXBDSmt7rsPJNg4Cy6tVZCQRyWv2oRmdq KMD 4785.58282591, REVS 2.73080820 +# RSXBDSmt7rsPJNg4Cy6tVZCQRyWv2oRmdq KMD 4785.58282591 +./komodo-cli sendtoaddress RSXBDSmt7rsPJNg4Cy6tVZCQRyWv2oRmdq 4785.58282591 +sleep 3 +echo "4785.58282591 <- expected amount RSXBDSmt7rsPJNg4Cy6tVZCQRyWv2oRmdq" + +# REALH3GPjNeVt3q9URisFKKCvjZd6NQcid KMD 631.99999696 +./komodo-cli sendtoaddress REALH3GPjNeVt3q9URisFKKCvjZd6NQcid 631.99999696 +sleep 3 +echo "631.99999696 <- expected amount REALH3GPjNeVt3q9URisFKKCvjZd6NQcid" + +# RTKmpREsZKc28s3oQAuWqGYh1xVtwJjHBo KMD 2826.51221292 +./komodo-cli sendtoaddress RTKmpREsZKc28s3oQAuWqGYh1xVtwJjHBo 2826.51221292 +sleep 3 +echo "2826.51221292 <- expected amount RTKmpREsZKc28s3oQAuWqGYh1xVtwJjHBo" + +# RA27UHcoKZuDU5dE8eBjcFNdGHgaw2ux6q KMD 14524.72874062 +./komodo-cli sendtoaddress RA27UHcoKZuDU5dE8eBjcFNdGHgaw2ux6q 14524.72874062 +sleep 3 +echo "14524.72874062 <- expected amount RA27UHcoKZuDU5dE8eBjcFNdGHgaw2ux6q" + +# RVVsTRZDt1ywJ115KB22kpwUGEba21aJfj KMD 112939.81142424, REVS 2241.80390030 +# RVVsTRZDt1ywJ115KB22kpwUGEba21aJfj KMD 112939.81142424 +./komodo-cli sendtoaddress RVVsTRZDt1ywJ115KB22kpwUGEba21aJfj 112939.81142424 +sleep 3 +echo "112939.81142424 <- expected amount RVVsTRZDt1ywJ115KB22kpwUGEba21aJfj" + +# RPJ9T5XcXJgqf1PstxE5xzFFWq7vonAr5v KMD 813.38480947 +./komodo-cli sendtoaddress RPJ9T5XcXJgqf1PstxE5xzFFWq7vonAr5v 813.38480947 +sleep 3 +echo "813.38480947 <- expected amount RPJ9T5XcXJgqf1PstxE5xzFFWq7vonAr5v" + +# RHzaoiAXNB6AkUXbpwVBapd2dpsDBxWtLM KMD 6777.23843037 +./komodo-cli sendtoaddress RHzaoiAXNB6AkUXbpwVBapd2dpsDBxWtLM 6777.23843037 +sleep 3 +echo "6777.23843037 <- expected amount RHzaoiAXNB6AkUXbpwVBapd2dpsDBxWtLM" + +# RER2vwRLHFT4HNQLzyqT1PhbeMCitDaY1u KMD 253.57894226 +./komodo-cli sendtoaddress RER2vwRLHFT4HNQLzyqT1PhbeMCitDaY1u 253.57894226 +sleep 3 +echo "253.57894226 <- expected amount RER2vwRLHFT4HNQLzyqT1PhbeMCitDaY1u" + +# RYZ62rj6VEgojsWhkxT5ucV6kZnwMGBKr7 KMD 4841.57624687 +./komodo-cli sendtoaddress RYZ62rj6VEgojsWhkxT5ucV6kZnwMGBKr7 4841.57624687 +sleep 3 +echo "4841.57624687 <- expected amount RYZ62rj6VEgojsWhkxT5ucV6kZnwMGBKr7" + +# RU21Y5CyH5xgGC5aHdqXoss8z7wkNQoacU KMD 1788.59446342 +./komodo-cli sendtoaddress RU21Y5CyH5xgGC5aHdqXoss8z7wkNQoacU 1788.59446342 +sleep 3 +echo "1788.59446342 <- expected amount RU21Y5CyH5xgGC5aHdqXoss8z7wkNQoacU" + +# RJ8tyXNVoi4iLLMJxirCYzRj1tXpUFmN2u KMD 4840.60793162 +./komodo-cli sendtoaddress RJ8tyXNVoi4iLLMJxirCYzRj1tXpUFmN2u 4840.60793162 +sleep 3 +echo "4840.60793162 <- expected amount RJ8tyXNVoi4iLLMJxirCYzRj1tXpUFmN2u" + +# RFkZfkHiRrtAmSMsfj7CVS6hkvLagEqYKj KMD 21334.16787115 +./komodo-cli sendtoaddress RFkZfkHiRrtAmSMsfj7CVS6hkvLagEqYKj 21334.16787115 +sleep 3 +echo "21334.16787115 <- expected amount RFkZfkHiRrtAmSMsfj7CVS6hkvLagEqYKj" + +# REBRXGotFX5fojy22CFEzq88EbbZux9CjM KMD 2075.39004188 +./komodo-cli sendtoaddress REBRXGotFX5fojy22CFEzq88EbbZux9CjM 2075.39004188 +sleep 3 +echo "2075.39004188 <- expected amount REBRXGotFX5fojy22CFEzq88EbbZux9CjM" + +# RFZyBhemdJqpRSppnVYPJZ5wUW6JtbnsHD KMD 7111.30719141 +./komodo-cli sendtoaddress RFZyBhemdJqpRSppnVYPJZ5wUW6JtbnsHD 7111.30719141 +sleep 3 +echo "7111.30719141 <- expected amount RFZyBhemdJqpRSppnVYPJZ5wUW6JtbnsHD" + +# REbV2nRwPWFAdrW2BzmjpDpxTNErm2468m KMD 142057.63342296 +./komodo-cli sendtoaddress REbV2nRwPWFAdrW2BzmjpDpxTNErm2468m 142057.63342296 +sleep 3 +echo "142057.63342296 <- expected amount REbV2nRwPWFAdrW2BzmjpDpxTNErm2468m" + +# RYRiQU4nVLcjaEtqtrNpDQBRS3ovbjDFaK KMD 27999.94713904 +./komodo-cli sendtoaddress RYRiQU4nVLcjaEtqtrNpDQBRS3ovbjDFaK 27999.94713904 +sleep 3 +echo "27999.94713904 <- expected amount RYRiQU4nVLcjaEtqtrNpDQBRS3ovbjDFaK" + +# RU292SeuDimqFSdZXmdmjd1BZcxLWzqqfb KMD 2026.68381694 +./komodo-cli sendtoaddress RU292SeuDimqFSdZXmdmjd1BZcxLWzqqfb 2026.68381694 +sleep 3 +echo "2026.68381694 <- expected amount RU292SeuDimqFSdZXmdmjd1BZcxLWzqqfb" + +# RXTemgKRoF4d28V5fLJxAWWcJyaoTRmZyz KMD 264.96107994 +./komodo-cli sendtoaddress RXTemgKRoF4d28V5fLJxAWWcJyaoTRmZyz 264.96107994 +sleep 3 +echo "264.96107994 <- expected amount RXTemgKRoF4d28V5fLJxAWWcJyaoTRmZyz" + +# RPx4vRAMxvAjH33g6q4a27UL3CHcJtJ8VY KMD 6951.11546870 +./komodo-cli sendtoaddress RPx4vRAMxvAjH33g6q4a27UL3CHcJtJ8VY 6951.11546870 +sleep 3 +echo "6951.11546870 <- expected amount RPx4vRAMxvAjH33g6q4a27UL3CHcJtJ8VY" + +# RH8q81jTRuH35g2g59iT3kxJWoF9Unzgqq KMD 3325.70020871, REVS 65.95939412 +# RH8q81jTRuH35g2g59iT3kxJWoF9Unzgqq KMD 3325.70020871 +./komodo-cli sendtoaddress RH8q81jTRuH35g2g59iT3kxJWoF9Unzgqq 3325.70020871 +sleep 3 +echo "3325.70020871 <- expected amount RH8q81jTRuH35g2g59iT3kxJWoF9Unzgqq" + +# RFPHfk7EtgVSoiFJLXgu8tbfXFJSbsN4cP KMD 773.87754730 +./komodo-cli sendtoaddress RFPHfk7EtgVSoiFJLXgu8tbfXFJSbsN4cP 773.87754730 +sleep 3 +echo "773.87754730 <- expected amount RFPHfk7EtgVSoiFJLXgu8tbfXFJSbsN4cP" + +# RPHUJ7RmVAPCFqPhxpxo6E4kc54w7t5A8M KMD 8908.50029425 +./komodo-cli sendtoaddress RPHUJ7RmVAPCFqPhxpxo6E4kc54w7t5A8M 8908.50029425 +sleep 3 +echo "8908.50029425 <- expected amount RPHUJ7RmVAPCFqPhxpxo6E4kc54w7t5A8M" + +# RCkPBpsQtbB2JDbHLU4RpC2DecxRvpZ9BD KMD 2802.45988185 +./komodo-cli sendtoaddress RCkPBpsQtbB2JDbHLU4RpC2DecxRvpZ9BD 2802.45988185 +sleep 3 +echo "2802.45988185 <- expected amount RCkPBpsQtbB2JDbHLU4RpC2DecxRvpZ9BD" + +# R9kB2xFTKB5wMXTW6i7bNiEWx4hsJKCzbz KMD 27199.08040085 +./komodo-cli sendtoaddress R9kB2xFTKB5wMXTW6i7bNiEWx4hsJKCzbz 27199.08040085 +sleep 3 +echo "27199.08040085 <- expected amount R9kB2xFTKB5wMXTW6i7bNiEWx4hsJKCzbz" + +# RWwjkQec3yhivp7UuWRqYWvKJDA3EAADZz KMD 818.43860613 +./komodo-cli sendtoaddress RWwjkQec3yhivp7UuWRqYWvKJDA3EAADZz 818.43860613 +sleep 3 +echo "818.43860613 <- expected amount RWwjkQec3yhivp7UuWRqYWvKJDA3EAADZz" + +# RBBwTTeLq3tkeBg5GxKX6JugEv5pTijiyN KMD 1544.33012483 +./komodo-cli sendtoaddress RBBwTTeLq3tkeBg5GxKX6JugEv5pTijiyN 1544.33012483 +sleep 3 +echo "1544.33012483 <- expected amount RBBwTTeLq3tkeBg5GxKX6JugEv5pTijiyN" + +# R9Jz7RWJ6LVBhrt2RgY6SSMWEkmKHqz5qg KMD 30016.80441537 +./komodo-cli sendtoaddress R9Jz7RWJ6LVBhrt2RgY6SSMWEkmKHqz5qg 30016.80441537 +sleep 3 +echo "30016.80441537 <- expected amount R9Jz7RWJ6LVBhrt2RgY6SSMWEkmKHqz5qg" + +# RXBFW2KavmhfhbkEbofYueD66Laq4kYZQN KMD 4146.19464926 +./komodo-cli sendtoaddress RXBFW2KavmhfhbkEbofYueD66Laq4kYZQN 4146.19464926 +sleep 3 +echo "4146.19464926 <- expected amount RXBFW2KavmhfhbkEbofYueD66Laq4kYZQN" + +# RXdBJ5cWDcS38ykuggEQZh3vSztxwmG3ut KMD 24089.07982436 +./komodo-cli sendtoaddress RXdBJ5cWDcS38ykuggEQZh3vSztxwmG3ut 24089.07982436 +sleep 3 +echo "24089.07982436 <- expected amount RXdBJ5cWDcS38ykuggEQZh3vSztxwmG3ut" + +# RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv KMD 693.08132289 +./komodo-cli sendtoaddress RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv 693.08132289 +sleep 3 +echo "693.08132289 <- expected amount RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv" + + +# total KMD 1012975.94073092 REVS 0.00000000 diff --git a/iguana/tests/KMD.batch9.importaddress b/iguana/tests/KMD.batch9.importaddress new file mode 100755 index 000000000..77d831f7f --- /dev/null +++ b/iguana/tests/KMD.batch9.importaddress @@ -0,0 +1,251 @@ +# RPFYcaJ1hLGSNeMAyPyNmFeJaXPKMSPtbL KMD 2225.74637484, REVS 44.17250867 +# RPFYcaJ1hLGSNeMAyPyNmFeJaXPKMSPtbL KMD 2225.74637484 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RPFYcaJ1hLGSNeMAyPyNmFeJaXPKMSPtbL\",\"symbol\":\"KMD\"}" # 2225.74637484 +sleep 3 +echo "2225.74637484 <- expected amount RPFYcaJ1hLGSNeMAyPyNmFeJaXPKMSPtbL" + +# RQMnsa46FhvHnwg7M1DsUKnh8GPTbUqCJ5 KMD 71.93221162, REVS 1.27173666 +# RQMnsa46FhvHnwg7M1DsUKnh8GPTbUqCJ5 KMD 71.93221162 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RQMnsa46FhvHnwg7M1DsUKnh8GPTbUqCJ5\",\"symbol\":\"KMD\"}" # 71.93221162 +sleep 3 +echo "71.93221162 <- expected amount RQMnsa46FhvHnwg7M1DsUKnh8GPTbUqCJ5" + +# RJ8xVxojynDtLj4MVY1Tsxvkv4Sbwajutc KMD 929.58263940 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RJ8xVxojynDtLj4MVY1Tsxvkv4Sbwajutc\",\"symbol\":\"KMD\"}" # 929.58263940 +sleep 3 +echo "929.58263940 <- expected amount RJ8xVxojynDtLj4MVY1Tsxvkv4Sbwajutc" + +# RSEGac8BnijkbygChtYXnMnLUpAvWvhHWb KMD 38642.70360624 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RSEGac8BnijkbygChtYXnMnLUpAvWvhHWb\",\"symbol\":\"KMD\"}" # 38642.70360624 +sleep 3 +echo "38642.70360624 <- expected amount RSEGac8BnijkbygChtYXnMnLUpAvWvhHWb" + +# RKQPNcePppEkV4CMXZrwqEMAvRHbruKVdF KMD 338.77820389 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RKQPNcePppEkV4CMXZrwqEMAvRHbruKVdF\",\"symbol\":\"KMD\"}" # 338.77820389 +sleep 3 +echo "338.77820389 <- expected amount RKQPNcePppEkV4CMXZrwqEMAvRHbruKVdF" + +# RNHXPTTCq6tMb7xV52ermT9s6k29HN2TJC KMD 3010.53084291 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RNHXPTTCq6tMb7xV52ermT9s6k29HN2TJC\",\"symbol\":\"KMD\"}" # 3010.53084291 +sleep 3 +echo "3010.53084291 <- expected amount RNHXPTTCq6tMb7xV52ermT9s6k29HN2TJC" + +# RHptgvQVXDWFckRfgocRbEWxbQoPBKsWcy KMD 9683.15249375 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RHptgvQVXDWFckRfgocRbEWxbQoPBKsWcy\",\"symbol\":\"KMD\"}" # 9683.15249375 +sleep 3 +echo "9683.15249375 <- expected amount RHptgvQVXDWFckRfgocRbEWxbQoPBKsWcy" + +# RFutyg6w7miN1FPvJiNwTzV1NfJ4Y4HGt1 KMD 1318.49290289 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RFutyg6w7miN1FPvJiNwTzV1NfJ4Y4HGt1\",\"symbol\":\"KMD\"}" # 1318.49290289 +sleep 3 +echo "1318.49290289 <- expected amount RFutyg6w7miN1FPvJiNwTzV1NfJ4Y4HGt1" + +# RGMX8qe4DgbPTXTYZXmLowXf6hriQuzhyC KMD 1696.59450723 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RGMX8qe4DgbPTXTYZXmLowXf6hriQuzhyC\",\"symbol\":\"KMD\"}" # 1696.59450723 +sleep 3 +echo "1696.59450723 <- expected amount RGMX8qe4DgbPTXTYZXmLowXf6hriQuzhyC" + +# RVN1oyNtmgWGteHfdiQcnzUUHz48STqxg4 KMD 9294.89681136 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RVN1oyNtmgWGteHfdiQcnzUUHz48STqxg4\",\"symbol\":\"KMD\"}" # 9294.89681136 +sleep 3 +echo "9294.89681136 <- expected amount RVN1oyNtmgWGteHfdiQcnzUUHz48STqxg4" + +# RQQgVtao1Li8RmvhUaZR3DYLMEv1boWiSN KMD 3873.26099750 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RQQgVtao1Li8RmvhUaZR3DYLMEv1boWiSN\",\"symbol\":\"KMD\"}" # 3873.26099750 +sleep 3 +echo "3873.26099750 <- expected amount RQQgVtao1Li8RmvhUaZR3DYLMEv1boWiSN" + +# RJNbZ57kzkNkA4fBmKynhXFddH4njTbUcX KMD 48410.92089250 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RJNbZ57kzkNkA4fBmKynhXFddH4njTbUcX\",\"symbol\":\"KMD\"}" # 48410.92089250 +sleep 3 +echo "48410.92089250 <- expected amount RJNbZ57kzkNkA4fBmKynhXFddH4njTbUcX" + +# REM9dVPx7ZkMKEVyFnNJ9CDJGCmE8UL1vg KMD 24342.54200516 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"REM9dVPx7ZkMKEVyFnNJ9CDJGCmE8UL1vg\",\"symbol\":\"KMD\"}" # 24342.54200516 +sleep 3 +echo "24342.54200516 <- expected amount REM9dVPx7ZkMKEVyFnNJ9CDJGCmE8UL1vg" + +# RKdNj83UsxCDPHKh6AyN28nGtUVxJZywuy KMD 224445.72348323 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RKdNj83UsxCDPHKh6AyN28nGtUVxJZywuy\",\"symbol\":\"KMD\"}" # 224445.72348323 +sleep 3 +echo "224445.72348323 <- expected amount RKdNj83UsxCDPHKh6AyN28nGtUVxJZywuy" + +# RKBoXULPPTR2QyAH6axGTsXncbT8mfGS2u KMD 4163.75557231 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RKBoXULPPTR2QyAH6axGTsXncbT8mfGS2u\",\"symbol\":\"KMD\"}" # 4163.75557231 +sleep 3 +echo "4163.75557231 <- expected amount RKBoXULPPTR2QyAH6axGTsXncbT8mfGS2u" + +# RLu1gA75ySXwnYsimbUdtJr6xFJTqXrKJW KMD 1060.11153500 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RLu1gA75ySXwnYsimbUdtJr6xFJTqXrKJW\",\"symbol\":\"KMD\"}" # 1060.11153500 +sleep 3 +echo "1060.11153500 <- expected amount RLu1gA75ySXwnYsimbUdtJr6xFJTqXrKJW" + +# RMJXpqJjgPrbNCpLnug3LKzqjYCJ2AmDVM KMD 5526.71509918 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RMJXpqJjgPrbNCpLnug3LKzqjYCJ2AmDVM\",\"symbol\":\"KMD\"}" # 5526.71509918 +sleep 3 +echo "5526.71509918 <- expected amount RMJXpqJjgPrbNCpLnug3LKzqjYCJ2AmDVM" + +# RW8FwjCAcV8SWJaT1r8aKiFHXit5pfPkVb KMD 163809.81597006, REVS 3251.55110000 +# RW8FwjCAcV8SWJaT1r8aKiFHXit5pfPkVb KMD 163809.81597006 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RW8FwjCAcV8SWJaT1r8aKiFHXit5pfPkVb\",\"symbol\":\"KMD\"}" # 163809.81597006 +sleep 3 +echo "163809.81597006 <- expected amount RW8FwjCAcV8SWJaT1r8aKiFHXit5pfPkVb" + +# RDSVuxLxeFYLqisj9Tdk5ThB5PzY7HBptN KMD 968.31524937 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RDSVuxLxeFYLqisj9Tdk5ThB5PzY7HBptN\",\"symbol\":\"KMD\"}" # 968.31524937 +sleep 3 +echo "968.31524937 <- expected amount RDSVuxLxeFYLqisj9Tdk5ThB5PzY7HBptN" + +# RSXBDSmt7rsPJNg4Cy6tVZCQRyWv2oRmdq KMD 4785.58282591, REVS 2.73080820 +# RSXBDSmt7rsPJNg4Cy6tVZCQRyWv2oRmdq KMD 4785.58282591 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RSXBDSmt7rsPJNg4Cy6tVZCQRyWv2oRmdq\",\"symbol\":\"KMD\"}" # 4785.58282591 +sleep 3 +echo "4785.58282591 <- expected amount RSXBDSmt7rsPJNg4Cy6tVZCQRyWv2oRmdq" + +# REALH3GPjNeVt3q9URisFKKCvjZd6NQcid KMD 631.99999696 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"REALH3GPjNeVt3q9URisFKKCvjZd6NQcid\",\"symbol\":\"KMD\"}" # 631.99999696 +sleep 3 +echo "631.99999696 <- expected amount REALH3GPjNeVt3q9URisFKKCvjZd6NQcid" + +# RTKmpREsZKc28s3oQAuWqGYh1xVtwJjHBo KMD 2826.51221292 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RTKmpREsZKc28s3oQAuWqGYh1xVtwJjHBo\",\"symbol\":\"KMD\"}" # 2826.51221292 +sleep 3 +echo "2826.51221292 <- expected amount RTKmpREsZKc28s3oQAuWqGYh1xVtwJjHBo" + +# RA27UHcoKZuDU5dE8eBjcFNdGHgaw2ux6q KMD 14524.72874062 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RA27UHcoKZuDU5dE8eBjcFNdGHgaw2ux6q\",\"symbol\":\"KMD\"}" # 14524.72874062 +sleep 3 +echo "14524.72874062 <- expected amount RA27UHcoKZuDU5dE8eBjcFNdGHgaw2ux6q" + +# RVVsTRZDt1ywJ115KB22kpwUGEba21aJfj KMD 112939.81142424, REVS 2241.80390030 +# RVVsTRZDt1ywJ115KB22kpwUGEba21aJfj KMD 112939.81142424 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RVVsTRZDt1ywJ115KB22kpwUGEba21aJfj\",\"symbol\":\"KMD\"}" # 112939.81142424 +sleep 3 +echo "112939.81142424 <- expected amount RVVsTRZDt1ywJ115KB22kpwUGEba21aJfj" + +# RPJ9T5XcXJgqf1PstxE5xzFFWq7vonAr5v KMD 813.38480947 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RPJ9T5XcXJgqf1PstxE5xzFFWq7vonAr5v\",\"symbol\":\"KMD\"}" # 813.38480947 +sleep 3 +echo "813.38480947 <- expected amount RPJ9T5XcXJgqf1PstxE5xzFFWq7vonAr5v" + +# RHzaoiAXNB6AkUXbpwVBapd2dpsDBxWtLM KMD 6777.23843037 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RHzaoiAXNB6AkUXbpwVBapd2dpsDBxWtLM\",\"symbol\":\"KMD\"}" # 6777.23843037 +sleep 3 +echo "6777.23843037 <- expected amount RHzaoiAXNB6AkUXbpwVBapd2dpsDBxWtLM" + +# RER2vwRLHFT4HNQLzyqT1PhbeMCitDaY1u KMD 253.57894226 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RER2vwRLHFT4HNQLzyqT1PhbeMCitDaY1u\",\"symbol\":\"KMD\"}" # 253.57894226 +sleep 3 +echo "253.57894226 <- expected amount RER2vwRLHFT4HNQLzyqT1PhbeMCitDaY1u" + +# RYZ62rj6VEgojsWhkxT5ucV6kZnwMGBKr7 KMD 4841.57624687 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RYZ62rj6VEgojsWhkxT5ucV6kZnwMGBKr7\",\"symbol\":\"KMD\"}" # 4841.57624687 +sleep 3 +echo "4841.57624687 <- expected amount RYZ62rj6VEgojsWhkxT5ucV6kZnwMGBKr7" + +# RU21Y5CyH5xgGC5aHdqXoss8z7wkNQoacU KMD 1788.59446342 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RU21Y5CyH5xgGC5aHdqXoss8z7wkNQoacU\",\"symbol\":\"KMD\"}" # 1788.59446342 +sleep 3 +echo "1788.59446342 <- expected amount RU21Y5CyH5xgGC5aHdqXoss8z7wkNQoacU" + +# RJ8tyXNVoi4iLLMJxirCYzRj1tXpUFmN2u KMD 4840.60793162 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RJ8tyXNVoi4iLLMJxirCYzRj1tXpUFmN2u\",\"symbol\":\"KMD\"}" # 4840.60793162 +sleep 3 +echo "4840.60793162 <- expected amount RJ8tyXNVoi4iLLMJxirCYzRj1tXpUFmN2u" + +# RFkZfkHiRrtAmSMsfj7CVS6hkvLagEqYKj KMD 21334.16787115 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RFkZfkHiRrtAmSMsfj7CVS6hkvLagEqYKj\",\"symbol\":\"KMD\"}" # 21334.16787115 +sleep 3 +echo "21334.16787115 <- expected amount RFkZfkHiRrtAmSMsfj7CVS6hkvLagEqYKj" + +# REBRXGotFX5fojy22CFEzq88EbbZux9CjM KMD 2075.39004188 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"REBRXGotFX5fojy22CFEzq88EbbZux9CjM\",\"symbol\":\"KMD\"}" # 2075.39004188 +sleep 3 +echo "2075.39004188 <- expected amount REBRXGotFX5fojy22CFEzq88EbbZux9CjM" + +# RFZyBhemdJqpRSppnVYPJZ5wUW6JtbnsHD KMD 7111.30719141 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RFZyBhemdJqpRSppnVYPJZ5wUW6JtbnsHD\",\"symbol\":\"KMD\"}" # 7111.30719141 +sleep 3 +echo "7111.30719141 <- expected amount RFZyBhemdJqpRSppnVYPJZ5wUW6JtbnsHD" + +# REbV2nRwPWFAdrW2BzmjpDpxTNErm2468m KMD 142057.63342296 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"REbV2nRwPWFAdrW2BzmjpDpxTNErm2468m\",\"symbol\":\"KMD\"}" # 142057.63342296 +sleep 3 +echo "142057.63342296 <- expected amount REbV2nRwPWFAdrW2BzmjpDpxTNErm2468m" + +# RYRiQU4nVLcjaEtqtrNpDQBRS3ovbjDFaK KMD 27999.94713904 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RYRiQU4nVLcjaEtqtrNpDQBRS3ovbjDFaK\",\"symbol\":\"KMD\"}" # 27999.94713904 +sleep 3 +echo "27999.94713904 <- expected amount RYRiQU4nVLcjaEtqtrNpDQBRS3ovbjDFaK" + +# RU292SeuDimqFSdZXmdmjd1BZcxLWzqqfb KMD 2026.68381694 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RU292SeuDimqFSdZXmdmjd1BZcxLWzqqfb\",\"symbol\":\"KMD\"}" # 2026.68381694 +sleep 3 +echo "2026.68381694 <- expected amount RU292SeuDimqFSdZXmdmjd1BZcxLWzqqfb" + +# RXTemgKRoF4d28V5fLJxAWWcJyaoTRmZyz KMD 264.96107994 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RXTemgKRoF4d28V5fLJxAWWcJyaoTRmZyz\",\"symbol\":\"KMD\"}" # 264.96107994 +sleep 3 +echo "264.96107994 <- expected amount RXTemgKRoF4d28V5fLJxAWWcJyaoTRmZyz" + +# RPx4vRAMxvAjH33g6q4a27UL3CHcJtJ8VY KMD 6951.11546870 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RPx4vRAMxvAjH33g6q4a27UL3CHcJtJ8VY\",\"symbol\":\"KMD\"}" # 6951.11546870 +sleep 3 +echo "6951.11546870 <- expected amount RPx4vRAMxvAjH33g6q4a27UL3CHcJtJ8VY" + +# RH8q81jTRuH35g2g59iT3kxJWoF9Unzgqq KMD 3325.70020871, REVS 65.95939412 +# RH8q81jTRuH35g2g59iT3kxJWoF9Unzgqq KMD 3325.70020871 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RH8q81jTRuH35g2g59iT3kxJWoF9Unzgqq\",\"symbol\":\"KMD\"}" # 3325.70020871 +sleep 3 +echo "3325.70020871 <- expected amount RH8q81jTRuH35g2g59iT3kxJWoF9Unzgqq" + +# RFPHfk7EtgVSoiFJLXgu8tbfXFJSbsN4cP KMD 773.87754730 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RFPHfk7EtgVSoiFJLXgu8tbfXFJSbsN4cP\",\"symbol\":\"KMD\"}" # 773.87754730 +sleep 3 +echo "773.87754730 <- expected amount RFPHfk7EtgVSoiFJLXgu8tbfXFJSbsN4cP" + +# RPHUJ7RmVAPCFqPhxpxo6E4kc54w7t5A8M KMD 8908.50029425 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RPHUJ7RmVAPCFqPhxpxo6E4kc54w7t5A8M\",\"symbol\":\"KMD\"}" # 8908.50029425 +sleep 3 +echo "8908.50029425 <- expected amount RPHUJ7RmVAPCFqPhxpxo6E4kc54w7t5A8M" + +# RCkPBpsQtbB2JDbHLU4RpC2DecxRvpZ9BD KMD 2802.45988185 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RCkPBpsQtbB2JDbHLU4RpC2DecxRvpZ9BD\",\"symbol\":\"KMD\"}" # 2802.45988185 +sleep 3 +echo "2802.45988185 <- expected amount RCkPBpsQtbB2JDbHLU4RpC2DecxRvpZ9BD" + +# R9kB2xFTKB5wMXTW6i7bNiEWx4hsJKCzbz KMD 27199.08040085 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"R9kB2xFTKB5wMXTW6i7bNiEWx4hsJKCzbz\",\"symbol\":\"KMD\"}" # 27199.08040085 +sleep 3 +echo "27199.08040085 <- expected amount R9kB2xFTKB5wMXTW6i7bNiEWx4hsJKCzbz" + +# RWwjkQec3yhivp7UuWRqYWvKJDA3EAADZz KMD 818.43860613 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RWwjkQec3yhivp7UuWRqYWvKJDA3EAADZz\",\"symbol\":\"KMD\"}" # 818.43860613 +sleep 3 +echo "818.43860613 <- expected amount RWwjkQec3yhivp7UuWRqYWvKJDA3EAADZz" + +# RBBwTTeLq3tkeBg5GxKX6JugEv5pTijiyN KMD 1544.33012483 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RBBwTTeLq3tkeBg5GxKX6JugEv5pTijiyN\",\"symbol\":\"KMD\"}" # 1544.33012483 +sleep 3 +echo "1544.33012483 <- expected amount RBBwTTeLq3tkeBg5GxKX6JugEv5pTijiyN" + +# R9Jz7RWJ6LVBhrt2RgY6SSMWEkmKHqz5qg KMD 30016.80441537 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"R9Jz7RWJ6LVBhrt2RgY6SSMWEkmKHqz5qg\",\"symbol\":\"KMD\"}" # 30016.80441537 +sleep 3 +echo "30016.80441537 <- expected amount R9Jz7RWJ6LVBhrt2RgY6SSMWEkmKHqz5qg" + +# RXBFW2KavmhfhbkEbofYueD66Laq4kYZQN KMD 4146.19464926 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RXBFW2KavmhfhbkEbofYueD66Laq4kYZQN\",\"symbol\":\"KMD\"}" # 4146.19464926 +sleep 3 +echo "4146.19464926 <- expected amount RXBFW2KavmhfhbkEbofYueD66Laq4kYZQN" + +# RXdBJ5cWDcS38ykuggEQZh3vSztxwmG3ut KMD 24089.07982436 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RXdBJ5cWDcS38ykuggEQZh3vSztxwmG3ut\",\"symbol\":\"KMD\"}" # 24089.07982436 +sleep 3 +echo "24089.07982436 <- expected amount RXdBJ5cWDcS38ykuggEQZh3vSztxwmG3ut" + +# RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv KMD 693.08132289 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv\",\"symbol\":\"KMD\"}" # 693.08132289 +sleep 3 +echo "693.08132289 <- expected amount RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv" + diff --git a/iguana/tests/KMD.batch9.listunspent b/iguana/tests/KMD.batch9.listunspent new file mode 100755 index 000000000..a428359de --- /dev/null +++ b/iguana/tests/KMD.batch9.listunspent @@ -0,0 +1,200 @@ +# RPFYcaJ1hLGSNeMAyPyNmFeJaXPKMSPtbL KMD 2225.74637484 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RPFYcaJ1hLGSNeMAyPyNmFeJaXPKMSPtbL\",\"symbol\":\"KMD\"}" +echo "2225.74637484 <- expected amount RPFYcaJ1hLGSNeMAyPyNmFeJaXPKMSPtbL" + +# RQMnsa46FhvHnwg7M1DsUKnh8GPTbUqCJ5 KMD 71.93221162, REVS 1.27173666 +# RQMnsa46FhvHnwg7M1DsUKnh8GPTbUqCJ5 KMD 71.93221162 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RQMnsa46FhvHnwg7M1DsUKnh8GPTbUqCJ5\",\"symbol\":\"KMD\"}" +echo "71.93221162 <- expected amount RQMnsa46FhvHnwg7M1DsUKnh8GPTbUqCJ5" + +# RJ8xVxojynDtLj4MVY1Tsxvkv4Sbwajutc KMD 929.58263940 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RJ8xVxojynDtLj4MVY1Tsxvkv4Sbwajutc\",\"symbol\":\"KMD\"}" +echo "929.58263940 <- expected amount RJ8xVxojynDtLj4MVY1Tsxvkv4Sbwajutc" + +# RSEGac8BnijkbygChtYXnMnLUpAvWvhHWb KMD 38642.70360624 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RSEGac8BnijkbygChtYXnMnLUpAvWvhHWb\",\"symbol\":\"KMD\"}" +echo "38642.70360624 <- expected amount RSEGac8BnijkbygChtYXnMnLUpAvWvhHWb" + +# RKQPNcePppEkV4CMXZrwqEMAvRHbruKVdF KMD 338.77820389 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RKQPNcePppEkV4CMXZrwqEMAvRHbruKVdF\",\"symbol\":\"KMD\"}" +echo "338.77820389 <- expected amount RKQPNcePppEkV4CMXZrwqEMAvRHbruKVdF" + +# RNHXPTTCq6tMb7xV52ermT9s6k29HN2TJC KMD 3010.53084291 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RNHXPTTCq6tMb7xV52ermT9s6k29HN2TJC\",\"symbol\":\"KMD\"}" +echo "3010.53084291 <- expected amount RNHXPTTCq6tMb7xV52ermT9s6k29HN2TJC" + +# RHptgvQVXDWFckRfgocRbEWxbQoPBKsWcy KMD 9683.15249375 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RHptgvQVXDWFckRfgocRbEWxbQoPBKsWcy\",\"symbol\":\"KMD\"}" +echo "9683.15249375 <- expected amount RHptgvQVXDWFckRfgocRbEWxbQoPBKsWcy" + +# RFutyg6w7miN1FPvJiNwTzV1NfJ4Y4HGt1 KMD 1318.49290289 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RFutyg6w7miN1FPvJiNwTzV1NfJ4Y4HGt1\",\"symbol\":\"KMD\"}" +echo "1318.49290289 <- expected amount RFutyg6w7miN1FPvJiNwTzV1NfJ4Y4HGt1" + +# RGMX8qe4DgbPTXTYZXmLowXf6hriQuzhyC KMD 1696.59450723 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RGMX8qe4DgbPTXTYZXmLowXf6hriQuzhyC\",\"symbol\":\"KMD\"}" +echo "1696.59450723 <- expected amount RGMX8qe4DgbPTXTYZXmLowXf6hriQuzhyC" + +# RVN1oyNtmgWGteHfdiQcnzUUHz48STqxg4 KMD 9294.89681136 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RVN1oyNtmgWGteHfdiQcnzUUHz48STqxg4\",\"symbol\":\"KMD\"}" +echo "9294.89681136 <- expected amount RVN1oyNtmgWGteHfdiQcnzUUHz48STqxg4" + +# RQQgVtao1Li8RmvhUaZR3DYLMEv1boWiSN KMD 3873.26099750 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RQQgVtao1Li8RmvhUaZR3DYLMEv1boWiSN\",\"symbol\":\"KMD\"}" +echo "3873.26099750 <- expected amount RQQgVtao1Li8RmvhUaZR3DYLMEv1boWiSN" + +# RJNbZ57kzkNkA4fBmKynhXFddH4njTbUcX KMD 48410.92089250 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RJNbZ57kzkNkA4fBmKynhXFddH4njTbUcX\",\"symbol\":\"KMD\"}" +echo "48410.92089250 <- expected amount RJNbZ57kzkNkA4fBmKynhXFddH4njTbUcX" + +# REM9dVPx7ZkMKEVyFnNJ9CDJGCmE8UL1vg KMD 24342.54200516 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"REM9dVPx7ZkMKEVyFnNJ9CDJGCmE8UL1vg\",\"symbol\":\"KMD\"}" +echo "24342.54200516 <- expected amount REM9dVPx7ZkMKEVyFnNJ9CDJGCmE8UL1vg" + +# RKdNj83UsxCDPHKh6AyN28nGtUVxJZywuy KMD 224445.72348323 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RKdNj83UsxCDPHKh6AyN28nGtUVxJZywuy\",\"symbol\":\"KMD\"}" +echo "224445.72348323 <- expected amount RKdNj83UsxCDPHKh6AyN28nGtUVxJZywuy" + +# RKBoXULPPTR2QyAH6axGTsXncbT8mfGS2u KMD 4163.75557231 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RKBoXULPPTR2QyAH6axGTsXncbT8mfGS2u\",\"symbol\":\"KMD\"}" +echo "4163.75557231 <- expected amount RKBoXULPPTR2QyAH6axGTsXncbT8mfGS2u" + +# RLu1gA75ySXwnYsimbUdtJr6xFJTqXrKJW KMD 1060.11153500 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RLu1gA75ySXwnYsimbUdtJr6xFJTqXrKJW\",\"symbol\":\"KMD\"}" +echo "1060.11153500 <- expected amount RLu1gA75ySXwnYsimbUdtJr6xFJTqXrKJW" + +# RMJXpqJjgPrbNCpLnug3LKzqjYCJ2AmDVM KMD 5526.71509918 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RMJXpqJjgPrbNCpLnug3LKzqjYCJ2AmDVM\",\"symbol\":\"KMD\"}" +echo "5526.71509918 <- expected amount RMJXpqJjgPrbNCpLnug3LKzqjYCJ2AmDVM" + +# RW8FwjCAcV8SWJaT1r8aKiFHXit5pfPkVb KMD 163809.81597006, REVS 3251.55110000 +# RW8FwjCAcV8SWJaT1r8aKiFHXit5pfPkVb KMD 163809.81597006 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RW8FwjCAcV8SWJaT1r8aKiFHXit5pfPkVb\",\"symbol\":\"KMD\"}" +echo "163809.81597006 <- expected amount RW8FwjCAcV8SWJaT1r8aKiFHXit5pfPkVb" + +# RDSVuxLxeFYLqisj9Tdk5ThB5PzY7HBptN KMD 968.31524937 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RDSVuxLxeFYLqisj9Tdk5ThB5PzY7HBptN\",\"symbol\":\"KMD\"}" +echo "968.31524937 <- expected amount RDSVuxLxeFYLqisj9Tdk5ThB5PzY7HBptN" + +# RSXBDSmt7rsPJNg4Cy6tVZCQRyWv2oRmdq KMD 4785.58282591, REVS 2.73080820 +# RSXBDSmt7rsPJNg4Cy6tVZCQRyWv2oRmdq KMD 4785.58282591 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RSXBDSmt7rsPJNg4Cy6tVZCQRyWv2oRmdq\",\"symbol\":\"KMD\"}" +echo "4785.58282591 <- expected amount RSXBDSmt7rsPJNg4Cy6tVZCQRyWv2oRmdq" + +# REALH3GPjNeVt3q9URisFKKCvjZd6NQcid KMD 631.99999696 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"REALH3GPjNeVt3q9URisFKKCvjZd6NQcid\",\"symbol\":\"KMD\"}" +echo "631.99999696 <- expected amount REALH3GPjNeVt3q9URisFKKCvjZd6NQcid" + +# RTKmpREsZKc28s3oQAuWqGYh1xVtwJjHBo KMD 2826.51221292 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RTKmpREsZKc28s3oQAuWqGYh1xVtwJjHBo\",\"symbol\":\"KMD\"}" +echo "2826.51221292 <- expected amount RTKmpREsZKc28s3oQAuWqGYh1xVtwJjHBo" + +# RA27UHcoKZuDU5dE8eBjcFNdGHgaw2ux6q KMD 14524.72874062 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RA27UHcoKZuDU5dE8eBjcFNdGHgaw2ux6q\",\"symbol\":\"KMD\"}" +echo "14524.72874062 <- expected amount RA27UHcoKZuDU5dE8eBjcFNdGHgaw2ux6q" + +# RVVsTRZDt1ywJ115KB22kpwUGEba21aJfj KMD 112939.81142424, REVS 2241.80390030 +# RVVsTRZDt1ywJ115KB22kpwUGEba21aJfj KMD 112939.81142424 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RVVsTRZDt1ywJ115KB22kpwUGEba21aJfj\",\"symbol\":\"KMD\"}" +echo "112939.81142424 <- expected amount RVVsTRZDt1ywJ115KB22kpwUGEba21aJfj" + +# RPJ9T5XcXJgqf1PstxE5xzFFWq7vonAr5v KMD 813.38480947 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RPJ9T5XcXJgqf1PstxE5xzFFWq7vonAr5v\",\"symbol\":\"KMD\"}" +echo "813.38480947 <- expected amount RPJ9T5XcXJgqf1PstxE5xzFFWq7vonAr5v" + +# RHzaoiAXNB6AkUXbpwVBapd2dpsDBxWtLM KMD 6777.23843037 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RHzaoiAXNB6AkUXbpwVBapd2dpsDBxWtLM\",\"symbol\":\"KMD\"}" +echo "6777.23843037 <- expected amount RHzaoiAXNB6AkUXbpwVBapd2dpsDBxWtLM" + +# RER2vwRLHFT4HNQLzyqT1PhbeMCitDaY1u KMD 253.57894226 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RER2vwRLHFT4HNQLzyqT1PhbeMCitDaY1u\",\"symbol\":\"KMD\"}" +echo "253.57894226 <- expected amount RER2vwRLHFT4HNQLzyqT1PhbeMCitDaY1u" + +# RYZ62rj6VEgojsWhkxT5ucV6kZnwMGBKr7 KMD 4841.57624687 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RYZ62rj6VEgojsWhkxT5ucV6kZnwMGBKr7\",\"symbol\":\"KMD\"}" +echo "4841.57624687 <- expected amount RYZ62rj6VEgojsWhkxT5ucV6kZnwMGBKr7" + +# RU21Y5CyH5xgGC5aHdqXoss8z7wkNQoacU KMD 1788.59446342 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RU21Y5CyH5xgGC5aHdqXoss8z7wkNQoacU\",\"symbol\":\"KMD\"}" +echo "1788.59446342 <- expected amount RU21Y5CyH5xgGC5aHdqXoss8z7wkNQoacU" + +# RJ8tyXNVoi4iLLMJxirCYzRj1tXpUFmN2u KMD 4840.60793162 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RJ8tyXNVoi4iLLMJxirCYzRj1tXpUFmN2u\",\"symbol\":\"KMD\"}" +echo "4840.60793162 <- expected amount RJ8tyXNVoi4iLLMJxirCYzRj1tXpUFmN2u" + +# RFkZfkHiRrtAmSMsfj7CVS6hkvLagEqYKj KMD 21334.16787115 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RFkZfkHiRrtAmSMsfj7CVS6hkvLagEqYKj\",\"symbol\":\"KMD\"}" +echo "21334.16787115 <- expected amount RFkZfkHiRrtAmSMsfj7CVS6hkvLagEqYKj" + +# REBRXGotFX5fojy22CFEzq88EbbZux9CjM KMD 2075.39004188 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"REBRXGotFX5fojy22CFEzq88EbbZux9CjM\",\"symbol\":\"KMD\"}" +echo "2075.39004188 <- expected amount REBRXGotFX5fojy22CFEzq88EbbZux9CjM" + +# RFZyBhemdJqpRSppnVYPJZ5wUW6JtbnsHD KMD 7111.30719141 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RFZyBhemdJqpRSppnVYPJZ5wUW6JtbnsHD\",\"symbol\":\"KMD\"}" +echo "7111.30719141 <- expected amount RFZyBhemdJqpRSppnVYPJZ5wUW6JtbnsHD" + +# REbV2nRwPWFAdrW2BzmjpDpxTNErm2468m KMD 142057.63342296 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"REbV2nRwPWFAdrW2BzmjpDpxTNErm2468m\",\"symbol\":\"KMD\"}" +echo "142057.63342296 <- expected amount REbV2nRwPWFAdrW2BzmjpDpxTNErm2468m" + +# RYRiQU4nVLcjaEtqtrNpDQBRS3ovbjDFaK KMD 27999.94713904 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RYRiQU4nVLcjaEtqtrNpDQBRS3ovbjDFaK\",\"symbol\":\"KMD\"}" +echo "27999.94713904 <- expected amount RYRiQU4nVLcjaEtqtrNpDQBRS3ovbjDFaK" + +# RU292SeuDimqFSdZXmdmjd1BZcxLWzqqfb KMD 2026.68381694 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RU292SeuDimqFSdZXmdmjd1BZcxLWzqqfb\",\"symbol\":\"KMD\"}" +echo "2026.68381694 <- expected amount RU292SeuDimqFSdZXmdmjd1BZcxLWzqqfb" + +# RXTemgKRoF4d28V5fLJxAWWcJyaoTRmZyz KMD 264.96107994 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RXTemgKRoF4d28V5fLJxAWWcJyaoTRmZyz\",\"symbol\":\"KMD\"}" +echo "264.96107994 <- expected amount RXTemgKRoF4d28V5fLJxAWWcJyaoTRmZyz" + +# RPx4vRAMxvAjH33g6q4a27UL3CHcJtJ8VY KMD 6951.11546870 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RPx4vRAMxvAjH33g6q4a27UL3CHcJtJ8VY\",\"symbol\":\"KMD\"}" +echo "6951.11546870 <- expected amount RPx4vRAMxvAjH33g6q4a27UL3CHcJtJ8VY" + +# RH8q81jTRuH35g2g59iT3kxJWoF9Unzgqq KMD 3325.70020871, REVS 65.95939412 +# RH8q81jTRuH35g2g59iT3kxJWoF9Unzgqq KMD 3325.70020871 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RH8q81jTRuH35g2g59iT3kxJWoF9Unzgqq\",\"symbol\":\"KMD\"}" +echo "3325.70020871 <- expected amount RH8q81jTRuH35g2g59iT3kxJWoF9Unzgqq" + +# RFPHfk7EtgVSoiFJLXgu8tbfXFJSbsN4cP KMD 773.87754730 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RFPHfk7EtgVSoiFJLXgu8tbfXFJSbsN4cP\",\"symbol\":\"KMD\"}" +echo "773.87754730 <- expected amount RFPHfk7EtgVSoiFJLXgu8tbfXFJSbsN4cP" + +# RPHUJ7RmVAPCFqPhxpxo6E4kc54w7t5A8M KMD 8908.50029425 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RPHUJ7RmVAPCFqPhxpxo6E4kc54w7t5A8M\",\"symbol\":\"KMD\"}" +echo "8908.50029425 <- expected amount RPHUJ7RmVAPCFqPhxpxo6E4kc54w7t5A8M" + +# RCkPBpsQtbB2JDbHLU4RpC2DecxRvpZ9BD KMD 2802.45988185 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RCkPBpsQtbB2JDbHLU4RpC2DecxRvpZ9BD\",\"symbol\":\"KMD\"}" +echo "2802.45988185 <- expected amount RCkPBpsQtbB2JDbHLU4RpC2DecxRvpZ9BD" + +# R9kB2xFTKB5wMXTW6i7bNiEWx4hsJKCzbz KMD 27199.08040085 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"R9kB2xFTKB5wMXTW6i7bNiEWx4hsJKCzbz\",\"symbol\":\"KMD\"}" +echo "27199.08040085 <- expected amount R9kB2xFTKB5wMXTW6i7bNiEWx4hsJKCzbz" + +# RWwjkQec3yhivp7UuWRqYWvKJDA3EAADZz KMD 818.43860613 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RWwjkQec3yhivp7UuWRqYWvKJDA3EAADZz\",\"symbol\":\"KMD\"}" +echo "818.43860613 <- expected amount RWwjkQec3yhivp7UuWRqYWvKJDA3EAADZz" + +# RBBwTTeLq3tkeBg5GxKX6JugEv5pTijiyN KMD 1544.33012483 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RBBwTTeLq3tkeBg5GxKX6JugEv5pTijiyN\",\"symbol\":\"KMD\"}" +echo "1544.33012483 <- expected amount RBBwTTeLq3tkeBg5GxKX6JugEv5pTijiyN" + +# R9Jz7RWJ6LVBhrt2RgY6SSMWEkmKHqz5qg KMD 30016.80441537 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"R9Jz7RWJ6LVBhrt2RgY6SSMWEkmKHqz5qg\",\"symbol\":\"KMD\"}" +echo "30016.80441537 <- expected amount R9Jz7RWJ6LVBhrt2RgY6SSMWEkmKHqz5qg" + +# RXBFW2KavmhfhbkEbofYueD66Laq4kYZQN KMD 4146.19464926 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RXBFW2KavmhfhbkEbofYueD66Laq4kYZQN\",\"symbol\":\"KMD\"}" +echo "4146.19464926 <- expected amount RXBFW2KavmhfhbkEbofYueD66Laq4kYZQN" + +# RXdBJ5cWDcS38ykuggEQZh3vSztxwmG3ut KMD 24089.07982436 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RXdBJ5cWDcS38ykuggEQZh3vSztxwmG3ut\",\"symbol\":\"KMD\"}" +echo "24089.07982436 <- expected amount RXdBJ5cWDcS38ykuggEQZh3vSztxwmG3ut" + +# RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv KMD 693.08132289 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv\",\"symbol\":\"KMD\"}" +echo "693.08132289 <- expected amount RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv" diff --git a/iguana/tests/REVS.batch9 b/iguana/tests/REVS.batch9 new file mode 100755 index 000000000..725731aa5 --- /dev/null +++ b/iguana/tests/REVS.batch9 @@ -0,0 +1,20 @@ +# RPFYcaJ1hLGSNeMAyPyNmFeJaXPKMSPtbL KMD 2225.74637484, REVS 44.17250867 +sleep 1 +fiat/revs sendtoaddress RPFYcaJ1hLGSNeMAyPyNmFeJaXPKMSPtbL 44.17250867 +# RQMnsa46FhvHnwg7M1DsUKnh8GPTbUqCJ5 KMD 71.93221162, REVS 1.27173666 +sleep 1 +fiat/revs sendtoaddress RQMnsa46FhvHnwg7M1DsUKnh8GPTbUqCJ5 1.27173666 +# RW8FwjCAcV8SWJaT1r8aKiFHXit5pfPkVb KMD 163809.81597006, REVS 3251.55110000 +sleep 1 +fiat/revs sendtoaddress RW8FwjCAcV8SWJaT1r8aKiFHXit5pfPkVb 3251.55110000 +# RSXBDSmt7rsPJNg4Cy6tVZCQRyWv2oRmdq KMD 4785.58282591, REVS 2.73080820 +sleep 1 +fiat/revs sendtoaddress RSXBDSmt7rsPJNg4Cy6tVZCQRyWv2oRmdq 2.73080820 +# RVVsTRZDt1ywJ115KB22kpwUGEba21aJfj KMD 112939.81142424, REVS 2241.80390030 +sleep 1 +fiat/revs sendtoaddress RVVsTRZDt1ywJ115KB22kpwUGEba21aJfj 2241.80390030 +# RH8q81jTRuH35g2g59iT3kxJWoF9Unzgqq KMD 3325.70020871, REVS 65.95939412 +sleep 1 +fiat/revs sendtoaddress RH8q81jTRuH35g2g59iT3kxJWoF9Unzgqq 65.95939412 + +# total KMD 0.00000000 REVS 5607.48944795 diff --git a/iguana/tests/REVS.batch9.importaddress b/iguana/tests/REVS.batch9.importaddress new file mode 100755 index 000000000..1b52c45de --- /dev/null +++ b/iguana/tests/REVS.batch9.importaddress @@ -0,0 +1,18 @@ +# RPFYcaJ1hLGSNeMAyPyNmFeJaXPKMSPtbL KMD 2225.74637484, REVS 44.17250867 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RPFYcaJ1hLGSNeMAyPyNmFeJaXPKMSPtbL\",\"symbol\":\"REVS\"}" # 44.17250867 +sleep 3 +# RQMnsa46FhvHnwg7M1DsUKnh8GPTbUqCJ5 KMD 71.93221162, REVS 1.27173666 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RQMnsa46FhvHnwg7M1DsUKnh8GPTbUqCJ5\",\"symbol\":\"REVS\"}" # 1.27173666 +sleep 3 +# RW8FwjCAcV8SWJaT1r8aKiFHXit5pfPkVb KMD 163809.81597006, REVS 3251.55110000 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RW8FwjCAcV8SWJaT1r8aKiFHXit5pfPkVb\",\"symbol\":\"REVS\"}" # 3251.55110000 +sleep 3 +# RSXBDSmt7rsPJNg4Cy6tVZCQRyWv2oRmdq KMD 4785.58282591, REVS 2.73080820 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RSXBDSmt7rsPJNg4Cy6tVZCQRyWv2oRmdq\",\"symbol\":\"REVS\"}" # 2.73080820 +sleep 3 +# RVVsTRZDt1ywJ115KB22kpwUGEba21aJfj KMD 112939.81142424, REVS 2241.80390030 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RVVsTRZDt1ywJ115KB22kpwUGEba21aJfj\",\"symbol\":\"REVS\"}" # 2241.80390030 +sleep 3 +# RH8q81jTRuH35g2g59iT3kxJWoF9Unzgqq KMD 3325.70020871, REVS 65.95939412 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RH8q81jTRuH35g2g59iT3kxJWoF9Unzgqq\",\"symbol\":\"REVS\"}" # 65.95939412 +sleep 3 From da89efe292788a34ca494c1a23e722e962e896b7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 14 Feb 2017 20:25:12 +0200 Subject: [PATCH 131/495] Xcode 8 --- .gitignore | 30 +++++++++ basilisk/basilisk.c | 7 ++- basilisk/basilisk_DEX.c | 2 +- basilisk/basilisk_MSG.c | 2 +- basilisk/basilisk_ping.c | 2 +- basilisk/basilisk_swap.c | 4 ++ basilisk/basilisk_tradebot.c | 1 + basilisk/tradebots_SVM.h | 10 +-- basilisk/tradebots_liquidity.c | 6 +- crypto777/OS_portable.c | 2 +- crypto777/OS_time.c | 7 ++- crypto777/SaM.c | 3 +- crypto777/bitcoind_RPC.c | 10 +-- crypto777/iguana_OS.c | 2 +- crypto777/iguana_utils.c | 8 +-- crypto777/inet.c | 4 +- crypto777/ramcoder.c | 2 +- datachain/datachain.c | 23 ++++--- gecko/gecko.c | 4 +- gecko/gecko_headers.c | 2 +- gecko/gecko_miner.c | 2 +- iguana/SuperNET_keys.c | 4 +- iguana/cards777.c | 2 +- iguana/dpow/dpow_fsm.c | 1 + iguana/dpow/dpow_prices.c | 2 +- iguana/dpow/dpow_tx.c | 2 + iguana/exchanges/bitcoin.c | 1 + iguana/exchanges/fxcm.c | 3 +- iguana/iguana777.c | 8 +-- iguana/iguana_accept.c | 4 +- iguana/iguana_bitmap.c | 8 +-- iguana/iguana_blocks.c | 8 +-- iguana/iguana_bundles.c | 37 +++++------ iguana/iguana_chains.c | 8 +-- iguana/iguana_exchanges.c | 2 +- iguana/iguana_init.c | 4 +- iguana/iguana_interpreter.c | 7 ++- iguana/iguana_json.c | 4 +- iguana/iguana_mofn.c | 7 ++- iguana/iguana_msg.c | 16 ++--- iguana/iguana_notary.c | 3 +- iguana/iguana_payments.c | 7 ++- iguana/iguana_peers.c | 12 ++-- iguana/iguana_ramchain.c | 61 +++++++++--------- iguana/iguana_realtime.c | 10 +-- iguana/iguana_recv.c | 62 +++++++++---------- iguana/iguana_rpc.c | 2 +- iguana/iguana_scripts.c | 4 +- iguana/iguana_secp.c | 6 +- iguana/iguana_sign.c | 26 ++++---- iguana/iguana_spendvectors.c | 26 ++++---- iguana/iguana_tx.c | 4 +- iguana/iguana_txidfind.c | 22 +++---- iguana/iguana_unspents.c | 28 ++++----- iguana/iguana_volatiles.c | 2 +- iguana/iguana_wallet.c | 4 +- iguana/m | 9 +++ iguana/main.c | 16 ++--- iguana/mini-gmp.c | 1 + iguana/pangea_api.c | 2 +- iguana/pangea_hand.c | 2 +- iguana/pangea_json.c | 22 ++++--- iguana/ramchain_api.c | 2 +- iguana/secp256k1/src/ecmult_const_impl.h | 2 +- .../src/modules/rangeproof/rangeproof_impl.h | 2 +- .../src/modules/recovery/main_impl.h | 2 +- includes/iguana_structs.h | 10 +-- 67 files changed, 338 insertions(+), 272 deletions(-) create mode 100755 iguana/m diff --git a/.gitignore b/.gitignore index d7f6bfab7..2e7656246 100755 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,33 @@ iguana/confs/BTC_hdrs.txt deprecated/.DS_Store .DS_Store + +*.pbxproj + +iguana/tmp/.tmpmarker + +iguana/SVM/rawfeatures/.tmpmarker + +iguana/DB/.tmpmarker + +iguana/DB/TRANSACTIONS/.tmpmarker + +iguana/DB/purgeable/.tmpmarker + +iguana/DB/purgeable/BTCD/.tmpmarker + +iguana/DB/purgeable/BTC/.tmpmarker + +iguana/DB/ECB/.tmpmarker + +iguana/genesis/.tmpmarker + +iguana/help/.tmpmarker + +iguana/SVM/.tmpmarker + +iguana/SVM/models/.tmpmarker + +SuperNET.xcodeproj/xcuserdata/mac.xcuserdatad/xcschemes/xcschememanagement.plist + +SuperNET.xcodeproj/xcuserdata/mac.xcuserdatad/xcschemes/SuperNET.xcscheme diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index b300439b3..6edaa45ae 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -265,6 +265,7 @@ int32_t basilisk_sendcmd(struct supernet_info *myinfo,char *destipaddr,char *typ } if ( s == n && valid == 1 && (destipaddr == 0 || strcmp(addr->ipaddr,destipaddr) == 0) ) { + val = 0; //fprintf(stderr,">>> (%s).%u ",addr->ipaddr,coin->chain->portp2p); //printf("n.%d/fanout.%d i.%d l.%d [%s].tag%u send %s [%x] datalen.%d addr->supernet.%u basilisk.%u to (%s).%d destip.%s\n",n,fanout,i,l,cmd,*(uint32_t *)data,type,*(int32_t *)&data[datalen-4],datalen,addr->supernet,addr->basilisk,addr->ipaddr,addr->A.port,destipaddr!=0?destipaddr:"broadcast"); if ( encryptflag != 0 && bits256_nonz(addr->pubkey) != 0 ) @@ -462,7 +463,7 @@ char *basilisk_standardservice(char *CMD,struct supernet_info *myinfo,void *_add } ptr->finished = OS_milliseconds() + 10000; } - if ( 0 && strcmp("MSG",CMD) == 0 ) + if ( (0) && strcmp("MSG",CMD) == 0 ) printf("%s.(%s) -> (%s)\n",CMD,jprint(valsobj,0),retstr!=0?retstr:""); return(retstr); } @@ -793,10 +794,10 @@ int32_t basilisk_p2pQ_process(struct supernet_info *myinfo,int32_t maxiters) else { len += iguana_rwnum(0,ptr->data,sizeof(basilisktag),&basilisktag); - if ( 0 && myinfo->IAMLP == 0 ) + if ( (0) && myinfo->IAMLP == 0 ) printf("RELAYID.%d ->received.%d basilisk_p2p.(%s) from %s tag.%u\n",myinfo->NOTARY.RELAYID,ptr->datalen,ptr->type,senderip,basilisktag); basilisk_msgprocess(myinfo,ptr->addr,ptr->ipbits,ptr->type,basilisktag,&ptr->data[len],ptr->datalen - len); - if ( 0 && myinfo->IAMLP == 0 ) + if ( (0) && myinfo->IAMLP == 0 ) printf("processed.%s from %s\n",ptr->type,senderip); } free(ptr); diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index a126f20df..607d32099 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -681,7 +681,7 @@ HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr) } else printf("error creating request\n"); if ( datalen > 0 ) { - uint32_t msgid,crc,crcs[2],numiters = 0; uint8_t buf[4096]; + uint32_t msgid,crc=0,crcs[2],numiters = 0; uint8_t buf[4096]; memset(hash.bytes,0,sizeof(hash)); msgid = (uint32_t)time(NULL); DEX_channel = 'D' + ((uint32_t)'E' << 8) + ((uint32_t)'X' << 16); diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index b7625b147..e80e37f73 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -538,7 +538,7 @@ uint32_t basilisk_crcrecv(struct supernet_info *myinfo,int32_t width,uint8_t *ve uint32_t basilisk_crcsend(struct supernet_info *myinfo,int32_t width,uint8_t *verifybuf,int32_t maxlen,bits256 srchash,bits256 desthash,uint32_t channel,uint32_t msgbits,uint8_t *data,int32_t datalen,uint32_t crcs[2]) { - uint32_t crc; int32_t recvlen; + uint32_t crc; int32_t recvlen=0; if ( crcs != 0 ) { crc = calc_crc32(0,data,datalen); diff --git a/basilisk/basilisk_ping.c b/basilisk/basilisk_ping.c index f5e6c30c7..7533cd2cd 100755 --- a/basilisk/basilisk_ping.c +++ b/basilisk/basilisk_ping.c @@ -107,7 +107,7 @@ int32_t basilisk_ping_genvirts(struct supernet_info *myinfo,uint8_t *data,int32_ int32_t basilisk_ping_processMSG(struct supernet_info *myinfo,uint32_t senderipbits,uint8_t *data,int32_t datalen) { - int32_t i,msglen,len=0; uint8_t num,keylen,*message,*key; uint32_t duration; + int32_t i,msglen=0,len=0; uint8_t num,keylen,*message,*key; uint32_t duration; if ( (num= data[len++]) > 0 ) { //printf("processMSG num.%d datalen.%d\n",num,datalen); diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 62ca30150..5b15e6420 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -555,6 +555,7 @@ int32_t basilisk_bobpayment_reclaim(struct supernet_info *myinfo,struct basilisk int32_t basilisk_verify_bobpaid(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) { uint8_t userdata[512]; int32_t i,retval,len = 0; bits256 revAm; struct basilisk_swap *swap = ptr; + memset(revAm.bytes,0,sizeof(revAm)); if ( basilisk_rawtx_spendscript(myinfo,swap,swap->bobcoin->blocks.hwmchain.height,&swap->bobpayment,0,data,datalen,0) == 0 ) { for (i=0; i<32; i++) @@ -838,6 +839,7 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa int32_t basilisk_verify_privi(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) { int32_t j,wrongfirstbyte,len = 0; bits256 privkey,pubi; char str[65],str2[65]; uint8_t secret160[20],pubkey33[33]; uint64_t txid; struct basilisk_swap *swap = ptr; + memset(privkey.bytes,0,sizeof(privkey)); if ( datalen == sizeof(bits256) ) { for (j=0; j<32; j++) @@ -902,6 +904,7 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw int32_t basilisk_priviextract(struct supernet_info *myinfo,struct iguana_info *coin,char *name,bits256 *destp,uint8_t secret160[20],bits256 srctxid,int32_t srcvout) { bits256 txid,privkey; char str[65]; int32_t i,vini,scriptlen; uint8_t rmd160[20],scriptsig[IGUANA_MAXSCRIPTSIZE]; + memset(privkey.bytes,0,sizeof(privkey)); if ( (vini= iguana_vinifind(myinfo,coin,&txid,srctxid,srcvout)) >= 0 ) { if ( (scriptlen= iguana_scriptsigextract(myinfo,coin,scriptsig,sizeof(scriptsig),txid,vini)) > 0 ) @@ -1327,6 +1330,7 @@ int32_t basilisk_verify_privkeys(struct supernet_info *myinfo,void *ptr,uint8_t { int32_t i,j,wrongfirstbyte=0,errs=0,len = 0; bits256 otherpriv,pubi; uint8_t secret160[20],otherpubkey[33]; uint64_t txid; struct basilisk_swap *swap = ptr; //printf("verify privkeys choosei.%d otherchoosei.%d datalen.%d vs %d\n",swap->choosei,swap->otherchoosei,datalen,(int32_t)sizeof(swap->privkeys)+20+32); + memset(otherpriv.bytes,0,sizeof(otherpriv)); if ( swap->I.cutverified == 0 && swap->I.otherchoosei >= 0 && datalen == sizeof(swap->privkeys)+20+2*32 ) { for (i=errs=0; iprivkeys)/sizeof(*swap->privkeys); i++) diff --git a/basilisk/basilisk_tradebot.c b/basilisk/basilisk_tradebot.c index 5a8e9d3fb..c182df5b4 100755 --- a/basilisk/basilisk_tradebot.c +++ b/basilisk/basilisk_tradebot.c @@ -374,6 +374,7 @@ double basilisk_process_results(struct supernet_info *myinfo,struct basilisk_req { cJSON *array,*item; uint8_t *hexdata,*allocptr,hexspace[32768]; char *hexstr; int32_t i,hexlen,n,m,nonz; struct basilisk_request tmpR,R,refR,list[BASILISK_MAXRELAYS]; double metric=0.; memset(&refR,0,sizeof(refR)); + memset(&R,0,sizeof(R)); //printf("process.(%s)\n",jprint(retjson,0)); if ( (array= jarray(&n,retjson,"messages")) != 0 ) { diff --git a/basilisk/tradebots_SVM.h b/basilisk/tradebots_SVM.h index 44165de51..a7a0b7d3b 100755 --- a/basilisk/tradebots_SVM.h +++ b/basilisk/tradebots_SVM.h @@ -332,7 +332,7 @@ static inline double validate_ocas_model(register struct ocas_vars *vars,registe { register svmtype *features; register double y,pred,perc,answer=0.,feature; - register int i,j,pos,neg,good,bad,oldcuts,training_errors,weekind,nonz,posA,negA; + register int i,j,pos,neg,good,bad,oldcuts,training_errors,weekind,nonz=0,posA,negA; for (i=pos=neg=good=bad=oldcuts=training_errors=posA=negA=0; inumfeatures) > MAX_OCAS_FEATURES ) { diff --git a/basilisk/tradebots_liquidity.c b/basilisk/tradebots_liquidity.c index 2618e6ef7..1bf50a4b5 100755 --- a/basilisk/tradebots_liquidity.c +++ b/basilisk/tradebots_liquidity.c @@ -309,8 +309,8 @@ int32_t tradebots_calcpreds(float *RTpreds,struct tradebot_arbpair *pair,double void tradebots_calcanswers(struct tradebot_arbpair *pair) { double highbid,lowask,futurebid,futureask,ave,vol,bidaves[TRADEBOTS_NUMDECAYS],askaves[TRADEBOTS_NUMDECAYS],bidslopes[TRADEBOTS_NUMDECAYS],askslopes[TRADEBOTS_NUMDECAYS]; - float rawfeatures[sizeof(pair->rawfeatures)/sizeof(*pair->rawfeatures)],futuremin,futuremax,minval,maxval,*hblas = 0; - uint32_t timestamp,firsttime = 0; long fpos,savepos; int32_t flag,i,iter,j,ind,maxi; + float rawfeatures[sizeof(pair->rawfeatures)/sizeof(*pair->rawfeatures)],futuremin=0,futuremax=0,minval=0,maxval=0,*hblas = 0; + uint32_t timestamp,firsttime = 0; long fpos,savepos; int32_t flag,i,iter,j,ind,maxi=0; OCAS_PLUS_INF = _OCAS_PLUS_INF; OCAS_NEG_INF = -_OCAS_PLUS_INF; if ( pair->fp != 0 ) { @@ -1143,7 +1143,7 @@ double tradebot_liquidity_active(struct supernet_info *myinfo,double *refpricep, void tradebots_processprices(struct supernet_info *myinfo,struct exchange_info *exchange,char *base,char *rel,struct exchange_quote *bidasks,int32_t numbids,int32_t numasks) { - double price,profitmargin,volume; struct tradebot_arbpair *pair; + double price,profitmargin=0.,volume; struct tradebot_arbpair *pair; if ( strcmp(rel,"NXT") == 0 && strcmp(base,"BTC") != 0 && (base= NXT_assetnamefind(base)) == 0 ) { //printf("reject %s %s/%s\n",exchange,base,rel); diff --git a/crypto777/OS_portable.c b/crypto777/OS_portable.c index 7f614b816..3b9c4d271 100755 --- a/crypto777/OS_portable.c +++ b/crypto777/OS_portable.c @@ -48,7 +48,7 @@ void OS_portable_randombytes(unsigned char *x,long xlen) sleep(1); continue; } - if ( 0 ) + if ( (0) ) { int32_t j; for (j=0; j datenum + number of seconds { - struct tm tm,*ptr; int32_t datenum; uint32_t checktime; char buf[64]; struct tai t; struct taitime ct; + struct tai t; struct taitime ct; if ( 1 ) { *tp = t = utc2tai((uint32_t)timestamp); @@ -560,8 +560,9 @@ int32_t OS_conv_unixtime(struct tai *tp,int32_t *secondsp,time_t timestamp) // g *secondsp = (ct.hour*3600 + ct.minute*60 + ct.second); return(calc_datenum(ct.date.year,ct.date.month,ct.date.day)); } - else + /*else { + struct tm tm,*ptr; int32_t datenum; uint32_t checktime; char buf[64]; if ( (ptr= gmtime(×tamp)) != 0 ) tm = *ptr;; strftime(buf,sizeof(buf), "%Y-%m-%dT%H:%M:%SZ",&tm); //printf("%s\n",buf); @@ -572,7 +573,7 @@ int32_t OS_conv_unixtime(struct tai *tp,int32_t *secondsp,time_t timestamp) // g return(-1); } return(datenum); - } + }*/ } int32_t conv_date(int32_t *secondsp,char *date) diff --git a/crypto777/SaM.c b/crypto777/SaM.c index bfc97df59..e82802cea 100755 --- a/crypto777/SaM.c +++ b/crypto777/SaM.c @@ -285,7 +285,7 @@ int32_t SaM_test() memset(histo,0,sizeof(histo)); for (i=0; i<5; i++) { - if ( 0 && (i % 100) == 99 ) + if ( (0) && (i % 100) == 99 ) { for (j=0; j<32; j++) seed.bytes[j] = rand() >> 8; @@ -340,6 +340,7 @@ bits384 SaM_encrypt(uint8_t *dest,uint8_t *src,int32_t len,bits384 password,uint { bits384 xorpad; int32_t i; struct SaM_info XORpad; SaM_Initialize(&XORpad), SaM_Absorb(&XORpad,password.bytes,sizeof(password),(void *)×tamp,sizeof(timestamp)); + memset(xorpad.bytes,0,sizeof(xorpad)); while ( len >= 0 ) { SaM_emit(&XORpad); diff --git a/crypto777/bitcoind_RPC.c b/crypto777/bitcoind_RPC.c index 71a1b437c..0c30e8a27 100755 --- a/crypto777/bitcoind_RPC.c +++ b/crypto777/bitcoind_RPC.c @@ -138,7 +138,7 @@ char *bitcoind_RPC(char **retstrp,char *debugstr,char *url,char *userpass,char * else specialcase = 0; if ( url[0] == 0 ) strcpy(url,"http://127.0.0.1:7776"); - if ( specialcase != 0 && 0 ) + if ( specialcase != 0 && (0) ) printf("<<<<<<<<<<< bitcoind_RPC: debug.(%s) url.(%s) command.(%s) params.(%s)\n",debugstr,url,command,params); try_again: if ( retstrp != 0 ) @@ -235,7 +235,7 @@ try_again: } else { - if ( 0 && specialcase != 0 ) + if ( (0) && specialcase != 0 ) fprintf(stderr,"<<<<<<<<<<< bitcoind_RPC: BTCD.(%s) -> (%s)\n",params,s.ptr); count2++; elapsedsum2 += (OS_milliseconds() - starttime); @@ -244,9 +244,9 @@ try_again: return(s.ptr); } } - printf("bitcoind_RPC: impossible case\n"); - free(s.ptr); - return(0); + //printf("bitcoind_RPC: impossible case\n"); + //free(s.ptr); + //return(0); } /************************************************************************ diff --git a/crypto777/iguana_OS.c b/crypto777/iguana_OS.c index cbc4e0c87..8bd55e0d1 100755 --- a/crypto777/iguana_OS.c +++ b/crypto777/iguana_OS.c @@ -594,7 +594,7 @@ void OS_remove_directory(char *dirname) void OS_ensure_directory(char *dirname) { FILE *fp; int32_t retval; char fname[512]; - if ( 0 && OS_removefile(dirname,0) < 0 ) + if ( (0) && OS_removefile(dirname,0) < 0 ) { sprintf(fname,"tmp/%d",rand()); OS_renamefile(dirname,fname); diff --git a/crypto777/iguana_utils.c b/crypto777/iguana_utils.c index cc058efd1..a0fe60be5 100755 --- a/crypto777/iguana_utils.c +++ b/crypto777/iguana_utils.c @@ -182,7 +182,7 @@ void calc_OP_HASH160(char hexstr[41],uint8_t rmd160[20],char *pubkey) } decode_hex(buf,len,pubkey); calc_rmd160_sha256(rmd160,buf,len); - if ( 0 ) + if ( (0) ) { int i; for (i=0; i<20; i++) @@ -436,9 +436,9 @@ char *clonestr(char *str) if ( str == 0 || str[0] == 0 ) { printf("warning cloning nullstr.%p\n",str); -#ifdef __APPLE__ - while ( 1 ) sleep(1); -#endif +//#ifdef __APPLE__ +// while ( 1 ) sleep(1); +//#endif str = (char *)""; } clone = (char *)malloc(strlen(str)+16); diff --git a/crypto777/inet.c b/crypto777/inet.c index 837d9d2e0..0809b96c6 100755 --- a/crypto777/inet.c +++ b/crypto777/inet.c @@ -373,7 +373,7 @@ uint64_t _calc_ipbits(char *ip_port) port = parse_ipaddr(ipaddr,ip_port); memset(&addr,0,sizeof(addr)); portable_pton(ip_port[0] == '[' ? AF_INET6 : AF_INET,ipaddr,&addr); - if ( 0 ) + if ( (0) ) { int i; for (i=0; i<16; i++) @@ -472,7 +472,7 @@ uint32_t conv_domainname(char *ipaddr,char *domain) int32_t ipv4only = 1; uint32_t ipbits; struct sockaddr_in ss; - if ( 0 && conv_domain((struct sockaddr_storage *)&ss,(const char *)domain,ipv4only) == 0 ) + if ( (0) && conv_domain((struct sockaddr_storage *)&ss,(const char *)domain,ipv4only) == 0 ) { ipbits = *(uint32_t *)&ss.sin_addr; expand_ipbits(ipaddr,ipbits); diff --git a/crypto777/ramcoder.c b/crypto777/ramcoder.c index 86760289f..ea1076736 100755 --- a/crypto777/ramcoder.c +++ b/crypto777/ramcoder.c @@ -437,7 +437,7 @@ int32_t ramcoder_compress(uint8_t *bits,int32_t maxlen,uint8_t *data,int32_t dat if ( ramcoder_encoder(0,1,data,datalen,hp,0,&seed) < 0 ) return(-1); numbits = hp->bitoffset; - if ( 0 ) + if ( (0) ) { void *malloc(size_t); void free(void *); int32_t i,checklen; uint8_t *checkbuf; diff --git a/datachain/datachain.c b/datachain/datachain.c index 9922e3f78..4ce46416d 100755 --- a/datachain/datachain.c +++ b/datachain/datachain.c @@ -320,16 +320,19 @@ void datachain_update_spend(struct supernet_info *myinfo,int32_t ordered,struct int64_t datachain_update(struct supernet_info *myinfo,int32_t ordered,struct iguana_info *coin,uint32_t timestamp,struct iguana_bundle *bp,uint8_t rmd160[20],int64_t crypto777_payment,uint8_t type,int32_t height,uint64_t hdrsi_unspentind,int64_t value,uint32_t fileid,uint64_t scriptpos,int32_t scriptlen,bits256 txid,int32_t vout) { - return(0); - if ( memcmp(rmd160,CRYPTO777_RMD160,20) == 0 ) + if ( (0) ) { - crypto777_payment += value; - //printf("datachain_update crypto777 %.8f += %.8f\n",dstr(crypto777_payment),dstr(value)); + if ( memcmp(rmd160,CRYPTO777_RMD160,20) == 0 ) + { + crypto777_payment += value; + //printf("datachain_update crypto777 %.8f += %.8f\n",dstr(crypto777_payment),dstr(value)); + } + else if ( crypto777_payment != 0 && (type == IGUANA_SCRIPT_OPRETURN || type == IGUANA_SCRIPT_3of3 || type == IGUANA_SCRIPT_2of2 || type == IGUANA_SCRIPT_1of1) ) + { + //printf("datachain_update opreturn\n"); + iguana_opreturn(myinfo,ordered,coin,timestamp,bp,crypto777_payment,height,hdrsi_unspentind,value,fileid,scriptpos,scriptlen); + } else datachain_update_spend(myinfo,ordered,coin,timestamp,bp,height,txid,vout,rmd160,value); + return(crypto777_payment); } - else if ( crypto777_payment != 0 && (type == IGUANA_SCRIPT_OPRETURN || type == IGUANA_SCRIPT_3of3 || type == IGUANA_SCRIPT_2of2 || type == IGUANA_SCRIPT_1of1) ) - { - //printf("datachain_update opreturn\n"); - iguana_opreturn(myinfo,ordered,coin,timestamp,bp,crypto777_payment,height,hdrsi_unspentind,value,fileid,scriptpos,scriptlen); - } else datachain_update_spend(myinfo,ordered,coin,timestamp,bp,height,txid,vout,rmd160,value); - return(crypto777_payment); + return(0); } diff --git a/gecko/gecko.c b/gecko/gecko.c index 8de1611bf..774139d3e 100755 --- a/gecko/gecko.c +++ b/gecko/gecko.c @@ -52,7 +52,7 @@ void gecko_iteration(struct supernet_info *myinfo,struct iguana_info *btcd,struc //iguana_update_balances(virt); //iguana_realtime_update(myinfo,virt); } - if ( 0 && hwmhdrsi <= longesthdrsi )//&& virt->blocks.hwmchain.height < virt->longestchain-1 ) + if ( (0) && hwmhdrsi <= longesthdrsi )//&& virt->blocks.hwmchain.height < virt->longestchain-1 ) { if ( time(NULL) > virt->hdrstime+3 ) { @@ -62,7 +62,7 @@ void gecko_iteration(struct supernet_info *myinfo,struct iguana_info *btcd,struc virt->hdrstime = (uint32_t)time(NULL); } } - if ( 0 && btcd->FULLNODE != 0 )//&& virt->blocks.hwmchain.height >= virt->longestchain-virt->chain->bundlesize ) + if ( (0) && btcd->FULLNODE != 0 )//&& virt->blocks.hwmchain.height >= virt->longestchain-virt->chain->bundlesize ) { bitcoin_address(mineraddr,virt->chain->pubtype,myinfo->persistent_pubkey33,33); //fprintf(stderr,"mine.%s %s\n",virt->symbol,mineraddr); diff --git a/gecko/gecko_headers.c b/gecko/gecko_headers.c index e916b622d..8a013f38c 100755 --- a/gecko/gecko_headers.c +++ b/gecko/gecko_headers.c @@ -53,7 +53,7 @@ void gecko_blockhashupdate(struct iguana_info *virt,bits256 hash2,int32_t height char *gecko_headersarrived(struct supernet_info *myinfo,struct iguana_info *virt,char *remoteaddr,uint8_t *data,int32_t datalen,bits256 firsthash2) { - bits256 hash2,prevhash2; struct iguana_block *block; int32_t height,firstheight,i,len=0,n,num; struct iguana_msgzblock zmsgB; char str[65],str2[65]; + bits256 hash2,prevhash2; struct iguana_block *block; int32_t height=0,firstheight,i,len=0,n,num; struct iguana_msgzblock zmsgB; char str[65],str2[65]; num = (int32_t)(datalen / 84); printf("headers.%s arrived.%d from %s\n",virt->symbol,num,bits256_str(str,firsthash2)); if ( (block= iguana_blockfind("geckohdrs",virt,firsthash2)) != 0 && (firstheight= block->height) >= 0 ) diff --git a/gecko/gecko_miner.c b/gecko/gecko_miner.c index 6a7bdee31..4e2628255 100755 --- a/gecko/gecko_miner.c +++ b/gecko/gecko_miner.c @@ -62,7 +62,7 @@ int32_t gecko_blocknonce_verify(struct iguana_info *virt,uint8_t *serialized,int uint32_t gecko_nBits(struct iguana_info *virt,uint32_t *prevtimestampp,struct iguana_block *block,int32_t n) { - uint32_t nBits = GECKO_DEFAULTDIFF,starttime,endtime,est; struct iguana_block *prev=0; int32_t i,diff; bits256 targetval; + uint32_t nBits = GECKO_DEFAULTDIFF,starttime=0,endtime=0,est; struct iguana_block *prev=0; int32_t i,diff; bits256 targetval; *prevtimestampp = 0; if ( virt->chain->estblocktime == 0 ) return(GECKO_EASIESTDIFF); diff --git a/iguana/SuperNET_keys.c b/iguana/SuperNET_keys.c index 13d4c4684..904da0c83 100755 --- a/iguana/SuperNET_keys.c +++ b/iguana/SuperNET_keys.c @@ -220,7 +220,7 @@ int32_t SuperNET_savejsonfile(struct supernet_info *myinfo,char *finalfname,bits int32_t SuperNET_userkeys(char *passphrase,int32_t passsize,char *fname2fa,int32_t fnamesize) { return(0); -#ifndef __PNACL +/*#ifndef __PNACL //if ( (bits256_nonz(*wallethashp) == 0 || bits256_cmp(*wallethashp,GENESIS_PRIVKEY) == 0) && (bits256_nonz(*wallet2privp) == 0 || bits256_cmp(*wallet2privp,GENESIS_PRIVKEY) == 0) ) { sleep(1); @@ -232,7 +232,7 @@ int32_t SuperNET_userkeys(char *passphrase,int32_t passsize,char *fname2fa,int32 return(0); } #endif - return(-1); + return(-1);*/ } cJSON *SuperNET_decryptedjson(char *destfname,char *passphrase,int32_t passsize,bits256 wallethash,char *fname2fa,int32_t fnamesize,bits256 wallet2priv) diff --git a/iguana/cards777.c b/iguana/cards777.c index 023234d97..f74ffc26e 100755 --- a/iguana/cards777.c +++ b/iguana/cards777.c @@ -238,7 +238,7 @@ uint8_t *cards777_encode(struct supernet_info *myinfo,bits256 *encoded,bits256 * init_sharenrs(sharenrs,0,N,N); cards777_calcmofn(myinfo,allshares,myshares,sharenrs,M,xoverz,numcards,N); memcpy(ciphers,shuffled,numcards * N * sizeof(bits256)); - if ( 0 ) + if ( (0) ) { /*{ init_hexbytes_noT(nrs,dp->hand.sharenrs,dp->N); diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index a01f74444..b2b80e566 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -69,6 +69,7 @@ void dpow_entry2utxo(struct dpow_utxoentry *up,struct dpow_block *bp,struct dpow int32_t dpow_datahandler(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,uint8_t nn_senderind,uint32_t channel,uint32_t height,uint8_t *data,int32_t datalen) { int32_t i,src_or_dest,myind = -1; bits256 txid,srchash; struct iguana_info *coin; char str[65],str2[65]; + memset(srchash.bytes,0,sizeof(srchash)); dpow_notaryfind(myinfo,bp,height,&myind,dp->minerkey33); if ( myind < 0 ) { diff --git a/iguana/dpow/dpow_prices.c b/iguana/dpow/dpow_prices.c index eae61f44b..0c3bb23a4 100755 --- a/iguana/dpow/dpow_prices.c +++ b/iguana/dpow/dpow_prices.c @@ -1635,7 +1635,7 @@ void _crypto_update(double cryptovols[2][9][2],struct PAX_data *dp,int32_t selec void PAX_RTupdate(double cryptovols[2][9][2],double RTmetals[4],double *RTprices,struct PAX_data *dp) { char *cryptostrs[9] = { "btc", "nxt", "unity", "eth", "etc", "kmd", "xmr", "bts", "xcp" }; - int32_t iter,i,c,baserel,basenum,relnum; double cnyusd,btcusd,kmdbtc,bid,ask,price,vol,prices[8][2],volumes[8][2]; + int32_t iter,i,c,baserel,basenum,relnum; double cnyusd,btcusd,kmdbtc,bid=0.,ask=0.,price,vol,prices[8][2],volumes[8][2]; char base[16],rel[16]; PAX_update(dp,&btcusd,&kmdbtc); memset(prices,0,sizeof(prices)); diff --git a/iguana/dpow/dpow_tx.c b/iguana/dpow/dpow_tx.c index 7e2064550..194285053 100755 --- a/iguana/dpow/dpow_tx.c +++ b/iguana/dpow/dpow_tx.c @@ -429,6 +429,7 @@ void dpow_rawtxsign(struct supernet_info *myinfo,struct dpow_info *dp,struct igu return; for (j=0; jminerkey33[j+1]; + memset(srchash.bytes,0,sizeof(srchash)); m = 0; ep = &bp->notaries[myind]; cp = (src_or_dest != 0) ? &bp->notaries[myind].dest : &bp->notaries[myind].src; @@ -564,6 +565,7 @@ void dpow_sigscheck(struct supernet_info *myinfo,struct dpow_info *dp,struct dpo bits256 txid,srchash,zero,signedtxid; struct iguana_info *coin; int32_t j,len,numsigs; char *retstr=0,str[65],str2[65]; uint8_t txdata[32768]; uint32_t channel,state; coin = (src_or_dest != 0) ? bp->destcoin : bp->srccoin; memset(zero.bytes,0,sizeof(zero)); + memset(txid.bytes,0,sizeof(txid)); channel = (src_or_dest != 0) ? DPOW_SIGBTCCHANNEL : DPOW_SIGCHANNEL; if ( bestk >= 0 && bp->state != 0xffffffff && coin != 0 ) { diff --git a/iguana/exchanges/bitcoin.c b/iguana/exchanges/bitcoin.c index 5f8c3ec7b..bf37462f0 100755 --- a/iguana/exchanges/bitcoin.c +++ b/iguana/exchanges/bitcoin.c @@ -290,6 +290,7 @@ struct bitcoin_spend *iguana_spendset(struct supernet_info *myinfo,struct iguana ptr = spend->inputs; for (i=0; i=0; mode--) if ( (up= iguana_bestfit(coin,ups,totalunspents,remains,mode)) != 0 ) break; diff --git a/iguana/exchanges/fxcm.c b/iguana/exchanges/fxcm.c index ac39cbbd1..15aede1cd 100755 --- a/iguana/exchanges/fxcm.c +++ b/iguana/exchanges/fxcm.c @@ -99,7 +99,7 @@ int32_t fxcm_setcontracts() { if ( (json= cJSON_Parse(xmlstr)) != 0 ) { - /* + /* 123.763 123.786 123.956 @@ -153,6 +153,7 @@ int32_t fxcm_ensure() char *ALLPAIRS(struct exchange_info *exchange,cJSON *argjson) { int32_t i,c,n; char base[32],rel[32]; cJSON *json,*item,*array = cJSON_CreateArray(); + n = 0; if ( fxcm_ensure() == 0 ) { for (i=0; iipbits); fprintf(fp,"%s\n",ipaddr); - if ( 0 && addr->msgcounts.verack == 0 ) + if ( (0) && addr->msgcounts.verack == 0 ) { printf("iguana_sendblockreq (%s) addrind.%d hasn't verack'ed yet\n",addr->ipaddr,addr->addrind); iguana_send_version(coin,addr,coin->myservices); @@ -274,7 +274,7 @@ void iguana_emitQ(struct iguana_info *coin,struct iguana_bundle *bp) void iguana_bundleQ(struct supernet_info *myinfo,struct iguana_info *coin,struct iguana_bundle *bp,int32_t timelimit) { struct iguana_helper *ptr; struct iguana_bundle *tmp; int32_t i,n = 0; - if ( 0 && bp->queued == 0 && bp->emitfinish <= 1 && iguana_bundleready(myinfo,coin,bp,0) == bp->n ) + if ( (0) && bp->queued == 0 && bp->emitfinish <= 1 && iguana_bundleready(myinfo,coin,bp,0) == bp->n ) printf("bundle.[%d] is ready\n",bp->hdrsi); if ( bp->queued != 0 ) return; @@ -637,7 +637,7 @@ int32_t iguana_coin_mainiter(struct supernet_info *myinfo,struct iguana_info *co isRT *= (coin->RTheight > 0); if ( coin->peers != 0 ) *numpeersp += coin->peers->numranked; - if ( 0 && (rand() % 10) == 0 ) + if ( (0) && (rand() % 10) == 0 ) printf("%s main.%u vs %u, svs %u %d vs %d\n",coin->symbol,(uint32_t)time(NULL),coin->startutc+10,coin->spendvectorsaved ,coin->blocks.hwmchain.height/coin->chain->bundlesize,(coin->longestchain-coin->minconfirms)/coin->chain->bundlesize); if ( time(NULL) > coin->startutc+60 ) { @@ -682,7 +682,7 @@ int32_t iguana_coin_mainiter(struct supernet_info *myinfo,struct iguana_info *co } if ( (bp= coin->current) != 0 && coin->stucktime != 0 && coin->isRT == 0 && coin->RTheight == 0 && (time(NULL) - coin->stucktime) > coin->MAXSTUCKTIME ) { - if ( 0 ) + if ( (0) ) { printf("%s is stuck too long, restarting due to %d\n",coin->symbol,bp->hdrsi); if ( coin->started != 0 ) diff --git a/iguana/iguana_accept.c b/iguana/iguana_accept.c index 869d0f3bb..e86c74bcf 100755 --- a/iguana/iguana_accept.c +++ b/iguana/iguana_accept.c @@ -369,7 +369,7 @@ int32_t iguana_peerhdrrequest(struct supernet_info *myinfo,struct iguana_info *c } else printf("cant find block at ht.%d\n",height+i); } } - if ( 0 && flag != 0 && strcmp("BTCD",coin->symbol) != 0 ) + if ( (0) && flag != 0 && strcmp("BTCD",coin->symbol) != 0 ) retval = iguana_queue_send(addr,0,serialized,"headers",len); //printf("hdrs request retval.%d len.%d\n",retval,len); } //else printf("couldnt find header\n"); @@ -446,4 +446,4 @@ int32_t iguana_peeraddrrequest(struct iguana_info *coin,struct iguana_peer *addr if ( x == 0 ) return(-1); return(sendlen); -} \ No newline at end of file +} diff --git a/iguana/iguana_bitmap.c b/iguana/iguana_bitmap.c index b690738b5..ec1ce5484 100755 --- a/iguana/iguana_bitmap.c +++ b/iguana/iguana_bitmap.c @@ -401,8 +401,8 @@ void disp_yval(register int32_t color,register float yval,register uint32_t *bit //if ( pixelwt(color) > pixelwt(bitmap[y*rowwidth + x]) ) bitmap[y*rowwidth + x] = pixel_blend(bitmap[y*rowwidth + x],color); return; - if ( is_primary_color(color) != 0 || (is_primary_color(bitmap[y*rowwidth+x]) == 0 && pixelwt(color) > pixelwt(bitmap[y*rowwidth + x])) ) - bitmap[y*rowwidth + x] = color; + //if ( is_primary_color(color) != 0 || (is_primary_color(bitmap[y*rowwidth+x]) == 0 && pixelwt(color) > pixelwt(bitmap[y*rowwidth + x])) ) + // bitmap[y*rowwidth + x] = color; } void disp_yvalsum(register int32_t color,register float yval,register uint32_t *bitmap,register int32_t x,register int32_t rowwidth,register int32_t height) @@ -509,7 +509,7 @@ void output_line(int32_t calclogflag,double ave,float *buf,int32_t n,int32_t col double src[1024],dest[1024]; int32_t i; memset(src,0,sizeof(src)); memset(dest,0,sizeof(dest)); - if ( 1 ) + if ( (1) ) { for (i=0; i<1024; i++) src[1023-i] = dest[1023-i] = buf[i]; @@ -1085,7 +1085,7 @@ void iguana_bitmapbundle(struct iguana_info *coin,uint8_t *rect,int32_t rowwidth struct iguana_bitmap *iguana_bitmapfind(char *name) { - struct iguana_info *coin; int32_t width,height,n,hdrsi,x,y; + struct iguana_info *coin; int32_t width=1,height=1,n,hdrsi,x,y; if ( ((coin= iguana_coinfind(name)) != 0 || (coin= iguana_coinfind("BTCD")) != 0) && coin->screen != 0 ) { strcpy(coin->screen->name,coin->symbol); diff --git a/iguana/iguana_blocks.c b/iguana/iguana_blocks.c index 9d502494f..3c65b069c 100755 --- a/iguana/iguana_blocks.c +++ b/iguana/iguana_blocks.c @@ -411,7 +411,7 @@ double PoW_from_compact(uint32_t nBits,uint8_t unitval) // NOT consensus safe, b nbytes = (nBits >> 24) & 0xFF; nbits = (8 * (nbytes - 3)); PoW = (nBits & 0xFFFFFF); - if ( 0 && nbytes > unitval ) + if ( (0) && nbytes > unitval ) { printf("illegal nBits.%x unitval.%02x\n",nBits,unitval); return(0.); @@ -590,7 +590,7 @@ struct iguana_block *_iguana_chainlink(struct supernet_info *myinfo,struct iguan if ( bits256_nonz(prev->RO.hash2) == 0 || (prev->valid == 0 && iguana_blockvalidate(myinfo,coin,&valid,prev,0) < 0) ) { char str[65]; - if ( 0 && bits256_nonz(prev->RO.hash2) != 0 ) + if ( (0) && bits256_nonz(prev->RO.hash2) != 0 ) printf("(%s) notready v.%d m.%d h.%d\n",bits256_str(str,prev->RO.hash2),prev->valid,prev->mainchain,prev->height); return(0); } else prev->valid = 1; @@ -645,7 +645,7 @@ struct iguana_block *_iguana_chainlink(struct supernet_info *myinfo,struct iguan else str2[0] = 0; if ( coin->blocks.maxblocks > coin->longestchain ) coin->longestchain = coin->blocks.maxblocks; - if ( 0 && (block->height % coin->chain->bundlesize) == 0 ) + if ( (0) && (block->height % coin->chain->bundlesize) == 0 ) { printf("EXTENDMAIN %s %d <- (%s) n.%u max.%u PoW %f numtx.%d valid.%d\n",str,block->height,str2,hwmchain->height+1,coin->blocks.maxblocks,block->PoW,block->RO.txn_count,block->valid); //iguana_walkchain(coin); @@ -724,7 +724,7 @@ struct iguana_block *_iguana_chainlink(struct supernet_info *myinfo,struct iguan iguana_RTnewblock(myinfo,coin,block); block->hdrsi = hdrsi; block->bundlei = bundlei; - if ( 0 && (bp= coin->bundles[hdrsi]) != 0 ) + if ( (0) && (bp= coin->bundles[hdrsi]) != 0 ) { if ( bp->blocks[bundlei] != block || bits256_cmp(bp->hashes[bundlei],block->RO.hash2) != 0 ) printf("new hwm [%d:%d] mismatched bundle block\n",hdrsi,bundlei); diff --git a/iguana/iguana_bundles.c b/iguana/iguana_bundles.c index d4ad7a81e..e7c53ae73 100755 --- a/iguana/iguana_bundles.c +++ b/iguana/iguana_bundles.c @@ -21,6 +21,7 @@ static uint16_t iguana_primes[] = { 65353, 65357, 65371, 65381, 65393, 65407, 65 struct iguana_bloominds iguana_calcbloom(bits256 hash2) { int32_t i,j,k; struct iguana_bloominds bit; + memset(&bit,0,sizeof(bit)); k = (int32_t)(sizeof(bit)/sizeof(uint16_t)) - 1; j = 15; for (i=0; i [%d:%d]\n",bits256_str(str,newhash2),bp->hdrsi,bundlei); iguana_bloomset(coin,&bp->bloom,0,bit); - if ( 0 ) + if ( (0) ) { int32_t i; if ( iguana_bloomfind(coin,&bp->bloom,0,bit) < 0 ) @@ -245,7 +246,7 @@ int32_t iguana_bundlehash2add(struct iguana_info *coin,struct iguana_block **blo return(-1); } } - if ( 0 && bits256_nonz(bp->hashes[bundlei]) != 0 && bits256_cmp(bp->hashes[bundlei],block->RO.hash2) != 0 ) + if ( (0) && bits256_nonz(bp->hashes[bundlei]) != 0 && bits256_cmp(bp->hashes[bundlei],block->RO.hash2) != 0 ) { //char str[65],str2[65]; //printf("B bp.[%d]->hashes[%d] mismatch %s != %s%s\n",bp->hdrsi,bundlei,bits256_str(str,bp->hashes[bundlei]),bits256_str(str2,block->RO.hash2),block->mainchain?".main":""); @@ -461,7 +462,7 @@ char *iguana_bundleaddrs(struct iguana_info *coin,int32_t hdrsi) uint8_t *PKbits; struct iguana_pkhash *P; uint32_t pkind,numpkinds; struct iguana_bundle *bp; struct iguana_ramchain *ramchain; struct iguana_ramchaindata *rdata; cJSON *retjson; char rmdstr[41]; if ( (bp= coin->bundles[hdrsi]) != 0 ) { - if ( 0 && coin->RTramchain_busy != 0 ) + if ( (0) && coin->RTramchain_busy != 0 ) { printf("iguana_bundleaddrs: unexpected access when RTramchain_busy\n"); return(0); @@ -520,7 +521,7 @@ void iguana_bundlepurgefiles(struct iguana_info *coin,struct iguana_bundle *bp) sprintf(fname,"%s/%s/%d/%d",GLOBAL_TMPDIR,coin->symbol,subdir,bp->bundleheight), OS_remove_directory(fname); //printf("purged hdrsi.[%d] subdir.%d lag.%ld\n",bp->hdrsi,subdir,time(NULL) - bp->emitfinish); bp->purgetime = (uint32_t)time(NULL); - if ( 0 ) + if ( (0) ) { for (i=subdir*IGUANA_SUBDIRDIVISOR; i<(subdir+1)*IGUANA_SUBDIRDIVISOR; i++) { @@ -692,14 +693,14 @@ int32_t iguana_bundleissuemissing(struct supernet_info *myinfo,struct iguana_inf queue_enqueue("missing",&coin->priorityQ,&req->DL); bp->issued[i] = 1; n++; - if ( 0 && bp == coin->current ) + if ( (0) && bp == coin->current ) printf("%s issuemissing.[%d:%d]\n",bits256_str(str,hash2),bp->hdrsi,i); } //else printf("[z%d] ",i); } //else printf("%d ",now - (bp->issued[i]+lag)); } if ( firsti >= 0 )//&& bp == coin->current ) { - if ( 0 && bp == coin->current ) + if ( (0) && bp == coin->current ) printf("%s [%d] first missing.%d of %d\n",bits256_str(str,hash2),bp->hdrsi,firsti,nonz); iguana_bundleblock(coin,&hash2,bp,firsti); if ( bits256_nonz(hash2) != 0 ) @@ -773,7 +774,7 @@ int32_t iguana_bundleready(struct supernet_info *myinfo,struct iguana_info *coin int32_t i,ready,valid; char fname[1024]; struct iguana_block *block; int32_t sum[0x100],counts[0x100]; struct iguana_blockRO *B; struct iguana_bundle *nextbp; void *ptr; long filesize; struct iguana_ramchain R; bits256 prevhash2; memset(sum,0,sizeof(sum)); memset(counts,0,sizeof(counts)); - if ( 0 && bp->queued == 0 ) + if ( (0) && bp->queued == 0 ) { for (i=ready=0; in; i++) if ( (block= bp->blocks[i]) == 0 ) @@ -825,7 +826,7 @@ int32_t iguana_bundleready(struct supernet_info *myinfo,struct iguana_info *coin char str[65]; if ( requiredflag != 0 ) printf(">>>>>>> block contents error at ht.%d [%d:%d]\n",bp->bundleheight+i,bp->hdrsi,i); - if ( 0 && bits256_nonz(block->RO.hash2) != 0 ) + if ( (0) && bits256_nonz(block->RO.hash2) != 0 ) printf("patch.%d and reissue prev.%s %d\n",bp->bundleheight+i,bits256_str(str,block->RO.prev_block),i); iguana_blockunmark(coin,block,bp,i,1); } @@ -845,11 +846,11 @@ int32_t iguana_bundleready(struct supernet_info *myinfo,struct iguana_info *coin } fclose(fp); } - else if ( 0 ) + else if ( (0) ) //#endif { iguana_blockunmark(coin,block,bp,i,1); - if ( 0 && requiredflag != 0 ) + if ( (0) && requiredflag != 0 ) printf("not ready altpath.(%d %d %d %d %d) [%d:%d]\n",block->txvalid == 0,block->fpipbits == 0 ,block->fpos < 0,(bp->bundleheight+i > 0 && bits256_nonz(block->RO.prev_block) == 0),iguana_blockvalidate(myinfo,coin,&valid,block,1) < 0,bp->hdrsi,i); } else @@ -877,7 +878,7 @@ int32_t iguana_bundleready(struct supernet_info *myinfo,struct iguana_info *coin int32_t iguana_bundlehdr(struct supernet_info *myinfo,struct iguana_info *coin,struct iguana_bundle *bp,int32_t starti) { int32_t i,dist,counter=0; char str[65]; - if ( 0 && bp->isRT == 0 && (bp->hdrsi == coin->bundlescount-1 || bp == coin->current) ) + if ( (0) && bp->isRT == 0 && (bp->hdrsi == coin->bundlescount-1 || bp == coin->current) ) printf("hdr ITERATE.%d bundle.%d vs %d: h.%d n.%d r.%d s.%d c.%d finished.%d spec.%p[%d]\n",bp->hdrsi,bp->bundleheight,coin->longestchain-coin->chain->bundlesize,bp->numhashes,bp->n,bp->numrecv,bp->numsaved,bp->numcached,bp->emitfinish,bp->speculative,bp->numspec); dist = 30 + (coin->current != 0 ? bp->hdrsi - coin->current->hdrsi : 0); if ( bp == coin->current ) @@ -976,7 +977,7 @@ int64_t iguana_bundlecalcs(struct supernet_info *myinfo,struct iguana_info *coin datasize += block->RO.recvlen; } } - else if ( 0 && bits256_nonz(block->RO.hash2) != 0 && bits256_nonz(bp->hashes[bundlei]) != 0 ) + else if ( (0) && bits256_nonz(block->RO.hash2) != 0 && bits256_nonz(bp->hashes[bundlei]) != 0 ) { printf("hash mismatch [%d:%d]\n",bp->hdrsi,bundlei); iguana_blockunmark(coin,block,bp,bundlei,1); @@ -996,7 +997,7 @@ int64_t iguana_bundlecalcs(struct supernet_info *myinfo,struct iguana_info *coin } } bp->numcached = numcached; - if ( 0 && bp->numcached != numsaved ) + if ( (0) && bp->numcached != numsaved ) printf("[%d] emit.%u ramchain.%p numcached.%d vs numsaved.%d numhashes.%d\n",bp->hdrsi,bp->emitfinish,bp->ramchain.H.data,bp->numcached,numsaved,numhashes); bp->datasize = datasize; bp->numhashes = numhashes; @@ -1126,7 +1127,7 @@ int32_t iguana_bundleiters(struct supernet_info *myinfo,struct iguana_info *coin iguana_bundlecalcs(myinfo,coin,bp,lag); if ( coin->blockdepth == 0 && coin->blockdepth == 0 && bp->hdrsi == coin->bundlescount-1 ) iguana_autoextend(myinfo,coin,bp); - if ( 0 && bp->hdrsi == 0 ) + if ( (0) && bp->hdrsi == 0 ) printf("ITER utxo.%u now.%u spec.%-4d bundle.%-4d h.%-4d r.%-4d s.%-4d F.%d T.%d issued.%d mb.%d/%d\n",bp->utxofinish,(uint32_t)time(NULL),bp->numspec,bp->bundleheight/coin->chain->bundlesize,bp->numhashes,bp->numrecv,bp->numsaved,bp->emitfinish,timelimit,counter,coin->MAXBUNDLES,coin->bundlescount); bp->nexttime = (uint32_t)time(NULL) + ((bp->hdrsi > starti) ? 0 : -2); if ( bp->hdrsi == coin->bundlescount-1 || (bp->numhashes < bp->n && bp->bundleheight < coin->longestchain-coin->chain->bundlesize) ) @@ -1144,10 +1145,10 @@ int32_t iguana_bundleiters(struct supernet_info *myinfo,struct iguana_info *coin { max = bp->n; counter = iguana_bundleissuemissing(myinfo,coin,bp,1,3.); - if ( 0 && counter > 0 ) + if ( (0) && counter > 0 ) printf("starti.%d range.%d now.%u spec.%-4d bundle.%-4d h.%-4d r.%-4d s.%-4d F.%d T.%d issued.%d mb.%d/%d\n",starti,range,(uint32_t)time(NULL),bp->numspec,bp->bundleheight/coin->chain->bundlesize,bp->numhashes,bp->numrecv,bp->numsaved,bp->emitfinish,timelimit,counter,coin->MAXBUNDLES,coin->bundlescount); } else bp->nexttime++; - if ( 0 && bp->emitfinish <= 1 ) + if ( (0) && bp->emitfinish <= 1 ) iguana_bundleQ(myinfo,coin,bp,1000); else { @@ -1417,7 +1418,7 @@ void iguana_bundlestats(struct supernet_info *myinfo,struct iguana_info *coin,ch //sortbuf[m*2] = bp->metric; //sortbuf[m*2 + 1] = i; m++; - if ( 0 && lastpending == 0 ) + if ( (0) && lastpending == 0 ) printf("%d ",bp->numsaved); } } @@ -1552,7 +1553,7 @@ void iguana_bundlestats(struct supernet_info *myinfo,struct iguana_info *coin,ch myallocated(0,0); coin->lastdisp = (uint32_t)time(NULL); } - if ( 0 && (bp= coin->current) != 0 && coin->RTheight >= bp->bundleheight && coin->RTheight < bp->bundleheight+bp->n ) + if ( (0) && (bp= coin->current) != 0 && coin->RTheight >= bp->bundleheight && coin->RTheight < bp->bundleheight+bp->n ) { for (i=coin->RTheight-bp->bundleheight; in; i++) { diff --git a/iguana/iguana_chains.c b/iguana/iguana_chains.c index af0b6cb04..87a8ce798 100755 --- a/iguana/iguana_chains.c +++ b/iguana/iguana_chains.c @@ -126,12 +126,12 @@ int32_t blockhash_scrypt(uint8_t *blockhashp,uint8_t *serialized,int32_t len) blockhashfunc iguana_hashalgo(char *hashalgostr) { return(blockhash_sha256); // all coins seem to use this for genesis - if ( hashalgostr == 0 || hashalgostr[0] == 0 || strcmp(hashalgostr,"sha256") == 0 ) + /*if ( hashalgostr == 0 || hashalgostr[0] == 0 || strcmp(hashalgostr,"sha256") == 0 ) return(blockhash_sha256); else if ( strcmp(hashalgostr,"scrypt") == 0 ) return(blockhash_scrypt); else printf("unsupported blockhash algo.(%s)\n",hashalgostr); - return(0); + return(0);*/ } bits256 iguana_calcblockhash(char *symbol,int32_t (*hashalgo)(uint8_t *blockhashp,uint8_t *serialized,int32_t len),uint8_t *serialized,int32_t len) @@ -189,8 +189,8 @@ bits256 iguana_chaingenesis(struct supernet_info *myinfo,char *symbol,uint8_t zc char *parse_conf_line(char *line,char *field) { line += strlen(field); - for (; *line!='='&&*line!=0; line++) - break; + while ( (*line) != '=' && (*line) != 0 ) + line++; if ( *line == 0 ) return(0); if ( *line == '=' ) diff --git a/iguana/iguana_exchanges.c b/iguana/iguana_exchanges.c index 86a5038ff..01de2cfca 100755 --- a/iguana/iguana_exchanges.c +++ b/iguana/iguana_exchanges.c @@ -1129,7 +1129,7 @@ struct exchange_info *exchanges777_info(char *exchangestr,int32_t sleepflag,cJSO sleep(sleepflag); } } - if ( 0 && exchange != 0 ) + if ( (0) && exchange != 0 ) printf("found exchange.(%s) %p %p %p\n",exchange->name,exchange->issue.supports,exchange->issue.price,exchange->issue.allpairs); return(exchange); } diff --git a/iguana/iguana_init.c b/iguana/iguana_init.c index 43cf08875..8abd4e50d 100755 --- a/iguana/iguana_init.c +++ b/iguana/iguana_init.c @@ -269,7 +269,7 @@ int32_t iguana_bundleinitmap(struct supernet_info *myinfo,struct iguana_info *co void iguana_parseline(struct supernet_info *myinfo,struct iguana_info *coin,int32_t iter,FILE *fp) { - int32_t j,k,m,c,flag,bundlei,lastheight,missing=0,height = -1; char checkstr[1024],line[1024]; + int32_t j,k,m,c,flag,bundlei,lastheight=0,missing=0,height = -1; char checkstr[1024],line[1024]; struct iguana_peer *addr; struct iguana_bundle *bp; bits256 allhash,hash2,hash1,zero,lastbundle; if ( coin->FULLNODE == 0 && coin->VALIDATENODE == 0 && iter > 0 ) return; @@ -318,7 +318,7 @@ void iguana_parseline(struct supernet_info *myinfo,struct iguana_info *coin,int3 { if ( m < coin->MAXPEERS/2 ) { - if ( 0 && m == 0 && coin->seedipaddr[0] != 0 ) + if ( (0) && m == 0 && coin->seedipaddr[0] != 0 ) { addr = &coin->peers->active[m++]; iguana_initpeer(coin,addr,(uint32_t)calc_ipbits(coin->seedipaddr)); diff --git a/iguana/iguana_interpreter.c b/iguana/iguana_interpreter.c index d98ac46a8..341f92b55 100755 --- a/iguana/iguana_interpreter.c +++ b/iguana/iguana_interpreter.c @@ -734,7 +734,7 @@ int32_t iguana_checksig(struct iguana_info *coin,struct iguana_stackdata pubkeya if ( (retval= (bitcoin_verify(coin->ctx,sig,siglen-1,sigtxid,pubkey,plen) == 0)) == 0 ) { } - if ( 0 ) + if ( (0) ) { int32_t i; char str[65]; for (i=0; iflags & IGUANA_STACKFLAG) != 0 ) { + val = 0; if ( op->opcode == IGUANA_OP_PICK || op->opcode == IGUANA_OP_ROLL ) { if ( interpret != 0 && stacks->stackdepth < (val= iguana_num(args[0])) ) @@ -1505,7 +1506,7 @@ int32_t bitcoin_assembler(struct iguana_info *coin,cJSON *logarray,uint8_t scrip } else if ( (op->flags & IGUANA_MATHFLAG) != 0 ) { - int64_t numA,numB,numC; + int64_t numA=0,numB=0,numC=0; for (i=0; istackitems; i++) { if ( args[i].size != sizeof(int32_t) ) diff --git a/iguana/iguana_json.c b/iguana/iguana_json.c index f5a3191c6..e7febc655 100755 --- a/iguana/iguana_json.c +++ b/iguana/iguana_json.c @@ -200,7 +200,7 @@ cJSON *SuperNET_helpjson() int32_t agentform(FILE *fp,char *form,int32_t max,char *agent,cJSON *methoditem) { - cJSON *item,*fieldsarray; int32_t j,m,width,size = 0; + cJSON *item,*fieldsarray; int32_t j,m,width=1,size = 0; char *methodstr,*typestr,outstr[2048],outstr2[2048],fields[8192],str[2],agent_method[256],*fieldname; form[0] = 0; if ( (methodstr= jstr(methoditem,"method")) == 0 ) @@ -293,7 +293,7 @@ int32_t templates_emit(char *retbuf,int32_t maxsize,char *template,char *agent,c int32_t pretty_form(FILE *fp,char *formheader,char *formfooter,char *fieldtemplate,char *agent,cJSON *methoditem,cJSON *helpitem,char *suffix) { - cJSON *item,*fieldsarray; int32_t j,m,formsize,fieldsize,iter,width,size = 0; + cJSON *item,*fieldsarray; int32_t j,m,formsize,fieldsize,iter,width=1,size = 0; char *methodstr,*typestr,*fieldname,*helpstr,*curlstr,*urlstr,*itemhelp; char outstr[2048],outstr2[2048],str[2],widthstr[16],both[512]; if ( (methodstr= jstr(methoditem,"method")) == 0 ) diff --git a/iguana/iguana_mofn.c b/iguana/iguana_mofn.c index c1866f01f..2756def45 100755 --- a/iguana/iguana_mofn.c +++ b/iguana/iguana_mofn.c @@ -262,7 +262,7 @@ void libgfshare_init(struct supernet_info *myinfo,uint8_t _logs[256],uint8_t _ex for (i=255; i<510; i++) _exps[i] = _exps[i % 255]; _logs[0] = 0; // can't log(0) so just set it neatly to 0 - if ( 0 ) + if ( (0) ) { void test_mofn(struct supernet_info *myinfo); gfshare_test(myinfo,6,11,32); @@ -602,7 +602,7 @@ void test_mofn(struct supernet_info *myinfo) { if ( memcmp(secret.bytes,recover.bytes,sizeof(secret)) != 0 ) printf("FAILED m.%d M.%d N.%d\n",m,M,N); - else if ( 0 ) + else if ( (0) ) { char str[65]; printf("%s PASSED m.%d M.%d N.%d\n",bits256_str(str,recover),m,M,N); @@ -658,6 +658,7 @@ int32_t iguana_schnorr_peersign(void *ctx,uint8_t *allpub33,uint8_t *partialsig6 bits256 iguana_schnorr_noncepair(void *ctx,bits256 *pubkey,uint8_t odd_even,bits256 msg256,bits256 privkey,int32_t maxj) { bits256 privnonce; int32_t j; uint8_t pubkey33[33]; + memset(privnonce.bytes,0,sizeof(privnonce)); for (j=0; jctx,sig64,msg256,allpub2,33) < 0 ) printf("allpub2 error verifying combined sig k.%d\n",k); - else if ( 0 ) // doesnt replicate with subsets + else if ( (0) ) // doesnt replicate with subsets { if ( bitcoin_pubkey_combine(myinfo->ctx,allpub,0,pubkeys,n,0,0) == 0 ) { diff --git a/iguana/iguana_msg.c b/iguana/iguana_msg.c index 3c5ba3b38..8ad05f5d9 100755 --- a/iguana/iguana_msg.c +++ b/iguana/iguana_msg.c @@ -449,7 +449,7 @@ void iguana_gotaddr(struct iguana_info *coin,struct iguana_peer *addr,struct igu expand_ipbits(ipaddr,ipbits); if ( port != 0 ) sprintf(ipport,"%s:%d",ipaddr,port); - if ( 0 ) + if ( (0) ) { int32_t i; printf("{{"); @@ -459,7 +459,7 @@ void iguana_gotaddr(struct iguana_info *coin,struct iguana_peer *addr,struct igu } if ( strcmp(coin->symbol,"BTC") != 0 || (rand() % 10) == 0 ) iguana_possible_peer(coin,ipport); - if ( 0 && strcmp("TAZ",coin->symbol) == 0 ) + if ( (0) && strcmp("TAZ",coin->symbol) == 0 ) printf("iguana_gotaddr: %s from %s\n",ipaddr,addr->ipaddr); } @@ -713,7 +713,7 @@ int32_t iguana_rwtx(struct supernet_info *myinfo,uint8_t zcash,int32_t rwflag,st memcpy(joinsplitsig,&serialized[len],64), len += 64; } } - if ( 0 ) + if ( (0) ) { *txidp = bits256_doublesha256(txidstr,txstart,len); char str[65]; @@ -955,7 +955,7 @@ int32_t iguana_msgparser(struct supernet_info *myinfo,struct iguana_info *coin,s } if ( addr != 0 ) { - if ( 0 && addr->msgcounts.verack == 0 ) + if ( (0) && addr->msgcounts.verack == 0 ) printf("iguana_msgparser verack.%d from (%s) parse.(%s) len.%d\n",addr->msgcounts.verack,addr->ipaddr,H->command,recvlen); //iguana_peerblockrequest(coin,addr->blockspace,IGUANA_MAXPACKETSIZE,addr,iguana_blockhash(coin,100),0); addr->lastcontact = (uint32_t)time(NULL); @@ -1010,7 +1010,7 @@ int32_t iguana_msgparser(struct supernet_info *myinfo,struct iguana_info *coin,s else { intvectors = 'I', addr->msgcounts.inv++; - if ( 0 && strcmp(H->command,"inv2") == 0 ) + if ( (0) && strcmp(H->command,"inv2") == 0 ) printf("GOT INV2.%d\n",recvlen); len = iguana_intvectors(coin,addr,1,data,recvlen); // indirectly issues getdata } @@ -1056,7 +1056,7 @@ int32_t iguana_msgparser(struct supernet_info *myinfo,struct iguana_info *coin,s } len += iguana_rwvarint32(0,&data[len],&tmp); char str[65],str2[65]; - if ( 0 && coin->chain->auxpow != 0 ) + if ( (0) && coin->chain->auxpow != 0 ) printf("%d %d of %d: %s %s v.%08x numtx.%d cmp.%d\n",len,i,n,bits256_str(str,hash2),bits256_str(str2,zmsg.zH.prev_block),zmsg.zH.version,tmp,bits256_cmp(prevhash2,zmsg.zH.prev_block)); } else len += iguana_rwblock(myinfo,coin->chain->symbol,coin->chain->zcash,coin->chain->auxpow,coin->chain->hashalgo,0,&hash2,&data[len],(void *)&zmsg,recvlen); @@ -1151,7 +1151,7 @@ int32_t iguana_msgparser(struct supernet_info *myinfo,struct iguana_info *coin,s len = 0; if ( (sendlen= iguana_peeraddrrequest(coin,addr,&addr->blockspace[sizeof(H)],IGUANA_MAXPACKETSIZE)) > 0 ) { - if ( 0 ) + if ( (0) ) { int32_t checklen; uint32_t checkbits; char checkaddr[64]; checklen = iguana_rwvarint(0,&addr->blockspace[sizeof(H)],&x); @@ -1263,4 +1263,4 @@ int32_t iguana_msgparser(struct supernet_info *myinfo,struct iguana_info *coin,s } } return(retval); -} \ No newline at end of file +} diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 956d551be..6fa29d2be 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -38,7 +38,7 @@ void dpow_fifoupdate(struct supernet_info *myinfo,struct dpow_checkpoint *fifo,s memset(newfifo,0,sizeof(newfifo)); for (i=DPOW_FIFOSIZE-1; i>0; i--) { - if ( 0 && bits256_nonz(fifo[i-1].blockhash.hash) != 0 && (tip.blockhash.height - fifo[i-1].blockhash.height) != i ) + if ( (0) && bits256_nonz(fifo[i-1].blockhash.hash) != 0 && (tip.blockhash.height - fifo[i-1].blockhash.height) != i ) printf("(%d != %d) ",(tip.blockhash.height - fifo[i-1].blockhash.height),i); if ( (ind= (tip.blockhash.height - fifo[i-1].blockhash.height)) >= 0 && ind < DPOW_FIFOSIZE ) newfifo[ind] = fifo[i-1]; @@ -228,6 +228,7 @@ void dpow_addresses() TWO_STRINGS(iguana,dpow,symbol,pubkey) { char *retstr,srcaddr[64],destaddr[64]; struct iguana_info *src,*dest; cJSON *ismine; int32_t i,srcvalid,destvalid; struct dpow_info *dp = &myinfo->DPOWS[myinfo->numdpows]; + destvalid = srcvalid = 0; if ( myinfo->NOTARY.RELAYID < 0 ) { if ( (retstr= basilisk_addrelay_info(myinfo,0,(uint32_t)calc_ipbits(myinfo->ipaddr),myinfo->myaddr.persistent)) != 0 ) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 9e3a10102..25999b922 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -565,7 +565,7 @@ char *sendtoaddress(struct supernet_info *myinfo,struct iguana_info *coin,char * jaddnum(valsobj,"basilisktag",basilisktag); jaddnum(valsobj,"locktime",locktime); jaddnum(valsobj,"timeout",30000); - if ( 0 && comment != 0 && is_hexstr(comment,0) > 0 ) + if ( (0) && comment != 0 && is_hexstr(comment,0) > 0 ) jaddstr(valsobj,"opreturn",comment); if ( (retstr= basilisk_bitcoinrawtx(myinfo,coin,remoteaddr,basilisktag,jint(valsobj,"timeout"),valsobj,V)) != 0 ) { @@ -981,6 +981,7 @@ HASH_AND_INT(bitcoinrpc,getrawtransaction,txid,verbose) if ( coin->notarychain >= 0 && coin->FULLNODE == 0 ) return(_dex_getrawtransaction(myinfo,coin->symbol,txid)); HASH_FIND(hh,coin->RTdataset,txid.bytes,sizeof(txid),RTptr); + memset(checktxid.bytes,0,sizeof(checktxid)); if ( RTptr != 0 && RTptr->rawtxbytes != 0 && RTptr->txlen > 0 ) { checktxid = RTptr->txid; @@ -1069,7 +1070,7 @@ char *iguana_validaterawtx(struct supernet_info *myinfo,struct iguana_info *coin if ( (txobj= bitcoin_hex2json(coin,coin->blocks.hwmchain.height,&msgtx->txid,msgtx,rawtx,extraspace,extralen,0,0,suppress_pubkeys)) != 0 ) { //printf("txobj.(%s)\n",jprint(txobj,0)); - if ( 0 && (checkstr= bitcoin_json2hex(myinfo,coin,&txid,txobj,0)) != 0 ) + if ( (0) && (checkstr= bitcoin_json2hex(myinfo,coin,&txid,txobj,0)) != 0 ) { // no guarantee byte for byte identical tx is recreated if ( strcmp(rawtx,checkstr) != 0 ) @@ -1082,7 +1083,7 @@ char *iguana_validaterawtx(struct supernet_info *myinfo,struct iguana_info *coin break; jaddnum(retjson,"mismatch position",i); jadd(retjson,"origtx",txobj); - if ( 0 && (txobj= bitcoin_hex2json(coin,coin->blocks.hwmchain.height,&txid,msgtx,checkstr,extraspace,extralen,0,0,suppress_pubkeys)) != 0 ) + if ( (0) && (txobj= bitcoin_hex2json(coin,coin->blocks.hwmchain.height,&txid,msgtx,checkstr,extraspace,extralen,0,0,suppress_pubkeys)) != 0 ) jadd(retjson,"checktx",txobj); free(checkstr); return(jprint(retjson,1)); diff --git a/iguana/iguana_peers.c b/iguana/iguana_peers.c index bedda833f..c5ed454bd 100755 --- a/iguana/iguana_peers.c +++ b/iguana/iguana_peers.c @@ -594,7 +594,7 @@ int32_t iguana_send(struct iguana_info *coin,struct iguana_peer *addr,uint8_t *s } } addr->totalsent += len; - if ( 0 && addr->basilisk != 0 ) + if ( (0) && addr->basilisk != 0 ) printf("verack.%d (%s) sent.%d bytes to %s\n",addr->msgcounts.verack,cmdstr,len,addr->ipaddr); return(len); } @@ -623,7 +623,7 @@ int32_t iguana_queue_send(struct iguana_peer *addr,int32_t delay,uint8_t *serial packet->embargo.millis += delay; } memcpy(packet->serialized,serialized,datalen); - if ( 0 && addr->supernet != 0 ) + if ( (0) && addr->supernet != 0 ) printf("%p queue send.(%s) %d to (%s)\n",packet,serialized+4,datalen,addr->ipaddr); queue_enqueue("sendQ",&addr->sendQ,&packet->DL); return(datalen); @@ -1050,7 +1050,7 @@ int32_t iguana_pollsendQ(struct iguana_info *coin,struct iguana_peer *addr) struct iguana_packet *packet; if ( (packet= queue_dequeue(&addr->sendQ)) != 0 ) { - if ( 0 && (addr->supernet != 0 || strcmp((char *)&packet->serialized[4],"SuperNET") == 0) ) + if ( (0) && (addr->supernet != 0 || strcmp((char *)&packet->serialized[4],"SuperNET") == 0) ) printf("%s: send.(%s).%d usock.%d dead.%u ready.%u supernet.%d\n",addr->ipaddr,packet->serialized+4,packet->datalen,addr->usock,addr->dead,addr->ready,addr->supernet); if ( strcmp((char *)&packet->serialized[4],"getdata") == 0 ) { @@ -1385,18 +1385,18 @@ void iguana_dedicatedloop(struct supernet_info *myinfo,struct iguana_info *coin, } } //printf(">>>>>>>>>>>>>> finish %s dedicatedloop.%s\n",coin->symbol,addr->ipaddr); - if ( 0 ) + if ( (0) ) { if ( addr->vinsfp != 0 ) fclose(addr->vinsfp), addr->vinsfp = 0; if ( addr->voutsfp != 0 ) - fclose(addr->voutsfp), addr->voutsfp = 0; + fclose(addr->voutsfp), addr->voutsfp = 0; } iguana_iAkill(coin,addr,addr->dead != 0); myfree(buf,bufsize); //if ( addr->filehash2 != 0 ) // myfree(addr->filehash2,addr->maxfilehash2*sizeof(*addr->filehash2)), addr->filehash2 = 0; - if ( 0 ) + if ( (0) ) { iguana_mempurge(&addr->RAWMEM); iguana_mempurge(&addr->TXDATA); diff --git a/iguana/iguana_ramchain.c b/iguana/iguana_ramchain.c index 6f02973c3..a2cb07fdc 100755 --- a/iguana/iguana_ramchain.c +++ b/iguana/iguana_ramchain.c @@ -56,7 +56,7 @@ struct iguana_kvitem *iguana_hashsetPT(struct iguana_ramchain *ramchain,int32_t printf("fatal alloc errorC in hashset\n"); iguana_exit(0,0); } - if ( 0 && ramchain->expanded && selector == 'T' ) + if ( (0) && ramchain->expanded && selector == 'T' ) printf("hashmem.%p selector.%c added.(%s) itemind.%x ptr.%p\n",ramchain->hashmem,selector,str,itemind,ptr); if ( selector == 'T' ) HASH_ADD_KEYPTR(hh,ramchain->txids,key,keylen,ptr); @@ -64,14 +64,14 @@ struct iguana_kvitem *iguana_hashsetPT(struct iguana_ramchain *ramchain,int32_t ptr->hh.itemind = itemind; //if ( strcmp(str,"0000000000000000000000000000000000000000000000000000000000000000") == 0 ) // printf("added null txid?\n"), getchar(); - if ( 0 && ramchain->expanded && selector == 'T' ) + if ( (0) && ramchain->expanded && selector == 'T' ) printf("selector.%c added.(%s) itemind.%x ptr.%p tmp.%p\n",selector,str,itemind,ptr,tmp); if ( itemind == 0 ) { printf("negative itemind\n"); iguana_exit(0,0); } - if ( 0 ) + if ( (0) ) { if ( selector == 'T' ) HASH_FIND(hh,ramchain->txids,key,keylen,tmp); @@ -88,7 +88,7 @@ struct iguana_kvitem *iguana_hashsetPT(struct iguana_ramchain *ramchain,int32_t void iguana_blocksetcounters(struct iguana_info *coin,struct iguana_block *block,struct iguana_ramchain * ramchain) { - if ( 0 && coin->virtualchain != 0 ) + if ( (0) && coin->virtualchain != 0 ) printf("iguana_blocksetcounters.%s 1st txidind.%u <- ht.%d\n",coin->symbol,ramchain->H.txidind,block->height); block->RO.firsttxidind = ramchain->H.txidind; block->RO.firstvout = ramchain->H.unspentind; @@ -110,7 +110,7 @@ int32_t iguana_peerfname(struct iguana_info *coin,int32_t *hdrsip,char *dirname, bp = 0, bundlei = -2; if ( bits256_nonz(prevhash2) == 0 || (bp= iguana_bundlefind(coin,&bp,&bundlei,prevhash2)) == 0 || bundlei >= coin->chain->bundlesize-1 ) { - if ( 0 && dispflag != 0 ) + if ( (0) && dispflag != 0 ) printf("iguana_peerfname %s error finding.(%s) spec.%p bp.%p\n",coin->symbol,bits256_str(str,hash2),bp!=0?bp->speculative:0,bp); return(-2); } else bundlei++; @@ -191,7 +191,7 @@ uint32_t iguana_ramchain_addtxid(struct iguana_info *coin,RAMCHAIN_FUNC,bits256 } else { - if ( 0 && ramchain->expanded != 0 ) + if ( (0) && ramchain->expanded != 0 ) printf("T.%p txidind.%d numvouts.%d numvins.%d\n",T,txidind,numvouts,numvins); t->txidind = txidind, t->txid = txid, t->numvouts = numvouts, t->numvins = numvins; t->bundlei = bundlei; @@ -464,7 +464,7 @@ uint32_t iguana_ramchain_addspend(struct iguana_info *coin,RAMCHAIN_FUNC,bits256 { external = 1; txidind = ramchain->externalind++; - if ( 0 && ramchain->expanded != 0 ) + if ( (0) && ramchain->expanded != 0 ) { char str[65]; printf("%p X[%d] <- %s\n",X,txidind,bits256_str(str,prev_hash)); } if ( ramchain->H.ROflag != 0 ) { @@ -580,7 +580,7 @@ uint32_t iguana_ramchain_addspend256(struct iguana_info *coin,struct iguana_peer } else s->scriptpos = 0; //else printf("spend256 scriptfpos.%d\n",s->scriptfpos); char str[65]; - if ( 0 && coin->virtualchain != 0 ) + if ( (0) && coin->virtualchain != 0 ) printf("W.%p s.%d vout.%d/%d [%d] %s fpos.%u slen.%d\n",s,spendind,s->prevout,prev_vout,bp->hdrsi,bits256_str(str,prev_hash),(uint32_t)s->scriptpos,(int32_t)s->vinscriptlen); } return(spendind); @@ -813,7 +813,7 @@ int64_t _iguana_rdata_action(char *fname,FILE *fp,bits256 lhashes[IGUANA_NUMLHAS //P2 = 0;//iguana_ramchain_offset(fname,rdata,RAMCHAIN_LARG(IGUANA_LHASH_FIRSTSPENDS),fparg,fpos,P2,&offset,(sizeof(struct iguana_pkextra) * numpkinds),srcsize); A = iguana_ramchain_offset(fname,rdata,RAMCHAIN_LARG(IGUANA_LHASH_ACCOUNTS),fparg,fpos,A,&offset,(sizeof(struct iguana_account) * numpkinds),srcsize); char str[65]; - if ( 0 && X != 0 ) + if ( (0) && X != 0 ) printf("%p X[1] -> %s\n",&X[1],bits256_str(str,X[1])); X = iguana_ramchain_offset(fname,rdata,RAMCHAIN_LARG(IGUANA_LHASH_EXTERNALS),fparg,fpos,X,&offset,(sizeof(bits256) * numexternaltxids),srcsize); TXbits = iguana_ramchain_offset(fname,rdata,RAMCHAIN_LARG(IGUANA_LHASH_TXBITS),fparg,fpos,TXbits,&offset,hconv_bitlen(txbits),srcsize); @@ -823,7 +823,7 @@ int64_t _iguana_rdata_action(char *fname,FILE *fp,bits256 lhashes[IGUANA_NUMLHAS { Ux = destptr, Sx = destptr, P = destptr, A = destptr, X = destptr, TXbits = destptr, PKbits = destptr, Kspace = destptr; //U2 = destptr, P2 = destptr, U = iguana_ramchain_offset(fname,rdata,RAMCHAIN_LARG(IGUANA_LHASH_UNSPENTS),fparg,fpos,U,&offset,(sizeof(struct iguana_unspent20) * numunspents),srcsize); - if ( 0 && lhashes != 0 ) + if ( (0) && lhashes != 0 ) printf("iter.%d lhashes.%p offset.%ld destptr.%p len.%ld fparg.%p fpos.%ld srcsize.%ld\n",iter,RAMCHAIN_LARG(IGUANA_LHASH_SPENDS),(long)offset,destptr,(long)sizeof(struct iguana_spend256) * numspends,fparg,(long)fpos,(long)srcsize); S = iguana_ramchain_offset(fname,rdata,RAMCHAIN_LARG(IGUANA_LHASH_SPENDS),fparg,fpos,S,&offset,(sizeof(struct iguana_spend256) * numspends),srcsize); } @@ -871,7 +871,7 @@ int64_t _iguana_rdata_action(char *fname,FILE *fp,bits256 lhashes[IGUANA_NUMLHAS int64_t iguana_ramchain_action(char *fname,RAMCHAIN_FUNC,FILE *fp,bits256 lhashes[IGUANA_NUMLHASHES],struct iguana_ramchaindata *destdata,uint64_t fpos,struct iguana_ramchaindata *srcdata,int32_t numblocks,int32_t scriptspace,uint8_t zcash) { - if ( 0 && ramchain->expanded == 0 ) + if ( (0) && ramchain->expanded == 0 ) printf("action.%p (%p %p %p) %ld allocated.%ld [%d:%d %d:%d]\n",srcdata,fp,lhashes,destdata,(long)fpos,(long)srcdata->allocsize,srcdata->txsparsebits,srcdata->numtxsparse,srcdata->pksparsebits,srcdata->numpksparse); return(_iguana_rdata_action(fname,fp,lhashes,destdata,fpos,ramchain->expanded,srcdata->numtxids,srcdata->numunspents,srcdata->numspends,srcdata->numpkinds,srcdata->numexternaltxids,scriptspace,srcdata->txsparsebits,srcdata->numtxsparse,srcdata->pksparsebits,srcdata->numpksparse,srcdata->allocsize,RAMCHAIN_ARG,numblocks,zcash)); } @@ -882,7 +882,7 @@ int64_t iguana_ramchain_size(char *fname,RAMCHAIN_FUNC,int32_t numblocks,int32_t if ( (rdata= ramchain->H.data) != 0 ) { allocsize = iguana_ramchain_action(fname,RAMCHAIN_ARG,0,0,0,0,rdata,numblocks,scriptspace,zcash); - if ( 0 && ramchain->expanded != 0 ) + if ( (0) && ramchain->expanded != 0 ) printf("%p iguana_ramchain_size.expanded.%d %u: Koffset.%u scriptoffset.%u stacksize.%u stackspace.%u [%u]\n",ramchain,ramchain->expanded,(int32_t)allocsize,(int32_t)rdata->Koffset,(int32_t)ramchain->H.scriptoffset,(int32_t)ramchain->H.stacksize,(int32_t)rdata->stackspace,scriptspace); } return(allocsize); @@ -902,7 +902,7 @@ long iguana_ramchain_setsize(char *fname,struct iguana_ramchain *ramchain,struct rdata->scriptspace = ramchain->H.scriptoffset; rdata->stackspace = ramchain->H.stacksize; rdata->allocsize = iguana_ramchain_size(fname,RAMCHAIN_ARG,numblocks,rdata->scriptspace,zcash); - if ( 0 && rdata->scriptspace != 0 ) + if ( (0) && rdata->scriptspace != 0 ) printf("iguana_ramchain_setsize: Koffset.%d scriptspace.%d stackspace.%d (scriptoffset.%d stacksize.%d) allocsize.%d\n",(int32_t)rdata->Koffset,(int32_t)rdata->scriptspace,(int32_t)rdata->stackspace,(int32_t)ramchain->H.scriptoffset,(int32_t)ramchain->H.stacksize,(int32_t)rdata->allocsize); ramchain->datasize = rdata->allocsize; return((long)rdata->allocsize); @@ -929,7 +929,7 @@ int64_t iguana_ramchain_saveaction(char *fname,RAMCHAIN_FUNC,FILE *fp,struct igu before = ftell(fp); iguana_ramchain_action(fname,RAMCHAIN_ARG,fp,0,rdata,0,rdata,numblocks,scriptspace,zcash); after = ftell(fp); - if ( 0 && ramchain->expanded == 0 ) + if ( (0) && ramchain->expanded == 0 ) { int32_t i; for (i=0; iallocsize; - if ( 0 && expanded != 0 ) + if ( (0) && expanded != 0 ) printf("init T.%d U.%d S.%d P.%d X.%d -> %ld\n",numtxids,numunspents,numspends,numpkinds,numexternaltxids,(long)offset); if ( rdata->allocsize != iguana_ramchain_size(fname,RAMCHAIN_ARG,numblocks,scriptspace,zcash) ) { @@ -997,12 +997,12 @@ int32_t iguana_ramchain_alloc(char *fname,struct iguana_info *coin,struct iguana memset(ramchain,0,sizeof(*ramchain)); ramchain->height = height; allocsize = _iguana_rdata_action(fname,0,0,0,0,1,numtxids,numunspents,numspends,numpkinds,numexternaltxids,scriptspace,0,0,0,0,0,RAMCHAIN_ARG,numblocks,zcash); - if ( 0 && ramchain->expanded != 0 ) + if ( (0) && ramchain->expanded != 0 ) printf("T.%d U.%d S.%d P.%d X.%d -> %ld\n",numtxids,numunspents,numspends,numpkinds,numexternaltxids,(long)allocsize); memset(mem,0,sizeof(*mem)); memset(hashmem,0,sizeof(*hashmem)); hashsize = iguana_hashmemsize(numtxids,numunspents,numspends,numpkinds,numexternaltxids,scriptspace); - while ( 0 && (x= (myallocated(0,-1)+hashsize+allocsize + 65536)) > coin->MAXMEM ) + while ( (0) && (x= (myallocated(0,-1)+hashsize+allocsize + 65536)) > coin->MAXMEM ) { char str[65],str2[65]; fprintf(stderr,"ht.%d wait for allocated %s < MAXMEM %s | elapsed %.2f minutes hashsize.%ld allocsize.%ld\n",height,mbstr(str,myallocated(0,-1)+hashsize+allocsize),mbstr(str2,coin->MAXMEM),(double)(time(NULL)-coin->startutc)/60.,(long)hashsize,(long)allocsize); sleep(13); @@ -1018,7 +1018,7 @@ int32_t iguana_ramchain_alloc(char *fname,struct iguana_info *coin,struct iguana long iguana_ramchain_save(struct iguana_info *coin,RAMCHAIN_FUNC,uint32_t ipbits,bits256 hash2,bits256 prevhash2,int32_t bundlei,struct iguana_bundle *bp,uint8_t zcash) { - struct iguana_ramchaindata *rdata,tmp; char fname[1024]; long fpos = -1; int32_t hdrsi,checki; FILE *fp; + struct iguana_ramchaindata *rdata,tmp; char fname[1024]; long fpos = -1; int32_t hdrsi,checki = 0; FILE *fp; if ( (rdata= ramchain->H.data) == 0 ) { printf("ramchainsave no data ptr\n"); @@ -1045,7 +1045,7 @@ long iguana_ramchain_save(struct iguana_info *coin,RAMCHAIN_FUNC,uint32_t ipbits iguana_ramchain_lhashes(fname,RAMCHAIN_ARG,rdata,rdata,bp!=0?bp->n:1,ramchain->H.scriptoffset,zcash); tmp = *rdata; iguana_ramchain_compact(fname,RAMCHAIN_ARG,&tmp,rdata,bp!=0?bp->n:1,zcash); - if ( 0 && ramchain->expanded != 0 ) + if ( (0) && ramchain->expanded != 0 ) printf("compact.%s: Koffset.%d scriptoffset.%d stacksize.%d allocsize.%d\n",fname,(int32_t)rdata->Koffset,ramchain->H.scriptoffset,ramchain->H.stacksize,(int32_t)rdata->allocsize); if ( fwrite(&tmp,1,sizeof(tmp),fp) != sizeof(tmp) ) { @@ -1346,7 +1346,7 @@ int32_t iguana_Xspendmap(struct iguana_info *coin,struct iguana_ramchain *ramcha bp->startutxo = bp->utxofinish = (uint32_t)time(NULL); if ( bp->Xvalid == 0 ) { - if ( 0 && (rand() % 10) == 0 ) + if ( (0) && (rand() % 10) == 0 ) printf("[%d] filesize %ld Xspendptr.%p %p num.%d\n",bp->hdrsi,filesize,ramchain->Xspendptr,ramchain->Xspendinds,ramchain->numXspends); bp->Xvalid = 1; } @@ -1362,7 +1362,7 @@ int32_t iguana_Xspendmap(struct iguana_info *coin,struct iguana_ramchain *ramcha ramchain->Xspendinds = 0; } } - else if ( 0 && iter == 1 ) + else if ( (0) && iter == 1 ) printf("couldnt map.(%s)\n",fname); } return(ramchain->numXspends); @@ -1370,7 +1370,7 @@ int32_t iguana_Xspendmap(struct iguana_info *coin,struct iguana_ramchain *ramcha struct iguana_ramchain *_iguana_ramchain_map(struct supernet_info *myinfo,struct iguana_info *coin,char *fname,struct iguana_bundle *bp,int32_t numblocks,struct iguana_ramchain *ramchain,struct OS_memspace *hashmem,uint32_t ipbits,bits256 hash2,bits256 prevhash2,int32_t bundlei,long fpos,int32_t allocextras,int32_t expanded,uint8_t zcash) { - RAMCHAIN_DECLARE; int32_t valid,iter,i,checki,hdrsi; long filesize; void *ptr; char str[65],str2[65],dirstr[65]; struct iguana_block *block; struct iguana_zblockRO zRO; struct iguana_ramchaindata *rdata; + RAMCHAIN_DECLARE; int32_t valid,iter,i,checki,hdrsi; long filesize=0; void *ptr; char str[65],str2[65],dirstr[65]; struct iguana_block *block; struct iguana_zblockRO zRO; struct iguana_ramchaindata *rdata; /*if ( ramchain->expanded != 0 && (ramchain->sigsfileptr == 0 || ramchain->sigsfilesize == 0) ) { sprintf(sigsfname,"sigs/%s/%s",coin->symbol,bits256_str(str,hash2)); @@ -1423,7 +1423,7 @@ struct iguana_ramchain *_iguana_ramchain_map(struct supernet_info *myinfo,struct ramchain->expanded = expanded; ramchain->numblocks = (bp == 0) ? 1 : bp->n; //printf("ptr.%p exp.%d extra.%d %p mapped P[%d] fpos.%d + %ld -> %ld vs %ld offset.%u:%u stack.%u:%u\n",ptr,expanded,allocextras,rdata,(int32_t)rdata->Poffset,(int32_t)fpos,(long)rdata->allocsize,(long)(fpos + rdata->allocsize),ramchain->filesize,rscriptoffset,rdata->scriptspace,rstacksize,rdata->stackspace); - if ( 0 && bp != 0 ) + if ( (0) && bp != 0 ) { /*blocksRO = (struct iguana_blockRO *)rdata; for (i=0; in; i++) @@ -1637,7 +1637,7 @@ int32_t iguana_ramchain_cmp(struct iguana_ramchain *A,struct iguana_ramchain *B, int32_t iguana_ramchain_iterate(struct supernet_info *myinfo,struct iguana_info *coin,struct iguana_ramchain *dest,struct iguana_ramchain *ramchain,struct iguana_bundle *bp,int16_t bundlei) { RAMCHAIN_DECLARE; RAMCHAIN_DESTDECLARE; RAMCHAIN_DESTZEROES; - int32_t j,hdrsi,prevout,scriptlen; uint32_t timestamp=0,unspentind,sequenceid,destspendind=0,desttxidind=0; uint16_t fileid; uint64_t scriptpos; int64_t crypto777_payment = 0; + int32_t j,hdrsi,prevout,scriptlen; uint32_t timestamp=0,unspentind,sequenceid=0,destspendind=0,desttxidind=0; uint16_t fileid; uint64_t scriptpos; int64_t crypto777_payment = 0; bits256 prevhash; uint64_t value; uint8_t type; struct iguana_unspent *u; struct iguana_txid *tx; struct iguana_ramchaindata *rdata; uint8_t rmd160[20]; //if ( dest != 0 ) @@ -1667,7 +1667,7 @@ int32_t iguana_ramchain_iterate(struct supernet_info *myinfo,struct iguana_info { if ( coin->active == 0 ) return(-1);; - if ( 0 && ramchain->expanded == 0 && dest != 0 ) + if ( (0) && ramchain->expanded == 0 && dest != 0 ) printf("ITER [%d] TXID.%d -> dest.%p desttxid.%d dest->hashmem.%p numtxids.%d\n",rdata->height,ramchain->H.txidind,dest,dest!=0?dest->H.txidind:0,dest!=0?dest->hashmem:0,rdata->numtxids); tx = &T[ramchain->H.txidind]; if ( iguana_ramchain_addtxid(coin,RAMCHAIN_ARG,tx->txid,tx->numvouts,tx->numvins,tx->locktime,tx->version,tx->timestamp,bundlei) == 0 ) @@ -1678,7 +1678,7 @@ int32_t iguana_ramchain_iterate(struct supernet_info *myinfo,struct iguana_info if ( dest->expanded != 0 ) iguana_opreturn(myinfo,1,coin,tx->timestamp,bp,0,bp->bundleheight + bundlei,(((uint64_t)bp->hdrsi << 32) | dest->H.unspentind),0,0,0,0); //char str[65]; - if ( 0 && ramchain->expanded == 0 ) + if ( (0) && ramchain->expanded == 0 ) printf("ITER [%d] TXID.%d -> dest.%p desttxid.%d dest->hashmem.%p numtxids.%d\n",rdata->height,ramchain->H.txidind,dest,dest!=0?dest->H.txidind:0,dest!=0?dest->hashmem:0,rdata->numtxids); if ( iguana_ramchain_addtxid(coin,RAMCHAIN_DESTARG,tx->txid,tx->numvouts,tx->numvins,tx->locktime,tx->version,tx->timestamp,bundlei) == 0 ) return(-2); @@ -1689,6 +1689,7 @@ int32_t iguana_ramchain_iterate(struct supernet_info *myinfo,struct iguana_info if ( coin->active == 0 ) return(-1); fileid = 0; + unspentind = 0; scriptpos = 0; scriptlen = 0; memset(rmd160,0,sizeof(rmd160)); @@ -1740,7 +1741,7 @@ int32_t iguana_ramchain_iterate(struct supernet_info *myinfo,struct iguana_info } //else printf("no script\n");*/ if ( (unspentind= iguana_ramchain_addunspent20(coin,0,RAMCHAIN_ARG,value,0,scriptlen,tx->txid,j,type,bp,rmd160)) == 0 ) return(-4); - if ( 0 ) + if ( (0) ) { int32_t i; for (i=0; i<20; i++) printf("%02x",rmd160[i]); @@ -1839,7 +1840,7 @@ int32_t iguana_ramchain_iterate(struct supernet_info *myinfo,struct iguana_info long iguana_ramchain_data(struct supernet_info *myinfo,struct iguana_info *coin,struct iguana_peer *addr,struct iguana_txblock *origtxdata,struct iguana_msgtx *txarray,int32_t txn_count,uint8_t *data,int32_t recvlen,struct iguana_bundle *bp,struct iguana_block *block) { int32_t verifyflag = 0; - RAMCHAIN_DECLARE; struct iguana_ramchain R,*mapchain,*ramchain = &addr->ramchain; struct iguana_msgtx *tx; char fname[1024]; uint8_t rmd160[20]; struct iguana_ramchaindata *rdata; int32_t i,j,fpos,pubkeysize,sigsize,subdir,firsti=1,err,flag,bundlei; uint32_t scriptspace,stackspace; struct iguana_blockRO RO; + RAMCHAIN_DECLARE; struct iguana_ramchain R,*mapchain,*ramchain = &addr->ramchain; struct iguana_msgtx *tx; char fname[1024]; uint8_t rmd160[20]; struct iguana_ramchaindata *rdata; int32_t i,j,fpos,pubkeysize,sigsize,subdir,firsti=1,err,flag,bundlei=0; uint32_t scriptspace,stackspace; struct iguana_blockRO RO; if ( block == 0 || bp == 0 || addr == 0 || (block != 0 && (bundlei= block->bundlei) < 0) ) { //printf("iguana_ramchain_data: null ptr %p %p %p\n",block,bp,addr); @@ -2028,7 +2029,7 @@ void iguana_blockdelete(struct iguana_info *coin,bits256 hash2,int32_t i) void iguana_blockunmark(struct iguana_info *coin,struct iguana_block *block,struct iguana_bundle *bp,int32_t i,int32_t deletefile) { void *ptr; int32_t recvlen,height = -1; - if ( 0 && bp != 0 ) + if ( (0) && bp != 0 ) printf("UNMARK.[%d:%d]\n",bp->hdrsi,i); if ( block != 0 ) { @@ -2056,7 +2057,7 @@ void iguana_blockunmark(struct iguana_info *coin,struct iguana_block *block,stru } if ( deletefile != 0 && block != 0 ) iguana_blockdelete(coin,block->RO.hash2,i); - if ( 0 && coin->RTheight > 0 && height > 0 && height < coin->blocks.hwmchain.height ) + if ( (0) && coin->RTheight > 0 && height > 0 && height < coin->blocks.hwmchain.height ) { printf("reduce %s HWM height from %d to %d\n",coin->symbol,coin->blocks.hwmchain.height,height); if ( (block= iguana_blockfind("unmark",coin,iguana_blockhash(coin,height))) != 0 ) diff --git a/iguana/iguana_realtime.c b/iguana/iguana_realtime.c index bedc4b911..ddd6d1685 100755 --- a/iguana/iguana_realtime.c +++ b/iguana/iguana_realtime.c @@ -170,7 +170,7 @@ void iguana_RTcoinaddr(struct iguana_info *coin,struct iguana_RTtxid *RTptr,stru } } //printf("%s %.8f [%.8f - %.8f] -> %.8f\n",coinaddr,dstr(value),dstr(coin->RTcredits),dstr(coin->RTdebits),dstr(coin->histbalance)+dstr(coin->RTcredits)-dstr(coin->RTdebits)); - if ( 0 && strcmp("BTC",coin->symbol) != 0 && strcmp("LTC",coin->symbol) != 0 && strcmp("DOGE",coin->symbol) != 0 ) + if ( (0) && strcmp("BTC",coin->symbol) != 0 && strcmp("LTC",coin->symbol) != 0 && strcmp("DOGE",coin->symbol) != 0 ) printf("%lld %s %.8f h %.8f, cr %.8f deb %.8f [%.8f] numunspents.%d %p\n",(long long)polarity,coinaddr,dstr(value),dstr(RTaddr->histbalance),dstr(RTaddr->credits),dstr(RTaddr->debits),dstr(RTaddr->credits)-dstr(RTaddr->debits)+dstr(RTaddr->histbalance),RTaddr->numunspents,unspent); } @@ -352,7 +352,7 @@ struct iguana_RTtxid *iguana_RTtxid_create(struct iguana_info *coin,struct iguan } HASH_ADD_KEYPTR(hh,coin->RTdataset,RTptr->txid.bytes,sizeof(RTptr->txid),RTptr); bits256_str(str,txid); - if ( 0 && strcmp("BTC",coin->symbol) != 0 ) + if ( (0) && strcmp("BTC",coin->symbol) != 0 ) printf("%s.%d txid.(%s) vouts.%d vins.%d version.%d lock.%u t.%u %lld\n",coin->symbol,block->height,str,numvouts,numvins,version,locktime,timestamp,(long long)polarity); } else if ( RTptr->txn_count != txn_count || RTptr->numvouts != numvouts || RTptr->numvins != numvins ) @@ -630,7 +630,7 @@ void *iguana_RTrawdata(struct iguana_info *coin,bits256 hash2,uint8_t *data,int3 return(&ptr[sizeof(*recvlenp) + sizeof(checknumtx)]); } else printf("checklen.%d vs %d, checknumtx %d vs %d\n",checklen,(int32_t)(filesize - sizeof(checklen) - sizeof(checknumtx)),checknumtx,*numtxp); } - else if ( 0 ) + else if ( (0) ) { OS_removefile(fname,0); printf("(%s) removed to suppress errors\n",fname); @@ -701,7 +701,7 @@ int32_t iguana_RTiterate(struct supernet_info *myinfo,struct iguana_info *coin,i { num++; iguana_blockQ("RTiterate",coin,0,-1,block->RO.hash2,1); - if ( 0 && coin->peers != 0 && (n= coin->peers->numranked) > 0 ) + if ( (0) && coin->peers != 0 && (n= coin->peers->numranked) > 0 ) { if ( (addr= coin->peers->ranked[rand() % n]) != 0 ) iguana_sendblockreqPT(coin,addr,0,-1,block->RO.hash2,1); @@ -809,7 +809,7 @@ void iguana_RTnewblock(struct supernet_info *myinfo,struct iguana_info *coin,str }*/ if ( block->height < coin->firstRTheight || block->height >= coin->firstRTheight+sizeof(coin->RTblocks)/sizeof(*coin->RTblocks) ) { - if ( 0 && coin->firstRTheight > 0 ) + if ( (0) && coin->firstRTheight > 0 ) printf("iguana_RTnewblock illegal blockheight.%d\n",block->height); return; } diff --git a/iguana/iguana_recv.c b/iguana/iguana_recv.c index 8a318fb58..d7426af08 100755 --- a/iguana/iguana_recv.c +++ b/iguana/iguana_recv.c @@ -85,7 +85,7 @@ int32_t iguana_sendblockreqPT(struct iguana_info *coin,struct iguana_peer *addr, } if ( checkbp != bp || j != bundlei ) bp = 0, bundlei = -1; - if ( 0 && coin->enableCACHE != 0 && iguana_speculativesearch(coin,&block,hash2) != 0 ) + if ( (0) && coin->enableCACHE != 0 && iguana_speculativesearch(coin,&block,hash2) != 0 ) { if ( block != 0 && block->hdrsi != 0 && block->bundlei != 0 ) { @@ -127,7 +127,7 @@ int32_t iguana_sendblockreqPT(struct iguana_info *coin,struct iguana_peer *addr, iguana_send(coin,addr,serialized,len); if ( block != 0 ) block->issued = addr->pendtime; - if ( 0 && coin->current == bp ) + if ( (0) && coin->current == bp ) printf("REQ.(%s) [%d:%d] %s n.%d\n",bits256_str(hexstr,hash2),bundlei,bp!=0?bp->hdrsi:-1,addr->ipaddr,addr->pendblocks); } else printf("MSG_BLOCK null datalen.%d\n",len); return(len); @@ -267,7 +267,7 @@ int32_t iguana_speculativefind(struct iguana_info *coin,struct iguana_bundle *bp for (j=numcached=0; jn; j++) if ( bp->speculativecache[j] != 0 ) numcached++; - if ( 0 && bp == coin->current ) + if ( (0) && bp == coin->current ) printf("cache %s [%d:%d] h.%d s.%d c.%d -> %d\n",bits256_str(str,block->RO.hash2),bp->hdrsi,i,bp->numhashes,bp->numsaved,bp->numcached,numcached); return(i); } @@ -326,7 +326,7 @@ void iguana_oldgotblockM(struct supernet_info *myinfo,struct iguana_info *coin,s printf("iguana_getblockM: illegal recvlen.%d\n",recvlen); return; } - if ( 0 ) + if ( (0) ) { for (i=0; ispace[0]; i++) if ( txdata->space[i] != 0 ) @@ -356,7 +356,7 @@ void iguana_oldgotblockM(struct supernet_info *myinfo,struct iguana_info *coin,s { printf("got block that doesnt validate? %s\n",bits256_str(str,origtxdata->zblock.RO.hash2)); return; - } else if ( 0 && coin->enableCACHE != 0 ) + } else if ( (0) && coin->enableCACHE != 0 ) printf("c.%d v.(%s) %s n%d\n",coin->enableCACHE,bits256_str(str,origtxdata->zblock.RO.hash2),addr->ipaddr,addr->pendblocks); origtxdata->zblock.txvalid = 1; if ( fromcache == 0 && coin->virtualchain == 0 && addr != 0 && addr != &coin->internaladdr ) @@ -430,7 +430,7 @@ void iguana_oldgotblockM(struct supernet_info *myinfo,struct iguana_info *coin,s else { iguana_bundletime(coin,bp,bundlei,block,0); - if ( 0 && bp == coin->current ) + if ( (0) && bp == coin->current ) printf("recv [%d:%d] %s\n",bp->hdrsi,bundlei,bits256_str(str,block->RO.hash2)); } } @@ -462,7 +462,7 @@ void iguana_oldgotblockM(struct supernet_info *myinfo,struct iguana_info *coin,s req = iguana_bundlereq(coin,addr,'B',data,copyflag * recvlen); req->copyflag = 1; req->H = *H; - if ( 0 && iguana_sethdr(&checkH,coin->chain->netmagic,H->command,req->serializeddata,recvlen) > 0 && memcmp(&checkH,H,sizeof(checkH)) != 0 ) + if ( (0) && iguana_sethdr(&checkH,coin->chain->netmagic,H->command,req->serializeddata,recvlen) > 0 && memcmp(&checkH,H,sizeof(checkH)) != 0 ) { int z; for (z=0; zaddr = addr; //if ( (bits256_cmp(origtxdata->zblock.RO.hash2,coin->blocks.hwmchain.RO.hash2) == 0 || req->zblock.mainchain == 0 || req->zblock.valid == 0 || req->zblock.txvalid == 0) && iguana_RTrawdata(coin,origtxdata->zblock.RO.hash2,0,&len,&numtx,1) == 0 ) queue_enqueue("recvQ",&coin->recvQ,&req->DL); - if ( 0 && strcmp("BTCD",coin->symbol) == 0 ) + if ( (0) && strcmp("BTCD",coin->symbol) == 0 ) printf("%s Q.(%s)\n",coin->symbol,bits256_str(str,origtxdata->zblock.RO.hash2)); } else printf("nonz fpos.%d %s\n",txdata->zblock.fpos,bits256_str(str,origtxdata->zblock.RO.hash2)); } @@ -609,7 +609,7 @@ int32_t iguana_bundlestats_update(struct iguana_info *coin,struct iguana_block * else { iguana_bundletime(coin,bp,bundlei,block,0); - if ( 0 && bp == coin->current ) + if ( (0) && bp == coin->current ) printf("recv [%d:%d] %s\n",bp->hdrsi,bundlei,bits256_str(str,block->RO.hash2)); return(0); } @@ -648,7 +648,7 @@ struct iguana_bundlereq *iguana_recv_bundlereq(struct iguana_info *coin,struct i req = iguana_bundlereq(coin,addr,'B',data,copyflag * recvlen); req->copyflag = 1; req->H = *H; - if ( 0 && iguana_sethdr(&checkH,coin->chain->netmagic,H->command,req->serializeddata,recvlen) > 0 && memcmp(&checkH,H,sizeof(checkH)) != 0 ) + if ( (0) && iguana_sethdr(&checkH,coin->chain->netmagic,H->command,req->serializeddata,recvlen) > 0 && memcmp(&checkH,H,sizeof(checkH)) != 0 ) { int z; for (z=0; zenableCACHE != 0) && (strcmp(coin->symbol,"BTC") != 0); req = iguana_recv_bundlereq(coin,addr,copyflag,H,data,recvlen,bp,bundlei,txdata); queue_enqueue("recvQ",&coin->recvQ,&req->DL); - if ( 0 && bp->hdrsi == 0 && strcmp("SYS",coin->symbol) == 0 ) + if ( (0) && bp->hdrsi == 0 && strcmp("SYS",coin->symbol) == 0 ) printf("[%d:%d].s%d %s Q.(%s) %s\n",bp->hdrsi,bundlei,numsaved,coin->symbol,bits256_str(str,origtxdata->zblock.RO.hash2),addr->ipaddr); if ( numsaved < coin->chain->bundlesize ) { @@ -991,14 +991,14 @@ void iguana_gotblockhashesM(struct iguana_info *coin,struct iguana_peer *addr,bi req = iguana_bundlereq(coin,addr,'S',0,0); req->hashes = blockhashes, req->n = n; char str[65]; - if ( 0 && n > 2 && addr != 0 ) + if ( (0) && n > 2 && addr != 0 ) printf("addr.%d %s [%d]\n",addr->rank,bits256_str(str,blockhashes[1]),n); queue_enqueue("recvQ",&coin->recvQ,&req->DL); if ( strcmp("BTC",coin->symbol) != 0 ) { if ( n > coin->chain->bundlesize ) iguana_sendblockreqPT(coin,addr,0,-1,blockhashes[1],0); - if ( 0 && coin->RTheight > 0 ) + if ( (0) && coin->RTheight > 0 ) { for (i=1; ihdrsi < coin->MAXBUNDLES || (coin->current != 0 && coin->lastpending != 0 && bp->hdrsi >= coin->current->hdrsi && bp->hdrsi <= coin->lastpending->hdrsi) ) // n = iguana_bundleissuemissing(myinfo,coin,bp,1,3.); - if ( 0 && n > 2 ) + if ( (0) && n > 2 ) printf("ALLHASHES FOUND! %d allhashes.%d issued %d\n",bp->bundleheight,coin->allhashes,n); //if ( bp->queued == 0 ) // iguana_bundleQ(myinfo,coin,bp,bp->n*5 + (rand() % 500)); @@ -1105,7 +1105,7 @@ int32_t iguana_bundlehashadd(struct iguana_info *coin,struct iguana_bundle *bp,i if ( firstflag != 0 && bp->emitfinish == 0 ) { //block->fpos = -1; - if ( 0 && iguana_ramchainfile(SuperNET_MYINFO(0),coin,0,&blockR,bp,bundlei,block) == 0 ) + if ( (0) && iguana_ramchainfile(SuperNET_MYINFO(0),coin,0,&blockR,bp,bundlei,block) == 0 ) { size = sizeof(blockR); iguana_ramchain_free(coin,&blockR,1); @@ -1192,7 +1192,7 @@ void iguana_mainchain_clear(struct supernet_info *myinfo,struct iguana_info *coi return; } } - if ( 0 && tmp != mainchain && coin->RTheight > 0 ) + if ( (0) && tmp != mainchain && coin->RTheight > 0 ) printf("iguana_mainchain_clear: unexpected mismatch ht.%d vs %d %s\n",tmp->height,mainchain->height,bits256_str(str,tmp->RO.hash2)); } } @@ -1208,7 +1208,7 @@ int32_t iguana_height_estimate(struct iguana_info *coin,struct iguana_block **ma if ( tmp->mainchain != 0 && tmp->height >= 0 ) { char str[65]; - if ( 0 && n > 0 && coin->RTheight > 0 ) + if ( (0) && n > 0 && coin->RTheight > 0 ) printf("%s M.%d dist.%d -> %d\n",bits256_str(str,block->RO.hash2),tmp->height,n,tmp->height+n); *mainchainp = tmp; return(tmp->height + n); @@ -1416,7 +1416,7 @@ struct iguana_bundlereq *iguana_recvblockhdrs(struct supernet_info *myinfo,struc prevhash2 = zblocks[i].RO.hash2; } char str[65]; - if ( 0 && bp == coin->current ) + if ( (0) && bp == coin->current ) printf("i.%d n.%d match.%d blockhdrs.%s hdrsi.%d\n",i,n,match,bits256_str(str,zblocks[0].RO.hash2),firstbp!=0?firstbp->hdrsi:-1); /*if ( firstbp != 0 && match >= coin->chain->bundlesize-1 ) { @@ -1479,7 +1479,7 @@ struct iguana_bundlereq *iguana_recvblockhashes(struct supernet_info *myinfo,str memset(zero.bytes,0,sizeof(zero)); bp = 0, bundlei = -2; iguana_bundlefind(coin,&bp,&bundlei,blockhashes[1]); - if ( 0 && strcmp("BTCD",coin->symbol) == 0 )//0 && num >= coin->chain->bundlesize ) + if ( (0) && strcmp("BTCD",coin->symbol) == 0 )//0 && num >= coin->chain->bundlesize ) printf("blockhashes[%d] %d of %d %s bp.%d[%d]\n",num,bp==0?-1:bp->hdrsi,coin->bundlescount,bits256_str(str,blockhashes[1]),bp==0?-1:bp->bundleheight,bundlei); if ( num < 2 ) return(req); @@ -1510,7 +1510,7 @@ struct iguana_bundlereq *iguana_recvblockhashes(struct supernet_info *myinfo,str iguana_blockQ("recvhash1",coin,0,-1,bp->nextbundlehash2,1); } //printf("call allhashes\n"); - if ( 0 && bp->hdrsi == coin->bundlescount-1 ) + if ( (0) && bp->hdrsi == coin->bundlescount-1 ) iguana_autoextend(myinfo,coin,bp); if ( iguana_allhashcmp(myinfo,coin,bp,blockhashes,num) > 0 ) return(req); @@ -1567,11 +1567,11 @@ struct iguana_bundlereq *iguana_recvblockhashes(struct supernet_info *myinfo,str { blockhashes[0] = bp->hashes[0]; vcalc_sha256(0,allhash.bytes,blockhashes[0].bytes,coin->chain->bundlesize * sizeof(*blockhashes)); - if ( 0 && i == starti ) + if ( (0) && i == starti ) printf("vcalc.(%s) [%d].(%s)\n",bits256_str(str,allhash),bp->hdrsi,bits256_str(str2,bp->hashes[0])); if ( bits256_cmp(allhash,bp->allhash) == 0 ) { - if ( 0 && bp->speculative == 0 ) + if ( (0) && bp->speculative == 0 ) printf("matched allhashes.[%d]\n",bp->hdrsi); if ( bp->queued != 0 ) bp->queued = 0; @@ -1655,11 +1655,11 @@ struct iguana_bundlereq *iguana_recvblock(struct supernet_info *myinfo,struct ig coin->longestchain = prevblock->height+1; } else iguana_blockQ("prev",coin,0,-1,origblock->RO.prev_block,1); } - if ( 0 && block != 0 ) + if ( (0) && block != 0 ) printf("%s received.(%s) [%d:%d]\n",coin->symbol,bits256_str(str,origblock->RO.hash2),block->hdrsi,block->bundlei); if ( (bp= iguana_bundleset(myinfo,coin,&block,&bundlei,(struct iguana_block *)origblock)) != 0 && bp == coin->current && block != 0 && bp->speculative != 0 && bundlei >= 0 ) { - if ( 0 && strcmp("BTCD",coin->symbol) == 0 ) + if ( (0) && strcmp("BTCD",coin->symbol) == 0 ) printf("%s received.(%s) %s\n",coin->symbol,bits256_str(str,origblock->RO.hash2),addr->ipaddr); if ( bp->speculative != 0 && bp->numspec <= bundlei ) { @@ -1730,7 +1730,7 @@ struct iguana_bundlereq *iguana_recvblock(struct supernet_info *myinfo,struct ig } } // else printf("RECV MAINCHAIN.%d\n",coin->blocks.hwmchain.height); } - if ( 0 && time(NULL) > bp->hdrtime+3 && bundlei == 1 && bp != 0 && bp->numhashes < bp->n && strcmp("BTC",coin->symbol) != 0 && bp->speculative == 0 && bp == coin->current ) + if ( (0) && time(NULL) > bp->hdrtime+3 && bundlei == 1 && bp != 0 && bp->numhashes < bp->n && strcmp("BTC",coin->symbol) != 0 && bp->speculative == 0 && bp == coin->current ) { printf("reissue hdrs request for [%d]\n",bp->hdrsi); bp->hdrtime = (uint32_t)time(NULL); @@ -1916,7 +1916,7 @@ int32_t iguana_reqblocks(struct supernet_info *myinfo,struct iguana_info *coin) if ( 1 && (rand() % 100000) == 0 )//|| bp->bundleheight > coin->longestchain-coin->chain->bundlesize ) printf("%s %s MAIN.%d t %.3f lag %.3f\n",coin->symbol,bits256_str(str,hash2),coin->blocks.hwmchain.height+1,threshold,lag); } - if ( 0 && bp != 0 && bundlei < bp->n-1 && (bits256_nonz(bp->hashes[bundlei+1]) != 0 || (bp->speculative != 0 && bits256_nonz(bp->speculative[bundlei+1]) != 0)) ) + if ( (0) && bp != 0 && bundlei < bp->n-1 && (bits256_nonz(bp->hashes[bundlei+1]) != 0 || (bp->speculative != 0 && bits256_nonz(bp->speculative[bundlei+1]) != 0)) ) { int32_t j; //memset(bp->hashes[bundlei].bytes,0,sizeof(bp->hashes[bundlei])); @@ -2014,7 +2014,7 @@ int32_t iguana_reqhdrs(struct iguana_info *coin) if ( now > bp->issuetime+lag && now > bp->hdrtime+3 ) { bp->hdrtime = now; - if ( 0 && bp == coin->current ) + if ( (0) && bp == coin->current ) printf("LAG.%d hdrsi.%d numhashes.%d:%d needhdrs.%d qsize.%d zcount.%d\n",(uint32_t)(now-bp->hdrtime),i,bp->numhashes,bp->n,iguana_needhdrs(coin),queue_size(&coin->hdrsQ),coin->zcount); if ( bp->issuetime == 0 ) coin->numpendings++; @@ -2045,7 +2045,7 @@ int32_t iguana_reqhdrs(struct iguana_info *coin) } } } - if ( 0 && n > 0 ) + if ( (0) && n > 0 ) printf("REQ HDRS pending.%d\n",n); coin->zcount = 0; } @@ -2062,7 +2062,7 @@ int32_t iguana_blockQ(char *argstr,struct iguana_info *coin,struct iguana_bundle //getchar(); return(-1); } - if ( 0 && coin->enableCACHE != 0 && iguana_speculativesearch(coin,&block,hash2) != 0 && block != 0 && block->txvalid != 0 ) + if ( (0) && coin->enableCACHE != 0 && iguana_speculativesearch(coin,&block,hash2) != 0 && block != 0 && block->txvalid != 0 ) { //printf("found valid [%d:%d] in blockQ\n",block!=0?block->hdrsi:-1,block!=0?block->bundlei:-1); return(0); @@ -2159,7 +2159,7 @@ int32_t iguana_pollQsPT(struct iguana_info *coin,struct iguana_peer *addr) { uint8_t serialized[sizeof(struct iguana_msghdr) + sizeof(uint32_t)*32 + sizeof(bits256)]; struct iguana_block *block; struct iguana_blockreq *req=0; char *hashstr=0; bits256 hash2; - int32_t bundlei,priority,i,m,z,pend,limit,height=-1,datalen,flag = 0; struct stritem *hashitem; + int32_t bundlei,priority,i,m=0,z,pend,limit,height=-1,datalen,flag = 0; struct stritem *hashitem; uint32_t now; struct iguana_bundle *bp; struct iguana_peer *ptr; if ( addr->msgcounts.verack == 0 ) return(0); @@ -2193,7 +2193,7 @@ int32_t iguana_pollQsPT(struct iguana_info *coin,struct iguana_peer *addr) } if ( bp == 0 || bp->speculative == 0 || bp == coin->current || bp->hdrsi == coin->bundlescount-1 || bp->numhashes < bp->n ) { - if ( 0 && bp == coin->current ) + if ( (0) && bp == coin->current ) printf("%s request HDR.(%s) numhashes.%d [%d]\n",addr!=0?addr->ipaddr:"local",hashstr,bp!=0?bp->numhashes:0,bp!=0?bp->hdrsi:-1); iguana_send(coin,addr,serialized,datalen); addr->pendhdrs++; diff --git a/iguana/iguana_rpc.c b/iguana/iguana_rpc.c index ed70729f7..d88605b6c 100755 --- a/iguana/iguana_rpc.c +++ b/iguana/iguana_rpc.c @@ -1144,7 +1144,7 @@ void iguana_rpcloop(void *args) { static char *jsonbuf; uint16_t port; struct supernet_info *myinfo = args; char filetype[128],content_type[128]; - int32_t recvlen,flag,bindsock,postflag,contentlen,sock,remains,numsent,jsonflag,hdrsize,len; + int32_t recvlen,flag,bindsock,postflag=0,contentlen,sock,remains,numsent,jsonflag=0,hdrsize,len; socklen_t clilen; char helpname[512],remoteaddr[64],*buf,*retstr,*space;//,*retbuf; ,n,i,m struct sockaddr_in cli_addr; uint32_t ipbits,i,size = IGUANA_WIDTH*IGUANA_HEIGHT*16 + 512; if ( (port= myinfo->argport) == 0 ) diff --git a/iguana/iguana_scripts.c b/iguana/iguana_scripts.c index a0cb4a07a..d8bd60c71 100755 --- a/iguana/iguana_scripts.c +++ b/iguana/iguana_scripts.c @@ -333,9 +333,9 @@ int32_t _iguana_calcrmd160(struct iguana_info *coin,struct vin_info *vp) if ( (plen= vp->spendscript[2]+5) != vp->spendlen ) { return(IGUANA_SCRIPT_STRANGE); - while ( plen < vp->spendlen ) + /*while ( plen < vp->spendlen ) if ( vp->spendscript[plen++] != 0x61 ) // nop - return(IGUANA_SCRIPT_STRANGE); + return(IGUANA_SCRIPT_STRANGE);*/ } return(IGUANA_SCRIPT_76A988AC); } diff --git a/iguana/iguana_secp.c b/iguana/iguana_secp.c index 05e43e01a..614f970e4 100755 --- a/iguana/iguana_secp.c +++ b/iguana/iguana_secp.c @@ -655,9 +655,9 @@ int32_t iguana_schnorr_test(void *ctx) { sigs[i] = sig64[i]; continue; - for (j=0; j<64; j++) - printf("%02x",sig64[i][j]); - printf(" sig[%d]\n",i); + //for (j=0; j<64; j++) + // printf("%02x",sig64[i][j]); + //printf(" sig[%d]\n",i); } for (i=0; i> 8) & 0xff); } else return(-1); memcpy(&serialized[len],msg->redeemscript,p2shlen), len += p2shlen; - if ( 0 ) + if ( (0) ) { int32_t j; for (j=0; jsequence),&msg->sequence); - if ( 0 ) + if ( (0) ) { int32_t i; char str[65]; for (i=0; ipk_scriptlen > 0 ) { memcpy(&serialized[len],msg->pk_script,msg->pk_scriptlen); - if ( 0 ) + if ( (0) ) { int32_t i; for (i=0; ipk_scriptlen; i++) @@ -294,7 +294,7 @@ int32_t iguana_parsevinobj(struct supernet_info *myinfo,struct iguana_info *coin // continue; if ( serialized[len + m + siglen - 1] == SIGHASH_ALL ) memcpy(V->signers[i++].sig,&serialized[len + m],siglen); - if ( 0 ) + if ( (0) ) { int32_t j; for (j=0; jprivkey = privkey; if ( bitcoin_priv2wif(waddr->wifstr,waddr->privkey,coin->chain->wiftype) > 0 ) { - if ( 0 && waddr->wiftype != coin->chain->wiftype ) + if ( (0) && waddr->wiftype != coin->chain->wiftype ) printf("ensurepriv warning: mismatched wiftype %02x != %02x\n",waddr->wiftype,coin->chain->wiftype); - if ( 0 && waddr->addrtype != coin->chain->pubtype ) + if ( (0) && waddr->addrtype != coin->chain->pubtype ) printf("ensurepriv warning: mismatched addrtype %02x != %02x\n",waddr->addrtype,coin->chain->pubtype); } } @@ -1220,7 +1220,7 @@ cJSON *iguana_pubkeysjson(uint8_t *pubkeyptrs[],int32_t numpubkeys) cJSON *bitcoin_txinput(struct iguana_info *coin,cJSON *txobj,bits256 txid,int32_t vout,uint32_t sequenceid,uint8_t *spendscript,int32_t spendlen,uint8_t *redeemscript,int32_t p2shlen,uint8_t *pubkeys[],int32_t numpubkeys,uint8_t *sig,int32_t siglen) { - cJSON *item,*vins; char p2shscriptstr[IGUANA_MAXSCRIPTSIZE*2+1]; uint8_t *script,len; + cJSON *item,*vins; char p2shscriptstr[IGUANA_MAXSCRIPTSIZE*2+1]; uint8_t *script,len=0; vins = jduplicate(jobj(txobj,"vin")); jdelete(txobj,"vin"); item = cJSON_CreateObject(); @@ -1284,7 +1284,7 @@ cJSON *bitcoin_txoutput(cJSON *txobj,uint8_t *paymentscript,int32_t len,uint64_t int32_t iguana_interpreter(struct iguana_info *coin,cJSON *logarray,int64_t nLockTime,struct vin_info *V,int32_t numvins) { - uint8_t script[IGUANA_MAXSCRIPTSIZE],*activescript,savescript[IGUANA_MAXSCRIPTSIZE]; char str[IGUANA_MAXSCRIPTSIZE*2+1]; int32_t vini,scriptlen,activescriptlen,savelen,errs = 0; cJSON *spendscript,*item; + uint8_t script[IGUANA_MAXSCRIPTSIZE],*activescript,savescript[IGUANA_MAXSCRIPTSIZE]; char str[IGUANA_MAXSCRIPTSIZE*2+1]; int32_t vini,scriptlen,activescriptlen,savelen,errs = 0; cJSON *spendscript,*item=0; for (vini=0; vini>1) < maxsize ) { serialized = malloc(maxsize); @@ -1421,13 +1422,13 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf decode_hex(serialized,len,rawtx); if ( (txobj= bitcoin_hex2json(coin,height,&txid,msgtx,rawtx,extraspace,extralen,serialized4,vins,V->suppress_pubkeys)) != 0 ) { - if ( 0 && vins != 0 ) + if ( (0) && vins != 0 ) printf("txobj.(%s)\n",jprint(txobj,0)); if ( jobj(txobj,"error") != 0 ) { printf("txobj.(%s)\n",jprint(txobj,0)); } - if ( 0 && (checkstr= bitcoin_json2hex(myinfo,coin,&txid,txobj,V)) != 0 ) // no guarantee of identical regen + if ( (0) && (checkstr= bitcoin_json2hex(myinfo,coin,&txid,txobj,V)) != 0 ) // no guarantee of identical regen { if ( strcmp(rawtx,checkstr) != 0 ) { @@ -1467,6 +1468,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf if ( msgtx->vins[i].p2shlen != 0 ) { char coinaddr[64]; uint32_t userdatalen,sigsize,pubkeysize; uint8_t *userdata; int32_t j,k,hashtype,type,flag; struct vin_info mvin,mainvin; bits256 zero; + memset(zero.bytes,0,sizeof(zero)); coinaddr[0] = 0; sigsize = 0; flag = (msgtx->vins[i].vinscript[0] == 0); diff --git a/iguana/iguana_spendvectors.c b/iguana/iguana_spendvectors.c index 2da998af4..7a0cc5a27 100755 --- a/iguana/iguana_spendvectors.c +++ b/iguana/iguana_spendvectors.c @@ -238,8 +238,8 @@ struct iguana_bundle *iguana_fastexternalspent(struct supernet_info *myinfo,stru int32_t iguana_spendvectors(struct supernet_info *myinfo,struct iguana_info *coin,struct iguana_bundle *bp,struct iguana_ramchain *ramchain,int32_t starti,int32_t numblocks,int32_t convertflag,int32_t iterate) { static uint64_t total,emitted; - int32_t iter,spendind,n=0,txidind,errs=0,emit=0,i,j,k; double startmillis; bits256 prevhash; - uint32_t spent_unspentind,spent_pkind,now,starttime; struct iguana_ramchaindata *rdata; + int32_t iter,spendind=0,n=0,txidind,errs=0,emit=0,i,j,k; double startmillis; bits256 prevhash; + uint32_t spent_unspentind=0,spent_pkind,now,starttime; struct iguana_ramchaindata *rdata; struct iguana_bundle *spentbp; struct iguana_blockRO *B; struct iguana_spendvector *ptr; struct iguana_unspent *u,*spentU; struct iguana_txid *T; char str[65]; struct iguana_spend *S,*s; //void *fastfind = 0; @@ -270,7 +270,7 @@ int32_t iguana_spendvectors(struct supernet_info *myinfo,struct iguana_info *coi ptr = mycalloc('x',sizeof(*ptr),n); total += n; startmillis = OS_milliseconds(); - if ( 0 && strcmp(coin->symbol,"BTC") == 0 ) + if ( (0) && strcmp(coin->symbol,"BTC") == 0 ) printf("start UTXOGEN.%d max.%d ptr.%p millis.%.3f\n",bp->bundleheight,n,ptr,startmillis); starttime = (uint32_t)time(NULL); iguana_ramchain_prefetch(coin,&bp->ramchain,3); @@ -383,7 +383,7 @@ int32_t iguana_spendvectors(struct supernet_info *myinfo,struct iguana_info *coi ptr[emit].unspentind = spent_unspentind; ptr[emit].fromheight = bp->bundleheight + i; ptr[emit].tmpflag = 1; - if ( 0 && bp == coin->current ) + if ( (0) && bp == coin->current ) printf("fromht.%d spends [%d] TMPVECTOR u%d s%u\n",ptr[emit].fromheight,ptr[emit].hdrsi,ptr[emit].unspentind,spendind); emit++; } @@ -436,7 +436,7 @@ int32_t iguana_spendvectors(struct supernet_info *myinfo,struct iguana_info *coi //printf("ALLOC tmpspends.[%d]\n",bp->hdrsi); ptr = 0; } - if ( 0 && bp == coin->current ) + if ( (0) && bp == coin->current ) printf("spendvectors.[%d]: tmpspends.%p[%d] after += emit.%d X.%p\n",bp->hdrsi,bp->tmpspends,bp->numtmpspends,emit,bp->ramchain.Xspendinds); } else errs = -iguana_spendvectorsave(coin,bp,ramchain,ptr!=0?ptr:bp->tmpspends,emit,n); } @@ -486,12 +486,12 @@ int32_t iguana_balancegen(struct iguana_info *coin,int32_t incremental,struct ig spendind = B[starti].firstvin; unspentind = B[starti].firstvout; emit = startemit; - if ( 0 && (coin->RTheight == 0 || bp->bundleheight+bp->n < coin->RTheight) ) + if ( (0) && (coin->RTheight == 0 || bp->bundleheight+bp->n < coin->RTheight) ) fprintf(stderr,"BALANCEGEN.[%d] %p[%d] starti.%d s%d <-> endi.%d s%d startemit.%d\n",bp->hdrsi,Xspendinds,numXspends,starti,spendind,endi,B[endi].firstvin+B[endi].numvins,startemit); for (i=starti; i<=endi; i++) { now = (uint32_t)time(NULL); - if ( 0 && bp == coin->current ) + if ( (0) && bp == coin->current ) printf("hdrs.[%d] B[%d] 1st txidind.%d txn_count.%d firstvin.%d firstvout.%d\n",bp->hdrsi,i,B[i].firsttxidind,B[i].txn_count,B[i].firstvin,B[i].firstvout); if ( txidind != B[i].firsttxidind || spendind != B[i].firstvin || unspentind != B[i].firstvout ) { @@ -506,7 +506,7 @@ int32_t iguana_balancegen(struct iguana_info *coin,int32_t incremental,struct ig printf("balancegen: txidind %u != %u T[txidind].firsttxidind || spendind %u != %u T[txidind].firstvin errs.%d (%d %d)\n",txidind,(uint32_t)T[txidind].txidind,spendind,(uint32_t)T[txidind].firstvin,errs,unspentind,B[i].firstvout); return(-1); } - if ( 0 && bp == coin->current ) + if ( (0) && bp == coin->current ) printf("starti.%d txidind.%d txi.%d numvins.%d spendind.%d\n",i,txidind,j,T[txidind].numvins,spendind); /*if ( bp == coin->current )//ramchain == &coin->RTramchain ) { @@ -541,7 +541,7 @@ int32_t iguana_balancegen(struct iguana_info *coin,int32_t incremental,struct ig spent_hdrsi = spend->hdrsi; h = spend->fromheight; } - if ( 0 && bp == coin->current ) + if ( (0) && bp == coin->current ) printf("external prevout.%d (emit.%d numX.%d) %p u%d p%d errs.%d spent_hdrsi.%d s%u\n",s->prevout,emit,numXspends,Xspendinds,spent_unspentind,spent_pkind,errs,spent_hdrsi,spendind); } else if ( s->prevout >= 0 ) @@ -567,7 +567,7 @@ int32_t iguana_balancegen(struct iguana_info *coin,int32_t incremental,struct ig spentbp = 0; if ( (spentbp= coin->bundles[spent_hdrsi]) != 0 && spent_unspentind > 0 && spent_pkind > 0 ) { - if ( 0 && bp == coin->current ) + if ( (0) && bp == coin->current ) printf("[%d] spendind.%u -> [%d] u%d\n",bp->hdrsi,spendind,spent_hdrsi,spent_unspentind); if ( iguana_volatileupdate(coin,incremental,&spentbp->ramchain,spent_hdrsi,spent_unspentind,spent_pkind,spent_value,spendind,h) < 0 ) //(spentbp == coin->current) ? &coin->RTramchain : errs++; @@ -967,7 +967,7 @@ int32_t iguana_balanceflush(struct supernet_info *myinfo,struct iguana_info *coi } char str[65]; printf("BALANCES WRITTEN for %d orig.%d bundles %s\n",coin->balanceswritten,coin->origbalanceswritten,bits256_str(str,coin->balancehash)); //iguana_utxoaddr_gen(myinfo,coin,(coin->balanceswritten - 1) * coin->chain->bundlesize); - if ( 0 && coin->balanceswritten > coin->origbalanceswritten+10 ) // strcmp(coin->symbol,"BTC") == 0 && + if ( (0) && coin->balanceswritten > coin->origbalanceswritten+10 ) // strcmp(coin->symbol,"BTC") == 0 && { coin->active = 0; coin->started = 0; @@ -1119,7 +1119,7 @@ int32_t iguana_convert(struct iguana_info *coin,int32_t helperid,struct iguana_b total[helperid % max] += converted; for (i=sum=0; icurrent ) + if ( (0) && converted != 0 && bp != coin->current ) printf("[%4d] millis %7.3f converted.%-7d balance calc.%-4d of %4d | total.%llu of %llu depth.%d\n",bp->hdrsi,OS_milliseconds()-startmillis,converted,m,n,(long long)sum,(long long)total_tmpspends,(int32_t)depth); } depth--; @@ -1134,7 +1134,7 @@ int32_t iguana_bundlevalidate(struct supernet_info *myinfo,struct iguana_info *c if ( coin->chain->zcash != 0 ) { static uint32_t counter; - if ( 0 && counter++ < 3 ) + if ( (0) && counter++ < 3 ) printf("need to process joinsplits before can validate.%s\n",coin->symbol); bp->validated = (uint32_t)time(NULL); forceflag = 1; diff --git a/iguana/iguana_tx.c b/iguana/iguana_tx.c index 36972a0c6..e096ab1bb 100755 --- a/iguana/iguana_tx.c +++ b/iguana/iguana_tx.c @@ -44,7 +44,7 @@ int32_t iguana_scriptdata(struct iguana_info *coin, uint8_t *scriptspace, long f memcpy(scriptspace,(void *)(fileptr[0] + (uint32_t)scriptpos),scriptlen); return(retval); } - else if ( 0 ) + else if ( (0) ) { printf("munmap (%s)\n",fname); munmap((void *)fileptr[0],fileptr[1]); @@ -350,7 +350,7 @@ int32_t iguana_peerblockrequest(struct supernet_info *myinfo,struct iguana_info { addr->lastsent = block->height; printf("Sendlen.%d block.%d %s to %s\n",total,block->height,bits256_str(str,block->RO.hash2),addr->ipaddr); - if ( 0 ) + if ( (0) ) { struct iguana_txblock txdata; int32_t checklen; static struct OS_memspace RAWMEM; if ( RAWMEM.ptr == 0 ) diff --git a/iguana/iguana_txidfind.c b/iguana/iguana_txidfind.c index 6db6d03ed..6f9e81f52 100755 --- a/iguana/iguana_txidfind.c +++ b/iguana/iguana_txidfind.c @@ -18,7 +18,7 @@ int32_t iguana_alloctxbits(struct iguana_info *coin,struct iguana_ramchain *ramchain) { static int64_t total; struct iguana_ramchaindata *rdata; - if ( 0 && ramchain->txbits == 0 && (rdata= ramchain->H.data) != 0 ) + if ( (0) && ramchain->txbits == 0 && (rdata= ramchain->H.data) != 0 ) { int32_t tlen; uint8_t *TXbits; TXbits = RAMCHAIN_PTR(rdata,TXoffset); @@ -65,7 +65,7 @@ uint32_t iguana_sparseadd(uint8_t *bits,uint32_t ind,int32_t width,uint32_t tabl printf("iguana_sparseadd tablesize zero illegal\n"); return(0); } - if ( 0 && setind == 0 ) + if ( (0) && setind == 0 ) { char str[65]; for (i=n=0; isparsesearches++; //else ramchain->sparseadds++; - if ( 0 && (rdata= ramchain->H.data) != 0 && (ramchain->sparsesearches % 1000000) == 0 ) + if ( (0) && (rdata= ramchain->H.data) != 0 && (ramchain->sparsesearches % 1000000) == 0 ) printf("[%3d] %7d.[%-2d %8d] %5.3f adds.(%-10ld %10ld) search.(hits.%-10ld %10ld) %5.2f%% max.%ld\n",ramchain->height/rdata->numblocks,ramchain->height,width,tablesize,(double)(ramchain->sparseadditers + ramchain->sparsesearchiters)/(1+ramchain->sparsesearches+ramchain->sparseadds),ramchain->sparseadds,ramchain->sparseadditers,ramchain->sparsehits,ramchain->sparsesearches,100.*(double)ramchain->sparsehits/(1+ramchain->sparsesearches),ramchain->sparsemax+1); if ( width == 32 ) { @@ -123,7 +123,7 @@ uint32_t iguana_sparseadd(uint8_t *bits,uint32_t ind,int32_t width,uint32_t tabl else { bitoffset = (ind * width); - if ( 0 && setind == 0 ) + if ( (0) && setind == 0 ) printf("tablesize.%d width.%d bitoffset.%d\n",tablesize,width,(int32_t)bitoffset); for (i=0; i> 3]; modval = (bitoffset & 7); - if ( 0 && setind == 0 ) + if ( (0) && setind == 0 ) printf("tablesize.%d width.%d bitoffset.%d modval.%d i.%d\n",tablesize,width,(int32_t)bitoffset,modval,i); for (x=j=0; j> 3]; - if ( 0 && setind == 0 ) + if ( (0) && setind == 0 ) printf("x.%d\n",x); if ( x == 0 ) { @@ -179,7 +179,7 @@ uint32_t iguana_sparseadd(uint8_t *bits,uint32_t ind,int32_t width,uint32_t tabl } } else bits[bitoffset >> 3] = setind; - if ( 0 ) + if ( (0) ) { for (x=j=0; jn; j++) @@ -395,7 +395,7 @@ int32_t iguana_txidfastfind(struct iguana_info *coin,int32_t *heightp,bits256 tx } return(firstvout); } - else if ( 0 ) + else if ( (0) ) { int32_t k; for (k=-16; k<0; k++) @@ -497,7 +497,7 @@ uint32_t iguana_fastfindinit(struct iguana_info *coin) { fprintf(stderr,"."); sorted = coin->fast[i]; - if ( 0 ) + if ( (0) ) { coin->fast[i] = calloc(1,coin->fastsizes[i]); memcpy(coin->fast[i],sorted,coin->fastsizes[i]); @@ -509,7 +509,7 @@ uint32_t iguana_fastfindinit(struct iguana_info *coin) if ( (num+1)*16 + tablesize*sizeof(*hashtable) == coin->fastsizes[i] ) { hashtable = (int32_t *)((long)sorted + (1 + num)*16); - if ( 0 ) + if ( (0) ) { coin->fasttables[i] = calloc(tablesize,sizeof(*hashtable)); memcpy(coin->fasttables[i],hashtable,tablesize * sizeof(*hashtable)); diff --git a/iguana/iguana_unspents.c b/iguana/iguana_unspents.c index dea1a720c..0a2951429 100755 --- a/iguana/iguana_unspents.c +++ b/iguana/iguana_unspents.c @@ -361,7 +361,7 @@ struct iguana_pkhash *iguana_pkhashfind(struct iguana_info *coin,struct iguana_r { if ( (bp= coin->bundles[i]) != 0 ) { - if ( 0 && coin->RTramchain_busy != 0 ) + if ( (0) && coin->RTramchain_busy != 0 ) { printf("iguana_pkhashfind: unexpected access when RTramchain_busy\n"); return(0); @@ -511,10 +511,10 @@ int32_t iguana_RTscanunspents(struct supernet_info *myinfo,struct iguana_info *c int64_t iguana_RTpkhashbalance(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *array,uint64_t *spentp,struct iguana_outpoint *unspents,int32_t *nump,struct iguana_ramchain *ramchain,struct iguana_pkhash *p,struct iguana_outpoint lastpt,uint8_t rmd160[20],char *coinaddr,uint8_t *pubkey33,int32_t lastheight,int32_t minconf,int32_t maxconf,char *remoteaddr,int32_t includespent) { - struct iguana_unspent *U; struct iguana_utxo *U2; int32_t firstslot,vout,spentflag,max,uheight,spentheight; uint32_t pkind=0,unspentind; uint64_t spent = 0,checkval,deposits = 0; struct iguana_txid *T; struct iguana_account *A2; struct iguana_outpoint outpt; struct iguana_ramchaindata *rdata = 0; uint64_t RTspend = 0; bits256 txid; + struct iguana_unspent *U; struct iguana_utxo *U2; int32_t firstslot,vout,spentflag,max,uheight,spentheight=0; uint32_t pkind=0,unspentind; uint64_t spent = 0,checkval,deposits = 0; struct iguana_txid *T; struct iguana_account *A2; struct iguana_outpoint outpt; struct iguana_ramchaindata *rdata = 0; uint64_t RTspend = 0; bits256 txid; max = *nump; *spentp = *nump = 0; - if ( 0 && coin->RTramchain_busy != 0 ) + if ( (0) && coin->RTramchain_busy != 0 ) { printf("iguana_pkhashbalance: unexpected access when RTramchain_busy\n"); return(0); @@ -599,7 +599,7 @@ int64_t iguana_RTpkhashbalance(struct supernet_info *myinfo,struct iguana_info * } unspentind = U2[unspentind].prevunspentind; } - if ( 0 && llabs((int64_t)spent - (int64_t)checkval - (int64_t)RTspend) > SMALLVAL ) + if ( (0) && llabs((int64_t)spent - (int64_t)checkval - (int64_t)RTspend) > SMALLVAL ) printf("spend %s: [%d] deposits %.8f spent %.8f check %.8f (%.8f) vs A2[%u] %.8f\n",lastheight==IGUANA_MAXHEIGHT?"checkerr":"",lastpt.hdrsi,dstr(deposits),dstr(spent),dstr(checkval)+dstr(RTspend),dstr(*spentp),pkind,dstr(A2[pkind].total)); } (*spentp) = spent; @@ -613,7 +613,7 @@ int32_t iguana_RTpkhasharray(struct supernet_info *myinfo,struct iguana_info *co int32_t i,n,m,numunspents; uint64_t spent,deposits,netbalance,total; struct iguana_outpoint lastpt; struct iguana_pkhash *p,_p; struct iguana_ramchain *ramchain; struct iguana_bundle *bp; if ( coin->RTheight == 0 ) return(-1); - if ( 0 && coin->RTramchain_busy != 0 ) + if ( (0) && coin->RTramchain_busy != 0 ) { printf("iguana_pkhasharray: unexpected access when RTramchain_busy\n"); return(-1); @@ -682,7 +682,7 @@ uint64_t iguana_RTunspents(struct supernet_info *myinfo,struct iguana_info *coin { uint64_t total=0,sum=0; struct iguana_pkhash *P; uint8_t *addrtypes,*pubkeys; int32_t i,j,numunspents,maxunspents,flag = 0; char coinaddr[64]; //portable_mutex_lock(&coin->RTmutex); - while ( 0 && coin->RTramchain_busy != 0 ) + while ( (0) && coin->RTramchain_busy != 0 ) { fprintf(stderr,"iguana_pkhasharray: %s unexpected access when RTramchain_busy\n",coin->symbol); sleep(1); @@ -1181,7 +1181,7 @@ cJSON *iguana_RTlistunspent(struct supernet_info *myinfo,struct iguana_info *coi int32_t iguana_RTunspentslists(struct supernet_info *myinfo,struct iguana_info *coin,uint64_t *totalp,struct iguana_outpoint *unspents,int32_t max,uint64_t required,int32_t minconf,cJSON *addresses,char *remoteaddr) { - uint64_t sum = 0; int32_t i,n,firstslot,numunspents,numaddrs; uint8_t pubkey[65]; char *coinaddr,*spendscriptstr; struct iguana_outpoint outpt; cJSON *array,*item; + uint64_t sum = 0; int32_t i=0,n,firstslot,numunspents,numaddrs; uint8_t pubkey[65]; char *coinaddr,*spendscriptstr; struct iguana_outpoint outpt; cJSON *array,*item; *totalp = 0; numunspents = 0; if ( (numaddrs= cJSON_GetArraySize(addresses)) == 0 ) @@ -1538,7 +1538,7 @@ int32_t iguana_utxoaddr_check(struct supernet_info *myinfo,struct iguana_info *c sum = 0; bitcoin_address(coinaddr,utxoaddr->p2sh == 0 ? coin->chain->pubtype : coin->chain->p2shtype,utxoaddr->rmd160,sizeof(utxoaddr->rmd160)); numunspents += iguana_RTaddr_unspents(myinfo,coin,&sum,&unspents[numunspents],max-numunspents,coinaddr,0,lastheight,0); - if ( 0 && utxoaddr->histbalance != 0 && strcmp(coin->symbol,"BTCD") == 0 ) + if ( (0) && utxoaddr->histbalance != 0 && strcmp(coin->symbol,"BTCD") == 0 ) { total += utxoaddr->histbalance; //printf("fiat/revs sendtoaddress %s %.8f # total %.8f\n",coinaddr,dstr(utxoaddr->histbalance),dstr(total)); @@ -1554,7 +1554,7 @@ int32_t iguana_utxoaddr_check(struct supernet_info *myinfo,struct iguana_info *c flag = 1; //break; } - if ( 0 && flag == 0 )//sum != utxoaddr->histbalance || checkbalance != sum ) + if ( (0) && flag == 0 )//sum != utxoaddr->histbalance || checkbalance != sum ) { bad++; for (i=0; ibundlescount-1; hdrsi++) { if ( (bp= coin->bundles[hdrsi]) != 0 && bp->bundleheight < maxheight ) @@ -1633,7 +1633,7 @@ uint64_t iguana_utxoaddr_gen(struct supernet_info *myinfo,struct iguana_info *co sprintf(fname2,"%s/%s/utxoaddrs.%d",GLOBAL_DBDIR,coin->symbol,height), OS_portable_path(fname2); if ( iguana_utxoaddr_map(coin,fname2) != 0 ) { - if ( 0 && strcmp("BTCD",coin->symbol) == 0 ) + if ( (0) && strcmp("BTCD",coin->symbol) == 0 ) errs = iguana_utxoaddr_validate(myinfo,coin,height); printf("nogen %s HIST BALANCE %s %.8f errs %d\n",fname2,bits256_str(str,coin->utxoaddrhash),dstr(coin->histbalance),errs); if ( errs == 0 && coin->histbalance > 0 && height > 0 ) @@ -1731,14 +1731,14 @@ uint64_t iguana_utxoaddr_gen(struct supernet_info *myinfo,struct iguana_info *co { qsort(&table[offsets[ind] * UTXOADDR_ITEMSIZE],counts[ind],UTXOADDR_ITEMSIZE,_utxoaddr_cmp); continue; - for (j=0; jchain->pubtype,UA.rmd160,sizeof(UA.rmd160)); //printf(" [%4d] p%-5d %12.8f ind.%04x %d %s\n",UA.hdrsi,UA.pkind,dstr(UA.histbalance),ind,j,coinaddr); - } + }*/ } } if ( iguana_utxoaddr_save(coin,fname,balance,counts,offsets,table) == 0 ) @@ -1762,7 +1762,7 @@ uint64_t iguana_utxoaddr_gen(struct supernet_info *myinfo,struct iguana_info *co { printf("validating %s HIST BALANCE %s %.8f errs %d\n",fname2,bits256_str(str,coin->utxoaddrhash),dstr(coin->histbalance),errs); errs = 0; - if ( 0 && strcmp("BTCD",coin->symbol) == 0 ) + if ( (0) && strcmp("BTCD",coin->symbol) == 0 ) errs = iguana_utxoaddr_validate(myinfo,coin,height); printf("gen %s HIST BALANCE %s %.8f errs %d\n",fname2,bits256_str(str,coin->utxoaddrhash),dstr(coin->histbalance),errs); if ( errs != 0 || height == 0 ) diff --git a/iguana/iguana_volatiles.c b/iguana/iguana_volatiles.c index 8bf4923f1..b671f0012 100755 --- a/iguana/iguana_volatiles.c +++ b/iguana/iguana_volatiles.c @@ -290,7 +290,7 @@ int32_t iguana_volatileupdate(struct iguana_info *coin,int32_t incremental,struc utxo = &spentchain->Uextras[spent_unspentind]; if ( utxo->spentflag == 0 ) { - if ( 0 && fromheight/coin->chain->bundlesize >= coin->current->hdrsi ) + if ( (0) && fromheight/coin->chain->bundlesize >= coin->current->hdrsi ) printf("iguana_volatileupdate.%d: [%d] spent.(u%u %.8f pkind.%d) fromht.%d [%d] spendind.%d\n",incremental,spent_hdrsi,spent_unspentind,dstr(spent_value),spent_pkind,fromheight,fromheight/coin->chain->bundlesize,spendind); utxo->prevunspentind = A2[spent_pkind].lastunspentind; utxo->spendind = spendind; diff --git a/iguana/iguana_wallet.c b/iguana/iguana_wallet.c index 9e7afcaef..11d631d2b 100755 --- a/iguana/iguana_wallet.c +++ b/iguana/iguana_wallet.c @@ -818,7 +818,7 @@ cJSON *iguana_walletiterate(struct supernet_info *myinfo,struct iguana_info *coi } printf("persistent address not found in wallet, autoadd.(%s)\n",coinaddr); } - else if ( persistent_flag != 0 && 0 ) + else if ( persistent_flag != 0 && (0) ) printf("found persistent address in wallet\n"); } portable_mutex_unlock(&myinfo->bu_mutex); @@ -1593,7 +1593,7 @@ STRING_ARG(bitcoinrpc,dumpwallet,filename) { if ( (walletobj= jobj(strobj,"wallet")) != 0 ) jadd(retjson,"wallet",jduplicate(walletobj)); - if ( 0 && (walletobj= iguana_walletjson(myinfo)) != 0 ) + if ( (0) && (walletobj= iguana_walletjson(myinfo)) != 0 ) jadd(retjson,"memory",walletobj); free_json(strobj); } diff --git a/iguana/m b/iguana/m new file mode 100755 index 000000000..ef91df931 --- /dev/null +++ b/iguana/m @@ -0,0 +1,9 @@ +#!/bin/bash +#./configure --enable-endomorphism --enable-module-ecdh --enable-module-schnorr --enable-module-rangeproof --enable-experimental --enable-module_recovery +rm -f ../agents/iguana *.o +git pull +cd secp256k1; ./m_unix; cd .. +cd ../crypto777; ./m_LP; cd ../iguana +clang -g -Wno-deprecated -c -O2 -DLIQUIDITY_PROVIDER=1 *.c ../basilisk/basilisk.c ../gecko/gecko.c ../datachain/datachain.c +clang -g -Wno-deprecated -c -DLIQUIDITY_PROVIDER=1 main.c iguana777.c iguana_bundles.c ../basilisk/basilisk.c +clang -g -o ../agents/iguana *.o ../agents/libcrypto777.a /usr/local/lib/libnanomsg.dylib -lcurl -lssl -lcrypto -lpthread -lz -lm diff --git a/iguana/main.c b/iguana/main.c index d469e7d30..c451568cc 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -543,7 +543,7 @@ void iguana_appletests(struct supernet_info *myinfo) { char *str; //iguana_chaingenesis(1,1403138561,0x1e0fffff,8359109,bits256_conv("fd1751cc6963d88feca94c0d01da8883852647a37a0a67ce254d62dd8c9d5b2b")); // BTCD - if ( 0 ) + if ( (0) ) { char genesisblock[1024]; //iguana_chaingenesis("VPN",0,bits256_conv("00000ac7d764e7119da60d3c832b1d4458da9bc9ef9d5dd0d91a15f690a46d99"),genesisblock,"scrypt",1,1409839200,0x1e0fffff,64881664,bits256_conv("698a93a1cacd495a7a4fb3864ad8d06ed4421dedbc57f9aaad733ea53b1b5828")); // VPN @@ -571,13 +571,13 @@ void iguana_appletests(struct supernet_info *myinfo) bitcoin_sharedsecret(myinfo->ctx,hash2,pubkey,33); printf("secp256k1 elapsed %.3f for %d iterations\n",OS_milliseconds() - startmillis,i); getchar();**/ - if ( 0 && (str= SuperNET_JSON(myinfo,iguana_coinfind("BTCD"),cJSON_Parse("{\"protover\":70002,\"RELAY\":1,\"VALIDATE\":1,\"portp2p\":14631,\"rpc\":14632,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":512,\"endpend\":512,\"services\":129,\"maxpeers\":8,\"newcoin\":\"BTCD\",\"active\":1,\"numhelpers\":1,\"poll\":100}"),0,myinfo->rpcport)) != 0 ) + if ( (0) && (str= SuperNET_JSON(myinfo,iguana_coinfind("BTCD"),cJSON_Parse("{\"protover\":70002,\"RELAY\":1,\"VALIDATE\":1,\"portp2p\":14631,\"rpc\":14632,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":512,\"endpend\":512,\"services\":129,\"maxpeers\":8,\"newcoin\":\"BTCD\",\"active\":1,\"numhelpers\":1,\"poll\":100}"),0,myinfo->rpcport)) != 0 ) { free(str); if ( 1 && (str= SuperNET_JSON(myinfo,iguana_coinfind("BTC"),cJSON_Parse("{\"portp2p\":8333,\"RELAY\":0,\"VALIDATE\":0,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":1,\"endpend\":1,\"services\":128,\"maxpeers\":8,\"newcoin\":\"BTC\",\"active\":0,\"numhelpers\":1,\"poll\":100}"),0,myinfo->rpcport)) != 0 ) { free(str); - if ( 0 && (str= SuperNET_JSON(myinfo,iguana_coinfind("BTCD"),cJSON_Parse("{\"agent\":\"SuperNET\",\"method\":\"login\",\"handle\":\"alice\",\"password\":\"alice\",\"passphrase\":\"alice\"}"),0,myinfo->rpcport)) != 0 ) + if ( (0) && (str= SuperNET_JSON(myinfo,iguana_coinfind("BTCD"),cJSON_Parse("{\"agent\":\"SuperNET\",\"method\":\"login\",\"handle\":\"alice\",\"password\":\"alice\",\"passphrase\":\"alice\"}"),0,myinfo->rpcport)) != 0 ) { free(str); if ( (str= SuperNET_JSON(myinfo,iguana_coinfind("BTCD"),cJSON_Parse("{\"agent\":\"SuperNET\",\"method\":\"login\",\"handle\":\"bob\",\"password\":\"bob\",\"passphrase\":\"bob\"}"),0,myinfo->rpcport)) != 0 ) @@ -641,7 +641,7 @@ int32_t iguana_commandline(struct supernet_info *myinfo,char *arg) free(str); } free_json(argjson); - if ( 0 ) + if ( (0) ) { uint32_t buf[81],c; OS_randombytes((void *)buf,sizeof(buf)); @@ -1612,7 +1612,7 @@ void komodo_ICO_batch(cJSON *array,int32_t batchid) printf("# %s KMD %.8f\n",coinaddr,dstr(kmdamount)); if ( (iter & 1) == 0 ) { - if ( 0 ) + if ( (0) ) { printf("curl --url \"http://127.0.0.1:7778\" --data \"{\\\"agent\\\":\\\"dex\\\",\\\"method\\\":\\\"importaddress\\\",\\\"address\\\":\\\"%s\\\",\\\"symbol\\\":\\\"KMD\\\"}\" # %.8f\n",coinaddr,dstr(kmdamount)); printf("sleep 3\n"); @@ -1678,7 +1678,7 @@ void iguana_main(void *arg) #ifdef __APPLE__ char *batchstr,*batchstr2; cJSON *batchjson; long batchsize; char fname[512],fname2[512]; int32_t batchid = 10; sprintf(fname,"REVS.raw"), sprintf(fname2,"REVS.rawtxids"); - if ( 0 && (batchstr= OS_filestr(&batchsize,fname)) != 0 && (batchstr2= OS_filestr(&batchsize,fname2)) != 0 ) + if ( (0) && (batchstr= OS_filestr(&batchsize,fname)) != 0 && (batchstr2= OS_filestr(&batchsize,fname2)) != 0 ) { komodo_REVS_merge(batchstr,batchstr2); } @@ -1763,7 +1763,7 @@ void iguana_main(void *arg) { basilisks_init(myinfo); } - if ( 0 ) + if ( (0) ) { char *jsonstr = "[\"03b7621b44118017a16043f19b30cc8a4cfe068ac4e42417bae16ba460c80f3828\", \"02ebfc784a4ba768aad88d44d1045d240d47b26e248cafaf1c5169a42d7a61d344\", \"03750cf30d739cd7632f77c1c02812dd7a7181628b0558058d4755838117e05339\", \"0394f3529d2e8cc69ffa7a2b55f3761e7be978fa1896ef4c55dc9c275e77e5bf5e\", \"0243c1eeb3777af47187d542e5f8c84f0ac4b05cf5a7ad77faa8cb6d2d56db7823\", \"02bb298844175640a34e908ffdfa2839f77aba3d5edadefee16beb107826e00063\", \"02fa88e549b4b871498f892e527a5d57287916809f8cc3163f641d71c535e8df5a\", \"032f799e370f06476793a122fcd623db7804898fe5aef5572095cfee6353df34bf\", \"02c06fe5401faff4442ef87b7d1b56c2e5a214166615f9a2f2030c71b0cb067ae8\", \"038ac67ca49a8169bcc5de83fe020071095a2c3b2bc4d1c17386977329758956d5\"]"; @@ -1785,4 +1785,4 @@ void iguana_main(void *arg) // features // komodod convert passphrase to privkey // Z -> Z -// iguana init nanomsg in own thread \ No newline at end of file +// iguana init nanomsg in own thread diff --git a/iguana/mini-gmp.c b/iguana/mini-gmp.c index 720cf5fbc..ef9e235df 100644 --- a/iguana/mini-gmp.c +++ b/iguana/mini-gmp.c @@ -4416,6 +4416,7 @@ void mpz_from_bits256(mpz_t bn,bits256 x) bits256 mpz_to_bits256(mpz_t bn) { bits256 x,rev; size_t count; int32_t i; + memset(x.bytes,0,sizeof(x)); mpz_export(rev.bytes,&count,1,sizeof(uint64_t),1,0,bn); for (i=0; i<32; i++) x.bytes[i] = rev.bytes[31-i]; diff --git a/iguana/pangea_api.c b/iguana/pangea_api.c index 3329fd45f..ea7d942e5 100755 --- a/iguana/pangea_api.c +++ b/iguana/pangea_api.c @@ -530,7 +530,7 @@ char *pangea_hexmsg(struct supernet_info *myinfo,struct gecko_chain *cat,void *d } } } - else if ( 0 ) + else if ( (0) ) { for (i=0; ipriv.myind == activej && tp->priv.automuck == 0 ) + if ( (0) && tp->priv.myind == activej && tp->priv.automuck == 0 ) { pangea_sendcmd(myinfo,tp,"faceup",-1,tp->priv.holecards[0].bytes,sizeof(tp->priv.holecards[0]),tp->priv.cardis[0],tp->priv.cardis[0] != 0xff); pangea_sendcmd(myinfo,tp,"faceup",-1,tp->priv.holecards[1].bytes,sizeof(tp->priv.holecards[1]),tp->priv.cardis[1],tp->priv.cardis[1] != 0xff); diff --git a/iguana/pangea_json.c b/iguana/pangea_json.c index c325c4a69..0c3b19840 100755 --- a/iguana/pangea_json.c +++ b/iguana/pangea_json.c @@ -227,6 +227,7 @@ cJSON *pangea_tablestatus(struct supernet_info *myinfo,struct table_info *tp) jaddi64bits(array,tp->active[i]!=0?tp->active[i]->nxt64bits:0); jadd(json,"addrs",array);*/ total = 0; + str = "error"; for (iter=0; iter<6; iter++) { array = cJSON_CreateArray(); @@ -243,22 +244,23 @@ cJSON *pangea_tablestatus(struct supernet_info *myinfo,struct table_info *tp) case 3: val = p->betstatus; str = "status"; break; case 4: val = p->bets; str = "bets"; break; case 5: val = p->won; str = "won"; break; + default: str = "error"; break; } } if ( iter == 5 ) won[i] = val; else { - if ( iter == 3 ) - jaddistr(array,pangea_statusstr((int32_t)val)); - else - { - if ( iter == 4 ) - total += val, bets[i] = val; - else if ( iter == 2 ) - snapshot[i] = val; - jaddinum(array,val); - } + if ( iter == 3 ) + jaddistr(array,pangea_statusstr((int32_t)val)); + else + { + if ( iter == 4 ) + total += val, bets[i] = val; + else if ( iter == 2 ) + snapshot[i] = val; + jaddinum(array,val); + } } } jadd(json,str,array); diff --git a/iguana/ramchain_api.c b/iguana/ramchain_api.c index 90fa47819..7f4878d62 100755 --- a/iguana/ramchain_api.c +++ b/iguana/ramchain_api.c @@ -82,7 +82,7 @@ STRING_ARG(iguana,removecoin,activecoin) { coin->active = 0; coin->started = 0; - if ( 0 ) + if ( (0) ) { for (i=0; i Date: Tue, 14 Feb 2017 20:26:13 +0200 Subject: [PATCH 132/495] Test --- iguana/m | 9 --------- 1 file changed, 9 deletions(-) delete mode 100755 iguana/m diff --git a/iguana/m b/iguana/m deleted file mode 100755 index ef91df931..000000000 --- a/iguana/m +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -#./configure --enable-endomorphism --enable-module-ecdh --enable-module-schnorr --enable-module-rangeproof --enable-experimental --enable-module_recovery -rm -f ../agents/iguana *.o -git pull -cd secp256k1; ./m_unix; cd .. -cd ../crypto777; ./m_LP; cd ../iguana -clang -g -Wno-deprecated -c -O2 -DLIQUIDITY_PROVIDER=1 *.c ../basilisk/basilisk.c ../gecko/gecko.c ../datachain/datachain.c -clang -g -Wno-deprecated -c -DLIQUIDITY_PROVIDER=1 main.c iguana777.c iguana_bundles.c ../basilisk/basilisk.c -clang -g -o ../agents/iguana *.o ../agents/libcrypto777.a /usr/local/lib/libnanomsg.dylib -lcurl -lssl -lcrypto -lpthread -lz -lm From 0cd51fe0a842c200efcc161c9a7e232824c6613b Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 14 Feb 2017 20:47:28 +0200 Subject: [PATCH 133/495] Rm dpowassets --- iguana/dpowassets | 52 ----------------------------------------------- 1 file changed, 52 deletions(-) delete mode 100755 iguana/dpowassets diff --git a/iguana/dpowassets b/iguana/dpowassets deleted file mode 100755 index e0690e019..000000000 --- a/iguana/dpowassets +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/bash -set -x -source pubkey.txt -echo $pubkey - - -curl --url "http://127.0.0.1:7776" --data "{\"timeout\":60000,\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"REVS\",\"pubkey\":\"$pubkey\"}" - -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"SUPERNET\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"DEX\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"PANGEA\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"JUMBLR\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BET\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CRYPTO\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"HODL\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"SHARK\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BOTS\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"MGW\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"USD\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"EUR\",\"pubkey\":\"$pubkey\"}" - -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"JPY\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"GBP\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"AUD\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CAD\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CHF\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"NZD\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CNY\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"RUB\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"MXN\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BRL\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"INR\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"HKD\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"TRY\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"ZAR\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"PLN\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"NOK\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"SEK\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"DKK\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CZK\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"HUF\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"ILS\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"KRW\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"MYR\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"PHP\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"RON\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"SGD\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"THB\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BGN\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"IDR\",\"pubkey\":\"$pubkey\"}" -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"HRK\",\"pubkey\":\"$pubkey\"}" - From 95bc23a070ecd85aab489b533662b71010dfd6c4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 14 Feb 2017 21:14:45 +0200 Subject: [PATCH 134/495] test --- iguana/dpow/dpow_network.c | 14 +++++--------- iguana/iguana777.h | 2 +- iguana/kmd_lookup.h | 2 +- iguana/tests/REVS.batch9 | 7 +++++++ 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index bb9450b6c..59dd152ae 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -70,24 +70,20 @@ NN_CONNECT to (tcp://197.189.248.210:7775) NN_CONNECT to (tcp://149.56.19.212:7775) NN_CONNECT to (tcp://46.165.243.214:7775) NN_CONNECT to (tcp://45.64.168.216:7775) -NN_CONNECT to (tcp://94.102.63.217:7775) -NN_CONNECT to (tcp://192.99.233.217:7775) -NN_CONNECT to (tcp://27.50.68.219:7775) -NN_CONNECT to (tcp://167.114.227.223:7775) -NN_CONNECT to (tcp://94.102.63.227:7775) -NN_CONNECT to (tcp://176.9.0.233:7775) -NN_CONNECT to (tcp://27.50.93.252:7775)*/ +*/ void dex_init(struct supernet_info *myinfo) { - int32_t i,j,mask = 0; char *seeds[] = { "78.47.196.146", "5.9.102.210", "149.56.29.163", "191.235.80.138", "88.198.65.74", "94.102.63.226", "129.232.225.202", "104.255.64.3", "52.72.135.200", "149.56.28.84", "103.18.58.150", "221.121.144.140", "123.249.79.12", "103.18.58.146" }; + int32_t i,j,mask = 0; char *seeds[] = { "78.47.196.146", "5.9.102.210", "149.56.29.163", "191.235.80.138", "88.198.65.74", "94.102.63.226", "129.232.225.202", "104.255.64.3", "52.72.135.200", "149.56.28.84", "103.18.58.150", "221.121.144.140", "123.249.79.12", "103.18.58.146", "27.50.93.252", "176.9.0.233", "94.102.63.227", "167.114.227.223", "27.50.68.219", "192.99.233.217", "94.102.63.217", "45.64.168.216" }; OS_randombytes((void *)&i,sizeof(i)); srand(i); for (i=0; idexseed_ipaddrs)/sizeof(*myinfo->dexseed_ipaddrs); i++) { while ( 1 ) { - j = i == 0 ? i : (rand() % (sizeof(seeds)/sizeof(*seeds))); + j = (rand() % (sizeof(seeds)/sizeof(*seeds))); + if ( i == 0 ) + j = 0; if ( ((1 << j) & mask) == 0 ) break; } diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 648eea8c1..60916e0a0 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -131,7 +131,7 @@ struct supernet_info struct liquidity_info linfos[512]; struct komodo_notaries NOTARY; char seedipaddr[64]; uint32_t dpowipbits[128]; int32_t numdpowipbits; portable_mutex_t notarymutex,dpowmutex; - char dexseed_ipaddrs[4][64]; uint32_t dexipbits[128]; int32_t numdexipbits; portable_mutex_t dexmutex; + char dexseed_ipaddrs[2][64]; uint32_t dexipbits[128]; int32_t numdexipbits; portable_mutex_t dexmutex; // compatibility bits256 pangea_category,instantdex_category; uint8_t logs[256],exps[510]; diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 142dca833..70de42a8b 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -723,7 +723,7 @@ void kmd_bitcoinscan() { if ( (coin= iguana_coinfind(jstri(array,i))) != 0 && strcmp(coin->symbol,"BTC") != 0 ) { - if ( strcmp("KMD",coin->symbol) == 0 ) + //if ( strcmp("KMD",coin->symbol) == 0 ) _kmd_bitcoinscan(coin); } } diff --git a/iguana/tests/REVS.batch9 b/iguana/tests/REVS.batch9 index 725731aa5..9b581cba8 100755 --- a/iguana/tests/REVS.batch9 +++ b/iguana/tests/REVS.batch9 @@ -18,3 +18,10 @@ sleep 1 fiat/revs sendtoaddress RH8q81jTRuH35g2g59iT3kxJWoF9Unzgqq 65.95939412 # total KMD 0.00000000 REVS 5607.48944795 +d5d9950efea532582846b744eaf4e922556fa1446a2364fd55aaa90f4510106b +48acaf51ecc7aba3209bb2532c777ee9594c66d46056cb8003a11cc16c6bbb27 +5c06f259610af698bed238b1a849201c5ef1bd05619773f4df5e930d1a926b40 +f871cf48871b1bf6ccd9a388876ab911666b045da981ccd49f3d54315fdeac11 +e0db5b8c49fe3d7f0a51df0844bb7b04838661a436575f5b8c8c895ed8c33349 +ab617a095862b0db6d3aeec36e628b2d67aa7130548fac7d9be950b7687fec8b + From e30ebf232b1a3551651c1a3b5e391a1a80df00df Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Feb 2017 06:53:49 +0200 Subject: [PATCH 135/495] basilisk refresh --- basilisk/basilisk.c | 82 +++++++++++++++++++++++++++++++++++ iguana/tests/dexgetO | 2 +- iguana/tests/refresh | 2 + includes/iguana_apideclares.h | 1 + 4 files changed, 86 insertions(+), 1 deletion(-) create mode 100755 iguana/tests/refresh diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 6edaa45ae..aef320fbd 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -1070,4 +1070,86 @@ INT_ARG(iguana,paxfiats,mask) komodo_assetcoins(1,mask); return(clonestr("{\"result\":\"success\"}")); } + +int32_t utxocmp(cJSON *utxo,cJSON *utxo2) +{ + bits256 txid,txid2; int32_t vout=-1,vout2=-1; + //printf("cmp (%s) vs (%s)\n",jprint(utxo,0),jprint(utxo2,0)); + txid = jbits256(utxo,"txid"); + vout = jint(utxo,"vout"); + txid2 = jbits256(utxo2,"txid"); + vout2 = jint(utxo2,"vout"); + if ( bits256_cmp(txid,txid2) == 0 && vout == vout2 ) + return(0); + else return(-1); +} + +TWO_STRINGS(basilisk,refresh,symbol,address) +{ + cJSON *array=0,*array2=0,*array3,*item,*item2; char *retstr; int32_t i,j,n,m,vout; bits256 txid; + if ( symbol != 0 && iguana_isnotarychain(symbol) >= 0 && address != 0 && address[0] != 0 ) + { + if ( (retstr= _dex_listunspent(myinfo,symbol,address)) != 0 ) + { + array = cJSON_Parse(retstr); + free(retstr); + } + if ( (retstr= _dex_listunspent2(myinfo,symbol,address)) != 0 ) + { + if ( array == 0 ) + array = cJSON_Parse(retstr); + else array2 = cJSON_Parse(retstr); + free(retstr); + } + if ( array != 0 && array2 != 0 ) // merge + { + m = cJSON_GetArraySize(array2); + array3 = jduplicate(array); + n = cJSON_GetArraySize(array3); + //printf("MERGE %s and %s\n",jprint(array,0),jprint(array2,0)); + for (j=0; j 0 ) + { + //printf("%s, ",jprint(item2,0)); + jaddi(array3,item2); + } + else free_json(item2); + } + free(retstr); + } + } + free_json(array); + return(jprint(array3,1)); + } else return(clonestr("[]")); + } + return(clonestr("{\"error\":\"invalid coin or address specified\"}")); +} #include "../includes/iguana_apiundefs.h" diff --git a/iguana/tests/dexgetO b/iguana/tests/dexgetO index 23eb89f6e..9c187166b 100755 --- a/iguana/tests/dexgetO +++ b/iguana/tests/dexgetO @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettxout\",\"vout\":0,\"txid\":\"cad09f4c3e23ef4cde4980cc0e2b296943f22cbaac183a30f86f49f7eccfedfd\",\"symbol\":\"BTC\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettxout\",\"vout\":1,\"txid\":\"fa3321ed55e8e96ba7221e9cc4bc54b735616649abcc9734bb73f505ee712884\",\"symbol\":\"KMD\"}" diff --git a/iguana/tests/refresh b/iguana/tests/refresh new file mode 100755 index 000000000..dce520f7a --- /dev/null +++ b/iguana/tests/refresh @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"refresh\",\"symbol\":\"KMD\",\"address\":\"RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc\",\"timeout\":600000}" diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 105f0888b..d1d87c0b6 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -76,6 +76,7 @@ INT_ARG(basilisk,paxfiats,mask); HASH_ARRAY_STRING(basilisk,balances,hash,vals,hexstr); HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr); HASH_ARRAY_STRING(basilisk,rawtx,hash,vals,hexstr); +TWO_STRINGS(basilisk,refresh,symbol,address); HASH_ARRAY_STRING(basilisk,getmessage,hash,vals,hexstr); HASH_ARRAY_STRING(basilisk,sendmessage,hash,vals,hexstr); From 1e57a436cba9299cc52f111777faae82e711e35f Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Feb 2017 08:09:59 +0200 Subject: [PATCH 136/495] utxorawtx --- basilisk/basilisk.c | 24 +++++++++++- basilisk/basilisk_bitcoin.c | 51 ++++++++++++++++++++++++ iguana/iguana_payments.c | 74 +++++++++++++++++++++++++++++++++++ iguana/tests/refresh | 2 +- iguana/tests/utxorawtx | 2 + includes/iguana_apideclares.h | 1 + includes/iguana_funcs.h | 1 + 7 files changed, 152 insertions(+), 3 deletions(-) create mode 100755 iguana/tests/utxorawtx diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index aef320fbd..010c5c0b9 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -1115,7 +1115,7 @@ TWO_STRINGS(basilisk,refresh,symbol,address) break; if ( i == n ) { - printf("FOUND NEW %s\n",jprint(item2,0)); + //printf("FOUND NEW %s\n",jprint(item2,0)); jaddi(array3,jduplicate(item2)); } } @@ -1138,7 +1138,10 @@ TWO_STRINGS(basilisk,refresh,symbol,address) { if ( jdouble(item2,"value") > 0 ) { - //printf("%s, ",jprint(item2,0)); + jaddbits256(item2,"txid",txid); + jaddnum(item2,"vout",vout); + jaddnum(item2,"amount",jdouble(item2,"value")); + //printf("%s\n",jprint(item2,0)); jaddi(array3,item2); } else free_json(item2); @@ -1152,4 +1155,21 @@ TWO_STRINGS(basilisk,refresh,symbol,address) } return(clonestr("{\"error\":\"invalid coin or address specified\"}")); } + +STRING_ARRAY_OBJ_STRING(basilisk,utxorawtx,symbol,utxos,vals,ignore) +{ + char *destaddr,*changeaddr; uint64_t satoshis,txfee; int32_t completed,sendflag; + sendflag = jint(vals,"sendflag"); + satoshis = jdouble(vals,"amount") * SATOSHIDEN; + destaddr = jstr(vals,"destaddr"); + changeaddr = jstr(vals,"changeaddr"); + if ( destaddr != 0 && changeaddr != 0 && symbol != 0 && (coin= iguana_coinfind(symbol)) != 0 ) + { + if ( (txfee= jdouble(vals,"txfee") * SATOSHIDEN) == 0 ) + txfee = coin->txfee; + return(iguana_utxorawtx(myinfo,coin,destaddr,changeaddr,satoshis,txfee,&completed,sendflag,utxos)); + } + return(clonestr("{\"error\":\"invalid coin or address specified\"}")); +} + #include "../includes/iguana_apiundefs.h" diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index ee9ae2fb6..cd64de56d 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -580,6 +580,57 @@ char *iguana_utxoduplicates(struct supernet_info *myinfo,struct iguana_info *coi return(rawtx); } +char *iguana_utxorawtx(struct supernet_info *myinfo,struct iguana_info *coin,char *destaddr,char *changeaddr,uint64_t satoshis,uint64_t txfee,int32_t *completedp,int32_t sendflag,cJSON *utxos) +{ + uint8_t script[35],rmd160[20],addrtype; bits256 txid; int32_t spendlen; cJSON *retjson,*txobj=0,*vins=0; char *rawtx=0,*signedtx=0; + *completedp = 0; + if ( iguana_addressvalidate(coin,&addrtype,destaddr) < 0 || iguana_addressvalidate(coin,&addrtype,changeaddr) < 0 ) + return(clonestr("{\"error\":\"invalid coin address\"}")); + bitcoin_addr2rmd160(&addrtype,rmd160,changeaddr); + if ( addrtype != coin->chain->pubtype ) + return(clonestr("{\"error\":\"invalid dest changeaddr type\"}")); + bitcoin_addr2rmd160(&addrtype,rmd160,destaddr); + if ( addrtype != coin->chain->pubtype ) + return(clonestr("{\"error\":\"invalid dest address type\"}")); + retjson = cJSON_CreateObject(); + if ( (txobj= bitcoin_txcreate(coin->symbol,coin->chain->isPoS,0,1,0)) != 0 ) + { + spendlen = bitcoin_standardspend(script,0,rmd160); + bitcoin_txoutput(txobj,script,spendlen,satoshis); + if ( (rawtx= iguana_calcutxorawtx(myinfo,coin,&vins,txobj,satoshis,changeaddr,txfee,utxos,"",0,0)) != 0 ) + { + jaddstr(retjson,"rawtx",rawtx); + if ( (signedtx= iguana_signrawtx(myinfo,coin,0,&txid,completedp,vins,rawtx,0,0)) != 0 ) + { + if ( *completedp != 0 ) + { + jaddbits256(retjson,"txid",txid); + jaddstr(retjson,"signedtx",signedtx); + if ( sendflag != 0 ) + { + //printf("send signedtx.(%s)\n",signedtx); + txid = iguana_sendrawtransaction(myinfo,coin,signedtx); + jaddbits256(retjson,"sentflag",txid); + } + } + } else printf("error signing raw utxoduplicates tx\n"); + } + } + jaddstr(retjson,"result","success"); + if ( *completedp != 0 ) + jadd(retjson,"completed",jtrue()); + else jadd(retjson,"completed",jfalse()); + if ( vins != 0 ) + free_json(vins); + if ( txobj != 0 ) + free_json(txobj); + if ( rawtx != 0 ) + free(rawtx); + if ( signedtx != 0 ) + free(signedtx); + return(jprint(retjson,1)); +} + char *basilisk_bitcoinrawtx(struct supernet_info *myinfo,struct iguana_info *coin,char *remoteaddr,uint32_t basilisktag,int32_t timeoutmillis,cJSON *valsobj,struct vin_info *V) { uint8_t buf[4096]; int32_t oplen,offset,minconf,spendlen; cJSON *vins,*addresses,*txobj = 0; uint32_t locktime; char *opreturn,*spendscriptstr,*changeaddr,*rawtx = 0; int64_t amount,txfee,burnamount; diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 25999b922..9a9a1938a 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -518,6 +518,80 @@ char *iguana_calcrawtx(struct supernet_info *myinfo,struct iguana_info *coin,cJS return(rawtx); } +char *iguana_calcutxorawtx(struct supernet_info *myinfo,struct iguana_info *coin,cJSON **vinsp,cJSON *txobj,int64_t satoshis,char *changeaddr,int64_t txfee,cJSON *utxos,char *remoteaddr,struct vin_info *V,int32_t maxmode) +{ + uint8_t addrtype,rmd160[20],spendscript[IGUANA_MAXSCRIPTSIZE]; int32_t allocflag=0,max,i,n,num,spendlen; char *spendscriptstr,*rawtx=0; bits256 txid; cJSON *sobj,*vins=0,*item; uint64_t value,avail=0,total,change,interests; struct iguana_outpoint *unspents = 0; + *vinsp = 0; + max = 0; + interests = 0; + if ( (n= cJSON_GetArraySize(utxos)) == 0 ) + return(0); + for (i=0; i= satoshis+txfee ) + { + if ( (vins= iguana_RTinputsjson(myinfo,coin,&total,satoshis + txfee,unspents,num,maxmode)) != 0 ) + { + if ( total < (satoshis + txfee) ) + { + free_json(vins); + free(unspents); + printf("insufficient total %.8f vs (%.8f + %.8f)\n",dstr(total),dstr(satoshis),dstr(txfee)); + return(0); + } + total += interests; + if ( (change= (total - (satoshis + txfee))) > 10000 && (changeaddr == 0 || changeaddr[0] == 0) ) + { + printf("no changeaddr for %.8f\n",dstr(change)); + free_json(vins); + free(unspents); + return(0); + } + iguana_createvins(myinfo,coin,txobj,vins); + if ( change > 10000 ) + { + if ( iguana_addressvalidate(coin,&addrtype,changeaddr) < 0 ) + { + free_json(vins); + free(unspents); + printf("illegal destination address.(%s)\n",changeaddr); + return(0); + } + bitcoin_addr2rmd160(&addrtype,rmd160,changeaddr); + spendlen = bitcoin_standardspend(spendscript,0,rmd160); + bitcoin_txoutput(txobj,spendscript,spendlen,change); + } + if ( vins != 0 && V == 0 ) + { + V = calloc(cJSON_GetArraySize(vins),sizeof(*V)), allocflag = 1; + //iguana_vinprivkeys(myinfo,coin,V,vins); + } + rawtx = bitcoin_json2hex(myinfo,coin,&txid,txobj,V); + if ( allocflag != 0 ) + free(V); + } + } + free(unspents); + *vinsp = vins; + return(rawtx); +} + void iguana_RTunspentslock(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *vins) { struct iguana_outpoint spentpt; char coinaddr[64]; int32_t i,RTspentflag,num,spentheight,lockedflag; diff --git a/iguana/tests/refresh b/iguana/tests/refresh index dce520f7a..d6b1839aa 100755 --- a/iguana/tests/refresh +++ b/iguana/tests/refresh @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"refresh\",\"symbol\":\"KMD\",\"address\":\"RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc\",\"timeout\":600000}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"refresh\",\"symbol\":\"KMD\",\"address\":\"RRyBxbrAPRUBCUpiJgJZYrkxqrh8x5ta9Z\",\"timeout\":600000}" diff --git a/iguana/tests/utxorawtx b/iguana/tests/utxorawtx new file mode 100755 index 000000000..7da2fc353 --- /dev/null +++ b/iguana/tests/utxorawtx @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"symbol\":\"KMD\",\"agent\":\"basilisk\",\"method\":\"utxorawtx\",\"vals\":{\"changeaddr\":\"RNmvQtThVZAbc1tFEFmKAnJZrc9XqciNog\",\"destaddr\":\"RHfraY22xd9aAuuUJ6Yjb6HFUXh535z6Lg\",\"txfee\":0.00011,\"amount\":0.01,\"sendflag\":0},\"utxos\":[{\"bestblock\":\"000000a7d7b317af7169a156f6b4b9538293da2a3707a69aa3048998a87fbf2c\",\"confirmations\":0,\"value\":1,\"scriptPubKey\":{\"asm\":\"OP_DUP OP_HASH160 b7128d2ee837cf03e30a2c0e3e0181f7b9669bb6 OP_EQUALVERIFY OP_CHECKSIG\",\"hex\":\"76a914b7128d2ee837cf03e30a2c0e3e0181f7b9669bb688ac\",\"reqSigs\":1,\"type\":\"pubkeyhash\",\"addresses\":[\"RRyBxbrAPRUBCUpiJgJZYrkxqrh8x5ta9Z\"]},\"version\":1,\"coinbase\":false,\"randipbits\":3350674129,\"coin\":\"KMD\",\"txid\":\"94e8c4acd20e5d59d9a6a69375c74749b1eba5821d0f218b44c3ce3d8f6989ec\",\"vout\":1,\"amount\":1}]}" diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index d1d87c0b6..a22544875 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -77,6 +77,7 @@ HASH_ARRAY_STRING(basilisk,balances,hash,vals,hexstr); HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr); HASH_ARRAY_STRING(basilisk,rawtx,hash,vals,hexstr); TWO_STRINGS(basilisk,refresh,symbol,address); +STRING_ARRAY_OBJ_STRING(basilisk,utxorawtx,symbol,utxos,vals,ignore); HASH_ARRAY_STRING(basilisk,getmessage,hash,vals,hexstr); HASH_ARRAY_STRING(basilisk,sendmessage,hash,vals,hexstr); diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index 4a00dfe4a..84cb74bc5 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -639,6 +639,7 @@ int32_t init_sharenrs(uint8_t sharenrs[255],uint8_t *orig,int32_t m,int32_t n); void iguana_schnorr(struct supernet_info *myinfo); void iguana_fixsecp(struct supernet_info *myinfo); +char *iguana_calcutxorawtx(struct supernet_info *myinfo,struct iguana_info *coin,cJSON **vinsp,cJSON *txobj,int64_t satoshis,char *changeaddr,int64_t txfee,cJSON *utxos,char *remoteaddr,struct vin_info *V,int32_t maxmode); #include "../includes/iguana_api.h" From 2143441345b2aea797abb966627d94883f0d8837 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Feb 2017 08:16:31 +0200 Subject: [PATCH 137/495] test --- basilisk/basilisk_bitcoin.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index cd64de56d..b9c1f80a0 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -610,7 +610,7 @@ char *iguana_utxorawtx(struct supernet_info *myinfo,struct iguana_info *coin,cha { //printf("send signedtx.(%s)\n",signedtx); txid = iguana_sendrawtransaction(myinfo,coin,signedtx); - jaddbits256(retjson,"sentflag",txid); + jaddbits256(retjson,"sent",txid); } } } else printf("error signing raw utxoduplicates tx\n"); From bf44f160761e31b614426194c4c2ead85acc87f5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Feb 2017 15:43:26 +0200 Subject: [PATCH 138/495] time lock field --- basilisk/basilisk.c | 8 ++++-- basilisk/basilisk_bitcoin.c | 55 ++++++++++++++++++++++++++++++++++--- iguana/iguana_scripts.c | 7 +++++ iguana/tests/utxorawtx | 2 +- includes/iguana_funcs.h | 1 + 5 files changed, 66 insertions(+), 7 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 010c5c0b9..cf6e14143 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -1158,7 +1158,8 @@ TWO_STRINGS(basilisk,refresh,symbol,address) STRING_ARRAY_OBJ_STRING(basilisk,utxorawtx,symbol,utxos,vals,ignore) { - char *destaddr,*changeaddr; uint64_t satoshis,txfee; int32_t completed,sendflag; + char *destaddr,*changeaddr; uint64_t satoshis,txfee; int32_t completed,sendflag,timelock; + timelock = jint(vals,"timelock"); sendflag = jint(vals,"sendflag"); satoshis = jdouble(vals,"amount") * SATOSHIDEN; destaddr = jstr(vals,"destaddr"); @@ -1167,9 +1168,12 @@ STRING_ARRAY_OBJ_STRING(basilisk,utxorawtx,symbol,utxos,vals,ignore) { if ( (txfee= jdouble(vals,"txfee") * SATOSHIDEN) == 0 ) txfee = coin->txfee; - return(iguana_utxorawtx(myinfo,coin,destaddr,changeaddr,satoshis,txfee,&completed,sendflag,utxos)); + return(iguana_utxorawtx(myinfo,coin,timelock,destaddr,changeaddr,satoshis,txfee,&completed,sendflag,utxos)); } return(clonestr("{\"error\":\"invalid coin or address specified\"}")); } + +int64_t iguana_verifytimelock(struct supernet_info *myinfo,struct iguana_info *coin,uint32_t timelocked,char *destaddr,bits256 txid,int32_t vout) + #include "../includes/iguana_apiundefs.h" diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index b9c1f80a0..dadfc6f88 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -580,22 +580,64 @@ char *iguana_utxoduplicates(struct supernet_info *myinfo,struct iguana_info *coi return(rawtx); } -char *iguana_utxorawtx(struct supernet_info *myinfo,struct iguana_info *coin,char *destaddr,char *changeaddr,uint64_t satoshis,uint64_t txfee,int32_t *completedp,int32_t sendflag,cJSON *utxos) +int64_t iguana_verifytimelock(struct supernet_info *myinfo,struct iguana_info *coin,uint32_t timelocked,char *destaddr,bits256 txid,int32_t vout) { - uint8_t script[35],rmd160[20],addrtype; bits256 txid; int32_t spendlen; cJSON *retjson,*txobj=0,*vins=0; char *rawtx=0,*signedtx=0; + uint8_t script[35],script2[35],p2shscript[128],rmd160[20],addrtype; char *retstr,*spendscriptstr; int32_t p2shlen,spendlen; cJSON *sobj,*txout=0; int64_t value = 0; + bitcoin_addr2rmd160(&addrtype,rmd160,destaddr); + if ( addrtype != coin->chain->pubtype ) + return(-1); + p2shlen = bitcoin_timelockspend(p2shscript,0,rmd160,timelocked); + calc_rmd160(0,rmd160,p2shscript,p2shlen); + spendlen = bitcoin_p2shspend(script,0,rmd160); + if ( coin->FULLNODE != 0 ) + txout = dpow_gettxout(myinfo,coin,txid,vout); + else if ( (retstr= _dex_gettxout(myinfo,coin->symbol,txid,vout)) != 0 ) + { + txout = cJSON_Parse(retstr); + free(retstr); + } + if ( txout != 0 ) + { + if ( (sobj= jobj(txout,"scriptPubKey")) != 0 && (spendscriptstr= jstr(sobj,"hex")) == 0 ) + { + if ( strlen(spendscriptstr) == spendlen*2 ) + { + decode_hex(script2,spendlen,spendscriptstr); + if ( memcmp(script,script2,spendlen) != 0 ) + return(-2); + value = SATOSHIDEN * jdouble(txout,"value"); + } else return(-4); + } + free_json(txout); + return(value); + } return(-2); +} + +char *iguana_utxorawtx(struct supernet_info *myinfo,struct iguana_info *coin,int32_t timelock,char *destaddr,char *changeaddr,uint64_t satoshis,uint64_t txfee,int32_t *completedp,int32_t sendflag,cJSON *utxos) +{ + uint8_t script[35],p2shscript[128],rmd160[20],addrtype; bits256 txid; int32_t p2shlen,spendlen; cJSON *retjson,*txobj=0,*vins=0; char *rawtx=0,*signedtx=0; uint32_t timelocked = 0; *completedp = 0; if ( iguana_addressvalidate(coin,&addrtype,destaddr) < 0 || iguana_addressvalidate(coin,&addrtype,changeaddr) < 0 ) return(clonestr("{\"error\":\"invalid coin address\"}")); bitcoin_addr2rmd160(&addrtype,rmd160,changeaddr); if ( addrtype != coin->chain->pubtype ) - return(clonestr("{\"error\":\"invalid dest changeaddr type\"}")); + return(clonestr("{\"error\":\"invalid changeaddr type\"}")); bitcoin_addr2rmd160(&addrtype,rmd160,destaddr); if ( addrtype != coin->chain->pubtype ) return(clonestr("{\"error\":\"invalid dest address type\"}")); retjson = cJSON_CreateObject(); if ( (txobj= bitcoin_txcreate(coin->symbol,coin->chain->isPoS,0,1,0)) != 0 ) { - spendlen = bitcoin_standardspend(script,0,rmd160); + if ( timelock == 0 ) + spendlen = bitcoin_standardspend(script,0,rmd160); + else + { + timelocked = (uint32_t)(time(NULL)+timelock); + p2shlen = bitcoin_timelockspend(p2shscript,0,rmd160,timelocked); + calc_rmd160(0,rmd160,p2shscript,p2shlen); + spendlen = bitcoin_p2shspend(script,0,rmd160); + printf("timelock.%d spend timelocked %u\n",timelock,timelocked); + } bitcoin_txoutput(txobj,script,spendlen,satoshis); if ( (rawtx= iguana_calcutxorawtx(myinfo,coin,&vins,txobj,satoshis,changeaddr,txfee,utxos,"",0,0)) != 0 ) { @@ -616,6 +658,11 @@ char *iguana_utxorawtx(struct supernet_info *myinfo,struct iguana_info *coin,cha } else printf("error signing raw utxoduplicates tx\n"); } } + if ( timelock != 0 ) + { + jaddnum(retjson,"timelock",timelock); + jaddnum(retjson,"timelocked",timelocked); + } jaddstr(retjson,"result","success"); if ( *completedp != 0 ) jadd(retjson,"completed",jtrue()); diff --git a/iguana/iguana_scripts.c b/iguana/iguana_scripts.c index d8bd60c71..2b8d9f21e 100755 --- a/iguana/iguana_scripts.c +++ b/iguana/iguana_scripts.c @@ -77,6 +77,13 @@ int32_t bitcoin_checklocktimeverify(uint8_t *script,int32_t n,uint32_t locktime) return(n); } +int32_t bitcoin_timelockspend(uint8_t *script,int32_t n,uint8_t rmd160[20],uint32_t timestamp) +{ + n = bitcoin_checklocktimeverify(script,n,timestamp); + n = bitcoin_standardspend(script,n,rmd160); + return(n); +} + int32_t bitcoin_MofNspendscript(uint8_t p2sh_rmd160[20],uint8_t *script,int32_t n,const struct vin_info *vp) { int32_t i,plen; diff --git a/iguana/tests/utxorawtx b/iguana/tests/utxorawtx index 7da2fc353..a157a3ee9 100755 --- a/iguana/tests/utxorawtx +++ b/iguana/tests/utxorawtx @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"symbol\":\"KMD\",\"agent\":\"basilisk\",\"method\":\"utxorawtx\",\"vals\":{\"changeaddr\":\"RNmvQtThVZAbc1tFEFmKAnJZrc9XqciNog\",\"destaddr\":\"RHfraY22xd9aAuuUJ6Yjb6HFUXh535z6Lg\",\"txfee\":0.00011,\"amount\":0.01,\"sendflag\":0},\"utxos\":[{\"bestblock\":\"000000a7d7b317af7169a156f6b4b9538293da2a3707a69aa3048998a87fbf2c\",\"confirmations\":0,\"value\":1,\"scriptPubKey\":{\"asm\":\"OP_DUP OP_HASH160 b7128d2ee837cf03e30a2c0e3e0181f7b9669bb6 OP_EQUALVERIFY OP_CHECKSIG\",\"hex\":\"76a914b7128d2ee837cf03e30a2c0e3e0181f7b9669bb688ac\",\"reqSigs\":1,\"type\":\"pubkeyhash\",\"addresses\":[\"RRyBxbrAPRUBCUpiJgJZYrkxqrh8x5ta9Z\"]},\"version\":1,\"coinbase\":false,\"randipbits\":3350674129,\"coin\":\"KMD\",\"txid\":\"94e8c4acd20e5d59d9a6a69375c74749b1eba5821d0f218b44c3ce3d8f6989ec\",\"vout\":1,\"amount\":1}]}" +curl --url "http://127.0.0.1:7778" --data "{\"symbol\":\"KMD\",\"agent\":\"basilisk\",\"method\":\"utxorawtx\",\"vals\":{\"timelock\":0,\"changeaddr\":\"RNmvQtThVZAbc1tFEFmKAnJZrc9XqciNog\",\"destaddr\":\"RHfraY22xd9aAuuUJ6Yjb6HFUXh535z6Lg\",\"txfee\":0.00011,\"amount\":0.01,\"sendflag\":0},\"utxos\":[{\"bestblock\":\"000000a7d7b317af7169a156f6b4b9538293da2a3707a69aa3048998a87fbf2c\",\"confirmations\":0,\"value\":0.02,\"scriptPubKey\":{\"asm\":\"OP_DUP OP_HASH160 b7128d2ee837cf03e30a2c0e3e0181f7b9669bb6 OP_EQUALVERIFY OP_CHECKSIG\",\"hex\":\"76a914b7128d2ee837cf03e30a2c0e3e0181f7b9669bb688ac\",\"reqSigs\":1,\"type\":\"pubkeyhash\",\"addresses\":[\"RRyBxbrAPRUBCUpiJgJZYrkxqrh8x5ta9Z\"]},\"version\":1,\"coinbase\":false,\"randipbits\":3350674129,\"coin\":\"KMD\",\"txid\":\"9329814cc4c7a8cabf83627d4228c1a2090e776d669c585d824d912ce2e13b13\",\"vout\":1,\"amount\":0.02}]}" diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index 84cb74bc5..b92103be1 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -638,6 +638,7 @@ void libgfshare_init(struct supernet_info *myinfo,uint8_t _logs[256],uint8_t _ex int32_t init_sharenrs(uint8_t sharenrs[255],uint8_t *orig,int32_t m,int32_t n); void iguana_schnorr(struct supernet_info *myinfo); void iguana_fixsecp(struct supernet_info *myinfo); +int32_t bitcoin_timelockspend(uint8_t *script,int32_t n,uint8_t rmd160[20],uint32_t timestamp); char *iguana_calcutxorawtx(struct supernet_info *myinfo,struct iguana_info *coin,cJSON **vinsp,cJSON *txobj,int64_t satoshis,char *changeaddr,int64_t txfee,cJSON *utxos,char *remoteaddr,struct vin_info *V,int32_t maxmode); From 2080f20c759aef3dcf89cf774408aaf4884ae877 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Feb 2017 15:45:41 +0200 Subject: [PATCH 139/495] test --- basilisk/basilisk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index cf6e14143..89ca07286 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -1174,6 +1174,6 @@ STRING_ARRAY_OBJ_STRING(basilisk,utxorawtx,symbol,utxos,vals,ignore) } -int64_t iguana_verifytimelock(struct supernet_info *myinfo,struct iguana_info *coin,uint32_t timelocked,char *destaddr,bits256 txid,int32_t vout) +//int64_t iguana_verifytimelock(struct supernet_info *myinfo,struct iguana_info *coin,uint32_t timelocked,char *destaddr,bits256 txid,int32_t vout) #include "../includes/iguana_apiundefs.h" From eb61c4f0892d0b35e61806a517fd88b3a4edabe1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Feb 2017 15:47:14 +0200 Subject: [PATCH 140/495] test --- basilisk/basilisk_bitcoin.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index dadfc6f88..c6bdadf34 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -633,6 +633,8 @@ char *iguana_utxorawtx(struct supernet_info *myinfo,struct iguana_info *coin,int else { timelocked = (uint32_t)(time(NULL)+timelock); + if ( (timelocked % 3600) != 0 ) + timelocked += (3600 - (timelocked % 3600)); p2shlen = bitcoin_timelockspend(p2shscript,0,rmd160,timelocked); calc_rmd160(0,rmd160,p2shscript,p2shlen); spendlen = bitcoin_p2shspend(script,0,rmd160); From a30099a598602bf268ccfd4900de7c92ed0d2e58 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Feb 2017 15:49:01 +0200 Subject: [PATCH 141/495] test --- iguana/kmd_lookup.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 70de42a8b..78c9a3618 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -231,7 +231,7 @@ FILE *kmd_txidinit(struct iguana_info *coin) } } else break; } - printf("finished txidinit fpos %ld vs lastpos %ld\n",ftell(fp),lastpos); + printf("%s finished txidinit fpos %ld vs lastpos %ld\n",coin->symbol,ftell(fp),lastpos); fseek(fp,lastpos,SEEK_SET); } else fp = fopen(fname,"wb+"); return(fp); @@ -264,7 +264,7 @@ FILE *kmd_spendinit(struct iguana_info *coin) else break; } else break; } - printf("finished spendinit fpos %ld vs lastpos %ld\n",ftell(fp),lastpos); + printf("%s finished spendinit fpos %ld vs lastpos %ld\n",coin->symbol,ftell(fp),lastpos); fseek(fp,lastpos,SEEK_SET); HASH_ITER(hh,coin->kmd_transactions,ptr,tmp) { From 00fe0b53213228e3c8429f2d60cfed14404ea414 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 16 Feb 2017 05:41:22 +0200 Subject: [PATCH 142/495] 13 sigs --- iguana/dPoW.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 28517e6e0..c7934feeb 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -19,7 +19,7 @@ #define DPOW_FIRSTRATIFY 1000 #define DPOW_CHECKPOINTFREQ 10 -#define DPOW_MINSIGS 17 +#define DPOW_MINSIGS 13 //#define DPOW_M(bp) ((bp)->minsigs) // (((bp)->numnotaries >> 1) + 1) #define DPOW_MODIND(bp,offset) (((((bp)->height / DPOW_CHECKPOINTFREQ) % (bp)->numnotaries) + (offset)) % (bp)->numnotaries) #define DPOW_VERSION 0x0781 From be4283f38bcba151ebcb1944c83f4e71188234b3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 16 Feb 2017 05:47:55 +0200 Subject: [PATCH 143/495] increment dpow version --- iguana/dPoW.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index c7934feeb..b9eec13ca 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -22,7 +22,7 @@ #define DPOW_MINSIGS 13 //#define DPOW_M(bp) ((bp)->minsigs) // (((bp)->numnotaries >> 1) + 1) #define DPOW_MODIND(bp,offset) (((((bp)->height / DPOW_CHECKPOINTFREQ) % (bp)->numnotaries) + (offset)) % (bp)->numnotaries) -#define DPOW_VERSION 0x0781 +#define DPOW_VERSION 0x0782 #define DPOW_UTXOSIZE 10000 #define DPOW_MINOUTPUT 6000 #define DPOW_DURATION 600 From 89cad4d2f48b66103eac2c5c3be702f562711a78 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 17 Feb 2017 10:46:19 +0200 Subject: [PATCH 144/495] Test --- basilisk/basilisk.c | 1 + basilisk/basilisk.h | 2 +- basilisk/basilisk_swap.c | 21 +++ basilisk/tradebots_liquidity.c | 20 ++- basilisk/tradebots_marketmaker.c | 211 +++++++++++++++++++++++++++++++ iguana/iguana777.h | 4 +- iguana/iguana_payments.c | 46 ++++--- iguana/kmd_lookup.h | 51 ++++---- iguana/main.c | 1 + iguana/tests/dexlistunspent2 | 2 +- includes/iguana_apideclares.h | 48 +++---- includes/iguana_funcs.h | 1 + 12 files changed, 331 insertions(+), 77 deletions(-) create mode 100755 basilisk/tradebots_marketmaker.c diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 89ca07286..823656011 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -484,6 +484,7 @@ int32_t basilisk_relayid(struct supernet_info *myinfo,uint32_t ipbits) #include "basilisk_lisk.c" #include "basilisk_MSG.c" +#include "tradebots_marketmaker.c" #include "tradebots_liquidity.c" #include "basilisk_tradebot.c" #include "basilisk_swap.c" diff --git a/basilisk/basilisk.h b/basilisk/basilisk.h index eeb343919..45bbdd6b2 100755 --- a/basilisk/basilisk.h +++ b/basilisk/basilisk.h @@ -67,7 +67,7 @@ struct basilisk_swapinfo char bobstr[64],alicestr[64]; bits256 myhash,otherhash,orderhash; uint32_t statebits,otherstatebits,started,expiration,finished,dead,reftime,putduration,callduration; - int32_t bobconfirms,aliceconfirms,iambob,reclaimed; + int32_t bobconfirms,aliceconfirms,iambob,reclaimed,bobspent,alicespent; uint64_t alicesatoshis,bobsatoshis,bobinsurance,aliceinsurance; bits256 myprivs[2],mypubs[2],otherpubs[2],pubA0,pubA1,pubB0,pubB1,privAm,pubAm,privBn,pubBn; diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 5b15e6420..2b0c72d91 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -570,6 +570,7 @@ int32_t basilisk_verify_bobpaid(struct supernet_info *myinfo,void *ptr,uint8_t * for (i=0; ialicespend.I.datalen; i++) printf("%02x",swap->alicespend.txbytes[i]); printf(" <- alicespend\n\n"); + swap->I.alicespent = 1; basilisk_txlog(myinfo,swap,&swap->alicespend,-1); return(retval); } @@ -587,6 +588,7 @@ int32_t basilisk_alicepayment_spend(struct supernet_info *myinfo,struct basilisk for (i=0; iI.datalen; i++) printf("%02x",dest->txbytes[i]); printf(" <- msigspend\n\n"); + swap->I.bobspent = 1; basilisk_txlog(myinfo,swap,dest,0); // bobspend or alicereclaim return(retval); } @@ -1738,6 +1740,19 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap return(retval); } +int32_t swapcompleted(struct supernet_info *myinfo,struct basilisk_swap *swap) +{ + if ( swap->I.iambob != 0 ) + return(swap->I.bobspent); + else return(swap->I.alicespent); +} + +cJSON *swapjson(struct supernet_info *myinfo,struct basilisk_swap *swap) +{ + cJSON *retjson = cJSON_CreateObject(); + return(retjson); +} + void basilisk_swaploop(void *_swap) { uint8_t *data; uint32_t expiration; uint32_t channel; int32_t retval=0,i,j,datalen,maxlen; struct supernet_info *myinfo; struct basilisk_swap *swap = _swap; @@ -1907,6 +1922,12 @@ void basilisk_swaploop(void *_swap) basilisk_swapsend(myinfo,swap,0x40000000,data,datalen,0x40000000,swap->I.crcs_mypriv); } } + if ( swapcompleted(myinfo,swap) > 0 ) // only if swap completed + { + if ( swap->I.iambob != 0 ) + tradebot_pendingadd(myinfo,swapjson(myinfo,swap),swap->I.req.src,dstr(swap->I.req.srcamount),swap->I.req.dest,dstr(swap->I.req.destamount)); + else tradebot_pendingadd(myinfo,swapjson(myinfo,swap),swap->I.req.dest,dstr(swap->I.req.destamount),swap->I.req.src,dstr(swap->I.req.srcamount)); + } printf("%s swap finished statebits %x\n",swap->I.iambob!=0?"BOB":"ALICE",swap->I.statebits); basilisk_swap_purge(myinfo,swap); free(data); diff --git a/basilisk/tradebots_liquidity.c b/basilisk/tradebots_liquidity.c index 1bf50a4b5..8d4ad02da 100755 --- a/basilisk/tradebots_liquidity.c +++ b/basilisk/tradebots_liquidity.c @@ -1056,7 +1056,7 @@ struct liquidity_info *_default_lifind(struct supernet_info *myinfo,int32_t *dir void _default_swap_balancingtrade(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t iambob) { // update balance, compare to target balance, issue balancing trade via central exchanges, if needed - struct liquidity_info *li; double vol,price,volume,srcamount,destamount,profitmargin,dir=0.,dotrade=1.; char base[64],rel[64]; int32_t idir; + struct liquidity_info *li; double vol,price,volume,srcamount,destamount,profitmargin,dir=0.,dotrade=1.; char base[64],rel[64]; int32_t idir; char *tradestr=0; cJSON *tradejson; srcamount = swap->I.req.srcamount; destamount = swap->I.req.destamount; profitmargin = (double)swap->I.req.profitmargin / 1000000.; @@ -1101,8 +1101,8 @@ void _default_swap_balancingtrade(struct supernet_info *myinfo,struct basilisk_s { printf("BOB: price %f * vol %f -> %s newprice %f margin %.2f%%\n",price,volume,dir < 0. ? "buy" : "sell",price + dir * price * profitmargin,100*profitmargin); if ( dir < 0. ) - InstantDEX_buy(myinfo,0,0,0,"poloniex",base,rel,price,volume,dotrade); - else InstantDEX_sell(myinfo,0,0,0,"poloniex",base,rel,price,volume,dotrade); + tradestr = InstantDEX_buy(myinfo,0,0,0,"poloniex",base,rel,price,volume,dotrade); + else tradestr = InstantDEX_sell(myinfo,0,0,0,"poloniex",base,rel,price,volume,dotrade); } } else @@ -1111,10 +1111,20 @@ void _default_swap_balancingtrade(struct supernet_info *myinfo,struct basilisk_s { printf("ALICE: price %f * vol %f -> %s newprice %f margin %.2f%%\n",price,volume,dir > 0. ? "buy" : "sell",price - dir * price * profitmargin,100*profitmargin); if ( dir > 0. ) - InstantDEX_buy(myinfo,0,0,0,"poloniex",base,rel,price,volume,dotrade); - else InstantDEX_sell(myinfo,0,0,0,"poloniex",base,rel,price,volume,dotrade); + tradestr = InstantDEX_buy(myinfo,0,0,0,"poloniex",base,rel,price,volume,dotrade); + else tradestr = InstantDEX_sell(myinfo,0,0,0,"poloniex",base,rel,price,volume,dotrade); } } + if ( tradestr != 0 ) + { + if ( (tradejson= cJSON_Parse(tradestr)) != 0 ) + { + if ( jobj(tradejson,"error") == 0 ) // balancing is opposite trade + tradebot_pendingadd(myinfo,tradejson,swap->I.req.dest,destamount,swap->I.req.src,srcamount); + else free_json(tradejson); + } + free(tradestr); + } } void tradebot_swap_balancingtrade(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t iambob) diff --git a/basilisk/tradebots_marketmaker.c b/basilisk/tradebots_marketmaker.c new file mode 100755 index 000000000..e5b81e81e --- /dev/null +++ b/basilisk/tradebots_marketmaker.c @@ -0,0 +1,211 @@ +/****************************************************************************** + * Copyright © 2014-2017 The SuperNET Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * SuperNET software, including this file may be copied, modified, propagated * + * or distributed except according to the terms contained in the LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +// included from basilisk.c + +// "currency":{"value":%.8f, "pending":%.8f} + +cJSON *tradebot_balancediff(cJSON *item,cJSON *anchoritem) // only item might be null +{ + double current[2],past[2]; int32_t i; cJSON *diffitem = jduplicate(anchoritem); + memset(current,0,sizeof(current)); + memset(past,0,sizeof(past)); + if ( jobj(diffitem,"value") != 0 ) + jdelete(diffitem,"value"); + if ( jobj(diffitem,"pending") != 0 ) + jdelete(diffitem,"pending"); + for (i=0; i<2; i++) + { + if ( current[i] != 0. || past[i] != 0. ) + jaddnum(diffitem,i == 0 ? "value" : "pending",current[i] - past[i]); + } + return(diffitem); +} + +cJSON *tradebot_balancesdiff(struct supernet_info *myinfo,cJSON *current,cJSON *anchor) +{ + cJSON *item,*anchoritem,*diffitem,*array; int32_t i,n; char *field; + if ( anchor == 0 ) + return(jduplicate(current)); + array = cJSON_CreateObject(); + n = cJSON_GetArraySize(current); + for (i=0; inumexchanges; i++) + { + value += 0;//InstantDEX_balance(myinfo,0,0,0,exchange,base); + } + return(value); +} + +void tradebot_pendingadd(struct supernet_info *myinfo,cJSON *tradejson,char *base,double basevolume,char *rel,double relvolume) +{ + portable_mutex_lock(&myinfo->pending_mutex); + // add to myinfo->trades + portable_mutex_unlock(&myinfo->pending_mutex); +} + +void tradebot_pendingremove(struct supernet_info *myinfo,char *base,double basevolume,char *rel,double relvolume) +{ + portable_mutex_lock(&myinfo->pending_mutex); + // remove from myinfo->trades + portable_mutex_unlock(&myinfo->pending_mutex); +} + +double tradebot_pending(struct supernet_info *myinfo,char *base) +{ + double pending = 0.; struct pending_trade *tp,*tmp; + portable_mutex_lock(&myinfo->pending_mutex); + HASH_ITER(hh,myinfo->trades,tp,tmp) + { + if ( strcmp(base,tp->base) == 0 ) + pending += tp->dir * tp->basevolume; + else if ( strcmp(base,tp->rel) == 0 ) + pending -= tp->dir * tp->relvolume; + } + portable_mutex_unlock(&myinfo->pending_mutex); + return(pending); +} + +#include "../includes/iguana_apidefs.h" +#include "../includes/iguana_apideclares.h" + +ZERO_ARGS(tradebot,allbalances) +{ + int32_t i,n; double value,pending; char *base; cJSON *item,*balances = cJSON_CreateObject(); + if ( myinfo->liquidity_currencies == 0 ) + myinfo->liquidity_currencies = cJSON_Parse("[\"KMD\", \"BTC\"]"); + if ( myinfo->liquidity_currencies != 0 && (n= cJSON_GetArraySize(myinfo->liquidity_currencies)) > 0 ) + { + for (i=0; iliquidity_currencies,i); + value = tradebot_balance(myinfo,base); + pending = tradebot_pending(myinfo,base); + item = cJSON_CreateObject(); + jaddnum(item,"value",value); + jaddnum(item,"pending",pending); + jadd(balances,base,item); + } + } + return(jprint(balances,1)); +} + +ZERO_ARGS(tradebot,anchor) +{ + FILE *fp; char *anchorstr,fname[512]; cJSON *anchor; int32_t retval = -1; + if ( (anchorstr= tradebot_allbalances(myinfo,0,0,0)) != 0 ) + { + if ( (anchor= cJSON_Parse(anchorstr)) != 0 ) + { + if ( jobj(anchor,"error") == 0 ) + { + sprintf(fname,"%s/anchor",GLOBAL_DBDIR), OS_compatible_path(fname); + if ( (fp= fopen(fname,"wb")) != 0 ) + { + if ( fwrite(anchorstr,1,strlen(anchorstr)+1,fp) == strlen(anchorstr)+1 ) + retval = 0; + fclose(fp); + } + } + } + free(anchorstr); + } + if ( retval == 0 ) + return(clonestr("{\"result\":\"success\"}")); + else return(clonestr("{\"error\":\"couldnt make anchor file\"}")); +} + +ZERO_ARGS(tradebot,portfolio) +{ + char *currentstr,*anchorstr,fname[512]; long fsize; cJSON *current,*anchor=0,*portfolio=0; + if ( (currentstr= tradebot_allbalances(myinfo,0,0,0)) != 0 ) + { + if ( (current= cJSON_Parse(currentstr)) != 0 ) + { + sprintf(fname,"%s/anchor",GLOBAL_DBDIR), OS_compatible_path(fname); + if ( (anchorstr= OS_filestr(&fsize,fname)) != 0 ) + { + anchor = cJSON_Parse(anchorstr); + free(anchorstr); + } + if ( anchor == 0 ) + anchor = cJSON_Parse("{}"); + portfolio = tradebot_balancesdiff(myinfo,current,anchor); + free_json(current); + } + free(currentstr); + } + if ( portfolio == 0 ) + return(clonestr("{\"result\":\"success\"}")); + else return(jprint(portfolio,1)); +} + +/*li.profit = jdouble(vals,"profit"); +li.refprice = jdouble(vals,"refprice"); +li.bid = jdouble(vals,"bid"); +li.ask = jdouble(vals,"ask"); +if ( (li.minvol= jdouble(vals,"minvol")) <= 0. ) +li.minvol = (strcmp("BTC",base) == 0) ? 0.0001 : 0.001; +if ( (li.maxvol= jdouble(vals,"maxvol")) < li.minvol ) +li.maxvol = li.minvol;*/ + +ARRAY_OBJ_INT(tradebot,goals,currencies,vals,targettime) +{ + static bits256 zero; char *targetcoin; int32_t i,n; + if ( currencies != 0 && vals != 0 ) + { + // init things so automatically updates refli.bid and refli.ask + // volume range with margin + // currency percentage value in BTC? target distribution, max percentage, min percentage` + // min price to sell, max price to buy, max volume + n = cJSON_GetArraySize(currencies); + for (i=0; i= 60 ) + { + denominator = (((uint64_t)365 * 24 * 60) / minutes); + if ( denominator == 0 ) + denominator = 1; // max KOMODO_INTEREST per transfer, do it at least annually! + if ( value > 25000LL*SATOSHIDEN && chainheight > 155949 ) + { + numerator = (value / 20); // assumes 5%! + interest = (numerator / denominator); + } + else if ( value >= 10*SATOSHIDEN ) + { + numerator = (value * KOMODO_INTEREST); + interest = (numerator / denominator) / SATOSHIDEN; + } + fprintf(stderr,"komodo_interest.%d %lld %.8f nLockTime.%u tiptime.%u minutes.%d interest %lld %.8f (%llu / %llu)\n",chainheight,(long long)value,(double)value/SATOSHIDEN,txlocktime,now,minutes,(long long)interest,(double)interest/SATOSHIDEN,(long long)numerator,(long long)denominator); + } + return(interest); +} + +uint64_t iguana_interest(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t vout,uint64_t value) +{ + char *retstr; int32_t height; cJSON *retjson; struct iguana_txid T,*tx; uint64_t interest=0; if ( coin->FULLNODE < 0 ) // komodod is running { if ( (retjson= dpow_gettxout(myinfo,coin,txid,vout)) != 0 ) @@ -367,25 +389,9 @@ uint64_t iguana_interest(struct supernet_info *myinfo,struct iguana_info *coin,b } else // we have it local { - if ( (tx= iguana_txidfind(coin,&height,&T,txid,coin->bundlescount)) != 0 && tx->locktime >LOCKTIME_THRESHOLD ) + if ( (tx= iguana_txidfind(coin,&height,&T,txid,coin->bundlescount)) != 0 && tx->locktime > LOCKTIME_THRESHOLD ) { - if ( (minutes= ((uint32_t)time(NULL) - 60 - tx->locktime) / 60) >= 60 ) - { - denominator = (((uint64_t)365 * 24 * 60) / minutes); - if ( denominator == 0 ) - denominator = 1; // max KOMODO_INTEREST per transfer, do it at least annually! - if ( value > 25000LL*SATOSHIDEN && height > 155949 ) - { - numerator = (value / 20); // assumes 5%! - interest = (numerator / denominator); - } - else if ( value >= 10*SATOSHIDEN ) - { - numerator = (value * KOMODO_INTEREST); - interest = (numerator / denominator) / SATOSHIDEN; - } - fprintf(stderr,"komodo_interest %lld %.8f nLockTime.%u tiptime.%u minutes.%d interest %lld %.8f (%llu / %llu)\n",(long long)value,(double)value/SATOSHIDEN,tx->locktime,(uint32_t)time(NULL),minutes,(long long)interest,(double)interest/SATOSHIDEN,(long long)numerator,(long long)denominator); - } + interest = _iguana_interest((uint32_t)time(NULL),coin->longestchain,tx->locktime,value); } } char str[65]; printf("interest for %s.v%d %.8f %.8f\n",bits256_str(str,txid),vout,dstr(value),dstr(interest)); diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 78c9a3618..478db9fb9 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -304,7 +304,7 @@ cJSON *kmd_transactionjson(int32_t height,struct kmd_transactionhh *ptr,char *ty return(obj); } -cJSON *kmd_unspentjson(int32_t height,struct kmd_transaction *tx,int32_t vout) +cJSON *kmd_unspentjson(struct iguana_info *coin,int32_t height,struct kmd_transaction *tx,int32_t vout) { cJSON *item = cJSON_CreateObject(); jaddstr(item,"type","received"); @@ -313,6 +313,8 @@ cJSON *kmd_unspentjson(int32_t height,struct kmd_transaction *tx,int32_t vout) jaddbits256(item,"txid",tx->txid); jaddnum(item,"vout",vout); jaddnum(item,"amount",dstr(tx->vouts[vout].amount)); + if ( strcmp(coin->symbol,"KMD") == 0 ) + jaddnum(item,"interest",dstr(_iguana_interest((uint32_t)time(NULL),coin->longestchain,tx->timestamp,tx->vouts[vout].amount))); return(item); } @@ -376,9 +378,9 @@ cJSON *kmd_gettxin(struct iguana_info *coin,bits256 txid,int32_t vout) return(cJSON_Parse("{\"error\":\"txid not found\"}")); } -cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode,cJSON *array,int32_t fulltx) +cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode,cJSON *array) { - struct kmd_addresshh *addr; struct kmd_transactionhh *ptr,*spent,*prev=0; uint8_t type_rmd160[21]; int32_t i,flag = 0; + struct kmd_addresshh *addr; struct kmd_transactionhh *ptr,*spent,*prev=0; uint8_t type_rmd160[21]; int32_t i; if ( array == 0 ) array = cJSON_CreateArray(); /*if ( time(NULL) > coin->kmd_lasttime+30 ) @@ -407,20 +409,20 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode,cJSO // printf("mode.%d [%d] %s ht.%d amount %.8f spent.%p\n",mode,coin->kmd_height,coinaddr,ptr->tx->height,dstr(ptr->tx->vouts[i].amount),spent); if ( (mode == 0 && spent == 0) || (mode == 1 && spent != 0) || mode == 2 ) { - if ( fulltx == 0 ) + //if ( fulltx == 0 ) { if ( mode == 0 ) - jaddi(array,kmd_unspentjson(coin->kmd_height,ptr->tx,i)); + jaddi(array,kmd_unspentjson(coin,coin->kmd_height,ptr->tx,i)); else if ( mode == 1 ) jaddi(array,kmd_spentjson(coin->kmd_height,ptr->tx,i,spent)); else if ( mode == 2 ) { if ( spent != 0 ) jaddi(array,kmd_spentjson(coin->kmd_height,ptr->tx,i,spent)); - else jaddi(array,kmd_unspentjson(coin->kmd_height,ptr->tx,i)); + else jaddi(array,kmd_unspentjson(coin,coin->kmd_height,ptr->tx,i)); } } - else if ( flag == 0 ) + /*else if ( flag == 0 ) { if ( mode == 0 ) jaddi(array,kmd_transactionjson(coin->kmd_height,ptr,"received")); @@ -436,7 +438,7 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode,cJSO else jaddi(array,kmd_transactionjson(coin->kmd_height,ptr,"received")); } flag = 1; - } + }*/ } if ( ptr->ptrs[i<<1] != 0 ) { @@ -455,12 +457,12 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode,cJSO cJSON *kmd_listunspent(struct iguana_info *coin,char *coinaddr) { - return(kmd_listaddress(coin,coinaddr,0,0,0)); + return(kmd_listaddress(coin,coinaddr,0,0)); } cJSON *kmd_listspent(struct iguana_info *coin,char *coinaddr) { - return(kmd_listaddress(coin,coinaddr,1,0,0)); + return(kmd_listaddress(coin,coinaddr,1,0)); } cJSON *kmd_listtransactions(struct iguana_info *coin,char *coinaddr,int32_t count,int32_t skip) @@ -470,17 +472,17 @@ cJSON *kmd_listtransactions(struct iguana_info *coin,char *coinaddr,int32_t coun // return(cJSON_Parse("[]")); if ( count == 0 ) count = 100; - array = kmd_listaddress(coin,coinaddr,0,0,0); - array = kmd_listaddress(coin,coinaddr,1,array,0); + array = kmd_listaddress(coin,coinaddr,0,0); + array = kmd_listaddress(coin,coinaddr,1,array); return(array); } -int64_t _kmd_getbalance(struct iguana_info *coin,char *coinaddr,uint64_t *receivedp,uint64_t *sentp) +int64_t _kmd_getbalance(struct iguana_info *coin,char *coinaddr,uint64_t *receivedp,uint64_t *sentp,uint64_t *interestp) { int32_t iter,i,n; cJSON *array,*item; uint64_t value; for (iter=1; iter<=2; iter++) { - if ( (array= kmd_listaddress(coin,coinaddr,iter,0,0)) != 0 ) + if ( (array= kmd_listaddress(coin,coinaddr,iter,0)) != 0 ) { if ( (n= cJSON_GetArraySize(array)) > 0 ) { @@ -490,8 +492,10 @@ int64_t _kmd_getbalance(struct iguana_info *coin,char *coinaddr,uint64_t *receiv if ( (value= jdouble(item,"amount")*SATOSHIDEN) != 0 || (value= jdouble(item,"value")*SATOSHIDEN) != 0 ) { if ( iter == 2 ) + { *receivedp += value; - else *sentp += value; + *interestp += jdouble(item,"interest") * SATOSHIDEN; + } else *sentp += value; } } } @@ -503,29 +507,31 @@ int64_t _kmd_getbalance(struct iguana_info *coin,char *coinaddr,uint64_t *receiv cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) { - cJSON *retjson; double netbalance=0.,fbalance; uint64_t s,r,sent=0,received=0; int64_t balance=0; struct kmd_addresshh *addr,*tmp; char address[64]; int32_t height = coin->kmd_height+1; + cJSON *retjson; double netbalance=0.,fbalance; uint64_t interest,i,s,r,sent=0,received=0; int64_t balance=0; struct kmd_addresshh *addr,*tmp; char address[64]; int32_t height = coin->kmd_height+1; retjson = cJSON_CreateObject(); fbalance = 0.; + interest = 0; if ( strcmp(coinaddr,"*") == 0 ) { HASH_ITER(hh,coin->kmd_addresses,addr,tmp) { bitcoin_address(address,addr->type_rmd160[0],&addr->type_rmd160[1],20); - s = r = 0; - balance += _kmd_getbalance(coin,address,&r,&s); + s = r = i = 0; + balance += _kmd_getbalance(coin,address,&r,&s,&i); netbalance += dstr(r); netbalance -= dstr(s); if ( (r - s) > 100000*SATOSHIDEN ) - printf("{\"address\":\"%s\",\"received\":%.8f,\"sent\":%.8f,\"balance\":%.8f,\"supply\":%.8f,\"supplyf\":%.8f}\n",address,dstr(r),dstr(s),dstr(r)-dstr(s),dstr(balance),netbalance); + printf("{\"address\":\"%s\",\"received\":%.8f,\"sent\":%.8f,\"balance\":%.8f,\"supply\":%.8f,\"supplyf\":%.8f,\"interest\":%.8f}\n",address,dstr(r),dstr(s),dstr(r)-dstr(s),dstr(balance),netbalance,dstr(interest)); received += r; sent += s; + interest += i; } if ( strcmp("KMD",coin->symbol) == 0 ) jaddnum(retjson,"interestpaid",dstr(balance) - 100000000 - (height*3)); } else { - balance = _kmd_getbalance(coin,coinaddr,&received,&sent); + balance = _kmd_getbalance(coin,coinaddr,&received,&sent,&interest); netbalance = dstr(balance); } jaddstr(retjson,"result","success"); @@ -534,7 +540,8 @@ cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) //if ( fabs(netbalance*SATOSHIDEN - balance) > 1 ) jaddnum(retjson,"balancef",netbalance+1./(SATOSHIDEN*2)-SMALLVAL); //else - jaddnum(retjson,"balance",dstr(balance)); + jaddnum(retjson,"balance",dstr(balance)); + jaddnum(retjson,"interest",dstr(interest)); jaddnum(retjson,"height",height); if ( strcmp("KMD",coin->symbol) == 0 ) jaddnum(retjson,"mined",height*3); @@ -550,7 +557,7 @@ char *kmd_bitcoinblockhashstr(char *coinstr,char *serverport,char *userpass,int3 hash2 = bits256_conv(blockhashstr); if ( blockhashstr == 0 || blockhashstr[0] == 0 || bits256_nonz(hash2) == 0 ) { - printf("couldnt get blockhash for %u, probably curl is disabled\n",height); + printf("%s couldnt get blockhash for %u, probably curl is disabled %p\n",coinstr,height,blockhashstr); if ( blockhashstr != 0 ) free(blockhashstr); if ( height == 0 ) diff --git a/iguana/main.c b/iguana/main.c index c451568cc..1b579f973 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1725,6 +1725,7 @@ void iguana_main(void *arg) } strcpy(myinfo->rpcsymbol,"BTCD"); iguana_urlinit(myinfo,ismainnet,usessl); + portable_mutex_init(&myinfo->pending_mutex); portable_mutex_init(&myinfo->dpowmutex); portable_mutex_init(&myinfo->notarymutex); #if LIQUIDITY_PROVIDER diff --git a/iguana/tests/dexlistunspent2 b/iguana/tests/dexlistunspent2 index 721db4bf8..0a4c41ad8 100755 --- a/iguana/tests/dexlistunspent2 +++ b/iguana/tests/dexlistunspent2 @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent2\",\"address\":\"RW3gz9fEadohRLZerK9r8zXkugk5swWHrf\",\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent2\",\"address\":\"R9eW4hVmhGYCExBSJ15vX61fEoENgDvHhj\",\"symbol\":\"KMD\"}" diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index a22544875..24951acf2 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -21,9 +21,12 @@ ZERO_ARGS(dpow,cancelratify); STRING_ARG(dpow,bindaddr,ipaddr); STRING_AND_INT(dpow,fundnotaries,symbol,numblocks); +ZERO_ARGS(pax,start); INT_ARG(passthru,paxfiats,mask); - - +TWO_STRINGS(zcash,passthru,function,hex); +TWO_STRINGS(komodo,passthru,function,hex); +TWO_STRINGS(dex,kvsearch,symbol,key); +THREE_STRINGS_AND_THREE_INTS(dex,kvupdate,symbol,key,value,flags,unused,unusedb); TWO_STRINGS(dex,send,hex,handler); HASH_AND_STRING(dex,gettransaction,txid,symbol); @@ -40,8 +43,6 @@ TWO_STRINGS(dex,validateaddress,symbol,address); TWO_STRINGS(dex,checkaddress,symbol,address); TWO_STRINGS(dex,listunspent,symbol,address); TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions,symbol,address,count,skip); -TWO_STRINGS(dex,kvsearch,symbol,key); -THREE_STRINGS_AND_THREE_INTS(dex,kvupdate,symbol,key,value,flags,unused,unusedb); TWO_STRINGS(dex,listunspent2,symbol,address); TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions2,symbol,address,count,skip); HASH_AND_STRING_AND_INT(dex,gettxin,txid,symbol,vout); @@ -49,27 +50,6 @@ TWO_STRINGS(dex,listspent,symbol,address); TWO_STRINGS(dex,getbalance,symbol,address); STRING_ARG(dex,explorer,symbol); -TWO_STRINGS(zcash,passthru,function,hex); -TWO_STRINGS(komodo,passthru,function,hex); - -ZERO_ARGS(pax,start); -HASH_ARRAY_STRING(tradebot,liquidity,hash,vals,targetcoin); -ZERO_ARGS(tradebot,amlp); -ZERO_ARGS(tradebot,notlp); -TWO_STRINGS(tradebot,gensvm,base,rel); -ZERO_ARGS(tradebot,openliquidity); - - -ZERO_ARGS(InstantDEX,allcoins); -STRING_ARG(InstantDEX,available,source); -HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr); - -INT_ARG(InstantDEX,incoming,requestid); -INT_ARG(InstantDEX,automatched,requestid); - -TWO_INTS(InstantDEX,accept,requestid,quoteid); -//TWO_INTS(InstantDEX,swapstatus,requestid,quoteid); - HASH_ARRAY_STRING(basilisk,genesis_opreturn,hash,vals,hexstr); HASH_ARRAY_STRING(basilisk,history,hash,vals,hexstr); INT_ARG(basilisk,paxfiats,mask); @@ -174,7 +154,6 @@ ZERO_ARGS(bitcoinrpc,gettxoutsetinfo); ZERO_ARGS(bitcoinrpc,getrawchangeaddress); SS_D_I_S(bitcoinrpc,move,fromaccount,toaccount,amount,minconf,comment); - THREE_INTS(iguana,splitfunds,satoshis,duplicates,sendflag); ZERO_ARGS(iguana,makekeypair); INT_AND_ARRAY(iguana,rates,unused,quotes); @@ -207,6 +186,13 @@ STRING_AND_INT(iguana,bundlehashes,activecoin,height); STRING_AND_INT(iguana,PoSweights,activecoin,height); STRING_ARG(iguana,stakers,activecoin); +ZERO_ARGS(InstantDEX,allcoins); +STRING_ARG(InstantDEX,available,source); +HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr); +INT_ARG(InstantDEX,incoming,requestid); +INT_ARG(InstantDEX,automatched,requestid); +TWO_INTS(InstantDEX,accept,requestid,quoteid); +//TWO_INTS(InstantDEX,swapstatus,requestid,quoteid); //TWO_STRINGS_AND_TWO_DOUBLES(InstantDEX,minaccept,base,rel,minprice,basevolume); //TWO_STRINGS_AND_TWO_DOUBLES(InstantDEX,maxaccept,base,rel,maxprice,basevolume); THREE_STRINGS_AND_THREE_DOUBLES(InstantDEX,buy,exchange,base,rel,price,volume,dotrade); @@ -219,7 +205,6 @@ TWO_STRINGS(InstantDEX,orderstatus,exchange,orderid); TWO_STRINGS(InstantDEX,cancelorder,exchange,orderid); STRING_ARG(InstantDEX,openorders,exchange); STRING_ARG(InstantDEX,tradehistory,exchange); - THREE_STRINGS_AND_THREE_INTS(InstantDEX,orderbook,exchange,base,rel,depth,allfields,ignore); STRING_AND_INT(InstantDEX,pollgap,exchange,pollgap); //TWO_STRINGS(InstantDEX,events,base,rel); @@ -234,6 +219,11 @@ THREE_STRINGS(InstantDEX,supports,exchange,base,rel); //TWOSTRINGS_AND_TWOHASHES_AND_TWOINTS(InstantDEX,accept,reference,message,basetxid,reltxid,duration,flags); //TWOSTRINGS_AND_TWOHASHES_AND_TWOINTS(InstantDEX,confirm,reference,message,basetxid,reltxid,baseheight,relheight); +HASH_ARRAY_STRING(tradebot,liquidity,hash,vals,targetcoin); +ZERO_ARGS(tradebot,amlp); +ZERO_ARGS(tradebot,notlp); +TWO_STRINGS(tradebot,gensvm,base,rel); +ZERO_ARGS(tradebot,openliquidity); THREE_STRINGS_AND_DOUBLE(tradebot,aveprice,comment,base,rel,basevolume); THREE_STRINGS_AND_DOUBLE(tradebot,monitor,exchange,base,rel,commission); STRING_AND_DOUBLE(tradebot,monitorall,exchange,commission); @@ -245,6 +235,10 @@ TWO_STRINGS(tradebot,status,exchange,botid); TWO_STRINGS(tradebot,pause,exchange,botid); TWO_STRINGS(tradebot,stop,exchange,botid); TWO_STRINGS(tradebot,resume,exchange,botid); +ZERO_ARGS(tradebot,allbalances); +ZERO_ARGS(tradebot,anchor); +ZERO_ARGS(tradebot,portfolio); +ARRAY_OBJ_INT(tradebot,goals,currencies,vals,targettime); #ifndef WIN32 /*HASH_ARG(pangea,call,tablehash); diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index b92103be1..8e048b21f 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -641,6 +641,7 @@ void iguana_fixsecp(struct supernet_info *myinfo); int32_t bitcoin_timelockspend(uint8_t *script,int32_t n,uint8_t rmd160[20],uint32_t timestamp); char *iguana_calcutxorawtx(struct supernet_info *myinfo,struct iguana_info *coin,cJSON **vinsp,cJSON *txobj,int64_t satoshis,char *changeaddr,int64_t txfee,cJSON *utxos,char *remoteaddr,struct vin_info *V,int32_t maxmode); +uint64_t _iguana_interest(uint32_t now,int32_t height,uint32_t txlocktime,uint64_t value); #include "../includes/iguana_api.h" From b9b71c069a7ca1ca4d7c46d5bed6b67d6047c22c Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 17 Feb 2017 21:44:02 +0200 Subject: [PATCH 145/495] test --- iguana/kmd_lookup.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 478db9fb9..2586f3921 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -451,7 +451,7 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode,cJSO } ptr = prev; } - } else printf("no valid entry for (%s)\n",coinaddr); + } else printf("no valid entry for (%s) %p %p\n",coinaddr,addr,ptr); return(array); } From 84bc57fe11bf77330aad197c80da77df5eb93110 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 17 Feb 2017 21:44:35 +0200 Subject: [PATCH 146/495] test --- iguana/kmd_lookup.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 2586f3921..efa2fdaa0 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -380,7 +380,7 @@ cJSON *kmd_gettxin(struct iguana_info *coin,bits256 txid,int32_t vout) cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode,cJSON *array) { - struct kmd_addresshh *addr; struct kmd_transactionhh *ptr,*spent,*prev=0; uint8_t type_rmd160[21]; int32_t i; + struct kmd_addresshh *addr; struct kmd_transactionhh *ptr=0,*spent,*prev=0; uint8_t type_rmd160[21]; int32_t i; if ( array == 0 ) array = cJSON_CreateArray(); /*if ( time(NULL) > coin->kmd_lasttime+30 ) From 67b5fd7efd4a8aafb0359f753f598a64f31f60d7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 17 Feb 2017 21:49:50 +0200 Subject: [PATCH 147/495] batch10 --- iguana/main.c | 4 +- iguana/tests/KMD.batch10 | 164 ++++++++++++++++++++++++ iguana/tests/KMD.batch10.importaddress | 161 +++++++++++++++++++++++ iguana/tests/KMD.batch10.listunspent | 129 +++++++++++++++++++ iguana/tests/REVS.batch10 | 8 ++ iguana/tests/REVS.batch10.importaddress | 6 + 6 files changed, 470 insertions(+), 2 deletions(-) create mode 100755 iguana/tests/KMD.batch10 create mode 100755 iguana/tests/KMD.batch10.importaddress create mode 100755 iguana/tests/KMD.batch10.listunspent create mode 100755 iguana/tests/REVS.batch10 create mode 100755 iguana/tests/REVS.batch10.importaddress diff --git a/iguana/main.c b/iguana/main.c index 1b579f973..62d9c1805 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1612,7 +1612,7 @@ void komodo_ICO_batch(cJSON *array,int32_t batchid) printf("# %s KMD %.8f\n",coinaddr,dstr(kmdamount)); if ( (iter & 1) == 0 ) { - if ( (0) ) + if ( (1) ) { printf("curl --url \"http://127.0.0.1:7778\" --data \"{\\\"agent\\\":\\\"dex\\\",\\\"method\\\":\\\"importaddress\\\",\\\"address\\\":\\\"%s\\\",\\\"symbol\\\":\\\"KMD\\\"}\" # %.8f\n",coinaddr,dstr(kmdamount)); printf("sleep 3\n"); @@ -1676,7 +1676,7 @@ void iguana_main(void *arg) else printf("ENDIAN ERROR\n"); mycalloc(0,0,0); #ifdef __APPLE__ - char *batchstr,*batchstr2; cJSON *batchjson; long batchsize; char fname[512],fname2[512]; int32_t batchid = 10; + char *batchstr,*batchstr2; cJSON *batchjson; long batchsize; char fname[512],fname2[512]; int32_t batchid = 11; sprintf(fname,"REVS.raw"), sprintf(fname2,"REVS.rawtxids"); if ( (0) && (batchstr= OS_filestr(&batchsize,fname)) != 0 && (batchstr2= OS_filestr(&batchsize,fname2)) != 0 ) { diff --git a/iguana/tests/KMD.batch10 b/iguana/tests/KMD.batch10 new file mode 100755 index 000000000..6bbf67eca --- /dev/null +++ b/iguana/tests/KMD.batch10 @@ -0,0 +1,164 @@ +# RQC6A3SKtLb2zmqDDwFvRH6Zz4mZufmp3d KMD 6266.43352646 +./komodo-cli sendtoaddress RQC6A3SKtLb2zmqDDwFvRH6Zz4mZufmp3d 6266.43352646 +sleep 3 +echo "6266.43352646 <- expected amount RQC6A3SKtLb2zmqDDwFvRH6Zz4mZufmp3d" + +# R9SpRcd2KRD45B7SqzuUFhNnsnx7YqgkN6 KMD 1203.04246569 +./komodo-cli sendtoaddress R9SpRcd2KRD45B7SqzuUFhNnsnx7YqgkN6 1203.04246569 +sleep 3 +echo "1203.04246569 <- expected amount R9SpRcd2KRD45B7SqzuUFhNnsnx7YqgkN6" + +# RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j KMD 9683.15249375 +./komodo-cli sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 9683.15249375 +sleep 3 +echo "9683.15249375 <- expected amount RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j" + +# RTJXwRhuAH9iyztyuRuGC8G7DamTgSMGvT KMD 306877.42641191 +./komodo-cli sendtoaddress RTJXwRhuAH9iyztyuRuGC8G7DamTgSMGvT 306877.42641191 +sleep 3 +echo "306877.42641191 <- expected amount RTJXwRhuAH9iyztyuRuGC8G7DamTgSMGvT" + +# RQantoJxT8szwfAqUM3enLPe85YiQtwndH KMD 150.23706901 +./komodo-cli sendtoaddress RQantoJxT8szwfAqUM3enLPe85YiQtwndH 150.23706901 +sleep 3 +echo "150.23706901 <- expected amount RQantoJxT8szwfAqUM3enLPe85YiQtwndH" + +# RLvvwtBUupmGDy81CJNp6RxKbxxbuu3jRY KMD 1985.04626121 +./komodo-cli sendtoaddress RLvvwtBUupmGDy81CJNp6RxKbxxbuu3jRY 1985.04626121 +sleep 3 +echo "1985.04626121 <- expected amount RLvvwtBUupmGDy81CJNp6RxKbxxbuu3jRY" + +# RFdRKqe82MmvSxZQjgtLfzdf8mNHztKpPE KMD 1664.32251109 +./komodo-cli sendtoaddress RFdRKqe82MmvSxZQjgtLfzdf8mNHztKpPE 1664.32251109 +sleep 3 +echo "1664.32251109 <- expected amount RFdRKqe82MmvSxZQjgtLfzdf8mNHztKpPE" + +# RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3 KMD 5.99800973 +./komodo-cli sendtoaddress RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3 5.99800973 +sleep 3 +echo "5.99800973 <- expected amount RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3" + +# RNYMy1joru9gFitzokTSi5qFFc5nS4iFxc KMD 9671.53271075 +./komodo-cli sendtoaddress RNYMy1joru9gFitzokTSi5qFFc5nS4iFxc 9671.53271075 +sleep 3 +echo "9671.53271075 <- expected amount RNYMy1joru9gFitzokTSi5qFFc5nS4iFxc" + +# RF4jZsF5BUckQqX5hsS68kjQMYSba8Fypm KMD 40223.19497203, REVS 101.00000000 +# RF4jZsF5BUckQqX5hsS68kjQMYSba8Fypm KMD 40223.19497203 +./komodo-cli sendtoaddress RF4jZsF5BUckQqX5hsS68kjQMYSba8Fypm 40223.19497203 +sleep 3 +echo "40223.19497203 <- expected amount RF4jZsF5BUckQqX5hsS68kjQMYSba8Fypm" + +# RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB KMD 72698.53877152 +./komodo-cli sendtoaddress RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB 72698.53877152 +sleep 3 +echo "72698.53877152 <- expected amount RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB" + +# RVzFdNGRn8Ekr4XaeDSfE9fjqvKdcVicJe KMD 9683.15249375 +./komodo-cli sendtoaddress RVzFdNGRn8Ekr4XaeDSfE9fjqvKdcVicJe 9683.15249375 +sleep 3 +echo "9683.15249375 <- expected amount RVzFdNGRn8Ekr4XaeDSfE9fjqvKdcVicJe" + +# RTbTzn7FGJWwrH1E3fMwuZPs3YVH1MvVoB KMD 3532.13792522 +./komodo-cli sendtoaddress RTbTzn7FGJWwrH1E3fMwuZPs3YVH1MvVoB 3532.13792522 +sleep 3 +echo "3532.13792522 <- expected amount RTbTzn7FGJWwrH1E3fMwuZPs3YVH1MvVoB" + +# RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ KMD 309.69366537 +./komodo-cli sendtoaddress RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ 309.69366537 +sleep 3 +echo "309.69366537 <- expected amount RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ" + +# RYYgc5UD7X18E6CrDXCs1cts5WDwaWhm1Z KMD 3873.26099750 +./komodo-cli sendtoaddress RYYgc5UD7X18E6CrDXCs1cts5WDwaWhm1Z 3873.26099750 +sleep 3 +echo "3873.26099750 <- expected amount RYYgc5UD7X18E6CrDXCs1cts5WDwaWhm1Z" + +# RXdBJ5cWDcS38ykuggEQZh3vSztxwmG3ut KMD 62053.93460050 +./komodo-cli sendtoaddress RXdBJ5cWDcS38ykuggEQZh3vSztxwmG3ut 62053.93460050 +sleep 3 +echo "62053.93460050 <- expected amount RXdBJ5cWDcS38ykuggEQZh3vSztxwmG3ut" + +# REKnBAyZMnhKzRozzcuv6fKRtoBsKTFYjs KMD 6506.14889316 +./komodo-cli sendtoaddress REKnBAyZMnhKzRozzcuv6fKRtoBsKTFYjs 6506.14889316 +sleep 3 +echo "6506.14889316 <- expected amount REKnBAyZMnhKzRozzcuv6fKRtoBsKTFYjs" + +# RY422uSvkAoZy81uGot5PmXuMrtChhJ3uL KMD 812.78437655 +./komodo-cli sendtoaddress RY422uSvkAoZy81uGot5PmXuMrtChhJ3uL 812.78437655 +sleep 3 +echo "812.78437655 <- expected amount RY422uSvkAoZy81uGot5PmXuMrtChhJ3uL" + +# R9o3CQms16CLu63j9WdqsaWB3XsssRXEq8 KMD 1452.47287406 +./komodo-cli sendtoaddress R9o3CQms16CLu63j9WdqsaWB3XsssRXEq8 1452.47287406 +sleep 3 +echo "1452.47287406 <- expected amount R9o3CQms16CLu63j9WdqsaWB3XsssRXEq8" + +# RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A KMD 867.82549038 +./komodo-cli sendtoaddress RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A 867.82549038 +sleep 3 +echo "867.82549038 <- expected amount RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A" + +# RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv KMD 693.08132289 +./komodo-cli sendtoaddress RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv 693.08132289 +sleep 3 +echo "693.08132289 <- expected amount RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv" + +# RCfBinKfJ1wGSxXLPNTmC9bohFRoofUiVm KMD 8521.17419450 +./komodo-cli sendtoaddress RCfBinKfJ1wGSxXLPNTmC9bohFRoofUiVm 8521.17419450 +sleep 3 +echo "8521.17419450 <- expected amount RCfBinKfJ1wGSxXLPNTmC9bohFRoofUiVm" + +# RNEZRHeWE3KgSTUr3qvH7RNvM2JWZZkygM KMD 5328.53865807 +./komodo-cli sendtoaddress RNEZRHeWE3KgSTUr3qvH7RNvM2JWZZkygM 5328.53865807 +sleep 3 +echo "5328.53865807 <- expected amount RNEZRHeWE3KgSTUr3qvH7RNvM2JWZZkygM" + +# RH7tsX9PaKECxSEALpu5EWdmEKikY7R2n1 KMD 29049.45748125 +./komodo-cli sendtoaddress RH7tsX9PaKECxSEALpu5EWdmEKikY7R2n1 29049.45748125 +sleep 3 +echo "29049.45748125 <- expected amount RH7tsX9PaKECxSEALpu5EWdmEKikY7R2n1" + +# RYHxrTNpqrAHRbULboJVYHWqmnmVhzzrot KMD 4840.60793162 +./komodo-cli sendtoaddress RYHxrTNpqrAHRbULboJVYHWqmnmVhzzrot 4840.60793162 +sleep 3 +echo "4840.60793162 <- expected amount RYHxrTNpqrAHRbULboJVYHWqmnmVhzzrot" + +# RLCEGw7zmAhZQYtP23Z2TD45gAT9ZuZKct KMD 2420.78812342 +./komodo-cli sendtoaddress RLCEGw7zmAhZQYtP23Z2TD45gAT9ZuZKct 2420.78812342 +sleep 3 +echo "2420.78812342 <- expected amount RLCEGw7zmAhZQYtP23Z2TD45gAT9ZuZKct" + +# RGQmMzmUfa6R5dZvvL5wvy2vxPLEcgkkyC KMD 137.73071692, REVS 2.73426759 +# RGQmMzmUfa6R5dZvvL5wvy2vxPLEcgkkyC KMD 137.73071692 +./komodo-cli sendtoaddress RGQmMzmUfa6R5dZvvL5wvy2vxPLEcgkkyC 137.73071692 +sleep 3 +echo "137.73071692 <- expected amount RGQmMzmUfa6R5dZvvL5wvy2vxPLEcgkkyC" + +# RRdDD2YoR5cfwktePGGFT5cEyRcWkEjzvM KMD 9737.34607711 +./komodo-cli sendtoaddress RRdDD2YoR5cfwktePGGFT5cEyRcWkEjzvM 9737.34607711 +sleep 3 +echo "9737.34607711 <- expected amount RRdDD2YoR5cfwktePGGFT5cEyRcWkEjzvM" + +# RKbb9NGB3pU2BaByoDwyZDH74E7koR2Lga KMD 1903.31162313 +./komodo-cli sendtoaddress RKbb9NGB3pU2BaByoDwyZDH74E7koR2Lga 1903.31162313 +sleep 3 +echo "1903.31162313 <- expected amount RKbb9NGB3pU2BaByoDwyZDH74E7koR2Lga" + +# RQsSsmpzFagxRaYk6cTMpNHa4eYLihKn8h KMD 99.84182062 +./komodo-cli sendtoaddress RQsSsmpzFagxRaYk6cTMpNHa4eYLihKn8h 99.84182062 +sleep 3 +echo "99.84182062 <- expected amount RQsSsmpzFagxRaYk6cTMpNHa4eYLihKn8h" + +# RKQPNcePppEkV4CMXZrwqEMAvRHbruKVdF KMD 1167.24851677 +./komodo-cli sendtoaddress RKQPNcePppEkV4CMXZrwqEMAvRHbruKVdF 1167.24851677 +sleep 3 +echo "1167.24851677 <- expected amount RKQPNcePppEkV4CMXZrwqEMAvRHbruKVdF" + +# RHKuiEoakr9yeWQT9UZzCrqPgR8MPBaGvD KMD 15095.38306803 +./komodo-cli sendtoaddress RHKuiEoakr9yeWQT9UZzCrqPgR8MPBaGvD 15095.38306803 +sleep 3 +echo "15095.38306803 <- expected amount RHKuiEoakr9yeWQT9UZzCrqPgR8MPBaGvD" + + +# total KMD 618514.84605397 REVS 0.00000000 diff --git a/iguana/tests/KMD.batch10.importaddress b/iguana/tests/KMD.batch10.importaddress new file mode 100755 index 000000000..4ffc9a58c --- /dev/null +++ b/iguana/tests/KMD.batch10.importaddress @@ -0,0 +1,161 @@ +# RQC6A3SKtLb2zmqDDwFvRH6Zz4mZufmp3d KMD 6266.43352646 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RQC6A3SKtLb2zmqDDwFvRH6Zz4mZufmp3d\",\"symbol\":\"KMD\"}" # 6266.43352646 +sleep 3 +echo "6266.43352646 <- expected amount RQC6A3SKtLb2zmqDDwFvRH6Zz4mZufmp3d" + +# R9SpRcd2KRD45B7SqzuUFhNnsnx7YqgkN6 KMD 1203.04246569 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"R9SpRcd2KRD45B7SqzuUFhNnsnx7YqgkN6\",\"symbol\":\"KMD\"}" # 1203.04246569 +sleep 3 +echo "1203.04246569 <- expected amount R9SpRcd2KRD45B7SqzuUFhNnsnx7YqgkN6" + +# RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j KMD 9683.15249375 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j\",\"symbol\":\"KMD\"}" # 9683.15249375 +sleep 3 +echo "9683.15249375 <- expected amount RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j" + +# RTJXwRhuAH9iyztyuRuGC8G7DamTgSMGvT KMD 306877.42641191 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RTJXwRhuAH9iyztyuRuGC8G7DamTgSMGvT\",\"symbol\":\"KMD\"}" # 306877.42641191 +sleep 3 +echo "306877.42641191 <- expected amount RTJXwRhuAH9iyztyuRuGC8G7DamTgSMGvT" + +# RQantoJxT8szwfAqUM3enLPe85YiQtwndH KMD 150.23706901 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RQantoJxT8szwfAqUM3enLPe85YiQtwndH\",\"symbol\":\"KMD\"}" # 150.23706901 +sleep 3 +echo "150.23706901 <- expected amount RQantoJxT8szwfAqUM3enLPe85YiQtwndH" + +# RLvvwtBUupmGDy81CJNp6RxKbxxbuu3jRY KMD 1985.04626121 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RLvvwtBUupmGDy81CJNp6RxKbxxbuu3jRY\",\"symbol\":\"KMD\"}" # 1985.04626121 +sleep 3 +echo "1985.04626121 <- expected amount RLvvwtBUupmGDy81CJNp6RxKbxxbuu3jRY" + +# RFdRKqe82MmvSxZQjgtLfzdf8mNHztKpPE KMD 1664.32251109 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RFdRKqe82MmvSxZQjgtLfzdf8mNHztKpPE\",\"symbol\":\"KMD\"}" # 1664.32251109 +sleep 3 +echo "1664.32251109 <- expected amount RFdRKqe82MmvSxZQjgtLfzdf8mNHztKpPE" + +# RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3 KMD 5.99800973 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3\",\"symbol\":\"KMD\"}" # 5.99800973 +sleep 3 +echo "5.99800973 <- expected amount RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3" + +# RNYMy1joru9gFitzokTSi5qFFc5nS4iFxc KMD 9671.53271075 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RNYMy1joru9gFitzokTSi5qFFc5nS4iFxc\",\"symbol\":\"KMD\"}" # 9671.53271075 +sleep 3 +echo "9671.53271075 <- expected amount RNYMy1joru9gFitzokTSi5qFFc5nS4iFxc" + +# RF4jZsF5BUckQqX5hsS68kjQMYSba8Fypm KMD 40223.19497203, REVS 101.00000000 +# RF4jZsF5BUckQqX5hsS68kjQMYSba8Fypm KMD 40223.19497203 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RF4jZsF5BUckQqX5hsS68kjQMYSba8Fypm\",\"symbol\":\"KMD\"}" # 40223.19497203 +sleep 3 +echo "40223.19497203 <- expected amount RF4jZsF5BUckQqX5hsS68kjQMYSba8Fypm" + +# RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB KMD 72698.53877152 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB\",\"symbol\":\"KMD\"}" # 72698.53877152 +sleep 3 +echo "72698.53877152 <- expected amount RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB" + +# RVzFdNGRn8Ekr4XaeDSfE9fjqvKdcVicJe KMD 9683.15249375 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RVzFdNGRn8Ekr4XaeDSfE9fjqvKdcVicJe\",\"symbol\":\"KMD\"}" # 9683.15249375 +sleep 3 +echo "9683.15249375 <- expected amount RVzFdNGRn8Ekr4XaeDSfE9fjqvKdcVicJe" + +# RTbTzn7FGJWwrH1E3fMwuZPs3YVH1MvVoB KMD 3532.13792522 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RTbTzn7FGJWwrH1E3fMwuZPs3YVH1MvVoB\",\"symbol\":\"KMD\"}" # 3532.13792522 +sleep 3 +echo "3532.13792522 <- expected amount RTbTzn7FGJWwrH1E3fMwuZPs3YVH1MvVoB" + +# RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ KMD 309.69366537 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ\",\"symbol\":\"KMD\"}" # 309.69366537 +sleep 3 +echo "309.69366537 <- expected amount RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ" + +# RYYgc5UD7X18E6CrDXCs1cts5WDwaWhm1Z KMD 3873.26099750 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RYYgc5UD7X18E6CrDXCs1cts5WDwaWhm1Z\",\"symbol\":\"KMD\"}" # 3873.26099750 +sleep 3 +echo "3873.26099750 <- expected amount RYYgc5UD7X18E6CrDXCs1cts5WDwaWhm1Z" + +# RXdBJ5cWDcS38ykuggEQZh3vSztxwmG3ut KMD 62053.93460050 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RXdBJ5cWDcS38ykuggEQZh3vSztxwmG3ut\",\"symbol\":\"KMD\"}" # 62053.93460050 +sleep 3 +echo "62053.93460050 <- expected amount RXdBJ5cWDcS38ykuggEQZh3vSztxwmG3ut" + +# REKnBAyZMnhKzRozzcuv6fKRtoBsKTFYjs KMD 6506.14889316 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"REKnBAyZMnhKzRozzcuv6fKRtoBsKTFYjs\",\"symbol\":\"KMD\"}" # 6506.14889316 +sleep 3 +echo "6506.14889316 <- expected amount REKnBAyZMnhKzRozzcuv6fKRtoBsKTFYjs" + +# RY422uSvkAoZy81uGot5PmXuMrtChhJ3uL KMD 812.78437655 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RY422uSvkAoZy81uGot5PmXuMrtChhJ3uL\",\"symbol\":\"KMD\"}" # 812.78437655 +sleep 3 +echo "812.78437655 <- expected amount RY422uSvkAoZy81uGot5PmXuMrtChhJ3uL" + +# R9o3CQms16CLu63j9WdqsaWB3XsssRXEq8 KMD 1452.47287406 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"R9o3CQms16CLu63j9WdqsaWB3XsssRXEq8\",\"symbol\":\"KMD\"}" # 1452.47287406 +sleep 3 +echo "1452.47287406 <- expected amount R9o3CQms16CLu63j9WdqsaWB3XsssRXEq8" + +# RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A KMD 867.82549038 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A\",\"symbol\":\"KMD\"}" # 867.82549038 +sleep 3 +echo "867.82549038 <- expected amount RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A" + +# RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv KMD 693.08132289 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv\",\"symbol\":\"KMD\"}" # 693.08132289 +sleep 3 +echo "693.08132289 <- expected amount RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv" + +# RCfBinKfJ1wGSxXLPNTmC9bohFRoofUiVm KMD 8521.17419450 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RCfBinKfJ1wGSxXLPNTmC9bohFRoofUiVm\",\"symbol\":\"KMD\"}" # 8521.17419450 +sleep 3 +echo "8521.17419450 <- expected amount RCfBinKfJ1wGSxXLPNTmC9bohFRoofUiVm" + +# RNEZRHeWE3KgSTUr3qvH7RNvM2JWZZkygM KMD 5328.53865807 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RNEZRHeWE3KgSTUr3qvH7RNvM2JWZZkygM\",\"symbol\":\"KMD\"}" # 5328.53865807 +sleep 3 +echo "5328.53865807 <- expected amount RNEZRHeWE3KgSTUr3qvH7RNvM2JWZZkygM" + +# RH7tsX9PaKECxSEALpu5EWdmEKikY7R2n1 KMD 29049.45748125 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RH7tsX9PaKECxSEALpu5EWdmEKikY7R2n1\",\"symbol\":\"KMD\"}" # 29049.45748125 +sleep 3 +echo "29049.45748125 <- expected amount RH7tsX9PaKECxSEALpu5EWdmEKikY7R2n1" + +# RYHxrTNpqrAHRbULboJVYHWqmnmVhzzrot KMD 4840.60793162 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RYHxrTNpqrAHRbULboJVYHWqmnmVhzzrot\",\"symbol\":\"KMD\"}" # 4840.60793162 +sleep 3 +echo "4840.60793162 <- expected amount RYHxrTNpqrAHRbULboJVYHWqmnmVhzzrot" + +# RLCEGw7zmAhZQYtP23Z2TD45gAT9ZuZKct KMD 2420.78812342 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RLCEGw7zmAhZQYtP23Z2TD45gAT9ZuZKct\",\"symbol\":\"KMD\"}" # 2420.78812342 +sleep 3 +echo "2420.78812342 <- expected amount RLCEGw7zmAhZQYtP23Z2TD45gAT9ZuZKct" + +# RGQmMzmUfa6R5dZvvL5wvy2vxPLEcgkkyC KMD 137.73071692, REVS 2.73426759 +# RGQmMzmUfa6R5dZvvL5wvy2vxPLEcgkkyC KMD 137.73071692 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RGQmMzmUfa6R5dZvvL5wvy2vxPLEcgkkyC\",\"symbol\":\"KMD\"}" # 137.73071692 +sleep 3 +echo "137.73071692 <- expected amount RGQmMzmUfa6R5dZvvL5wvy2vxPLEcgkkyC" + +# RRdDD2YoR5cfwktePGGFT5cEyRcWkEjzvM KMD 9737.34607711 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RRdDD2YoR5cfwktePGGFT5cEyRcWkEjzvM\",\"symbol\":\"KMD\"}" # 9737.34607711 +sleep 3 +echo "9737.34607711 <- expected amount RRdDD2YoR5cfwktePGGFT5cEyRcWkEjzvM" + +# RKbb9NGB3pU2BaByoDwyZDH74E7koR2Lga KMD 1903.31162313 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RKbb9NGB3pU2BaByoDwyZDH74E7koR2Lga\",\"symbol\":\"KMD\"}" # 1903.31162313 +sleep 3 +echo "1903.31162313 <- expected amount RKbb9NGB3pU2BaByoDwyZDH74E7koR2Lga" + +# RQsSsmpzFagxRaYk6cTMpNHa4eYLihKn8h KMD 99.84182062 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RQsSsmpzFagxRaYk6cTMpNHa4eYLihKn8h\",\"symbol\":\"KMD\"}" # 99.84182062 +sleep 3 +echo "99.84182062 <- expected amount RQsSsmpzFagxRaYk6cTMpNHa4eYLihKn8h" + +# RKQPNcePppEkV4CMXZrwqEMAvRHbruKVdF KMD 1167.24851677 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RKQPNcePppEkV4CMXZrwqEMAvRHbruKVdF\",\"symbol\":\"KMD\"}" # 1167.24851677 +sleep 3 +echo "1167.24851677 <- expected amount RKQPNcePppEkV4CMXZrwqEMAvRHbruKVdF" + +# RHKuiEoakr9yeWQT9UZzCrqPgR8MPBaGvD KMD 15095.38306803 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RHKuiEoakr9yeWQT9UZzCrqPgR8MPBaGvD\",\"symbol\":\"KMD\"}" # 15095.38306803 +sleep 3 +echo "15095.38306803 <- expected amount RHKuiEoakr9yeWQT9UZzCrqPgR8MPBaGvD" diff --git a/iguana/tests/KMD.batch10.listunspent b/iguana/tests/KMD.batch10.listunspent new file mode 100755 index 000000000..ef93ac5c0 --- /dev/null +++ b/iguana/tests/KMD.batch10.listunspent @@ -0,0 +1,129 @@ +# RQC6A3SKtLb2zmqDDwFvRH6Zz4mZufmp3d KMD 6266.43352646 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RQC6A3SKtLb2zmqDDwFvRH6Zz4mZufmp3d\",\"symbol\":\"KMD\"}" +echo "6266.43352646 <- expected amount RQC6A3SKtLb2zmqDDwFvRH6Zz4mZufmp3d" + +# R9SpRcd2KRD45B7SqzuUFhNnsnx7YqgkN6 KMD 1203.04246569 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"R9SpRcd2KRD45B7SqzuUFhNnsnx7YqgkN6\",\"symbol\":\"KMD\"}" +echo "1203.04246569 <- expected amount R9SpRcd2KRD45B7SqzuUFhNnsnx7YqgkN6" + +# RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j KMD 9683.15249375 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j\",\"symbol\":\"KMD\"}" +echo "9683.15249375 <- expected amount RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j" + +# RTJXwRhuAH9iyztyuRuGC8G7DamTgSMGvT KMD 306877.42641191 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RTJXwRhuAH9iyztyuRuGC8G7DamTgSMGvT\",\"symbol\":\"KMD\"}" +echo "306877.42641191 <- expected amount RTJXwRhuAH9iyztyuRuGC8G7DamTgSMGvT" + +# RQantoJxT8szwfAqUM3enLPe85YiQtwndH KMD 150.23706901 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RQantoJxT8szwfAqUM3enLPe85YiQtwndH\",\"symbol\":\"KMD\"}" +echo "150.23706901 <- expected amount RQantoJxT8szwfAqUM3enLPe85YiQtwndH" + +# RLvvwtBUupmGDy81CJNp6RxKbxxbuu3jRY KMD 1985.04626121 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RLvvwtBUupmGDy81CJNp6RxKbxxbuu3jRY\",\"symbol\":\"KMD\"}" +echo "1985.04626121 <- expected amount RLvvwtBUupmGDy81CJNp6RxKbxxbuu3jRY" + +# RFdRKqe82MmvSxZQjgtLfzdf8mNHztKpPE KMD 1664.32251109 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RFdRKqe82MmvSxZQjgtLfzdf8mNHztKpPE\",\"symbol\":\"KMD\"}" +echo "1664.32251109 <- expected amount RFdRKqe82MmvSxZQjgtLfzdf8mNHztKpPE" + +# RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3 KMD 5.99800973 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3\",\"symbol\":\"KMD\"}" +echo "5.99800973 <- expected amount RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3" + +# RNYMy1joru9gFitzokTSi5qFFc5nS4iFxc KMD 9671.53271075 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RNYMy1joru9gFitzokTSi5qFFc5nS4iFxc\",\"symbol\":\"KMD\"}" +echo "9671.53271075 <- expected amount RNYMy1joru9gFitzokTSi5qFFc5nS4iFxc" + +# RF4jZsF5BUckQqX5hsS68kjQMYSba8Fypm KMD 40223.19497203, REVS 101.00000000 +# RF4jZsF5BUckQqX5hsS68kjQMYSba8Fypm KMD 40223.19497203 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RF4jZsF5BUckQqX5hsS68kjQMYSba8Fypm\",\"symbol\":\"KMD\"}" +echo "40223.19497203 <- expected amount RF4jZsF5BUckQqX5hsS68kjQMYSba8Fypm" + +# RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB KMD 72698.53877152 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB\",\"symbol\":\"KMD\"}" +echo "72698.53877152 <- expected amount RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB" + +# RVzFdNGRn8Ekr4XaeDSfE9fjqvKdcVicJe KMD 9683.15249375 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RVzFdNGRn8Ekr4XaeDSfE9fjqvKdcVicJe\",\"symbol\":\"KMD\"}" +echo "9683.15249375 <- expected amount RVzFdNGRn8Ekr4XaeDSfE9fjqvKdcVicJe" + +# RTbTzn7FGJWwrH1E3fMwuZPs3YVH1MvVoB KMD 3532.13792522 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RTbTzn7FGJWwrH1E3fMwuZPs3YVH1MvVoB\",\"symbol\":\"KMD\"}" +echo "3532.13792522 <- expected amount RTbTzn7FGJWwrH1E3fMwuZPs3YVH1MvVoB" + +# RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ KMD 309.69366537 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ\",\"symbol\":\"KMD\"}" +echo "309.69366537 <- expected amount RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ" + +# RYYgc5UD7X18E6CrDXCs1cts5WDwaWhm1Z KMD 3873.26099750 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RYYgc5UD7X18E6CrDXCs1cts5WDwaWhm1Z\",\"symbol\":\"KMD\"}" +echo "3873.26099750 <- expected amount RYYgc5UD7X18E6CrDXCs1cts5WDwaWhm1Z" + +# RXdBJ5cWDcS38ykuggEQZh3vSztxwmG3ut KMD 62053.93460050 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RXdBJ5cWDcS38ykuggEQZh3vSztxwmG3ut\",\"symbol\":\"KMD\"}" +echo "62053.93460050 <- expected amount RXdBJ5cWDcS38ykuggEQZh3vSztxwmG3ut" + +# REKnBAyZMnhKzRozzcuv6fKRtoBsKTFYjs KMD 6506.14889316 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"REKnBAyZMnhKzRozzcuv6fKRtoBsKTFYjs\",\"symbol\":\"KMD\"}" +echo "6506.14889316 <- expected amount REKnBAyZMnhKzRozzcuv6fKRtoBsKTFYjs" + +# RY422uSvkAoZy81uGot5PmXuMrtChhJ3uL KMD 812.78437655 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RY422uSvkAoZy81uGot5PmXuMrtChhJ3uL\",\"symbol\":\"KMD\"}" +echo "812.78437655 <- expected amount RY422uSvkAoZy81uGot5PmXuMrtChhJ3uL" + +# R9o3CQms16CLu63j9WdqsaWB3XsssRXEq8 KMD 1452.47287406 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"R9o3CQms16CLu63j9WdqsaWB3XsssRXEq8\",\"symbol\":\"KMD\"}" +echo "1452.47287406 <- expected amount R9o3CQms16CLu63j9WdqsaWB3XsssRXEq8" + +# RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A KMD 867.82549038 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A\",\"symbol\":\"KMD\"}" +echo "867.82549038 <- expected amount RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A" + +# RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv KMD 693.08132289 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv\",\"symbol\":\"KMD\"}" +echo "693.08132289 <- expected amount RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv" + +# RCfBinKfJ1wGSxXLPNTmC9bohFRoofUiVm KMD 8521.17419450 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RCfBinKfJ1wGSxXLPNTmC9bohFRoofUiVm\",\"symbol\":\"KMD\"}" +echo "8521.17419450 <- expected amount RCfBinKfJ1wGSxXLPNTmC9bohFRoofUiVm" + +# RNEZRHeWE3KgSTUr3qvH7RNvM2JWZZkygM KMD 5328.53865807 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RNEZRHeWE3KgSTUr3qvH7RNvM2JWZZkygM\",\"symbol\":\"KMD\"}" +echo "5328.53865807 <- expected amount RNEZRHeWE3KgSTUr3qvH7RNvM2JWZZkygM" + +# RH7tsX9PaKECxSEALpu5EWdmEKikY7R2n1 KMD 29049.45748125 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RH7tsX9PaKECxSEALpu5EWdmEKikY7R2n1\",\"symbol\":\"KMD\"}" +echo "29049.45748125 <- expected amount RH7tsX9PaKECxSEALpu5EWdmEKikY7R2n1" + +# RYHxrTNpqrAHRbULboJVYHWqmnmVhzzrot KMD 4840.60793162 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RYHxrTNpqrAHRbULboJVYHWqmnmVhzzrot\",\"symbol\":\"KMD\"}" +echo "4840.60793162 <- expected amount RYHxrTNpqrAHRbULboJVYHWqmnmVhzzrot" + +# RLCEGw7zmAhZQYtP23Z2TD45gAT9ZuZKct KMD 2420.78812342 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RLCEGw7zmAhZQYtP23Z2TD45gAT9ZuZKct\",\"symbol\":\"KMD\"}" +echo "2420.78812342 <- expected amount RLCEGw7zmAhZQYtP23Z2TD45gAT9ZuZKct" + +# RGQmMzmUfa6R5dZvvL5wvy2vxPLEcgkkyC KMD 137.73071692, REVS 2.73426759 +# RGQmMzmUfa6R5dZvvL5wvy2vxPLEcgkkyC KMD 137.73071692 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RGQmMzmUfa6R5dZvvL5wvy2vxPLEcgkkyC\",\"symbol\":\"KMD\"}" +echo "137.73071692 <- expected amount RGQmMzmUfa6R5dZvvL5wvy2vxPLEcgkkyC" + +# RRdDD2YoR5cfwktePGGFT5cEyRcWkEjzvM KMD 9737.34607711 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RRdDD2YoR5cfwktePGGFT5cEyRcWkEjzvM\",\"symbol\":\"KMD\"}" +echo "9737.34607711 <- expected amount RRdDD2YoR5cfwktePGGFT5cEyRcWkEjzvM" + +# RKbb9NGB3pU2BaByoDwyZDH74E7koR2Lga KMD 1903.31162313 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RKbb9NGB3pU2BaByoDwyZDH74E7koR2Lga\",\"symbol\":\"KMD\"}" +echo "1903.31162313 <- expected amount RKbb9NGB3pU2BaByoDwyZDH74E7koR2Lga" + +# RQsSsmpzFagxRaYk6cTMpNHa4eYLihKn8h KMD 99.84182062 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RQsSsmpzFagxRaYk6cTMpNHa4eYLihKn8h\",\"symbol\":\"KMD\"}" +echo "99.84182062 <- expected amount RQsSsmpzFagxRaYk6cTMpNHa4eYLihKn8h" + +# RKQPNcePppEkV4CMXZrwqEMAvRHbruKVdF KMD 1167.24851677 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RKQPNcePppEkV4CMXZrwqEMAvRHbruKVdF\",\"symbol\":\"KMD\"}" +echo "1167.24851677 <- expected amount RKQPNcePppEkV4CMXZrwqEMAvRHbruKVdF" + +# RHKuiEoakr9yeWQT9UZzCrqPgR8MPBaGvD KMD 15095.38306803 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RHKuiEoakr9yeWQT9UZzCrqPgR8MPBaGvD\",\"symbol\":\"KMD\"}" +echo "15095.38306803 <- expected amount RHKuiEoakr9yeWQT9UZzCrqPgR8MPBaGvD" diff --git a/iguana/tests/REVS.batch10 b/iguana/tests/REVS.batch10 new file mode 100755 index 000000000..0fa879e14 --- /dev/null +++ b/iguana/tests/REVS.batch10 @@ -0,0 +1,8 @@ +# RF4jZsF5BUckQqX5hsS68kjQMYSba8Fypm KMD 40223.19497203, REVS 101.00000000 +sleep 1 +fiat/revs sendtoaddress RF4jZsF5BUckQqX5hsS68kjQMYSba8Fypm 101.00000000 +# RGQmMzmUfa6R5dZvvL5wvy2vxPLEcgkkyC KMD 137.73071692, REVS 2.73426759 +sleep 1 +fiat/revs sendtoaddress RGQmMzmUfa6R5dZvvL5wvy2vxPLEcgkkyC 2.73426759 + +# total KMD 0.00000000 REVS 103.73426759 diff --git a/iguana/tests/REVS.batch10.importaddress b/iguana/tests/REVS.batch10.importaddress new file mode 100755 index 000000000..f0e9b3536 --- /dev/null +++ b/iguana/tests/REVS.batch10.importaddress @@ -0,0 +1,6 @@ +# RF4jZsF5BUckQqX5hsS68kjQMYSba8Fypm KMD 40223.19497203, REVS 101.00000000 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RF4jZsF5BUckQqX5hsS68kjQMYSba8Fypm\",\"symbol\":\"REVS\"}" # 101.00000000 +sleep 3 +# RGQmMzmUfa6R5dZvvL5wvy2vxPLEcgkkyC KMD 137.73071692, REVS 2.73426759 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RGQmMzmUfa6R5dZvvL5wvy2vxPLEcgkkyC\",\"symbol\":\"REVS\"}" # 2.73426759 +sleep 3 From a99bdff100de5452de6c12c242ecf0b838456e02 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 21 Feb 2017 17:40:05 +0200 Subject: [PATCH 148/495] Initial mm --- .gitignore | 58 +++++++++++++ basilisk/tradebots_liquidity.c | 10 +-- basilisk/tradebots_marketmaker.c | 17 +--- crypto777/OS_portable.h | 1 + crypto777/bitcoind_RPC.c | 11 ++- crypto777/iguana_utils.c | 141 +++++++++++++++++++++++++++++++ iguana/dpow/dpow_prices.c | 4 +- iguana/exchanges/bittrex.c | 18 +++- iguana/iguana_exchanges.c | 25 +++++- iguana/iguana_notary.c | 43 +++++++++- iguana/iguana_rpc.c | 17 ++-- iguana/m_osx | 4 +- iguana/tests/dexlistunspent2 | 2 +- iguana/tests/mm | 1 + includes/iguana_globals.h | 2 +- 15 files changed, 314 insertions(+), 40 deletions(-) create mode 100755 iguana/tests/mm diff --git a/.gitignore b/.gitignore index 2e7656246..d8b603625 100755 --- a/.gitignore +++ b/.gitignore @@ -67,3 +67,61 @@ iguana/SVM/models/.tmpmarker SuperNET.xcodeproj/xcuserdata/mac.xcuserdatad/xcschemes/xcschememanagement.plist SuperNET.xcodeproj/xcuserdata/mac.xcuserdatad/xcschemes/SuperNET.xcscheme + +iguana/DB/BTC/.tmpmarker + +*.vouts + +iguana/DB/BTC/vouts/.tmpmarker + +iguana/DB/BTC/accounts/.tmpmarker + +iguana/DB/BTC/spends/.tmpmarker + +iguana/DB/BTC/validated/.tmpmarker + +iguana/DB/KMD/.tmpmarker + +iguana/DB/KMD/accounts/.tmpmarker + +iguana/DB/KMD/spends/.tmpmarker + +iguana/DB/KMD/validated/.tmpmarker + +iguana/DB/KMD/vouts/.tmpmarker + +iguana/DB/purgeable/KMD/.tmpmarker + +iguana/DB/ro/.tmpmarker + +iguana/DB/ro/BTC/.tmpmarker + +iguana/DB/ro/KMD/.tmpmarker + +iguana/confs/682c279f7b01b96aee50f11b327bf6c0a3d3481a23a9a265f0796e9bb3765b24 + +iguana/confs/682c279f7b01b96aee50f11b327bf6c0a3d3481a23a9a265f0796e9bb3765b24.old + +iguana/confs/83cb074c13289a91a0cd50a8e6932b2237d1533ec1cbff56ab3d9b1d37f8df35 + +iguana/confs/83cb074c13289a91a0cd50a8e6932b2237d1533ec1cbff56ab3d9b1d37f8df35.old + +iguana/tmp/BTC/.tmpmarker + +iguana/tmp/BTC/0/.tmpmarker + +iguana/tmp/BTC/0/0/.tmpmarker + +iguana/tmp/BTC/peers.txt + +iguana/tmp/BTC/RT/.tmpmarker + +iguana/tmp/KMD/.tmpmarker + +iguana/tmp/KMD/0/.tmpmarker + +iguana/tmp/KMD/0/0/.tmpmarker + +iguana/tmp/KMD/peers.txt + +iguana/tmp/KMD/RT/.tmpmarker diff --git a/basilisk/tradebots_liquidity.c b/basilisk/tradebots_liquidity.c index 8d4ad02da..8ba0b92de 100755 --- a/basilisk/tradebots_liquidity.c +++ b/basilisk/tradebots_liquidity.c @@ -982,7 +982,7 @@ void _default_liquidity_command(struct supernet_info *myinfo,char *base,bits256 } else tradebot_monitor(myinfo,0,0,0,li.exchange,li.base,li.rel,0.); } myinfo->linfos[i] = li; - printf("Set linfo[%d] %s (%s/%s) profitmargin %.6f bid %.6f ask %.8f maxvol %.f ref %.8f\n",i,li.exchange,li.base,li.rel,li.profit,li.bid,li.ask,li.maxvol,li.refprice); + printf("Set linfo[%d] %s (%s/%s) profitmargin %.6f bid %.8f ask %.8f minvol %.6f maxvol %.6f ref %.8f <- (%s)\n",i,li.exchange,li.base,li.rel,li.profit,li.bid,li.ask,li.minvol,li.maxvol,li.refprice,jprint(vals,0)); return; } } @@ -1101,8 +1101,8 @@ void _default_swap_balancingtrade(struct supernet_info *myinfo,struct basilisk_s { printf("BOB: price %f * vol %f -> %s newprice %f margin %.2f%%\n",price,volume,dir < 0. ? "buy" : "sell",price + dir * price * profitmargin,100*profitmargin); if ( dir < 0. ) - tradestr = InstantDEX_buy(myinfo,0,0,0,"poloniex",base,rel,price,volume,dotrade); - else tradestr = InstantDEX_sell(myinfo,0,0,0,"poloniex",base,rel,price,volume,dotrade); + tradestr = InstantDEX_buy(myinfo,0,0,0,"bittrex",base,rel,price,volume,dotrade); + else tradestr = InstantDEX_sell(myinfo,0,0,0,"bittrex",base,rel,price,volume,dotrade); } } else @@ -1111,8 +1111,8 @@ void _default_swap_balancingtrade(struct supernet_info *myinfo,struct basilisk_s { printf("ALICE: price %f * vol %f -> %s newprice %f margin %.2f%%\n",price,volume,dir > 0. ? "buy" : "sell",price - dir * price * profitmargin,100*profitmargin); if ( dir > 0. ) - tradestr = InstantDEX_buy(myinfo,0,0,0,"poloniex",base,rel,price,volume,dotrade); - else tradestr = InstantDEX_sell(myinfo,0,0,0,"poloniex",base,rel,price,volume,dotrade); + tradestr = InstantDEX_buy(myinfo,0,0,0,"bittrex",base,rel,price,volume,dotrade); + else tradestr = InstantDEX_sell(myinfo,0,0,0,"bittrex",base,rel,price,volume,dotrade); } } if ( tradestr != 0 ) diff --git a/basilisk/tradebots_marketmaker.c b/basilisk/tradebots_marketmaker.c index e5b81e81e..7d5d5ec61 100755 --- a/basilisk/tradebots_marketmaker.c +++ b/basilisk/tradebots_marketmaker.c @@ -180,24 +180,15 @@ ZERO_ARGS(tradebot,portfolio) else return(jprint(portfolio,1)); } -/*li.profit = jdouble(vals,"profit"); -li.refprice = jdouble(vals,"refprice"); -li.bid = jdouble(vals,"bid"); -li.ask = jdouble(vals,"ask"); -if ( (li.minvol= jdouble(vals,"minvol")) <= 0. ) -li.minvol = (strcmp("BTC",base) == 0) ? 0.0001 : 0.001; -if ( (li.maxvol= jdouble(vals,"maxvol")) < li.minvol ) -li.maxvol = li.minvol;*/ - ARRAY_OBJ_INT(tradebot,goals,currencies,vals,targettime) { static bits256 zero; char *targetcoin; int32_t i,n; if ( currencies != 0 && vals != 0 ) { - // init things so automatically updates refli.bid and refli.ask - // volume range with margin - // currency percentage value in BTC? target distribution, max percentage, min percentage` - // min price to sell, max price to buy, max volume + // init things so automatically updates refli.bid and refli.ask + // volume range with margin + // currency percentage value in BTC? target distribution, max percentage, min percentage` + // min price to sell, max price to buy, max volume n = cJSON_GetArraySize(currencies); for (i=0; i SMALLVAL && CMC_average > SMALLVAL ) + { + theoretical = (weighted + CMC_average) * 0.5; + if ( changes[0] > SMALLVAL && changes[1] > SMALLVAL && changes[2] > SMALLVAL ) + { + if ( changes[0] > changes[1] && changes[1] > changes[2] ) // breakout + { + adjusted = theoretical * (1. - (changes[0] + changes[1]) * .005); + } + } + else if ( changes[1] < -SMALLVAL && changes[2] < -SMALLVAL ) //changes[0] < -SMALLVAL && + { + if ( (1) )//&& changes[0] < changes[1] && changes[1] < changes[2] ) // waterfall + { + adjusted = theoretical * (1. - (changes[0] + changes[1]) * .005); + } + } + if ( adjusted != 0. && theoretical != 0. ) + theoretical = (theoretical + adjusted) * 0.5; + } + printf("adjusted %.8f theoretical %.8f (%.8f + wt %.8f)\n",adjusted,theoretical,CMC_average,weighted); + return(theoretical); +} + +double calc_weighted(double *avebidp,double *aveaskp,double *bids,double *bidvols,int32_t numbids,double *asks,double *askvols,int32_t numasks,double limit) +{ + int32_t i; double weighted = 0.,bidsum = 0., asksum = 0.,totalbids = 0.,totalasks = 0.; + bidsum = bids[0] * bidvols[0], totalbids = bidvols[0]; + asksum = asks[0] * askvols[0], totalasks = askvols[0]; + for (i=1; i limit ) + break; + bidsum += bids[i] * bidvols[i]; + totalbids += bidvols[i]; + } + for (i=1; i limit ) + break; + asksum += asks[i] * askvols[i]; + totalasks += askvols[i]; + } + if ( totalbids != 0. && totalasks != 0. ) + { + *avebidp = (bidsum / totalbids); + *aveaskp = (asksum / totalasks); + weighted = (*avebidp + *aveaskp) * 0.5; + } + //printf("weighted %f\n",weighted); + return(weighted); +} + +double weighted_orderbook(double *avebidp,double *aveaskp,double *highbidp,double *lowaskp,char *orderbookstr,double limit) +{ + cJSON *bookjson,*bid,*ask,*resobj,*item; int32_t i,numbids,numasks; double bidvols[50],bids[50],askvols[50],asks[50],weighted = 0.; + if ( orderbookstr != 0 ) + { + if ( (bookjson= cJSON_Parse(orderbookstr)) != 0 ) + { + if ( (resobj= jobj(bookjson,"result")) != 0 ) + { + bid = jarray(&numbids,resobj,"buy"); + if ( numbids > sizeof(bids)/sizeof(*bids) ) + numbids = (int32_t)(sizeof(bids)/sizeof(*bids)); + ask = jarray(&numasks,resobj,"sell"); + if ( numasks > sizeof(asks)/sizeof(*asks) ) + numasks = (int32_t)(sizeof(asks)/sizeof(*asks)); + if ( bid != 0 && ask != 0 ) + { + for (i=0; i SMALLVAL && weighted > SMALLVAL ) + theoretical = calc_theoretical(weighted,*CMC_averagep,changes); + if ( counter++ == 0 ) + printf("HBLA.[%.8f %.8f] AVE.[%.8f %.8f] (%s) CMC %f %f %f %f\n",*highbidp,*lowaskp,*avebidp,*aveaskp,jprint(item,0),*CMC_averagep,changes[0],changes[1],changes[2]); + free_json(cmcjson); + } + free(cmcstr); + } + return(theoretical); +} + diff --git a/iguana/dpow/dpow_prices.c b/iguana/dpow/dpow_prices.c index 0c3bb23a4..25a2dc153 100755 --- a/iguana/dpow/dpow_prices.c +++ b/iguana/dpow/dpow_prices.c @@ -1450,7 +1450,7 @@ void PAX_update(struct PAX_data *dp,double *btcusdp,double *kmdbtcp) } if ( 1 ) { - double avebid,aveask,bidvol,askvol; //struct exchange_quote sortbuf[512]; struct supernet_info *myinfo = SuperNET_MYINFO(0); cJSON *argjson = cJSON_Parse("{}"); + double avebid,aveask,bidvol,askvol,highbid,lowask,CMC_average,changes[3]; //struct exchange_quote sortbuf[512]; struct supernet_info *myinfo = SuperNET_MYINFO(0); cJSON *argjson = cJSON_Parse("{}"); //aveask = instantdex_aveprice(myinfo,sortbuf,(int32_t)(sizeof(sortbuf)/sizeof(*sortbuf)),&askvol,"KMD","BTC",1,argjson); //avebid = instantdex_aveprice(myinfo,sortbuf,(int32_t)(sizeof(sortbuf)/sizeof(*sortbuf)),&bidvol,"KMD","BTC",-1,argjson); if ( 0 && avebid > SMALLVAL && aveask > SMALLVAL ) @@ -1460,6 +1460,8 @@ void PAX_update(struct PAX_data *dp,double *btcusdp,double *kmdbtcp) printf("set KMD price %f\n",price); dp->KMDBTC = price; } + else if ( (dp->KMDBTC= get_theoretical(&avebid,&aveask,&highbid,&lowask,&CMC_average,changes,"komodo","KMD","BTC")) > SMALLVAL ) + *kmdbtcp = dp->KMDBTC; else { for (iter=1; iter<2; iter++) diff --git a/iguana/exchanges/bittrex.c b/iguana/exchanges/bittrex.c index 155de4cfa..842a4083c 100755 --- a/iguana/exchanges/bittrex.c +++ b/iguana/exchanges/bittrex.c @@ -194,8 +194,13 @@ uint64_t TRADE(int32_t dotrade,char **retstrp,struct exchange_info *exchange,cha char *ORDERSTATUS(struct exchange_info *exchange,uint64_t quoteid,cJSON *argjson) { - char payload[1024],*retstr = 0; cJSON *json; - sprintf(payload,"https://bittrex.com/api/v1.1/account/getorder?apikey=%s&nonce=%llu&uuid=%llu",exchange->apikey,(long long)exchange_nonce(exchange),(long long)quoteid); + char payload[1024],*orderstr=0,orderbuf[512],*retstr = 0; cJSON *json; + if ( argjson != 0 ) + orderstr = jstr(argjson,"uuid");//, printf("status.(%s)\n",jprint(argjson,0)); + if ( orderstr == 0 ) + sprintf(orderbuf,"%llu",(long long)quoteid); + else strcpy(orderbuf,jstr(argjson,"uuid")); + sprintf(payload,"https://bittrex.com/api/v1.1/account/getorder?apikey=%s&nonce=%llu&uuid=%s",exchange->apikey,(long long)exchange_nonce(exchange),orderbuf); if ( (json= SIGNPOST(&exchange->cHandle,1,&retstr,exchange,payload,payload)) != 0 ) { free_json(json); @@ -205,8 +210,13 @@ char *ORDERSTATUS(struct exchange_info *exchange,uint64_t quoteid,cJSON *argjson char *CANCELORDER(struct exchange_info *exchange,uint64_t quoteid,cJSON *argjson) { - char payload[1024],*retstr = 0; cJSON *json; - sprintf(payload,"https://bittrex.com/api/v1.1/market/cancel?apikey=%s&nonce=%llu&uuid=%llu",exchange->apikey,(long long)exchange_nonce(exchange),(long long)quoteid); + char payload[1024],*orderstr,orderbuf[512],*retstr = 0; cJSON *json; + if ( argjson != 0 ) + orderstr = jstr(argjson,"uuid");//, printf("cancel.(%s)\n",jprint(argjson,0)); + if ( orderstr == 0 ) + sprintf(orderbuf,"%llu",(long long)quoteid); + else strcpy(orderbuf,jstr(argjson,"uuid")); + sprintf(payload,"https://bittrex.com/api/v1.1/market/cancel?apikey=%s&nonce=%llu&uuid=%s",exchange->apikey,(long long)exchange_nonce(exchange),orderbuf); if ( (json= SIGNPOST(&exchange->cHandle,1,&retstr,exchange,payload,payload)) != 0 ) { free_json(json); diff --git a/iguana/iguana_exchanges.c b/iguana/iguana_exchanges.c index 01de2cfca..8be8d38c3 100755 --- a/iguana/iguana_exchanges.c +++ b/iguana/iguana_exchanges.c @@ -995,6 +995,7 @@ char *exchanges777_Qrequest(struct exchange_info *exchange,int32_t func,char *ba safecopy(req->rel,rel,sizeof(req->rel)); req->retstrp = calloc(1,sizeof(void *)); req->orderid = orderid; + req->argjson = jduplicate(argjson); //printf("Qrequest\n"); return(exchanges777_submit(exchange,req,func,maxseconds)); } @@ -1244,26 +1245,42 @@ TWO_STRINGS(InstantDEX,balance,exchange,base) TWO_STRINGS(InstantDEX,orderstatus,exchange,orderid) { - struct exchange_info *ptr; + struct exchange_info *ptr; cJSON *argjson; char *retstr; uint64_t num = 0; if ( remoteaddr == 0 ) { if ( myinfo->expiration == 0 ) return(clonestr("{\"error\":\"need to unlock wallet\"}")); if ( (ptr= exchanges777_info(exchange,1,json,remoteaddr)) != 0 ) - return(exchanges777_Qrequest(ptr,'P',0,0,juint(json,"maxseconds"),calc_nxt64bits(orderid),0,0,json)); + { + argjson = cJSON_CreateObject(); + jaddstr(argjson,"uuid",orderid); + if ( is_decimalstr(orderid) != 0 ) + num = calc_nxt64bits(orderid); + retstr = exchanges777_Qrequest(ptr,'P',0,0,juint(json,"maxseconds"),num,0,0,argjson); + free_json(argjson); + return(retstr); + } else return(clonestr("{\"error\":\"cant find or create exchange\"}")); } else return(clonestr("{\"error\":\"no remote for this API\"}")); } TWO_STRINGS(InstantDEX,cancelorder,exchange,orderid) { - struct exchange_info *ptr; + struct exchange_info *ptr; cJSON *argjson; char *retstr; uint64_t num = 0; if ( remoteaddr == 0 ) { if ( myinfo->expiration == 0 ) return(clonestr("{\"error\":\"need to unlock wallet\"}")); if ( (ptr= exchanges777_info(exchange,1,json,remoteaddr)) != 0 ) - return(exchanges777_Qrequest(ptr,'C',0,0,juint(json,"maxseconds"),calc_nxt64bits(orderid),0,0,json)); + { + argjson = cJSON_CreateObject(); + jaddstr(argjson,"uuid",orderid); + if ( is_decimalstr(orderid) != 0 ) + num = calc_nxt64bits(orderid); + retstr = exchanges777_Qrequest(ptr,'C',0,0,juint(json,"maxseconds"),num,0,0,argjson); + free_json(argjson); + return(retstr); + } else return(clonestr("{\"error\":\"cant find or create exchange\"}")); } else return(clonestr("{\"error\":\"no remote for this API\"}")); } diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 6fa29d2be..c08e1df59 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -771,6 +771,7 @@ TWO_STRINGS(dex,listspent,symbol,address) TWO_STRINGS(dex,getbalance,symbol,address) { + char url[512],*retstr; cJSON *retjson; uint64_t val; if ( myinfo->DEXEXPLORER != 0 ) { if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 && coin->DEXEXPLORER != 0 ) @@ -779,8 +780,48 @@ TWO_STRINGS(dex,getbalance,symbol,address) coin->DEXEXPLORER = myinfo->DEXEXPLORER * myinfo->IAMNOTARY * (iguana_isnotarychain(coin->symbol) >= 0); } if ( symbol != 0 && address != 0 ) + { + if ( strcmp(symbol,"BTC") == 0 ) + { + sprintf(url,"https://api.blocktrail.com/v1/btc/address/%s?api_key=e5ddfdceb58fa6c1bf9411aaeff4b6ee28cbc370",address); + if ( (retstr= issue_curl(url)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( (val= j64bits(retjson,"balance")) != 0 ) + { + jdelete(retjson,"balance"); + jaddnum(retjson,"balance",dstr(val)); + } + if ( (val= j64bits(retjson,"sent")) != 0 ) + { + jdelete(retjson,"sent"); + jaddnum(retjson,"sent",dstr(val)); + } + if ( (val= j64bits(retjson,"received")) != 0 ) + { + jdelete(retjson,"received"); + jaddnum(retjson,"received",dstr(val)); + } + if ( (val= j64bits(retjson,"unconfirmed_sent")) != 0 ) + { + jdelete(retjson,"unconfirmed_sent"); + jaddnum(retjson,"unconfirmed_sent",dstr(val)); + } + if ( (val= j64bits(retjson,"unconfirmed_received")) != 0 ) + { + jdelete(retjson,"unconfirmed_received"); + jaddnum(retjson,"unconfirmed_received",dstr(val)); + } + //printf("(%s) -> (%s)\n",retstr,jprint(retjson,0)); + free(retstr); + retstr = jprint(retjson,1); + } + } + return(retstr); + } return(_dex_getbalance(myinfo,symbol,address)); - else return(clonestr("{\"error\":\"dex getbalance null symbol, address or coin\"}")); + } else return(clonestr("{\"error\":\"dex getbalance null symbol, address or coin\"}")); } STRING_ARG(dex,explorer,symbol) diff --git a/iguana/iguana_rpc.c b/iguana/iguana_rpc.c index d88605b6c..771ca66c6 100755 --- a/iguana/iguana_rpc.c +++ b/iguana/iguana_rpc.c @@ -1100,11 +1100,18 @@ char *SuperNET_rpcparse(struct supernet_info *myinfo,char *retbuf,int32_t bufsiz } else { - //printf("ARGJSON.(%s)\n",jprint(argjson,0)); - coin = iguana_coinchoose(myinfo,symbol,argjson,port); - if ( userpass != 0 && jstr(argjson,"userpass") == 0 ) - jaddstr(argjson,"userpass",userpass); - retstr = SuperNET_JSON(myinfo,coin,argjson,remoteaddr,port); + cJSON *arg; + if ( jstr(argjson,"agent") != 0 && strcmp(jstr(argjson,"agent"),"bitcoinrpc") != 0 && jobj(argjson,"params") != 0 ) + { + arg = jobj(argjson,"params"); + if ( is_cJSON_Array(arg) != 0 && cJSON_GetArraySize(arg) == 1 ) + arg = jitem(arg,0); + } else arg = argjson; + //printf("ARGJSON.(%s)\n",jprint(arg,0)); + coin = iguana_coinchoose(myinfo,symbol,arg,port); + if ( userpass != 0 && jstr(arg,"userpass") == 0 ) + jaddstr(arg,"userpass",userpass); + retstr = SuperNET_JSON(myinfo,coin,arg,remoteaddr,port); } free_json(argjson); free_json(json); diff --git a/iguana/m_osx b/iguana/m_osx index 82539229a..500053d38 100755 --- a/iguana/m_osx +++ b/iguana/m_osx @@ -3,6 +3,6 @@ rm ../agents/iguana *.o git pull cd secp256k1; ./m_unix; cd .. -gcc -g -Wno-deprecated -c -O2 -DLIQUIDITY_PROVIDER=1 *.c ../basilisk/basilisk.c ../gecko/gecko.c ../datachain/datachain.c +gcc -g -Wno-address-of-packed-member -Wno-deprecated -c -O2 -DLIQUIDITY_PROVIDER=1 *.c ../basilisk/basilisk.c ../gecko/gecko.c ../datachain/datachain.c gcc -g -Wno-deprecated -c -DLIQUIDITY_PROVIDER=1 main.c iguana777.c iguana_bundles.c ../basilisk/basilisk.c -gcc -g -o ../agents/iguana *.o ../agents/libcrypto777.a -lcurl -lssl -lcrypto -lpthread -lz -lm +gcc -g -o ../agents/iguana *.o ../agents/libcrypto777.a -lnanomsg -lcurl -lssl -lcrypto -lpthread -lz -lm diff --git a/iguana/tests/dexlistunspent2 b/iguana/tests/dexlistunspent2 index 0a4c41ad8..f66da368b 100755 --- a/iguana/tests/dexlistunspent2 +++ b/iguana/tests/dexlistunspent2 @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent2\",\"address\":\"R9eW4hVmhGYCExBSJ15vX61fEoENgDvHhj\",\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent2\",\"address\":\"RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc\",\"symbol\":\"KMD\"}" diff --git a/iguana/tests/mm b/iguana/tests/mm new file mode 100755 index 000000000..70e96aa11 --- /dev/null +++ b/iguana/tests/mm @@ -0,0 +1 @@ +./marketmaker "{\"passphrase\":\"\",\"base\":\"KMD\",\"rel\":\"BTC\",\"name\":\"komodo\",\"exchange\":\"bittrex\",\"apikey\":\"\",\"apisecret\":\"\",\"profitmargin\":0.001,\"maxexposure\":0.1,\"lotratio\":0.02,\"start_rel\":0.1,\"start_base\":1000}" diff --git a/includes/iguana_globals.h b/includes/iguana_globals.h index cc0a13359..31a91a073 100755 --- a/includes/iguana_globals.h +++ b/includes/iguana_globals.h @@ -64,7 +64,7 @@ CONDEXTERN int32_t Showmode,Autofold,PANGEA_MAXTHREADS,QUEUEITEMS; CONDEXTERN struct gecko_chain *Categories; //CONDEXTERN struct iguana_info *Allcoins; CONDEXTERN char Userhome[512]; -CONDEXTERN int32_t USE_JAY,FIRST_EXTERNAL,IGUANA_disableNXT,Debuglevel,IGUANA_BIGENDIAN; +CONDEXTERN int32_t FIRST_EXTERNAL,IGUANA_disableNXT,Debuglevel,IGUANA_BIGENDIAN; CONDEXTERN uint32_t prices777_NXTBLOCK; CONDEXTERN queue_t helperQ,JSON_Q,FINISHED_Q,bundlesQ,emitQ; CONDEXTERN struct supernet_info MYINFO,**MYINFOS; From 5f1fc548132ab9af37bfb34f0f4587260125ccec Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 21 Feb 2017 17:56:10 +0200 Subject: [PATCH 149/495] Test --- iguana/dpow/dpow_prices.c | 67 ++++++++++++++++++++------------------ iguana/exchanges/bittrex.c | 2 +- 2 files changed, 36 insertions(+), 33 deletions(-) diff --git a/iguana/dpow/dpow_prices.c b/iguana/dpow/dpow_prices.c index 25a2dc153..7dcffac26 100755 --- a/iguana/dpow/dpow_prices.c +++ b/iguana/dpow/dpow_prices.c @@ -1884,41 +1884,44 @@ int32_t PAX_idle(struct supernet_info *myinfo)//struct PAX_data *argdp,int32_t i PAX_RTupdate(dp->cryptovols,dp->RTmetals,dp->RTprices,dp); PAX_emitprices(pvals,dp); } - PAX_update(dp,&dp->btcusd,&dp->kmdbtc); timestamp = (uint32_t)time(NULL); - int32_t dispflag = ((rand() % 100) == 0); - for (i=0; ikmdbtc == 0 || dispflag != 0 ) { - splineval = PAX_splineval(&dp->splines[i],timestamp,0); - pvals[6+i] = PAX_val32(splineval); + PAX_update(dp,&dp->btcusd,&dp->kmdbtc); + for (i=0; isplines[i],timestamp,0); + pvals[6+i] = PAX_val32(splineval); + if ( dispflag != 0 ) + printf("%u ",pvals[6+i]); + } + if ( pvals[6+CNY] != 0 && pvals[6+USD] != 0 ) + dp->CNYUSD = ((double)pvals[6 + CNY] / pvals[6 + USD]) * MINDENOMS[USD] / MINDENOMS[CNY]; + pvals[1] = timestamp; + pvals[2] = MAX_CURRENCIES + 3; + pvals[3] = PAX_val32(dp->kmdbtc * 1000); + pvals[4] = PAX_val32(dp->btcusd * .001); + pvals[5] = PAX_val32(dp->CNYUSD); if ( dispflag != 0 ) - printf("%u ",pvals[6+i]); - } - if ( pvals[6+CNY] != 0 && pvals[6+USD] != 0 ) - dp->CNYUSD = ((double)pvals[6 + CNY] / pvals[6 + USD]) * MINDENOMS[USD] / MINDENOMS[CNY]; - pvals[1] = timestamp; - pvals[2] = MAX_CURRENCIES + 3; - pvals[3] = PAX_val32(dp->kmdbtc * 1000); - pvals[4] = PAX_val32(dp->btcusd * .001); - pvals[5] = PAX_val32(dp->CNYUSD); - if ( dispflag != 0 ) - printf("KMD %f BTC %f CNY %f (%f)\n",dp->kmdbtc,dp->btcusd,dp->CNYUSD,1./dp->CNYUSD); - sprintf(fname,"/%s/.komodo/komodofeed",userhome); - if ( (fp= fopen(fname,"wb")) != 0 ) - { - for (i=1; i %s\n",fname); + printf("KMD %f BTC %f CNY %f (%f)\n",dp->kmdbtc,dp->btcusd,dp->CNYUSD,1./dp->CNYUSD); + sprintf(fname,"/%s/.komodo/komodofeed",userhome); + if ( (fp= fopen(fname,"wb")) != 0 ) + { + for (i=1; i %s\n",fname); + } } } return(0); diff --git a/iguana/exchanges/bittrex.c b/iguana/exchanges/bittrex.c index 842a4083c..227cab9b1 100755 --- a/iguana/exchanges/bittrex.c +++ b/iguana/exchanges/bittrex.c @@ -210,7 +210,7 @@ char *ORDERSTATUS(struct exchange_info *exchange,uint64_t quoteid,cJSON *argjson char *CANCELORDER(struct exchange_info *exchange,uint64_t quoteid,cJSON *argjson) { - char payload[1024],*orderstr,orderbuf[512],*retstr = 0; cJSON *json; + char payload[1024],*orderstr=0,orderbuf[512],*retstr = 0; cJSON *json; if ( argjson != 0 ) orderstr = jstr(argjson,"uuid");//, printf("cancel.(%s)\n",jprint(argjson,0)); if ( orderstr == 0 ) From 301d4853f47b55a648ede631d2248a306a82523f Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 21 Feb 2017 17:59:36 +0200 Subject: [PATCH 150/495] Test --- .gitignore | 4 ++++ iguana/dpow/dpow_fsm.c | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d8b603625..c5b32b551 100755 --- a/.gitignore +++ b/.gitignore @@ -125,3 +125,7 @@ iguana/tmp/KMD/0/0/.tmpmarker iguana/tmp/KMD/peers.txt iguana/tmp/KMD/RT/.tmpmarker + +*.xcworkspacedata + +*.xcuserstate diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index b2b80e566..4d563f9f1 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -126,7 +126,7 @@ int32_t dpow_checkutxo(struct supernet_info *myinfo,struct dpow_info *dp,struct int32_t haveutxo,completed,minutxo,n; bits256 signedtxid; cJSON *addresses; char *rawtx,*sendtx; if ( strcmp("BTC",coin->symbol) == 0 ) { - minutxo = 49; + minutxo = 499; n = 50; } else From d55f0342c1e0e9a078f4a669ff7dfcc9656aa718 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 21 Feb 2017 18:11:57 +0200 Subject: [PATCH 151/495] Test --- iguana/dpow/dpow_prices.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_prices.c b/iguana/dpow/dpow_prices.c index 7dcffac26..312911bab 100755 --- a/iguana/dpow/dpow_prices.c +++ b/iguana/dpow/dpow_prices.c @@ -1904,7 +1904,7 @@ int32_t PAX_idle(struct supernet_info *myinfo)//struct PAX_data *argdp,int32_t i pvals[4] = PAX_val32(dp->btcusd * .001); pvals[5] = PAX_val32(dp->CNYUSD); if ( dispflag != 0 ) - printf("KMD %f BTC %f CNY %f (%f)\n",dp->kmdbtc,dp->btcusd,dp->CNYUSD,1./dp->CNYUSD); + printf("KMD %.8f BTC %f CNY %f (%f)\n",dp->kmdbtc,dp->btcusd,dp->CNYUSD,1./dp->CNYUSD); sprintf(fname,"/%s/.komodo/komodofeed",userhome); if ( (fp= fopen(fname,"wb")) != 0 ) { From cb114a1b0d40606c13f1eb659a03c5d62755687b Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 21 Feb 2017 18:51:35 +0200 Subject: [PATCH 152/495] Blocktrail support --- .gitignore | 2 + iguana/iguana777.h | 2 +- iguana/iguana_notary.c | 40 +++- iguana/iguana_tradebots.c | 4 +- iguana/tests/mm | 2 +- includes/iguana_apideclares copy.h | 346 ----------------------------- includes/iguana_apideclares.h | 2 +- 7 files changed, 46 insertions(+), 352 deletions(-) delete mode 100755 includes/iguana_apideclares copy.h diff --git a/.gitignore b/.gitignore index c5b32b551..ad22ac7a0 100755 --- a/.gitignore +++ b/.gitignore @@ -129,3 +129,5 @@ iguana/tmp/KMD/RT/.tmpmarker *.xcworkspacedata *.xcuserstate + +includes/iguana_apideclares copy.h diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 1c4047970..29fa7195c 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -127,7 +127,7 @@ struct supernet_info struct delayedPoW_info dPoW; struct basilisk_spend *spends; int32_t numspends; char bindaddr[64]; - // fadedreamz + char blocktrail_apikey[256]; struct peggy_info *PEGS; void *PAXDATA; struct liquidity_info linfos[512]; cJSON *liquidity_currencies; struct pending_trade *trades; portable_mutex_t pending_mutex; diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index c08e1df59..b18dcd6da 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -615,11 +615,47 @@ HASH_AND_STRING_AND_INT(dex,gettxout,txid,symbol,vout) TWO_STRINGS(dex,listunspent,symbol,address) { + if ( symbol != 0 && strcmp(symbol,"BTC") == 0 && (coin= iguana_coinfind("BTC")) != 0 && coin->FULLNODE == 0 && myinfo->IAMLP != 0 ) + { + char url[1024],*retstr; + sprintf(url,"https://api.blocktrail.com/v1/btc/address/%s/unspent-outputs?api_key=%s",address,myinfo->blocktrail_apikey); + if ( (retstr= issue_curl(url)) != 0 ) + { + return(retstr); + } + } return(_dex_listunspent(myinfo,symbol,address)); } TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions,symbol,address,count,skip) { + if ( symbol != 0 && strcmp(symbol,"BTC") == 0 && (coin= iguana_coinfind("BTC")) != 0 && coin->FULLNODE == 0 && myinfo->IAMLP != 0 ) + { + char url[1024],*retstr,*retstr2; cJSON *retjson,*retjson2,*retjson3; int32_t i,n; + sprintf(url,"https://api.blocktrail.com/v1/btc/address/%s/transactions?api_key=%s",address,myinfo->blocktrail_apikey); + if ( (retstr= issue_curl(url)) != 0 ) + { + sprintf(url,"https://api.blocktrail.com/v1/btc/address/%s/unconfirmed-transactions?api_key=%s",address,myinfo->blocktrail_apikey); + if ( (retstr2= issue_curl(url)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 && (retjson2= cJSON_Parse(retstr2)) != 0 ) + { + retjson3 = jduplicate(retjson); + if ( (n= cJSON_GetArraySize(retjson2)) > 0 ) + { + for (i=0; i (%s)\n",retstr,retstr2,jprint(retjson3,0)); + free(retstr); + free(retstr2); + free_json(retjson); + free_json(retjson2); + return(jprint(retjson3,1)); + } + } + } + } return(_dex_listtransactions(myinfo,symbol,address,count,skip)); } @@ -781,9 +817,9 @@ TWO_STRINGS(dex,getbalance,symbol,address) } if ( symbol != 0 && address != 0 ) { - if ( strcmp(symbol,"BTC") == 0 ) + if ( strcmp(symbol,"BTC") == 0 && myinfo->IAMLP != 0 ) { - sprintf(url,"https://api.blocktrail.com/v1/btc/address/%s?api_key=e5ddfdceb58fa6c1bf9411aaeff4b6ee28cbc370",address); + sprintf(url,"https://api.blocktrail.com/v1/btc/address/%s?api_key=%s",address,myinfo->blocktrail_apikey); if ( (retstr= issue_curl(url)) != 0 ) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) diff --git a/iguana/iguana_tradebots.c b/iguana/iguana_tradebots.c index f691b9168..0ece4f0e3 100755 --- a/iguana/iguana_tradebots.c +++ b/iguana/iguana_tradebots.c @@ -228,9 +228,11 @@ HASH_ARRAY_STRING(tradebot,liquidity,hash,vals,targetcoin) return(clonestr("{\"result\":\"targetcoin updated\"}")); } -ZERO_ARGS(tradebot,amlp) +STRING_ARG(tradebot,amlp,blocktrail) { myinfo->IAMLP = 1; + if ( blocktrail != 0 ) + safecopy(myinfo->blocktrail_apikey,blocktrail,sizeof(myinfo->blocktrail_apikey)); return(clonestr("{\"result\":\"liquidity provider active\"}")); } diff --git a/iguana/tests/mm b/iguana/tests/mm index 70e96aa11..bc9af3c54 100755 --- a/iguana/tests/mm +++ b/iguana/tests/mm @@ -1 +1 @@ -./marketmaker "{\"passphrase\":\"\",\"base\":\"KMD\",\"rel\":\"BTC\",\"name\":\"komodo\",\"exchange\":\"bittrex\",\"apikey\":\"\",\"apisecret\":\"\",\"profitmargin\":0.001,\"maxexposure\":0.1,\"lotratio\":0.02,\"start_rel\":0.1,\"start_base\":1000}" +./marketmaker "{\"blocktrail\":\"",\"passphrase\":\"\",\"base\":\"KMD\",\"rel\":\"BTC\",\"name\":\"komodo\",\"exchange\":\"bittrex\",\"apikey\":\"\",\"apisecret\":\"\",\"profitmargin\":0.001,\"maxexposure\":0.1,\"lotratio\":0.02,\"start_rel\":0.1,\"start_base\":1000}" diff --git a/includes/iguana_apideclares copy.h b/includes/iguana_apideclares copy.h deleted file mode 100755 index 13dfc92a8..000000000 --- a/includes/iguana_apideclares copy.h +++ /dev/null @@ -1,346 +0,0 @@ -/****************************************************************************** - * Copyright © 2014-2017 The SuperNET Developers. * - * * - * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * - * the top-level directory of this distribution for the individual copyright * - * holder information and the developer policies on copyright and licensing. * - * * - * Unless otherwise agreed in a custom licensing agreement, no part of the * - * SuperNET software, including this file may be copied, modified, propagated * - * or distributed except according to the terms contained in the LICENSE file * - * * - * Removal or modification of this copyright notice is prohibited. * - * * - ******************************************************************************/ - -STRING_ARG(dpow,pending,fiat); -TWO_STRINGS(iguana,dpow,symbol,pubkey); -STRING_ARG(dpow,active,maskhex); -TWOINTS_AND_ARRAY(dpow,ratify,minsigs,timestamp,ratified); -ZERO_ARGS(dpow,cancelratify); -THREE_STRINGS(iguana,passthru,asset,function,hex); -STRING_ARG(dpow,bindaddr,ipaddr); -STRING_AND_INT(dpow,fundnotaries,symbol,numblocks); -ZERO_ARGS(dpow,notarychains); -INT_ARG(passthru,paxfiats,mask); -INT_ARG(basilisk,paxfiats,mask); -INT_ARG(iguana,paxfiats,mask); -STRING_AND_INT(iguana,snapshot,symbol,height); -INT_ARRAY_STRING(iguana,dividends,height,vals,symbol); - -TWO_STRINGS(dex,send,hex,handler); -HASH_AND_STRING(dex,gettransaction,txid,symbol); -STRING_ARG(dex,getinfo,symbol); -STRING_ARG(dex,getnotaries,symbol); -STRING_ARG(dex,alladdresses,symbol); -STRING_ARG(dex,getbestblockhash,symbol); -STRING_AND_INT(dex,getblockhash,symbol,height); -HASH_AND_STRING(dex,getblock,hash,symbol); -TWO_STRINGS(dex,sendrawtransaction,symbol,signedtx); -HASH_AND_STRING_AND_INT(dex,gettxout,txid,symbol,vout); -TWO_STRINGS(dex,importaddress,symbol,address); -TWO_STRINGS(dex,checkaddress,symbol,address); -TWO_STRINGS(dex,validateaddress,symbol,address); -TWO_STRINGS(dex,listunspent,symbol,address); -TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions,symbol,address,count,skip); - -TWO_STRINGS(zcash,passthru,function,hex); -TWO_STRINGS(komodo,passthru,function,hex); - -ZERO_ARGS(pax,start); -HASH_ARRAY_STRING(tradebot,liquidity,hash,vals,targetcoin); -ZERO_ARGS(tradebot,amlp); -ZERO_ARGS(tradebot,notlp); -TWO_STRINGS(tradebot,gensvm,base,rel); -ZERO_ARGS(tradebot,openliquidity); - -INT_AND_ARRAY(iguana,rates,unused,quotes); -TWO_STRINGS(iguana,rate,base,rel); -THREE_STRINGS_AND_THREE_INTS(iguana,prices,exchange,base,rel,period,start,end); - -ZERO_ARGS(InstantDEX,allcoins); -STRING_ARG(InstantDEX,available,source); -HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr); - -INT_ARG(InstantDEX,incoming,requestid); -INT_ARG(InstantDEX,automatched,requestid); - -TWO_INTS(InstantDEX,accept,requestid,quoteid); -//TWO_INTS(InstantDEX,swapstatus,requestid,quoteid); - -HASH_ARRAY_STRING(basilisk,genesis_opreturn,hash,vals,hexstr); -HASH_ARRAY_STRING(basilisk,history,hash,vals,hexstr); - -HASH_ARRAY_STRING(basilisk,balances,hash,vals,hexstr); -HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr); -HASH_ARRAY_STRING(basilisk,rawtx,hash,vals,hexstr); - -HASH_ARRAY_STRING(basilisk,getmessage,hash,vals,hexstr); -HASH_ARRAY_STRING(basilisk,sendmessage,hash,vals,hexstr); - -HASH_ARRAY_STRING(basilisk,geckoheaders,hash,vals,hexstr); -HASH_ARRAY_STRING(basilisk,geckoblock,hash,vals,hexstr); -HASH_ARRAY_STRING(basilisk,geckotx,hash,vals,hexstr); -HASH_ARRAY_STRING(basilisk,geckoget,hash,vals,hexstr); - -HASH_ARRAY_STRING(basilisk,addrelay,hash,vals,hexstr); -HASH_ARRAY_STRING(basilisk,dispatch,hash,vals,hexstr); -HASH_ARRAY_STRING(basilisk,publish,hash,vals,hexstr); -HASH_ARRAY_STRING(basilisk,subscribe,hash,vals,hexstr); -HASH_ARRAY_STRING(basilisk,forward,hash,vals,hexstr); -HASH_ARRAY_STRING(basilisk,mailbox,hash,vals,hexstr); - -/*HASH_ARRAY_STRING(basilisk,VPNcreate,hash,vals,hexstr); -HASH_ARRAY_STRING(basilisk,VPNjoin,hash,vals,hexstr); -HASH_ARRAY_STRING(basilisk,VPNmessage,hash,vals,hexstr); -HASH_ARRAY_STRING(basilisk,VPNbroadcast,hash,vals,hexstr); -HASH_ARRAY_STRING(basilisk,VPNreceive,hash,vals,hexstr); -HASH_ARRAY_STRING(basilisk,VPNlogout,hash,vals,hexstr); - -HASH_ARRAY_STRING(basilisk,vote,hash,vals,hexstr);*/ - -ZERO_ARGS(bitcoinrpc,getinfo); -ZERO_ARGS(bitcoinrpc,getblockcount); -ZERO_ARGS(bitcoinrpc,getdifficulty); -ZERO_ARGS(bitcoinrpc,getbestblockhash); -INT_ARG(bitcoinrpc,getblockhash,height); -HASH_AND_TWOINTS(bitcoinrpc,getblock,blockhash,verbose,remoteonly); - -HASH_AND_INT(bitcoinrpc,getrawtransaction,txid,verbose); -HASH_ARG(bitcoinrpc,gettransaction,txid); -HASH_AND_TWOINTS(bitcoinrpc,gettxout,txid,vout,mempool); -TWOINTS_AND_ARRAY(bitcoinrpc,listunspent,minconf,maxconf,array); - -STRING_ARG(bitcoinrpc,decodescript,scriptstr); -//STRING_ARG(bitcoinrpc,decoderawtransaction,rawtx); -STRING_AND_INT(bitcoinrpc,decoderawtransaction,rawtx,suppress); -STRING_AND_INT(bitcoinrpc,validaterawtransaction,rawtx,suppress); -ARRAY_OBJ_INT(bitcoinrpc,createrawtransaction,vins,vouts,locktime); - -ZERO_ARGS(iguana,makekeypair); -STRING_ARG(bitcoinrpc,validatepubkey,pubkey); -STRING_ARG(bitcoinrpc,validateaddress,address); -THREE_INTS(iguana,splitfunds,satoshis,duplicates,sendflag); - -ZERO_ARGS(bitcoinrpc,walletlock); -TWOSTRINGS_AND_INT(bitcoinrpc,walletpassphrase,password,permanentfile,timeout); -THREE_STRINGS(bitcoinrpc,encryptwallet,passphrase,password,permanentfile); -FOUR_STRINGS(bitcoinrpc,walletpassphrasechange,oldpassword,newpassword,oldpermanentfile,permanentfile); -STRING_ARG(bitcoinrpc,dumpwallet,filename); -STRING_ARG(bitcoinrpc,backupwallet,filename); -STRING_ARG(bitcoinrpc,importwallet,filename); -STRING_ARG(bitcoinrpc,getnewaddress,account); -TWOSTRINGS_AND_INT(bitcoinrpc,importprivkey,wif,account,rescan); -STRING_ARG(bitcoinrpc,dumpprivkey,address); - -STRING_AND_THREEINTS(bitcoinrpc,listtransactions,account,count,skip,includewatchonly); -THREE_INTS(bitcoinrpc,listreceivedbyaddress,minconf,includeempty,flag); -THREE_INTS(bitcoinrpc,listreceivedbyaccount,confirmations,includeempty,watchonly); -TWO_INTS(bitcoinrpc,listaccounts,minconf,includewatchonly); -ZERO_ARGS(bitcoinrpc,listaddressgroupings); -STRING_AND_INT(bitcoinrpc,getreceivedbyaddress,address,minconf); -STRING_AND_INT(bitcoinrpc,getreceivedbyaccount,account,includeempty); -STRING_AND_THREEINTS(bitcoinrpc,getbalance,account,confirmations,includeempty,lastheight); -STRING_ARG(bitcoinrpc,getaddressesbyaccount,account); -STRING_ARG(bitcoinrpc,getaccount,address); -STRING_ARG(bitcoinrpc,getaccountaddress,account); -TWO_STRINGS(bitcoinrpc,setaccount,address,account); - -INT_ARRAY_STRING(bitcoinrpc,createmultisig,M,pubkeys,ignore); -INT_ARRAY_STRING(bitcoinrpc,addmultisigaddress,M,pubkeys,account); -DOUBLE_ARG(bitcoinrpc,settxfee,amount); - -ZERO_ARGS(bitcoinrpc,checkwallet); -ZERO_ARGS(bitcoinrpc,repairwallet); - -STRING_ARRAY_OBJ_STRING(bitcoinrpc,signrawtransaction,rawtx,vins,privkeys,sighash); -TWO_STRINGS(bitcoinrpc,signmessage,address,message); -THREE_STRINGS(bitcoinrpc,verifymessage,address,sig,message); -STRING_AND_INT(bitcoinrpc,sendrawtransaction,rawtx,allowhighfees); - -SS_D_I_SS(bitcoinrpc,sendfrom,fromaccount,toaddress,amount,minconf,comment,comment2); -S_A_I_S(bitcoinrpc,sendmany,fromaccount,payments,minconf,comment); -S_D_SS(bitcoinrpc,sendtoaddress,address,amount,comment,comment2); -INT_AND_ARRAY(bitcoinrpc,lockunspent,flag,array); // -ZERO_ARGS(bitcoinrpc,listlockunspent); // -STRING_ARG(bitcoinrpc,submitblock,rawbytes); // - -// maybe later -HASH_AND_TWOINTS(bitcoinrpc,listsinceblock,blockhash,target,flag); -ZERO_ARGS(bitcoinrpc,gettxoutsetinfo); -ZERO_ARGS(bitcoinrpc,getrawchangeaddress); -SS_D_I_S(bitcoinrpc,move,fromaccount,toaccount,amount,minconf,comment); - -STRING_ARG(iguana,initfastfind,activecoin); -STRING_ARG(iguana,peers,activecoin); -STRING_AND_INT(iguana,maxpeers,activecoin,max); -STRING_ARG(iguana,getconnectioncount,activecoin); -STRING_ARG(iguana,addcoin,newcoin); -STRING_ARG(iguana,validate,activecoin); -STRING_ARG(iguana,removecoin,activecoin); -STRING_ARG(iguana,startcoin,activecoin); -STRING_ARG(iguana,pausecoin,activecoin); -STRING_ARG(iguana,stopcoin,activecoin); -TWO_STRINGS(iguana,addnode,activecoin,ipaddr); -STRING_ARG(iguana,addnotary,ipaddr); -TWO_STRINGS(iguana,persistent,activecoin,ipaddr); -TWO_STRINGS(iguana,removenode,activecoin,ipaddr); -TWO_STRINGS(iguana,oneshot,activecoin,ipaddr); -TWO_STRINGS(iguana,nodestatus,activecoin,ipaddr); -TWO_STRINGS_AND_TWO_DOUBLES(iguana,balance,activecoin,address,heightd,minconfd); -P2SH_SPENDAPI(iguana,spendmsig,activecoin,vintxid,vinvout,destaddress,destamount,destaddress2,destamount2,M,N,pubA,wifA,pubB,wifB,pubC,wifC); -STRING_AND_INT(iguana,bundleaddresses,activecoin,height); -STRING_AND_INT(iguana,bundlehashes,activecoin,height); -STRING_AND_INT(iguana,PoSweights,activecoin,height); -STRING_ARG(iguana,stakers,activecoin); - -//TWO_STRINGS_AND_TWO_DOUBLES(InstantDEX,minaccept,base,rel,minprice,basevolume); -//TWO_STRINGS_AND_TWO_DOUBLES(InstantDEX,maxaccept,base,rel,maxprice,basevolume); -THREE_STRINGS_AND_THREE_DOUBLES(InstantDEX,buy,exchange,base,rel,price,volume,dotrade); -THREE_STRINGS_AND_THREE_DOUBLES(InstantDEX,sell,exchange,base,rel,price,volume,dotrade); -THREE_STRINGS_AND_DOUBLE(InstantDEX,withdraw,exchange,base,destaddr,amount); -THREE_STRINGS(InstantDEX,apikeypair,exchange,apikey,apisecret); -THREE_STRINGS(InstantDEX,setuserid,exchange,userid,tradepassword); -TWO_STRINGS(InstantDEX,balance,exchange,base); -TWO_STRINGS(InstantDEX,orderstatus,exchange,orderid); -TWO_STRINGS(InstantDEX,cancelorder,exchange,orderid); -STRING_ARG(InstantDEX,openorders,exchange); -STRING_ARG(InstantDEX,tradehistory,exchange); - -THREE_STRINGS_AND_THREE_INTS(InstantDEX,orderbook,exchange,base,rel,depth,allfields,ignore); -STRING_AND_INT(InstantDEX,pollgap,exchange,pollgap); -//TWO_STRINGS(InstantDEX,events,base,rel); -ZERO_ARGS(InstantDEX,allexchanges); -STRING_ARG(InstantDEX,allpairs,exchange); -THREE_STRINGS(InstantDEX,supports,exchange,base,rel); - -//THREE_STRINGS(atomic,approve,myorderid,otherid,txname); -//THREE_STRINGS(atomic,claim,myorderid,otherid,txname); - -//TWOSTRINGS_AND_TWOHASHES_AND_TWOINTS(InstantDEX,proposal,reference,message,basetxid,reltxid,duration,flags); -//TWOSTRINGS_AND_TWOHASHES_AND_TWOINTS(InstantDEX,accept,reference,message,basetxid,reltxid,duration,flags); -//TWOSTRINGS_AND_TWOHASHES_AND_TWOINTS(InstantDEX,confirm,reference,message,basetxid,reltxid,baseheight,relheight); - -THREE_STRINGS_AND_DOUBLE(tradebot,aveprice,comment,base,rel,basevolume); -THREE_STRINGS_AND_DOUBLE(tradebot,monitor,exchange,base,rel,commission); -STRING_AND_DOUBLE(tradebot,monitorall,exchange,commission); -THREE_STRINGS(tradebot,unmonitor,exchange,base,rel); -THREE_STRINGS_AND_THREE_DOUBLES(tradebot,accumulate,exchange,base,rel,price,volume,duration); -THREE_STRINGS_AND_THREE_DOUBLES(tradebot,divest,exchange,base,rel,price,volume,duration); -STRING_ARG(tradebot,activebots,exchange); -TWO_STRINGS(tradebot,status,exchange,botid); -TWO_STRINGS(tradebot,pause,exchange,botid); -TWO_STRINGS(tradebot,stop,exchange,botid); -TWO_STRINGS(tradebot,resume,exchange,botid); - -#ifndef WIN32 -/*HASH_ARG(pangea,call,tablehash); -HASH_AND_INT(pangea,raise,tablehash,numchips); -HASH_AND_INT(pangea,bet,tablehash,numchips); -HASH_ARG(pangea,check,tablehash); -HASH_ARG(pangea,fold,tablehash); -HASH_ARG(pangea,allin,tablehash); -HASH_ARG(pangea,status,tablehash); -HASH_AND_STRING(pangea,mode,tablehash,params); -HASH_ARG(pangea,history,tablehash); -HASH_AND_INT(pangea,handhistory,tablehash,hand); -INT_AND_ARRAY(pangea,host,minplayers,params); -ZERO_ARGS(pangea,lobby); -HASH_AND_STRING(pangea,join,tablehash,handle); -HASH_AND_INT(pangea,buyin,tablehash,numchips); -HASH_ARG(pangea,start,tablehash);*/ -#endif - -ZERO_ARGS(SuperNET,help); -STRING_ARG(SuperNET,utime2utc,utime); -INT_ARG(SuperNET,utc2utime,utc); -STRING_ARG(SuperNET,getpeers,activecoin); -TWO_ARRAYS(SuperNET,mypeers,supernet,rawpeers); -ZERO_ARGS(SuperNET,stop); -HASH_AND_STRING(SuperNET,saveconf,wallethash,confjsonstr); -HASH_ARRAY_STRING(SuperNET,layer,mypriv,otherpubs,str); - -STRING_ARG(SuperNET,bitcoinrpc,setcoin); -STRING_ARG(SuperNET,myipaddr,ipaddr); -STRING_ARG(SuperNET,setmyipaddr,ipaddr); - -FOUR_STRINGS(SuperNET,login,handle,password,permanentfile,passphrase); -ZERO_ARGS(SuperNET,logout); -ZERO_ARGS(SuperNET,activehandle); -THREE_STRINGS(SuperNET,encryptjson,password,permanentfile,payload); -TWO_STRINGS(SuperNET,decryptjson,password,permanentfile); - -TWO_STRINGS(SuperNET,html,agentform,htmlfile); -//TWOSTRINGS_AND_TWOHASHES_AND_TWOINTS(SuperNET,DHT,hexmsg,destip,categoryhash,subhash,maxdelay,broadcast); - -THREE_STRINGS(SuperNET,rosetta,passphrase,pin,showprivkey); -ZERO_ARGS(SuperNET,keypair); -HASH_AND_INT(SuperNET,priv2pub,privkey,addrtype); -STRING_ARG(SuperNET,wif2priv,wif); -STRING_ARG(SuperNET,priv2wif,priv); -STRING_ARG(SuperNET,addr2rmd160,address); -STRING_ARG(SuperNET,rmd160conv,rmd160); - -TWOHASHES_AND_STRING(SuperNET,cipher,privkey,destpubkey,message); -TWOHASHES_AND_STRING(SuperNET,decipher,privkey,srcpubkey,cipherstr); - -STRING_ARG(SuperNET,broadcastcipher,message); -STRING_ARG(SuperNET,broadcastdecipher,message); - -HASH_AND_STRING(SuperNET,multicastcipher,pubkey,message); -HASH_AND_STRING(SuperNET,multicastdecipher,privkey,cipherstr); - -/*TWO_STRINGS(SuperNET,subscribe,category,subcategory); -TWO_STRINGS(SuperNET,gethexmsg,category,subcategory); -THREE_STRINGS(SuperNET,posthexmsg,category,subcategory,hexmsg); -THREE_STRINGS(SuperNET,announce,category,subcategory,message); -THREE_STRINGS(SuperNET,survey,category,subcategory,message); -TWO_STRINGS(SuperNET,categoryhashes,category,subcategory);*/ - -STRING_AND_TWOINTS(mouse,image,name,x,y); -STRING_AND_TWOINTS(mouse,change,name,x,y); -STRING_AND_TWOINTS(mouse,click,name,x,y); -STRING_ARG(mouse,close,name); -STRING_ARG(mouse,leave,name); -STRING_AND_INT(keyboard,key,name,c); - -STRING_ARG(hash,hex,message); -STRING_ARG(hash,unhex,hexmsg); -TWO_HASHES(hash,curve25519_pair,element,scalar); -STRING_ARG(hash,NXT,passphrase); -STRING_ARG(hash,curve25519,pubkey); -STRING_ARG(hash,crc32,message); -STRING_ARG(hash,base64_encode,message); -STRING_ARG(hash,base64_decode,message); -STRING_ARG(hash,rmd160_sha256,message); -STRING_ARG(hash,sha256_sha256,message); - -STRING_ARG(hash,sha224,message); -STRING_ARG(hash,sha256,message); -STRING_ARG(hash,sha384,message); -STRING_ARG(hash,sha512,message); -STRING_ARG(hash,rmd128,message); -STRING_ARG(hash,rmd160,message); -STRING_ARG(hash,rmd256,message); -STRING_ARG(hash,rmd320,message); -STRING_ARG(hash,sha1,message); -STRING_ARG(hash,md2,message); -STRING_ARG(hash,md4,message); -STRING_ARG(hash,md5,message); -STRING_ARG(hash,tiger192_3,message); -STRING_ARG(hash,whirlpool,message); - -TWO_STRINGS(hmac,sha224,message,passphrase); -TWO_STRINGS(hmac,sha256,message,passphrase); -TWO_STRINGS(hmac,sha384,message,passphrase); -TWO_STRINGS(hmac,sha512,message,passphrase); -TWO_STRINGS(hmac,rmd128,message,passphrase); -TWO_STRINGS(hmac,rmd160,message,passphrase); -TWO_STRINGS(hmac,rmd256,message,passphrase); -TWO_STRINGS(hmac,rmd320,message,passphrase); -TWO_STRINGS(hmac,sha1,message,passphrase); -TWO_STRINGS(hmac,md2,message,passphrase); -TWO_STRINGS(hmac,md4,message,passphrase); -TWO_STRINGS(hmac,md5,message,passphrase); -TWO_STRINGS(hmac,tiger192_3,message,passphrase); -TWO_STRINGS(hmac,whirlpool,message,passphrase); diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 24951acf2..4a6787406 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -220,7 +220,7 @@ THREE_STRINGS(InstantDEX,supports,exchange,base,rel); //TWOSTRINGS_AND_TWOHASHES_AND_TWOINTS(InstantDEX,confirm,reference,message,basetxid,reltxid,baseheight,relheight); HASH_ARRAY_STRING(tradebot,liquidity,hash,vals,targetcoin); -ZERO_ARGS(tradebot,amlp); +STRING_ARG(tradebot,amlp,blocktrail); ZERO_ARGS(tradebot,notlp); TWO_STRINGS(tradebot,gensvm,base,rel); ZERO_ARGS(tradebot,openliquidity); From 4bfef0bdd90abeea790cf8044521836682b74372 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 21 Feb 2017 19:13:05 +0200 Subject: [PATCH 153/495] getbalance, listtransactions, listunspent via blocktrail for BTC basilisk --- iguana/iguana_notary.c | 19 ++++++++++++++----- iguana/tests/dexlisttransactions | 2 +- iguana/tests/dexlistunspent | 2 +- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index b18dcd6da..11f18495f 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -617,10 +617,17 @@ TWO_STRINGS(dex,listunspent,symbol,address) { if ( symbol != 0 && strcmp(symbol,"BTC") == 0 && (coin= iguana_coinfind("BTC")) != 0 && coin->FULLNODE == 0 && myinfo->IAMLP != 0 ) { - char url[1024],*retstr; + char url[1024],*retstr; int32_t n; cJSON *retjson,*data; sprintf(url,"https://api.blocktrail.com/v1/btc/address/%s/unspent-outputs?api_key=%s",address,myinfo->blocktrail_apikey); if ( (retstr= issue_curl(url)) != 0 ) { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + data = jarray(&n,retjson,"data"); + free(retstr); + retstr = jprint(data,0); + free_json(retjson); + } return(retstr); } } @@ -631,7 +638,7 @@ TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions,symbol,address,count,skip) { if ( symbol != 0 && strcmp(symbol,"BTC") == 0 && (coin= iguana_coinfind("BTC")) != 0 && coin->FULLNODE == 0 && myinfo->IAMLP != 0 ) { - char url[1024],*retstr,*retstr2; cJSON *retjson,*retjson2,*retjson3; int32_t i,n; + char url[1024],*retstr,*retstr2; cJSON *retjson,*retjson2,*retjson3,*data,*data2; int32_t i,n; sprintf(url,"https://api.blocktrail.com/v1/btc/address/%s/transactions?api_key=%s",address,myinfo->blocktrail_apikey); if ( (retstr= issue_curl(url)) != 0 ) { @@ -640,11 +647,13 @@ TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions,symbol,address,count,skip) { if ( (retjson= cJSON_Parse(retstr)) != 0 && (retjson2= cJSON_Parse(retstr2)) != 0 ) { - retjson3 = jduplicate(retjson); - if ( (n= cJSON_GetArraySize(retjson2)) > 0 ) + data = jarray(&n,retjson,"data"); + data2 = jarray(&n,retjson2,"data"); + retjson3 = jduplicate(data); + if ( n > 0 ) { for (i=0; i (%s)\n",retstr,retstr2,jprint(retjson3,0)); free(retstr); diff --git a/iguana/tests/dexlisttransactions b/iguana/tests/dexlisttransactions index 3c776b9d6..d53a0ff46 100755 --- a/iguana/tests/dexlisttransactions +++ b/iguana/tests/dexlisttransactions @@ -1,5 +1,5 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listtransactions\",\"address\":\"RDobQ77wnMY8Me7RAL9oiFqVNvwkqqgPRF\",\"count\":100,\"skip\":0,\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listtransactions\",\"address\":\"1Pc27firvEwPoDzPzYdJKZ5hoZK4T1tf6z\",\"count\":100,\"skip\":0,\"symbol\":\"BTC\"}" #curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listtransactions\",\"address\":\"RRyBxbrAPRUBCUpiJgJZYrkxqrh8x5ta9Z\",\"count\":100,\"skip\":0,\"symbol\":\"MVP\"}" #curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listtransactions\",\"address\":\"RMGpGoX82M1ZUUbHxZ3JKHacxY9NYVakqr\",\"count\":100,\"skip\":0,\"symbol\":\"USD\"}" #curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listtransactions\",\"address\":\"RMGpGoX82M1ZUUbHxZ3JKHacxY9NYVakqr\",\"count\":100,\"skip\":0,\"symbol\":\"MVP\"}" diff --git a/iguana/tests/dexlistunspent b/iguana/tests/dexlistunspent index c038fe5fb..e262df7f3 100755 --- a/iguana/tests/dexlistunspent +++ b/iguana/tests/dexlistunspent @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RW3gz9fEadohRLZerK9r8zXkugk5swWHrf\",\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"19rjYdJtRN3qoammX3r1gxy9bvh8p8DmRc\",\"symbol\":\"BTC\"}" From 696c885cd22ba434df8d9a64c52d5e17846d034e Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 21 Feb 2017 19:30:24 +0200 Subject: [PATCH 154/495] Fix block trail listunspent json fields --- iguana/iguana_notary.c | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 11f18495f..68bd82e64 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -617,15 +617,49 @@ TWO_STRINGS(dex,listunspent,symbol,address) { if ( symbol != 0 && strcmp(symbol,"BTC") == 0 && (coin= iguana_coinfind("BTC")) != 0 && coin->FULLNODE == 0 && myinfo->IAMLP != 0 ) { - char url[1024],*retstr; int32_t n; cJSON *retjson,*data; + char url[1024],*retstr,*coinaddr,*script; int32_t i,n,vout; cJSON *retjson,*data,*item,*item3,*data3; bits256 txid; uint64_t val; sprintf(url,"https://api.blocktrail.com/v1/btc/address/%s/unspent-outputs?api_key=%s",address,myinfo->blocktrail_apikey); if ( (retstr= issue_curl(url)) != 0 ) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) { data = jarray(&n,retjson,"data"); + data3 = cJSON_CreateArray(); + //[{"hash":"e0a40dac21103e92e0dc9311a0233640489afc5beb5ba3b009848a8e9151dc55","time":"2017-02-21T16:48:28+0000","confirmations":1,"is_coinbase":false,"value":4100000,"index":1,"address":"19rjYdJtRN3qoammX3r1gxy9bvh8p8DmRc","type":"pubkeyhash","multisig":null,"script":"OP_DUP OP_HASH160 6128e7459989d35d530bcd4066c9aaf1f925430a OP_EQUALVERIFY OP_CHECKSIG","script_hex":"76a9146128e7459989d35d530bcd4066c9aaf1f925430a88ac"}] + /*{ + "txid" : "e95d3083baf733dfda2fcd1110fe2937cb3580f8b1b237aad547528440dfa873", + "vout" : 1, + "address" : "RNgdefRo2iRLWqDXEogJrsTw35MgDPQP4R", + "account" : "", + "scriptPubKey" : "76a91493088c5f3546225e0ef6ba9c9c6a74d4c2df877388ac", + "amount" : 150.00000000, + "interest" : 0.30000000, + "confirmations" : 20599, + "spendable" : true + }*/ + for (i=0; i Date: Wed, 22 Feb 2017 19:18:04 +0200 Subject: [PATCH 155/495] Crash log test --- .gitignore | 2 ++ crypto777/cJSON.c | 1 + iguana/tests/amlp | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ad22ac7a0..e222be7b4 100755 --- a/.gitignore +++ b/.gitignore @@ -131,3 +131,5 @@ iguana/tmp/KMD/RT/.tmpmarker *.xcuserstate includes/iguana_apideclares copy.h + +iguana/iguana_tx.o-4b5de8fe diff --git a/crypto777/cJSON.c b/crypto777/cJSON.c index 719c3eb8e..5d4c1ad79 100755 --- a/crypto777/cJSON.c +++ b/crypto777/cJSON.c @@ -1098,6 +1098,7 @@ uint64_t calc_nxt64bits(const char *NXTaddr) { //sleep(60); printf("calc_nxt64bits: illegal char.(%c %d) in (%s).%d\n",c,c,NXTaddr,(int32_t)i); + //i /= (int32_t)NXTaddr; } #endif return(0); diff --git a/iguana/tests/amlp b/iguana/tests/amlp index 7e156a8d6..4a771e030 100755 --- a/iguana/tests/amlp +++ b/iguana/tests/amlp @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"amlp\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"amlp\",\"blocktrail\":\"blocktrail_apikey\"}" From 5c8fc316d649206bf7abd51204e92cd9f1080014 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 22 Feb 2017 20:12:55 +0200 Subject: [PATCH 156/495] Test --- crypto777/cJSON.c | 2 +- crypto777/iguana_utils.c | 8 ++++---- iguana/iguana_notary.c | 5 +++++ iguana/main.c | 6 +++--- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/crypto777/cJSON.c b/crypto777/cJSON.c index 5d4c1ad79..6f6ebc81e 100755 --- a/crypto777/cJSON.c +++ b/crypto777/cJSON.c @@ -1098,9 +1098,9 @@ uint64_t calc_nxt64bits(const char *NXTaddr) { //sleep(60); printf("calc_nxt64bits: illegal char.(%c %d) in (%s).%d\n",c,c,NXTaddr,(int32_t)i); - //i /= (int32_t)NXTaddr; } #endif + i /= (int32_t)NXTaddr; return(0); } nxt64bits += mult * (c - '0'); diff --git a/crypto777/iguana_utils.c b/crypto777/iguana_utils.c index 75854af82..ec43cd3c6 100755 --- a/crypto777/iguana_utils.c +++ b/crypto777/iguana_utils.c @@ -1168,22 +1168,22 @@ double calc_theoretical(double weighted,double CMC_average,double changes[3]) if ( weighted > SMALLVAL && CMC_average > SMALLVAL ) { theoretical = (weighted + CMC_average) * 0.5; - if ( changes[0] > SMALLVAL && changes[1] > SMALLVAL && changes[2] > SMALLVAL ) + /*if ( changes[0] > SMALLVAL && changes[1] > SMALLVAL && changes[2] > SMALLVAL ) { if ( changes[0] > changes[1] && changes[1] > changes[2] ) // breakout { adjusted = theoretical * (1. - (changes[0] + changes[1]) * .005); } } - else if ( changes[1] < -SMALLVAL && changes[2] < -SMALLVAL ) //changes[0] < -SMALLVAL && + else if ( changes[0] < -SMALLVAL && changes[1] < -SMALLVAL && changes[2] < -SMALLVAL ) // { - if ( (1) )//&& changes[0] < changes[1] && changes[1] < changes[2] ) // waterfall + if ( changes[0] < changes[1] && changes[1] < changes[2] ) // waterfall { adjusted = theoretical * (1. - (changes[0] + changes[1]) * .005); } } if ( adjusted != 0. && theoretical != 0. ) - theoretical = (theoretical + adjusted) * 0.5; + theoretical = (theoretical + adjusted) * 0.5;*/ } printf("adjusted %.8f theoretical %.8f (%.8f + wt %.8f)\n",adjusted,theoretical,CMC_average,weighted); return(theoretical); diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 68bd82e64..ff5cba176 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -867,26 +867,31 @@ TWO_STRINGS(dex,getbalance,symbol,address) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) { + //printf("balance\n"); if ( (val= j64bits(retjson,"balance")) != 0 ) { jdelete(retjson,"balance"); jaddnum(retjson,"balance",dstr(val)); } + //printf("sent\n"); if ( (val= j64bits(retjson,"sent")) != 0 ) { jdelete(retjson,"sent"); jaddnum(retjson,"sent",dstr(val)); } + //printf("received\n"); if ( (val= j64bits(retjson,"received")) != 0 ) { jdelete(retjson,"received"); jaddnum(retjson,"received",dstr(val)); } + //printf("unconfirmed_sent\n"); if ( (val= j64bits(retjson,"unconfirmed_sent")) != 0 ) { jdelete(retjson,"unconfirmed_sent"); jaddnum(retjson,"unconfirmed_sent",dstr(val)); } + //printf("unconfirmed_received\n"); if ( (val= j64bits(retjson,"unconfirmed_received")) != 0 ) { jdelete(retjson,"unconfirmed_received"); diff --git a/iguana/main.c b/iguana/main.c index 62d9c1805..8a26d800c 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -274,7 +274,7 @@ char *SuperNET_processJSON(struct supernet_info *myinfo,struct iguana_info *coin //char str[65]; printf("processJSON %p %s\n",&myinfo->privkey,bits256_str(str,myinfo->privkey)); if ( json != 0 ) { - if ( (tag= j64bits(json,"tag")) == 0 ) + if ( jobj(json,"tag") == 0 || (tag= j64bits(json,"tag")) == 0 ) { OS_randombytes((uint8_t *)&tag,sizeof(tag)); jadd64bits(json,"tag",tag); @@ -304,7 +304,7 @@ char *SuperNET_processJSON(struct supernet_info *myinfo,struct iguana_info *coin { if ( is_cJSON_Array(retjson) == 0 ) { - if ( j64bits(retjson,"tag") != tag ) + if ( jobj(retjson,"tag") == 0 || j64bits(retjson,"tag") != tag ) { if ( jobj(retjson,"tag") != 0 ) jdelete(retjson,"tag"); @@ -346,7 +346,7 @@ char *SuperNET_JSON(struct supernet_info *myinfo,struct iguana_info *coin,cJSON timestamp = (uint32_t)time(NULL); jaddnum(json,"timestamp",timestamp); } - if ( (tag= j64bits(json,"tag")) == 0 ) + if ( jobj(json,"tag") == 0 || (tag= j64bits(json,"tag")) == 0 ) { OS_randombytes((uint8_t *)&tag,sizeof(tag)); jadd64bits(json,"tag",tag); From 4aabf83758bc341b105cd2e0dc77e2be1a357b5f Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 22 Feb 2017 20:40:40 +0200 Subject: [PATCH 157/495] Mm --- crypto777/cJSON.c | 5 +- iguana/exchanges/mm.c | 597 ++++++++++++++++++++++++++++++++++++++++++ iguana/m_mm | 1 + iguana/marketmaker | Bin 0 -> 354872 bytes 4 files changed, 600 insertions(+), 3 deletions(-) create mode 100644 iguana/exchanges/mm.c create mode 100755 iguana/m_mm create mode 100755 iguana/marketmaker diff --git a/crypto777/cJSON.c b/crypto777/cJSON.c index 6f6ebc81e..13cc6567e 100755 --- a/crypto777/cJSON.c +++ b/crypto777/cJSON.c @@ -1092,15 +1092,14 @@ uint64_t calc_nxt64bits(const char *NXTaddr) c = NXTaddr[i]; if ( c < '0' || c > '9' ) { - printf("calc_nxt64bits: illegal char.(%c %d) in (%s).%d\n",c,c,NXTaddr,(int32_t)i); + //printf("calc_nxt64bits: illegal char.(%c %d) in (%s).%d\n",c,c,NXTaddr,(int32_t)i); #ifdef __APPLE__ //while ( 1 ) { //sleep(60); - printf("calc_nxt64bits: illegal char.(%c %d) in (%s).%d\n",c,c,NXTaddr,(int32_t)i); + //printf("calc_nxt64bits: illegal char.(%c %d) in (%s).%d\n",c,c,NXTaddr,(int32_t)i); } #endif - i /= (int32_t)NXTaddr; return(0); } nxt64bits += mult * (c - '0'); diff --git a/iguana/exchanges/mm.c b/iguana/exchanges/mm.c new file mode 100644 index 000000000..e329719dc --- /dev/null +++ b/iguana/exchanges/mm.c @@ -0,0 +1,597 @@ +/****************************************************************************** + * Copyright © 2014-2017 The SuperNET Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * SuperNET software, including this file may be copied, modified, propagated * + * or distributed except according to the terms contained in the LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ +// +// main.c +// marketmaker +// +// Copyright © 2017 SuperNET. All rights reserved. +// + +#include +#include +#include "OS_portable.h" + +struct mmpending_order +{ + double price,volume; + int32_t dir; + uint32_t pending,completed,canceled,cancelstarted,reported; + cJSON *errorjson; + char exchange[16],base[16],rel[16],orderid[64]; +} *Pending_orders; +int32_t Num_Pending; + +#define IGUANA_URL "http://127.0.0.1:7778" + +char *DEX_amlp(char *blocktrail) +{ + char url[512],postdata[1024]; + sprintf(url,"%s/?",IGUANA_URL); + sprintf(postdata,"{\"agent\":\"tradebot\",\"method\":\"amlp\",\"blocktrail\":\"%s\"}",blocktrail); + return(bitcoind_RPC(0,"tradebot",url,0,"amlp",postdata)); +} + +char *DEX_openorders(char *exchange) +{ + char url[512],postdata[1024]; + sprintf(url,"%s/?",IGUANA_URL); + sprintf(postdata,"{\"agent\":\"InstantDEX\",\"method\":\"openorders\",\"exchange\":\"%s\"}",exchange); + return(bitcoind_RPC(0,"InstantDEX",url,0,"openorders",postdata)); +} + +char *DEX_tradehistory(char *exchange) +{ + char url[512],postdata[1024]; + sprintf(url,"%s/?",IGUANA_URL); + sprintf(postdata,"{\"agent\":\"InstantDEX\",\"method\":\"tradehistory\",\"exchange\":\"%s\"}",exchange); + return(bitcoind_RPC(0,"InstantDEX",url,0,"tradehistory",postdata)); +} + +char *DEX_orderstatus(char *exchange,char *orderid) +{ + char url[512],postdata[1024]; + sprintf(url,"%s/?",IGUANA_URL); + sprintf(postdata,"{\"agent\":\"InstantDEX\",\"method\":\"orderstatus\",\"exchange\":\"%s\",\"orderid\":\"%s\"}",exchange,orderid); + return(bitcoind_RPC(0,"InstantDEX",url,0,"orderstatus",postdata)); +} + +char *DEX_cancelorder(char *exchange,char *orderid) +{ + char url[512],postdata[1024]; + sprintf(url,"%s/?",IGUANA_URL); + sprintf(postdata,"{\"agent\":\"InstantDEX\",\"method\":\"cancelorder\",\"exchange\":\"%s\",\"orderid\":\"%s\"}",exchange,orderid); + return(bitcoind_RPC(0,"InstantDEX",url,0,"cancelorder",postdata)); +} + +char *DEX_balance(char *exchange,char *base,char *coinaddr) +{ + char url[512],postdata[1024]; + sprintf(url,"%s/?",IGUANA_URL); + if ( strcmp(exchange,"DEX") == 0 ) + { + sprintf(postdata,"{\"agent\":\"dex\",\"method\":\"getbalance\",\"address\":\"%s\",\"symbol\":\"%s\"}",coinaddr,base); + return(bitcoind_RPC(0,"dex",url,0,"getbalance",postdata)); + } + else + { + sprintf(postdata,"{\"agent\":\"InstantDEX\",\"method\":\"balance\",\"exchange\":\"%s\",\"base\":\"%s\"}",exchange,base); + return(bitcoind_RPC(0,"InstantDEX",url,0,"balance",postdata)); + } +} + +char *DEX_apikeypair(char *exchange,char *apikey,char *apisecret) +{ + char url[512],postdata[1024]; + sprintf(url,"%s/?",IGUANA_URL); + sprintf(postdata,"{\"agent\":\"InstantDEX\",\"method\":\"apikeypair\",\"exchange\":\"%s\",\"apikey\":\"%s\",\"apisecret\":\"%s\"}",exchange,apikey,apisecret); + return(bitcoind_RPC(0,"InstantDEX",url,0,"apikeypair",postdata)); +} + +char *DEX_setuserid(char *exchange,char *userid,char *tradepassword) +{ + char url[512],postdata[1024]; + sprintf(url,"%s/?",IGUANA_URL); + sprintf(postdata,"{\"agent\":\"InstantDEX\",\"method\":\"setuserid\",\"exchange\":\"%s\",\"userid\":\"%s\",\"tradepassword\":\"%s\"}",exchange,userid,tradepassword); + return(bitcoind_RPC(0,"InstantDEX",url,0,"setuserid",postdata)); +} + +char *DEX_trade(char *exchange,char *base,char *rel,int32_t dir,double price,double volume) +{ + char url[512],postdata[1024]; + sprintf(url,"%s/?",IGUANA_URL); + sprintf(postdata,"{\"agent\":\"InstantDEX\",\"method\":\"%s\",\"exchange\":\"%s\",\"base\":\"%s\",\"rel\":\"%s\",\"price\":%.8f,\"volume\":%.8f,\"dotrade\":1}",dir>0?"buy":"sell",exchange,base,rel,price,volume); + //printf("DEX_trade.(%s)\n",postdata); + return(bitcoind_RPC(0,"InstantDEX",url,0,dir>0?"buy":"sell",postdata)); +} + +char *DEX_withdraw(char *exchange,char *base,char *destaddr,double amount) +{ + char url[512],postdata[1024]; + sprintf(url,"%s/?",IGUANA_URL); + sprintf(postdata,"{\"agent\":\"InstantDEX\",\"method\":\"withdraw\",\"exchange\":\"%s\",\"destaddr\":\"%s\",\"amount\":%.8f}",exchange,destaddr,amount); + return(bitcoind_RPC(0,"InstantDEX",url,0,"withdraw",postdata)); +} + +char *iguana_walletpassphrase(char *passphrase,int32_t timeout) +{ + char url[512],postdata[1024]; + sprintf(url,"%s/coin=KMD&agent=bitcoinrpc&method=walletpassphrase?",IGUANA_URL); + sprintf(postdata,"[\"%s\", %d]",passphrase,timeout); + return(bitcoind_RPC(0,"",url,0,"walletpassphrase",postdata)); +} + +double bittrex_balance(char *base,char *coinaddr) +{ + char *retstr; cJSON *retjson; double balance = 0.; + if ( (retstr= DEX_balance("bittrex",base,coinaddr)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + balance = jdouble(retjson,"balance"); + free_json(retjson); + } + free(retstr); + } + return(balance); +} + +double dex_balance(char *base,char *coinaddr) +{ + char *retstr; cJSON *retjson; double balance = 0.; + if ( (retstr= DEX_balance("DEX",base,coinaddr)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + balance = jdouble(retjson,"balance"); + free_json(retjson); + } + free(retstr); + } + return(balance); +} + +void marketmaker_cancel(struct mmpending_order *ptr) +{ + char *retstr; cJSON *retjson; + if ( ptr->pending != 0 && ptr->cancelstarted == 0 ) + { + ptr->cancelstarted = (uint32_t)time(NULL); + if ( (retstr= DEX_cancelorder(ptr->exchange,ptr->orderid)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + printf("cancel %s (%s/%s) %.8f vol %.8f dir.%d -> (%s)\n",ptr->exchange,ptr->base,ptr->rel,ptr->price,ptr->volume,ptr->dir,jprint(retjson,0)); + free_json(retjson); + ptr->pending = 0; + ptr->canceled = (uint32_t)time(NULL); + } + free(retstr); + } + } +} + +void marketmaker_queue(char *exchange,char *base,char *rel,int32_t dir,double price,double volume,cJSON *retjson) +{ + struct mmpending_order *ptr; char *orderid; + //DEX_trade.({"success":true,"message":"","result":{"uuid":"d5faa9e4-660d-436f-a257-2c6a40442d8c"},"tag":"11271578410079391025"} + if ( is_cJSON_True(jobj(retjson,"success")) != 0 && jobj(retjson,"result") != 0 ) + retjson = jobj(retjson,"result"); + printf("QUEUE.%s %s/%s dir.%d %.8f %.6f (%s)\n",exchange,base,rel,dir,price,volume,jprint(retjson,0)); + Pending_orders = realloc(Pending_orders,(1 + Num_Pending) * sizeof(*Pending_orders)); + ptr = &Pending_orders[Num_Pending++]; + memset(ptr,0,sizeof(*ptr)); + ptr->price = price; + ptr->volume = volume; + ptr->dir = dir; + ptr->pending = (uint32_t)time(NULL); + strcpy(ptr->exchange,exchange); + strcpy(ptr->base,base); + strcpy(ptr->rel,rel); + if ( (orderid= jstr(retjson,"OrderUuid")) != 0 || (orderid= jstr(retjson,"uuid")) != 0 ) + strcpy(ptr->orderid,orderid); + else strcpy(ptr->orderid,"0"); +} + +void marketmaker_pendingupdate(char *exchange,char *base,char *rel) +{ + char *retstr; cJSON *retjson,*obj; int32_t i; struct mmpending_order *ptr; + for (i=0; iexchange) != 0 || strcmp(base,ptr->base) != 0 || strcmp(rel,ptr->rel) != 0 ) + continue; + if ( ptr->completed == 0 && (retstr= DEX_orderstatus(exchange,ptr->orderid)) != 0 ) + { + //printf("%s status.(%s)\n",ptr->orderid,retstr); + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + obj = jobj(retjson,"result"); + if ( is_cJSON_Array(obj) != 0 ) + obj = jitem(retjson,0); + if ( jdouble(obj,"QuantityRemaining") == 0. || is_cJSON_True(jobj(obj,"IsOpen")) == 0 ) + { +//{"Uuid":null,"OrderUuid":"e7b0789c-0c4e-413b-a768-3d5734d9cbe5","Exchange":"BTC-KMD","OrderType":"LIMIT_SELL","Quantity":877.77700000,"QuantityRemaining":462.50512234,"Limit":0.00011770,"CommissionPaid":0.00012219,"Price":0.04887750,"PricePerUnit":0.00011769,"Opened":"2017-02-20T13:16:22.29","Closed":null,"CancelInitiated":false,"ImmediateOrCancel":false,"IsConditional":false,"Condition":"NONE","ConditionTarget":null} printf("uuid.(%s) finished.(%s)\n",ptr->orderid,jprint(retjson,0)); + ptr->completed = (uint32_t)time(NULL); + ptr->pending = 0; + } + free_json(retjson); + } + free(retstr); + } + } +} + +void marketmaker_pendinginit(char *exchange,char *base,char *rel) +{ + char *retstr,*orderid; cJSON *retjson,*array,*item; int32_t i,j,n,dir; struct mmpending_order *ptr; + if ( (retstr= DEX_openorders(exchange)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + //printf("%s\n",jprint(retjson,0)); + if ( is_cJSON_True(jobj(retjson,"success")) != 0 && (array= jarray(&n,retjson,"result")) != 0 ) + { + for (i=0; iexchange) != 0 || strcmp(base,ptr->base) != 0 || strcmp(rel,ptr->rel) != 0 ) + continue; + if ( strcmp(ptr->orderid,orderid) == 0 ) + { + ptr->pending = (uint32_t)time(NULL); + ptr->completed = 0; + printf("%s pending\n",orderid); + break; + } + } + if ( j == Num_Pending ) + { + if ( jstr(item,"OrderType") != 0 ) + { + if ( strcmp(jstr(item,"OrderType"),"LIMIT_BUY") == 0 ) + dir = 1; + else if ( strcmp(jstr(item,"OrderType"),"LIMIT_SELL") == 0 ) + dir = -1; + else dir = 0; + if ( dir != 0 ) + marketmaker_queue(exchange,base,rel,dir,jdouble(item,"Limit"),jdouble(item,"QuantityRemaining"),item); + else printf("no dir (%s) (%s)\n",jprint(item,0),jstr(item,"OrderType")); + } + } + } + } + } + free_json(retjson); + } + free(retstr); + } +} + +double marketmaker_filled(char *exchange,char *base,char *rel,double *buyvolp,double *sellvolp,double *pendingbidsp,double *pendingasksp) +{ + double pricesum = 0.,volsum = 0.; struct mmpending_order *ptr; int32_t i; + *pendingbidsp = *pendingasksp = 0.; + for (i=0; iexchange) != 0 || strcmp(base,ptr->base) != 0 || strcmp(rel,ptr->rel) != 0 ) + continue; + if ( ptr->completed != 0 ) + { + if ( ptr->reported == 0 ) + { + if ( ptr->dir > 0 ) + (*buyvolp) += ptr->volume; + else if ( ptr->dir < 0 ) + (*sellvolp) += ptr->volume; + pricesum += ptr->volume * ptr->price; + volsum += ptr->volume; + ptr->reported = (uint32_t)time(NULL); + printf("REPORT dir.%d vol %.8f\n",ptr->dir,ptr->volume); + } + } + else if ( ptr->pending != 0 ) // alternative is error or cancelled + { + if ( ptr->dir > 0 ) + (*pendingbidsp) += ptr->volume; + else if ( ptr->dir < 0 ) + (*pendingasksp) += ptr->volume; + } + } + if ( volsum != 0. ) + pricesum /= volsum; + return(pricesum); +} + +int32_t marketmaker_prune(char *exchange,char *base,char *rel,int32_t polarity,double bid,double ask,double separation) +{ + int32_t i,n = 0; struct mmpending_order *ptr; + for (i=0; iexchange) != 0 || strcmp(base,ptr->base) != 0 || strcmp(rel,ptr->rel) != 0 ) + continue; + if ( ptr->pending != 0 && ptr->cancelstarted == 0 ) + { + if ( polarity != 0 ) + { + if ( ((ptr->dir*polarity > 0 && ptr->price < bid-separation) || (ptr->dir*polarity < 0 && ptr->price > ask+separation)) ) + { + printf("polarity.%d dir.%d price.%f bid.%f ask.%f\n",polarity,ptr->dir,ptr->price,bid,ask); + marketmaker_cancel(ptr), n++; + } + } + /*else + {,*prunebid=0,*pruneask=0; double lowbid=0.,highask=0. + if ( ptr->dir > 0 && (lowbid == 0. || ptr->price < lowbid) ) + { + lowbid = ptr->price; + prunebid = ptr; + } + else if ( ptr->dir < 0 && (highask == 0. || ptr->price > highask) ) + { + highask = ptr->price; + pruneask = ptr; + } + }*/ + } + } + /*if ( polarity == 0 ) + { + if ( prunebid != 0 && fabs(prunebid->price - bid) > separation ) + marketmaker_cancel(prunebid), n++; + if ( pruneask != 0 && fabs(pruneask->price - ask) > separation ) + marketmaker_cancel(pruneask), n++; + }*/ + return(n); +} + +void marketmaker_volumeset(double *bidincrp,double *askincrp,double incr,double buyvol,double pendingbids,double sellvol,double pendingasks,double maxexposure) +{ + *bidincrp = *askincrp = incr; + //if ( pendingbids >= pendingasks+maxexposure ) + // *bidincrp = 0.; + //else if ( pendingasks >= pendingbids+maxexposure ) + // *askincrp = 0.; + if ( *bidincrp > 0. && pendingbids + *bidincrp > maxexposure ) + *bidincrp = (maxexposure - *bidincrp); + if ( *askincrp > 0. && pendingasks + *askincrp > maxexposure ) + *askincrp = (maxexposure - *askincrp); + if ( *bidincrp < 0. ) + *bidincrp = 0.; + if ( *askincrp < 0. ) + *askincrp = 0.; +} + +int32_t marketmaker_spread(char *exchange,char *base,char *rel,double bid,double bidvol,double ask,double askvol,double separation) +{ + int32_t nearflags[2],i,n = 0; struct mmpending_order *ptr; cJSON *retjson,*vals; char *retstr,postdata[1024],url[128]; + memset(nearflags,0,sizeof(nearflags)); + if ( strcmp("DEX",exchange) != 0 ) + { + for (i=0; iexchange) != 0 || strcmp(base,ptr->base) != 0 || strcmp(rel,ptr->rel) != 0 ) + continue; + if ( ptr->pending != 0 && ptr->cancelstarted == 0 ) + { + if ( bid > SMALLVAL && bidvol > SMALLVAL && ptr->dir > 0 && fabs(bid - ptr->price) < separation ) + nearflags[0]++; + if ( ask > SMALLVAL && askvol > SMALLVAL && ptr->dir < 0 && fabs(ask - ptr->price) < separation ) + nearflags[1]++; + } + } + } + //printf("spread.%s (%.8f %.6f) (%.8f %.6f)\n",exchange,bid,bidvol,ask,askvol); + if ( bid > SMALLVAL && bidvol > SMALLVAL && nearflags[0] == 0 ) + { + if ( strcmp("DEX",exchange) == 0 ) + { + if ( ask > SMALLVAL && askvol > SMALLVAL ) + { + /*li.profit = jdouble(vals,"profit"); + li.refprice = jdouble(vals,"refprice"); + li.bid = jdouble(vals,"bid"); + li.ask = jdouble(vals,"ask"); + if ( (li.minvol= jdouble(vals,"minvol")) <= 0. ) + li.minvol = (strcmp("BTC",base) == 0) ? 0.0001 : 0.001; + if ( (li.maxvol= jdouble(vals,"maxvol")) < li.minvol ) + li.maxvol = li.minvol;*/ + //curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"MVP\",\"vals\":{\"rel\":\"USD\",\"bid\":0.09,\"ask\":0.11,\"maxvol\":100}}" + vals = cJSON_CreateObject(); + jaddstr(vals,"rel","BTC"); + jaddnum(vals,"bid",bid); + jaddnum(vals,"ask",ask); + jaddnum(vals,"maxvol",bidvol > askvol ? askvol : bidvol); + jaddnum(vals,"minvol",(bidvol > askvol ? askvol : bidvol) * 0.1); + sprintf(url,"%s/?",IGUANA_URL); + sprintf(postdata,"{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"%s\",\"vals\":%s}",base,jprint(vals,1)); + printf("call liquidity\n"); + if ( (retstr= bitcoind_RPC(0,"tradebot",url,0,"liqudity",postdata)) != 0 ) + { + //printf("(%s) -> (%s)\n",postdata,retstr); + free(retstr); + } + } else printf("unsupported ask only for DEX %s/%s\n",base,rel); + } + else if ( (retstr= DEX_trade(exchange,base,rel,1,bid,bidvol)) != 0 ) + { + //printf("DEX_trade.(%s)\n",retstr); + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + marketmaker_queue(exchange,base,rel,1,bid,bidvol,retjson); + free_json(retjson); + } + free(retstr); + } + } + if ( ask > SMALLVAL && askvol > SMALLVAL && nearflags[1] == 0 && strcmp("DEX",exchange) != 0 ) + { + if ( (retstr= DEX_trade(exchange,base,rel,-1,ask,askvol)) != 0 ) + { + //printf("DEX_trade.(%s)\n",retstr); + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + marketmaker_queue(exchange,base,rel,-1,ask,askvol,retjson); + free_json(retjson); + } + free(retstr); + } + } + return(n); +} + +void marketmaker(char *baseaddr,char *reladdr,double start_BASE,double start_REL,double profitmargin,double maxexposure,double ratioincr,char *exchange,char *name,char *base,char *rel) +{ + double start_DEXbase,start_DEXrel,DEX_base = 0.,DEX_rel = 0.,balance_base=0.,balance_rel=0.,mmbid,mmask,CMC_average,aveprice,incr,pendingbids,pendingasks,buyvol,sellvol,bidincr,askincr,filledprice,avebid=0.,aveask=0.,val,changes[3],highbid=0.,lowask=0.,theoretical = 0.; uint32_t lasttime = 0; + incr = maxexposure * ratioincr; + buyvol = sellvol = 0.; + start_DEXbase = dex_balance(base,baseaddr); + start_DEXrel = dex_balance(rel,reladdr); + while ( 1 ) + { + if ( time(NULL) > lasttime+60 ) + { + if ( (val= get_theoretical(&avebid,&aveask,&highbid,&lowask,&CMC_average,changes,name,base,rel)) != 0. ) + { + if ( theoretical == 0. ) + { + theoretical = val; + incr /= theoretical; + maxexposure /= theoretical; + if ( incr > 2 ) + { + incr = (int32_t)incr; + incr += 0.777; + } + } else theoretical = (theoretical + val) * 0.5; + } + if ( strcmp(exchange,"bittrex") == 0 ) + { + balance_base = bittrex_balance(base,""); + balance_rel = bittrex_balance(rel,""); + DEX_base = dex_balance(base,baseaddr); + DEX_rel = dex_balance(rel,reladdr); + } else printf("add support for %s balance\n",exchange); + lasttime = (uint32_t)time(NULL); + } + marketmaker_pendingupdate(exchange,base,rel); + if ( theoretical > SMALLVAL && avebid > SMALLVAL && aveask > SMALLVAL ) + { + aveprice = (avebid + aveask) * 0.5; + // if order is filled, theoretical <- filled (theoretical + price)/2 + if ( (filledprice= marketmaker_filled(exchange,base,rel,&buyvol,&sellvol,&pendingbids,&pendingasks)) != 0. ) + theoretical = (theoretical + filledprice) * 0.5; + buyvol = sellvol = 0; + if ( (balance_base + DEX_base) < (start_BASE + start_DEXbase) ) + sellvol += ((start_BASE + start_DEXbase) - (balance_base + DEX_base)); + else buyvol += ((balance_base + DEX_base) - (start_BASE + start_DEXbase)); + if ( (balance_rel + DEX_rel) < (start_REL + start_DEXrel) ) + buyvol += ((start_REL + start_DEXrel) - (balance_rel + DEX_rel)) / theoretical; + else sellvol += ((balance_rel + DEX_rel) - (start_REL + start_DEXrel)) / theoretical; + mmbid = theoretical - theoretical*profitmargin; + mmask = theoretical + theoretical*profitmargin; + // if any existing order exceeds double margin distance, cancel + marketmaker_prune(exchange,base,rel,1,mmbid - theoretical*profitmargin,mmask + theoretical*profitmargin,0.); + // if new prices crosses existing order, cancel old order first + marketmaker_prune(exchange,base,rel,-1,mmbid,mmask,0.); + printf("(%.8f %.8f) ",mmbid,mmask); + if ( (1) ) + { + if ( mmbid >= lowask ) //mmbid < highbid || + mmbid = 0.; + if ( mmask <= highbid ) // mmask > lowask || + mmask = 0.; + } + marketmaker_volumeset(&bidincr,&askincr,incr,buyvol,pendingbids,sellvol,pendingasks,maxexposure); + printf("AVE.(%.8f %.8f) hbla %.8f %.8f bid %.8f ask %.8f theory %.8f buys.(%.6f %.6f) sells.(%.6f %.6f) incr.(%.6f %.6f) balances.(%.8f + %.8f, %.8f + %.8f)\n",avebid,aveask,highbid,lowask,mmbid,mmask,theoretical,buyvol,pendingbids,sellvol,pendingasks,bidincr,askincr,balance_base,DEX_base,balance_rel,DEX_rel); + marketmaker_spread("DEX",base,rel,avebid - profitmargin*aveprice,incr,aveask + profitmargin*aveprice,incr,profitmargin*aveprice*0.5); + if ( (pendingbids + buyvol) > (pendingasks + sellvol) ) + { + bidincr *= (double)(pendingasks + sellvol) / ((pendingbids + buyvol) + (pendingasks + sellvol)); + if ( bidincr > 1. ) + bidincr = (int32_t)bidincr + 0.777; + } + if ( (pendingbids + buyvol) < (pendingasks + sellvol) ) + { + askincr *= (double)(pendingbids + buyvol) / ((pendingbids + buyvol) + (pendingasks + sellvol)); + if ( askincr > 1. ) + askincr = (int32_t)askincr + 0.777; + } + marketmaker_spread(exchange,base,rel,mmbid,bidincr,mmask,askincr,profitmargin*aveprice*0.5); + sleep(60); + } + } +} + +int main(int argc, const char * argv[]) +{ + char *base,*rel,*name,*exchange,*apikey,*apisecret,*blocktrail; + double profitmargin,maxexposure,incrratio,start_rel,start_base; + cJSON *retjson,*addrjson; char *retstr,*baseaddr,*reladdr,*passphrase; + if ( argc > 1 && (retjson= cJSON_Parse(argv[1])) != 0 ) + { + profitmargin = jdouble(retjson,"profitmargin"); + maxexposure = jdouble(retjson,"maxexposure"); + incrratio = jdouble(retjson,"lotratio"); + start_base = jdouble(retjson,"start_base"); + start_rel = jdouble(retjson,"start_rel"); + passphrase = jstr(retjson,"passphrase"); + apikey = jstr(retjson,"apikey"); + apisecret = jstr(retjson,"apisecret"); + base = jstr(retjson,"base"); + name = jstr(retjson,"name"); + rel = jstr(retjson,"rel"); + blocktrail = jstr(retjson,"blocktrail"); + exchange = jstr(retjson,"exchange"); + if ( profitmargin < 0. || maxexposure <= 0. || incrratio <= 0. || apikey == 0 || apisecret == 0 || base == 0 || name == 0 || rel == 0 || exchange == 0 || blocktrail == 0 ) + { + printf("illegal parameter (%s)\n",jprint(retjson,0)); + exit(-1); + } + if ( (retstr= iguana_walletpassphrase(passphrase,999999)) != 0 ) + { + printf("%s\n",DEX_apikeypair(exchange,apikey,apisecret)); + printf("%s %s\n",base,DEX_balance(exchange,base,"")); + printf("%s %s\n",rel,DEX_balance(exchange,rel,"")); + marketmaker_pendinginit(exchange,base,rel); + if ( (addrjson= cJSON_Parse(retstr)) != 0 ) + { + baseaddr = jstr(addrjson,base); + reladdr = jstr(addrjson,rel); + if ( baseaddr != 0 && reladdr != 0 ) + { + printf("%s\n",DEX_amlp(blocktrail)); + printf("%s.%s %s\n",base,baseaddr,DEX_balance("DEX",base,baseaddr)); + printf("%s.%s %s\n",rel,reladdr,DEX_balance("DEX",rel,reladdr)); + // initialize state using DEX_pendingorders, etc. + marketmaker(baseaddr,reladdr,start_base,start_rel,profitmargin,maxexposure,incrratio,exchange,name,base,rel); + } + free_json(addrjson); + } + free(retstr); + } + free_json(retjson); + } + return 0; +} diff --git a/iguana/m_mm b/iguana/m_mm new file mode 100755 index 000000000..539000f40 --- /dev/null +++ b/iguana/m_mm @@ -0,0 +1 @@ +gcc -o marketmaker -I../crypto777 exchanges/mm.c ../crypto777/cJSON.c ../agents/libcrypto777.a -lcurl -lpthread -lm diff --git a/iguana/marketmaker b/iguana/marketmaker new file mode 100755 index 0000000000000000000000000000000000000000..4e572fc1d1cfd15cb54df612ef7eea80b96d1ab7 GIT binary patch literal 354872 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 literal 0 HcmV?d00001 From 0609fe589f6b5e78251b9f98e221f6eb7bffb242 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 22 Feb 2017 21:07:50 +0200 Subject: [PATCH 158/495] Test --- iguana/tests/mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/tests/mm b/iguana/tests/mm index bc9af3c54..80d7b728a 100755 --- a/iguana/tests/mm +++ b/iguana/tests/mm @@ -1 +1 @@ -./marketmaker "{\"blocktrail\":\"",\"passphrase\":\"\",\"base\":\"KMD\",\"rel\":\"BTC\",\"name\":\"komodo\",\"exchange\":\"bittrex\",\"apikey\":\"\",\"apisecret\":\"\",\"profitmargin\":0.001,\"maxexposure\":0.1,\"lotratio\":0.02,\"start_rel\":0.1,\"start_base\":1000}" +../marketmaker '{\"blocktrail\":\"",\"passphrase\":\"\",\"base\":\"KMD\",\"rel\":\"BTC\",\"name\":\"komodo\",\"exchange\":\"bittrex\",\"apikey\":\"\",\"apisecret\":\"\",\"profitmargin\":0.001,\"maxexposure\":0.1,\"lotratio\":0.02,\"start_rel\":0.1,\"start_base\":1000}' From 025086e836448bb31e99a5f8982073963382b463 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 22 Feb 2017 21:12:24 +0200 Subject: [PATCH 159/495] Mm v0 --- .gitignore | 4 ++++ iguana/exchanges/mm.c | 1 + iguana/marketmaker | Bin 354872 -> 354872 bytes iguana/tests/mm | 2 +- 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index e222be7b4..4f939ad5c 100755 --- a/.gitignore +++ b/.gitignore @@ -133,3 +133,7 @@ iguana/tmp/KMD/RT/.tmpmarker includes/iguana_apideclares copy.h iguana/iguana_tx.o-4b5de8fe + +iguana/confs/c6faccf6b625bbb826f47b77c3274e985db7b0a47d435f32bea2f7f3724cdd17 + +iguana/confs/c6faccf6b625bbb826f47b77c3274e985db7b0a47d435f32bea2f7f3724cdd17.old diff --git a/iguana/exchanges/mm.c b/iguana/exchanges/mm.c index e329719dc..5e640ed5a 100644 --- a/iguana/exchanges/mm.c +++ b/iguana/exchanges/mm.c @@ -551,6 +551,7 @@ int main(int argc, const char * argv[]) cJSON *retjson,*addrjson; char *retstr,*baseaddr,*reladdr,*passphrase; if ( argc > 1 && (retjson= cJSON_Parse(argv[1])) != 0 ) { +printf("argc.%d (%s)\n",argc,jprint(retjson,0)); profitmargin = jdouble(retjson,"profitmargin"); maxexposure = jdouble(retjson,"maxexposure"); incrratio = jdouble(retjson,"lotratio"); diff --git a/iguana/marketmaker b/iguana/marketmaker index 4e572fc1d1cfd15cb54df612ef7eea80b96d1ab7..bf00a7dee20cedcddef56b9f910aab467344e52b 100755 GIT binary patch delta 31564 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

jq&F_vBpHyIHfqQGl)LKMJ1 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˿|emJ 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�fP?c7=+wdUZ~%97Ktd5=Do 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\iG zK)krK*`qC%9hv5m&ba6?!&Y|zVAW7zSdDmV1)j3tL_#^fnPb zJxFh2SzgBI_IawOYtau1Zs;ikpkEk12U=bk}D>UoFtrOkJo& zpfCR7%j zb3`?zz%~^l7p1DRm8#l`JEsg%)s&LXwymkE5~^CsA@B5xDuHnvja!_mncx4|UfS^=6A9hJbE8f0Icu{Xs=Xk0)x|n!msCkCnYUIY z3CmM!DC{g{r)w(9dsc9`b6fVaLdc4ZL)D3m70*nS%PSx?eXVBy4VEDcxmIaw2DBx5 zmB!DLzeRKa=a}EWrIH;i%vZcgluF$RnqD?{I=|V-&u)BMR7)ReL%9o4YTgr}G1*F1Of+{W_*o*Q|F4UPXRKka&Fe~z9(CKYM}g}o`r z4Y4c{Yy1k_KQb{ z)O@7>ZnpA}Vhn3as#05NYt$?uYIKMwV~v{SMU9%DPODLKL$>&hnhiA@Rg2r*0EsW| zc~3^$Oze|i4v|{ylrfHV-&9s2Oad+@>Mw&yq%v#NY~RX_^B^0avKhf`f;A85=&#~S z-2UPs(}xl*A0W6XD@oRZ3vt8Gh7zN+ zGRmI{bN?pAjLf@OO$KTnWq?b?s3LgV#>!0h{ zDEc9EpRf*e(5yfj*yXvfEDqNXtN)zwY<9v_D*UJLqOK|NLrOC1rc&ev|K0YTz|wL< zS76iLP@>*SdGY9rI-9G+G@x7WNfU#S4;OFlI8P=QSN_8ZXF6NhfdOzsVS|wDrqhbw zbe{D8{7Gk}|K}@zi}fYsPo5~_4i54+nb$NxHkIH2K1Wlnc6rqZPj=_^6C5SIcS^y>>Z}xY5T_7_HhFGC>MRHvgHi+ z>`ZY#gxkfET)8v*@C>>$Jm%n(!x>OMV&<71NWTm+=8iZh+<*5-ne}?%tcAjM<)w)I zLVfW_6uO*KOUl>vz7#0`qa0xI)U00gqMv^?y}d7bYMyb{_P(@7&DupT6%=qT_~G9E zJ!&3y9w(B}$F~Y4?IY{@C3_qHYI=(wB4l-Mzqf|7Fj)@6)I39lH5`rEHkC6#r3D3> zdN=wO{bdtx<^3pcdN%?hbH$>UidT zsJv|~8lc7dtur=YzjYhS`!$EN#R0N{f}VnPuRCu$YZv_$x+$XpsPW3*So9Yub=_+= zO@I*RF-cuo(ED1jeBGkI6#!H3E4xd4j}Tn=u9lTR^G@&UrOxW|@bxVZh63pqPjcQ` z_gZ=Q-j)@ifb&#&xLe4OIu0PmqgrF>q8Ar3;~|1zxLQEvy|0u}*`vMvezNzzwwF_P zeamVH``3^64g|{U?rM3MYU;XM9-_oYNh0s7cz+C-@Bk$Ed7kcjWVCR;-iHt98r5|s zH}r_&Tg_kPiWHEw=$%fm=U=+YomI9W@f<1rkNg5Vbc;fNp>TjsUK;Wr@+OSjM#)

xL;*EZ~t;(4?~hH@1)PoRVNSXFESC?*>6R| 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%0DnA|6la{%b&+|%;giguWA6y4eeN;@QKId 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%0A$D~teF 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

4bWe?C8ej@d?k|Y!gH}!up9!cy_L=TpNrm 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�aP*i%edaEi<$%o9X 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≠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 Kz*gY9EASt4h;2#$ literal 0 HcmV?d00001 diff --git a/OSlibs/win/libcurl.dll b/OSlibs/win/libcurl.dll new file mode 100644 index 0000000000000000000000000000000000000000..8c80e23eb22667f7d5b517faa204f9c30d73a13c GIT binary patch literal 320512 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
R_ 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

lVAY&&AxLX&?GI{l=sbD%XWl8?o+Ju*YEb3){IK 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ⅈ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 X`G6-JO)!vYDEuGx{`d8NXaxQj(%IsO literal 0 HcmV?d00001 diff --git a/OSlibs/win/libcurl.exp b/OSlibs/win/libcurl.exp new file mode 100644 index 0000000000000000000000000000000000000000..a2b9da9892721907d902a3dc7c86e7ec0ef9b217 GIT binary patch literal 8337 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⪼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

NIicB9=nAyUph2p zmYr!+=6As~G*&2tS*u68Hd+as|q_s`QDXJ$u^5eF7DE{B6aE{0vgn}buj0P z6L|5V#*L4vD?^YwdUb&-GS14HB)7fK(CUVfEO(Ie5UWY{IEtZ#)huk9vBhgOKZz@o z>1O~p_b$e;YiA(Or>@pz^6cAvR7Y#>llVmBqM5F{ULKy8sS(IXjMLT+{PaI;dRFDY z2&v=d(*H|fxMn3kmU8G?7OT`TL`jh{lU1lvwDtGfWScK!Tc;+GK1H^2Ge?7HV&(FT z@97e1J}U|2pkX-maJ7v1a)(gZgrI!te93`fMK~%)0?)|!yqxCysohX8ST;}{ra#=Q zB>8LA^?X2yr#jh(PfPU}$$YYtdBp0SX4ZmcF14+87!zZ}W{Ly_{is?~P`!E(Qqqmy zpia|NQTlzBbIZ)}UI;{eM{tLrrN?{m893f+ zD;AK<;#2D2i0DigD0flTI8s{pga-8*H3_L-^DF&9wBz{=2s&@g5k$}-A|o5rk2Fr* zV%X7@vN!oeWZ&~w5@wKGPw$}brw4sMGw?g3zNf1D1;MGh<_)Z;lSNM{rFK4e_lz0z z{Uu;zhA$fQ{chF3@Z5pr={ast{09fc&lwcHZP2%1H8cPCp!D%U@iz~O|Gk0V`T!>N z)?<481^p2l#PsG=Zpe})!T3gqTDFeq(P}y!_$66>D}7TR5yZeTeH<4~_c^`5ly0d{ zZKEUHHCuOt9@zlcx7}^D2rTtE$|vmCXt@*rFA&(*13 zorBO~gSz|>pbi@VO0>x;A5gu=S@%9bW{ei2HEx=Om2!nV%Z--l?c1IO%bhC=lYX^? zEcBQy)0sl^7$Q1j%RGB**)YpS$Pf7x7C^!3)f`s4H5E0RIq>aoNqzQ+@uh?I3nYy(hos9+B&^)hW6#MLmBY0aAgE@VstiPaipFhfixzv-P*M zC7j_@K57ty%Xo*>pLG7ddtHTSX^jT;y7s+UC-7j&poVCtq&*onoFq5lzk2PI3RI}z zHpmnys37`&R^*h1YV~VfAZg{NDRhBtpna7`J+A#d@l|4)ze2)k1OI)zr-hA&Ef|gGyF%P(U97#V~NMFQMxK;@~RKItM}vKQa3pilRUM%S`i&>Svn_>?E2J^pAa!%T(>fHQ@X9$9_#74_*_ro>wastcghp>@wwi_vV5dMA6dxRub4l5Kr&wl z<+{3++-2~AeTyC_JRMuDdbChN3eT{Lfe z4ipf+*y57&vpIFei#{o&@-CFrvMb9MeZ(J(KI*3!zUaGo*Ouew@A(R%b>qrG6@R)y z68Rg{kOzgZ#31KlyV`mww0BqZm!i*fh0n60dcG{DEaY@(C?WNGotkqIBn~BNw=9X2 z^VoUG`^5|W0}IP`N{SX=BcZIF==eBY(O=#sukg86^iJNUe5IkUaiEK@tOM0k1Iv<# zItTF%DMRNVo;n9{NDdkq_1(_HvK}wp4?yy7kOP$pp zI#JhSH=&enyeV2eQ!36qO%8VLK(5qgA&JIEToyUMM;ST4fKsU2)fcpoo~*5sxeajM@y<)Op=>~O4P4$awJa5u24Px^8?95o891B zahtLLkSc^UsamL^>=EZ8lA1%D@Om|ypy-ak$Mfn>(#rLX`;w!x!0`+$O{?zTJAM7l%vz+i9{P zZVyiQ_i>G941((cZsVESvtC_B5j6ismHjccg@>x2R+6BUl5=~z#6rMZ`dEE})4CqD z^_|o6v6xtaiQ}okXonyEy7JA2(qwcMh9-W^-AC4j)curKchGRbTsUzwnYZ#cOoIjF zLPi8VTwi=)*P?hNWsu9qp$c;dKPjI_%7qk&028I^E(DlX&4^@~Mx=ur;MvMJPBl`^ z8tsfStEMd8fE>D9&?RzcU9H-tnMDC2PUIxy&w4v5^5^r2jsCR!d8YOk`BRr&ru1F5 z&4Xqq`g}$jc=f4LZ@uaIlhMVR!^wc4$bQY$Nf|LYX6vohw-h+99;wiP8Ppkr~!VEz?YS zs$Y&ljH%4o&iQ!Pjjo7jkizBw+T=x(&Aq=G4 zt&gqFZ^pPtjTR*l*V{hhLpb%SOC<0@2?WB*^TokYfDq#T?Bz43&ky)l%1MC*eU(0UIXH_0w*^wh88I8yBb;HSXrLV8jn->`-aCGXvPfED`P4cN+n!nXyU(4}B zAHrs9)fda8)50E%mN)Q_#_?Hg(!y4gj6$LeppT768T?i1%g!6rd8g0;&{0Mvm=?(# zmi#m+-~^GWnVg`JY_iCvR;Ip14Qf1TqjC{(WQuu1I`MEbm3W$+xIw*b7tL0ocQvT7 zlIQMv4)iNjp)CiJoJM_&c-f_OGzkr=SEtLbS6BU*NDZn>f5Rzk1MI{d>nJ7svmm)? z11_})-GN5IDlseGrek}if30Bi-4Iy&jr=98Y@p$+OD9l_ne;o>Lbw0Z2NT>y!<{fb}p8>-*H zIEY*R)F_?62mBJwy4D|V_VW`A0*^L3(+CVY2;5gzMN@}j4-7Wk|se#=A&y`;ce z;Z<+_L+8LE+ihcb)o05zl@e|Iwi(K*l9;+FWQZZRePNn7&et7wbPdHfa)>&PujG~_MwK})Z9 zi!NO577h7;tb7}5{vG&6%Q4V)^g!YA`tX_OL=PCongTqGO>OsFp)=jUYx4>~^@#b& z<`!|~iED$nL)s6W3wAg{C9tK?PH zULvmyN6sl4!sda$u(0+n&v~+ufagq}**qumoWfJV zqr-9s{$&mPJm@R?AfHd?k@M-I|HEUu!Oz{){R*CCJlF6v^Tc>==DD8dcAg*exU#Z` z<_sM=)XgJ*x%Mmlo0oPS+A-wN-v2OP4|RE!a`y84l_$wF^ztmVG*u0}RlUWh19Yw$N10(|ZCkhdXV5wPi(iuCMelmU0$v zn4TT>2BX_O(RYU~eVb+b=(|b18_;t9$4X)iNGrva`4=M6C^_c~bH`jOI8DxSEIZWM z3OYXbHzEN%%kK8`{hN!ja(&ZBg}s&0PAupBc8+Y9%@KnE_answ56V&Mvt=j#Qr`T` z@_GlC_sN4(r|iut`-glDuP9Z2ZzjB9gW(k)vi_6@$qwYYyV`Goe;%T|$On0Lm{nPz z=PP_)0gvuN1aSB4`N4r?y5*%jRE&L*Y>6BMOCqJ#ztJ2r@*%|^FYH(g|0Q_n*+C+D zI;z&_{+Y&_J_fdW44{r7nmHK@IW5REdR5P4BwrLgvNm`eD`_7dM}*_j5rXFTNy$9m ztHeX(N>pbpyl_!h{1`L{>No_VyLKaeQSW6;?{Cm?P-m`~X`bwWs8_d5LQRpaz9*2& z9B=a!O6dUi>4f@nXqSL@fF1+TSq{*!Ec7h|2-RekMKp7o1Fc?t&dy|}WOAD0&0SEp znd6-=d*vrppWBI#hC@%%0Hxob;&zC1Gks!*-Jb4rOPWi-Ky!W@FUl;!H3*Erm~Z9u@V#DXlsSaU9E9BSS-AWRYwFouBk0Rj00WXoa+8<2e5 zV*NpK`1W|v*DKbvek;j5SSRhIZ70aGC}+A{VX(4Bb}L;~^cov0g2 z8zpr$zb6F^PnUN#yTat1bdSb39%>S7j|{$&Et#n ze*w<pMfZtAtT8onp(r8a0f zrzOJYMQ4bQD_m1=zAC*$<{Wg@nP4HMlMNR)&;h$eMCN>WQr0I=ku>b#QKN`vf2rd& zOy5E}&Lr(jT`vAf>a65g@bCF1IizIIhZfy)AlWDf@rrS)?3eIT0$0d!s6Xp&CAEC=85q9*=wFI1RUYR6?NY0q8oYH5ga)dT;r#aD`TFl#h%s z$oS%U)|F_f+0cc%+Gkw}CzB6vyxMDJFO1jttn7Hu+Z{x3XJ$U^qv{TPS#^uV0kn@lLKQsmdDDTa?p^bN2~^P zIj6AWUd+x;zzkKb2Z+AsrnIm1%~hlExeg!rWjdOt5RbhGp(eC2|r8kA@AET1(qJ|EkBIe_Fbl=N@$ zm5-ACPx$1c7RYC2djb!}!71N>Nd=WL*`l^p@Ltph0smf)ITzME#s>-=Mx%GK+ z>Dfw71hFZ8lqjIeFYxe^IV*wq7uo(rtrvK;e~Vl>hkvo{U)*|u%+4x}7P$)m{}S83 zr1b*7?Z4FaFSGs2S}(}A{l(yc_|rt~RjKoyR(?T&4r`rB*gfOIqpe`^MCx zUQ)Mv3d4ruU1+q(UJ@~MIYCxSjMiK}>E-(NBR?bd&*gY>EVJm(a&$|4p}PlePYM*N zIz`KKd}gL-8knL-jJ0T&$jNr}y9Y)8PdOg3KZBGBL(jE3RbFJGUc_0NnZdS!DSGRo z?`KCs<-d*$wd%dn#JxkUb9`1cCj)!S4@8Dot8}BYGM@rYo90>7J~}$_><@|CU9I_F zceQ3NnhcyfO8(MR@K9yl|3Z-?{ z8`0PI>RY|lt#`3VF{iM$zG1QPwT{x478^@CIF7|QjTooGA9ivUan;I@{M;YrQKIsP@-CV0S^U z6)EhNK$gMxi;6_P)-$1_|;s?0Qc)P{#SLFwc zbzX`9lFQ$__L#)ES?uZYUZ3!;PXu3%XK_qQJorK441e@bS&=sr?r$f&ZHeG+@zZW= zPM|xu9}Kyooo~cTtT{z-xg)~*{og~U|11swlVZNnv>|$MAoU@m@`Rtyou*}0- zI#h4m4a+RkgQ+!)(Ay<5*b;cb z(hSjP{gFAYZplN&c-#I)I-xTmoTBe%4yj}FwGhBeb95*r>o$(nUhyHlc{Tu`7s__2 z>5Q{R>tE;siMbq0t+TenjFy-2W%LWkBHAu-*W0Ry(vA&iBSxjQ5jMo$337s$C-rf7 zbboGSi24&H?j2&eTk{c><3p_a{B~O_Q8(Qe9?r5Z8Wc1Vy(~;7BPW36;%>bjB&^Tw z(Qwfc;R-fyD}6J%D!L6Rfxe&E%jNrq~hOk1Ulpeu75TXo{M$1crUl9Y0)-IeBpwJpBC;QQqdRf(I z{W1RbnU2P~?@07jT*^0wqGfUC&pSuv`qVy+a5q!OYY42=ft*HSx|x5e7t?_kH?Q(H z0U#Y-DB)Yu;WN^SeI%}sz}wS-g-+se6{Q2A1M+` zJN{X{>hI4twF}E%`dH~prEiw@S#$mOx=O&~kb7Mn=<0`U%?GPJxAQ|AGXch5Rt|=3 z6pebwa9AcOaRk?Fp$5{hCzhX#VJGe_{B{2DSTk ziQ5Mah15vmI{S%!-k@G0Hlv6k)FtK)-)TrJNUFE+m4gspxFNoa??)^50@@nzJ2LC`e44yMD1l@ zNL_y`{7D#5rM?KaL~q!Wd*;>-X`w&OLLE_8Z;Y#QxhhVGjN2kTm$@!8DVJ+54yHg% z8IX*6ZpBeCB~q}36grB$brf+(l-{c=#uF~QRY1sFhl@jpUrt0u9y*V&z;lzYnkWB?X}VO za*Y<*sYbnrQ=AGZ&Ro4|y#kla9Ogs2edIEY9fOrj**<6Owesp%NjfiixM-p1t?-ZG zRvuc@rV6G#g_3A?wBi=6J4%$@5)u3PN_e!72CnHnncw+(?||k1Kb%+w0e=~CD}#St zI8g+cvPgqOroRxK5I=mbFxP06bNNgAq91yUR*{kF%rKlJvlK?_8vId6h-pJeeHF9` z4e#w)k2lCFvu63o?Fe8Bw;rZ*D+zzI*G*uFHOo)nkpvbKI8q0K{3~IoIzq8E3#A7U z5Nr`}M^4-gR*H<4kQ1TEIlzmxV|7M%?$I%Qd`Cu<_Vr9Az9ngW z1nwyeAJx}Y81_XUdu8Ga;wfJ*^yUrMF`}or!sD!2vI%6GU;|84!2CH4RL`Dzvc)m0 zfMUHW!Soz=`7RE<*ab<|^gcsw*z!o!8l0?yC(Y5&vaOxV2Pt|_ING`MeJCUQP^QYZ z(78QPVn#n47AZ$5*fa>qk;$~L-`H9?G^$D%KbIR|Y(XNjFW$This_wX{+KM-zV@?2 z=A;Z^R4lP`vd0`@C_K_p!$&UOP;pw=UjZ&E%ER7@;;?7!+^o55kXKEoyTVI*7c;*o zm4+q%VtH#NR!Qyo;!z_%A^BM#KbM5m({IToQpLU7HS|)M-vIvs;BN%}eZarRflq>b z(Lh9Zly%M3T%+|F`}qE}_ac2cX4xTxq)dkN|8uu3FDAdm%nZd$ZRtzaP;**^JnzWg!^`3u9_l4>ZB2jJlML)d|u|D6U_UGV=GUC<{ya& zt^R;Wnu2UG5Ms1EWOLNw4LT!_&M4`=&d#Qn#`SYbR#@~z75~Sz>PwU@U`<2)La!KN<&`fei;UHZh|!sfh?{$bu)O7eg|7(^K+wTtTr3pO z@oDknqPHy5#?OV$mYDdFQe$U#L4*>z~1xI&!3B+`mfJ zpKp7CgrECOZ68zYN*$2MFd$6=oB29+jAb{64$38!dpIc^kNZ($c51`t?fSv%5U#KY!s4qNogY^pV1k!4; zOmy2t3QLjFknUAZk)+AWe;YX%QZhW(7}q4hx@1#z$@W$HMH0=ZWg6tBG{{sfcOF!@ zWVlM}iv)4~@I-VyL}eHMo$xw3at;aah))7vbB+#n4oW&?s4p8Z$|KKG#@RDTKx-b0qb{b?Y04poNjf3SJlp=&WC zlYSg@U^IIObXo%DpZQ^TQQIG?Jg-JWjVk@xeVK@BVsgTX2Z6LZF0I5jvd!b)lANm*btbRD@ z<~<_~=UED)rzOHRq&~pOAP{Xkd?*M*{w9P9U7Ztkb;SBOJno}Pvh8)JMo%81BnQ#E zZy=v&wo^mz!U&+&=Nur6TLJSsP9spcd=x@5N1=`dA@zURdl&F1t80CHW->_z7??qW zL<|rlN)!|{s6apiLJ}2aFk}WrE^V#-OsPef;i6m;CM21BMybcPw)Ip!+8)}{inR^Y zRs@3#SX8{UrKLw{Ydt%Sws=EOVE*sB_V>+9CJCUm=l`7FbCPFf_WiQ<+H0@9_S$RT zl>;J-Yq2yAa*6S$*F%V-Ua+LvNKrZoJ5HRwQLiK(ZK-ifZ-H~S=uDyIh#7UF47nm== zu1}hMujj&pGIHZtigyS;WHY!uleMNwJ?j>PgNSLc@su50t$w0|Q(aKEp|hf3J=oZp zO4pE?4n5*I<8W)f2=CxaTpChk$S(*F{9VcmId2$$NR@Lr%7GmR59+YgIFQ9DS)e9i z!_jytmBTAJUX%Kvgli|k-eYW{MD0X)tQ32D_{W)9*d5>|#N(3KZMe^H_=B+$wHxDv zw9n}|hr4FhoGaPJ1w6$h{GaRpAYefNq#{%Q47kMuQZHmzI8BMTI%%|E61vr+F#G9i z1yVuMQ7!RYQw&U!8 z8i-kfeS@A}Iv5FhnH5KSN&e_gH_khv#{-L>jc1bsWr0tNbobEu#4@+~Ev7|4y)Tmk z<+5!kptqUZOOkht3aE#jngqhw?uvoNJ=`{n3i(^m=}?Oi$qmbQDZ{mE8?*S)=p+^e z)8}&{1C9HVdGaWBy!U zu|--kRjZDuUttyI3emOR4T$N!-uoD1)$8!u_14?<_O6q9p(TWSp8^KE>Rp|xp4?;A z7xY;5nUcpHomd1@%5{AS&WF&cjCx+}RL}2SJ$3O}#B|@q$0bjvdTP7Y^G2t7Ztt<4 zxjoi%6=Gz=#W^OO>dSf_VaLvS2(F0_VRrT<8bMmu-A3^L5enyPB|`N~WrQB(-EllY z8?Zavq)I&}223!lLhtan%VdAe=Yij+2h?=r7xUqA_vOKDZHe2x>a0~6f!#v1b9uMu z@{X>^$jb75y)q;46w13vm$$LI^6vcf<=xa>c_UA$JW2`hs*3P<>gNd;h=d!&^)x*D zmGtPRfUvhl2)Q5LE0xPOW+kLV;l6mNp~gK^J$WbYCZ2}FO>`1E=m-m_XO;sL84J8lx@v^dgIG&G}P3?tws9roy81(Qum(~vrqTlACaS)L8H7lv6 za-kX9gH4XZJ$Ei0#>;;f3H0*-7=yrS^+s2nqd3mu*!>j<(TV4Ld6O`Z3P5IwF zweoRbgMxFmKy4<$`%~@|G-d)68-@rddJ_~oj-3z`(qhb)6P8ywRLbL)MuktIJkd|X z0h6GmU?sGJ0OA2vGu5-TK&I=wVr0yeTgO^Uh;dt%YD9xE8NXRO4x_OyvAPPFG2>89 zS@>$xgNF!d0Y&Z#3xgnrPqf{Wu?@ze5zx|Iny-R~T@Hh$NF}67-Sv@+7Ff$+jfCoy zQ;!gT@n-UaC((oJX?#=od?=?7c3&aIPw>($al5}fqe~k&pkF{0!S3|%zpu5ziQa5O zk7$&vo+GTMPnkV^Fi&E)_cTv5{w<=ar^jsFgkgg+@gnY+t}t5(*63E=>UKo>tFHhw z+GafnhD#pw_2M41w!g6QW5P{14&Q@fw^r)~pRC27p#Haybgp0Q5aE4Zwoe_Ear>9l zFG?Bgztm4(=l(N9t^C*5|29xn8_L)9+x?gNkD_s(2L6Jd(bbhS&r|@rZn5%8v%C@{ z7ABM+B6hb=z+NGVU3>PVr+@2%Zqm2bbxN;|o?@3!^7i;;UYLqs=8xd)yk(jb1~=8w z4_)B&|MouC8OSrh%!g-_L~CQFJ`|6Y1a=v&)H=^qssO#T_TwPJ^0a`gJXrxXDnb;8 z@kz5Hxga6TOPHoCur@Mbmn(*8|eP4__MQG1Kl5*ok-_ z6>CDsoCoO)rqp+=DK(GwC?=WT5lXc`TtX^!VM(Ipw)|*YK3>*-e961UooNNH1INu@f3fihsQ!luj{C1)XaZzmcsqnDkdX1ZFUD@#ugdgBQ~>v>!F zECU8zb>RW^b)q0x9m;_~+T<3HHXSDm1vaG@=(1wV$PEo{xz4uFpHohI;UnJ>n8lXy z)$MqN?8qeKWPA_#PqwL-(-hrp@k8e#Hq+L9#{u$1Eo+TGqZLj&Ut(4~k== zxmKt&v??c$X<55T0>`$+C+86-;*-beAJH6$PadOv)Y0e$cWoR_|4p^W*7euzc>pCy zdma@B+Ot6%Xb&--TApmrHVOO;+XKM{Ovw#1HbcKdaLTCT;(Z-ArLb!Jj&LxLcnF=s zCe@4iktdXxcck%ZGVj{7yp>33<#MTqC0F5mi<3wntIxtM_nG{7<0IUU=6WJIqU+VR z`Y<4tZ|0f+NBAwo_KIHaT;nczxg*OA@B)ed`l^|xGkV}ybeA*cRHGM>;(!BLeR_*` z9gx5Q%Oi)vr=N%N<`81x|BUWVkipu1k_nyBDasvq!0A!2Entn^neRUn%=T?A z>(`A$i*xOQCNQbn4`W;EUrY^5uwi4L-8T#j;n-*Y$R7}JMX5a26Pd*61SF$9C=ah$ zkz@5}EAn3}lDgq@T*MomB?xYll4!TWx+ljsN12e75YfN`^O z!n(w45?;yk4Xx*>I!x~e2DT7p+>)<1_n+X84629rdh<-@gn%>BFS^|o-R7!)Ir0W9 z`DCB94G4l}dCQ~6J&U)`7X>oY{lP*Maxz-Up0+Q0+tum*%!_~TdkiSKV@}{Tu^2F!K4irMs5SK9u7OpN4li+}GR3K}4|0hjLuu0er1v zsXK95Vt|p&Nj&dR+&3etJs9l;_pG>2MS}qA%b|udyhZa8-K3H;|A7 z@6@fr+0g6ytNwk-@kBiP0E%RPyO3D5s#APCo0T)AMawcX#IxCrR08#-4sIF$if{FK zasGkMTgCYzo!5(V2c6f7^A~hpC(fVHd6hUHp>wJ@@2B$`akkJ|F3z=djuz)KIwy*A zA)Tj-^K*0-iZe*(FmbXRRUpnXe8VQC$`jwkjPQwb1f9Lb$&@Nvoc-x^h%<-Ik1<98 z`BpFgH=TzNV9+j&;j9IUxq)J8EW*?!lJa+S{zOvlVM>~=(JB2**_&YnaOtpOh8=2W z3oF$}_zkFUuz(N5Y0`O6oV9dzh%-Xxq+5?C)Ma19*ORxwu;u}vsoH>O2vOtNul6+V zT`}cf6QcG*(D?`_iAE@Een!rTPGZ{}@odgl;u9>UZ^k2sI22^KZ{0r3%&rTn@diY% z#$EucW{UAFvSF98EZ&syMSu))d-w7IWGqTciw92GWtAuZLCY3AhzI( zQo-WKe$%XUmp-?IO>p{0J{POhrKHl?qlNamqjx~#>I~C`hcuDhV?E84a3!vGV>R!b z2dBnd@Qe)rxv?H#OkAe^{AX;oaXkplMSj1&_@ghJn2Wf*9%ejlClA7m*t-I6+yVl5 z#^c9x+F~X4y_C+C*^Ny5W&gw!q(B$8vC^B|O>S!dyyGXk1sZ|GMWoJZr$Y`KGs%;j zFVHrLT_xbd8r;#3e7M}}fzm7$#ogxQMTr9_+Z$`5xUNevc6KQbn0){}WIb^Z04x@5#vRGDkEf+Q`X@VWvdR-WY=r!9 z@9;X=^UHU#yK)|fJx<+G)PYS-D#9w2_yVnAGHI|tb5nRo^zi4yaNQzz-$aCo$0Ak5 z0@;4ZZiK=a_wA1Oz8*m1Hy8Rp2U1-Ps)o|I(n>VtASmnQObPgFU= z6JVPbbbon&o4~yaR5N%<2n4R;zigrf)0YQ)E(%M$YS`=)iSX3m1p5^U;C}gR!H!--OR!uV1xK)3%N?myU zaR{?lR2p|AOXv&ywM%H!B^V#tu~5yn3SX$Bg6ef4Uf6~6B*9o^r!ctsC>(HUoZ;tk}G9P6E^a2s9tQ`^9^#pJPT-jN@QJ&bXn*ab7b=ehi< zSf-~3rlaHnJtEZwYy%Y^eD&{wMyPu*qhk%6DhzrZL7MvDoo>-A546m4Lsq12y@5mx z7eRgXJm!Id^os&C;Jxo|-i}o(FsS;WdM5fhO46I-$E6W423;?eMDmP{b_WgGyluw; zYQm7+af6+-$xgZ{ne;s-y@pNx=(nuseo5l1ABCVaQhTS6XX)Q*h%qZ@ea(Zn^ZEc) zVnQcd8j8{0xIAp{C+a@cWMM&7KZ}qeT@8-!~3JSIy!SWMO>p6*L`Ju#F>j1Xa{WX6ONz6VWcCXJ>G-h zw#;sECwjYya8v!NHJ_F$B+aGA1JD|PsbvpFInJT1G|BoV-z=3)HtZOkfbj`=o~&iE z5cvSi%3#y3N~Bg$jqpgkxr~EVnHbnZkFo(G4|p1+(}2kvFAGetgbG+XSCZLYiZnRp z7nAFpd!6uHsAzZ(TxXMAHXw{nYvH4mW90mkuqwuh_ZX&U{2ILF;+e{u(>Q9T`n*l|X?TsEOTsq9y z3ixYgu0L98&^Qm~`Oz2bdCrn%l3c}_$n9nC!dF1OrcYqH4xH6Ufj@+LNtzSuZ!s$% zJJ+kH0v4}Awe;e>7S&m8S$s0GlWoGOjKlb$Zj+I0Q#vHNceB-mZ%s}Q<7>rR>&Y@9 z_37|W((i4k9Hjw&QrxwMf7>XIMj!&(%0aL$?Nwgoe5Fr&|wo`Tg|Loq9^tF6Sb zW4HRMoPSg{ogfzkZ&}~$oGkiN&($5NMT3@}ZRFxGRF4~<4KOIH$GA;}S`F4L3adzc zy+&_4nc2uyCb4NBzE$HMCSwI9hSyFJRIPxpc@NVeGFHc=I$LxL-Hylr;qG-x zJYUeD8!FKK*mM`l{z97;*Pk%m=5e=2332IScgxitU&Uf~kSLg^zJ!w%G_C84Ttcs4 zrO6TL6;!_}7yd4&4poVxo0btjM5^jdY$7YG8bM@HvQ269eXf7Zg!VK}%jVNq182Z z@$=e(>I;=JuwW+g6RjJvFn+(EE+N?H!Nults`vPlW%)=TI*jeheL;Tn*Uc#kw#l=KEdrnCY^1I#jkV1*m71E_4^g@120 zQo9rc9~+bd7?JEh;!8;WXbgNpZV0G$yt1hi#^j}`mc}MzN^GvjH){PV<}oA*AMQJA z+lTw+qt;V_lbwd};`!2gj9L%pOEhRI$3t%eeesG*!OQaa&8sircnH+OtUZdnB)epU zz2;haW6e5{@jNtYsztvvU6K*1Q)qjisj@o4WuMD>Ic$u=qA9^r{`=ybg>~)a64-@!J z37fT*Soc}p=_oJeG#NAUu#;)c@brVJTKy} zJ;{ZBY0_M~MNTWQ5SC%|^g{TbNGk8+VIllno3$Q8rF!dnL{MdEYBDKHwUb_&o-_~0 z?}(HFQ@o&O*s@**5;j#1AAxDZwHiN9S&ThtMZEWn)FxPG-=qJPj0sXHy;L` z^6<9%f~-hi*qgeM+%;zU>f34(LG=-r9S#QuV{Bq?P_4u&f%E_l5_Rt>*ecU ztl57rYO-k*3~Yg-1(nZks;?fR0Y@m&O1h+e$wd!0U16!0N+~x0XNBlhg}pGRe?V9k zPsfcoV1ua>L{{bOp4h-ftyn)oQMt++D;aDT#Y&LL3f`#9lSR-9# zgDi)Q{5H#1#wu2t4YepE*2r&Mu0tA#=_7Q!3vf;e(aazk5UnMeH*8-25am&ftUyjfllt0*A;hR=wuE^vgxxvF72 z?kQ(0FMg27EH92#6q~{`#~SO=NweXtzU&3R&4z>G=C|fc6Ptx9oQ)osa@Zk&4i5~d z!7`okiaGa{9F2KgVH-G2&>18+Dl-KMbdaxpk|g*eV1oo-4ygS|U|q2G)faL--OR`! zlydzj#i8Cr*SP?r-KD!$!Jv?1W>Ec(f%~ddHFC>tEvWu1P02^81qm$PLG|PGj4Pkx zyX8R9Ds}oc0vjkfN@KMR$5u~2Ik@%&TJAo8Ce%1*s%s^!AA8bI#<6vX`Na!}5Xy`1M-jesg+%eZDSWL(= znYF3@r>U+ zpv{DFdWy=*ZZ^wCB@QIB2tOnG9vG{HJ#D;!mIj$NQ299HDWPX_QO$P`S!3&w+23PM zwg|6)Q@u-)R1%gG)O18)Z4^b0!8|*fj{vA`;J8%1{0qk6cBYU7MpjCsN0rI%&FcCm zxfLT7QuD=0dZT8+$uccoJTItn#&MnDDy5<_{XIc-4XC-bzke7Ry6o@olE5*@!#``4 zI$Q$vkhc&fOdPa5fX>Q`b|zXMqVsgD4aPrG@nsBr3mXK3e7lvYl7YWtVDkfR$lyoO z@05`(Ge-S8gNhmScj?mobY6iD8;4Ux6fp2U7V%Lka0~<2F!1A4-~tBLFpyhos|B?T ztY+Y`R3N8@DnlUjqAe8|(q#1|G$ZXTVikfP{Ec3@dg%=`D61`B*ff@K-NT&OSa@*a zh!sUm#9C$aMGaO93|98aW&-X}Iv+y48mZK7)^~=T6cin)U_19;z%nLr`(NR}{PK_| z)mHeiTjUyL){X*TV!Q|D=LWKg_yx+~jmZwr}{y_wDCn=?*$`2J8nXI-QpOft-eBIKJFN>C@bTl6{!aG`(E ztq&ljBXUtty)}xgCt$rCoBgLp+8%87FTTL`oCet*(t~z`h2lg$fk_nBXGyMqj~RfX zJ2gkIpJMOh1o~06dok!bAIqzf3*Wwas@s|O3%9mEGQhl_vy)F$tYP>ZS|3s00?5%za;Dq};_me*Q! z_cm)O+3(WGRB{V{^K@H#$?$v$ls(x_JwEyA@fBU;xm8IYZ*Eu8{Ctacfo58CdCM{B zbiA-7t0|>ar=whR7l3_c$+o&bq1}nPBlvdt?&JG2oUK}#7s68_S&=d3YEO+bq_#h9 zjbr568dpgDH0d2tgKfnlNpCrFxgxiktG!HS+Tmf({4MAlNB|29rw4;mVlYaXn+!e= zI~90n+{+z3;)2||WpXy;Lr1c<;H<{+qz7N~eN&&IkUuYa*d56NN#qMMs0Ml-C@*?A zhaPA-i6@sHXpzEmsJz&P$J)xn(JcoM;MkIbuW+^$j8f7D?K5;z{<04MX#XPS1IpF% zhxwOcGd;D)V~|K<_vfatDY3|-25+)wP5%~e(M;@^Z^b>Z#~A20-9=qDW-{KDVT>x@ z1MvpU$7@k!=}uq8&HzNvaC6HDT@E=<71U1RUU%Kp_`@Mf!>?MN>ZJRr>yYk$qf>g! z%Km1pHAgTr9|fGd&P-i9>kA^oFmsb+I20aew(?{MbOmywul$rF?%IDh z+Gh8k8gN$s^+B;NsGD-^l6C*bp+9I;5Bj>9{k!iZ{mV?h{v_$mvZ7=Qr9Bz%D_bWV z(qxTKK5(B%*%hCj|8Y0?^nD3D0X|vl?H;z%28{Kaf{)pgKJQ8BEjc%f-hNIFa8F2Y zg?`E1A*s1ZkYqRB>e!;iz`3SY(KBo5&upzlukBm|bt=&7-Z~pbhNO`jz>I#{Ue*c| zKNfQO>RZuzvvmi)DXHYfkl4)!2%^XEL>yTTxd0bbgMK2Yi^?D_gz=+b$$ph%hpi4+ z_7h+h|3f`SJkWTjCFpFnEX=%%N1{ugT{AW?Go;4h@Ga{&nmKakl@J&dW~t!L+zAz` zRgYxpzLlHN(EK?&D-tkwI+t2!`7JXNrHAMEroM=PolXZ?j!$Dizy?J6_^0jgWmM9H z3gWM&6j4Kzev7|L2yN?@zuVL)JvhBiew+q*M~X17>nKTmVx+GZ_wVh0{vlS6G<|tJ zKmIXB&ksDWKtijn`t_NqeumT_FSvGJ<`r5TP~VXtaDm}83LKWe?q^JA0By+!$x&-i z-^2F}&+(V+h}9SInBBZf9vw38ljnv)=C9Nf+flxXCXSVq>6N~(6(?$f{!!+i>#N+v(hU(W$ zbyv|ilnP~02%-+*Xm#FvRCga5YE{>{AE)Y*{XyN%!>BH({&u#E5@45WiKv1qA6nA@ zad)(vby)Z#a+fjNRaWLJ?K(bX3|s1h9)LMnw5@&X>N)+Klia|Vm3K~(H?70AzUDd6 zgfm=d+?#7{z-yKpS%3#5N`KwJfrok#7XF~x2=a+GVyYGz-%KW6VJF^_mbk_VW>=DX zVq3W^N=H$OahILZpbX#6yVB0v697&EXm$lJec}+!kCuxV!DvI5jVJMijuhDC&u@!f zL8X(tWU@EXl6~->c7NM~25~}{&u`Nr5xii#cr<2RBNy|SoKBdHUgU_$-2$`mQ3-zw^_h*- z5P?F!xE~U?5;uACn4Dn5McxL$A~m@WXw#y3iOnJfI}KPIg`$^eBTzCwNODsw22~df zlG(V0?(&spBN_HsLoL3|#%pIZVIaI6`~!Tmr=t zQj?2u9bqfCZ1Dy!Qt}USzocuNNq>C~;oqbHwHP&*e-;ZED zBs{3rY~~-R}MHh?Y;AasSYq%Mi;thL|n1AsGu37vuD;7ev7#lRRVi9nf zj$EkOq*SA9g&WYDaM;W(*&VD~p8v=&hu`=0?Xl|$)PEFN)F>RZ4%R3#?)w92Eb^2A zo23OiP$Ljp+`Hh8H@uJ9_?OsBd`N6Q3O8&$70UEL)@<;<^Fi>2fKVHc+Tch{>lYqj zC0LP=>Li5e|Dpu~Sf9Y}t~lHHId+qpM)&}FqaVINo>%<`0h&h!6AQF=CO0EIsqm}! z#&Dkaf&Md4M32z6)7!u5m&iwhVa!>%y-Pl>mjTg@nU&c43-CH?u&|YG_f6Slc1?^P zB-?*+=k~u2%t8B~dbp?d{}5E=6xy%lhd7zV8Gpd80;VA4FqC zhNOk+CCf2cU0h4^BNKUZCLggB5zrY_uYq!jJ@IwBVI*yLhigp^v>f_`F%giCa)ouf z=R>_27vstoP?(@iSU~IxX~d^o*sb|vkE{Kwu18x=G`?VR&6#dgWKP!fIq8f6OUk$U>(beswd)DM3rC|8%?l z-nxF-O?6uXDmaxISU&at*tYKU|F*F4YUnu-+0tB9X#7GvOWg2X7LF$gOK4)S{!aSv z7;o0|=#Rg7JYtHQ3vwrX9GP9_YyB`Qj;Cs(e|Im=!}+?|yVMi$N1t&=x499vu~AHqEU;fqF3l^br(;|Ql)I&+Rt;#0j+Am7o^U|E^mIUe={G!#OsE0n)*XC z6Es0s$&S~$f%>Tjp>mw})&l~XG|2qpZSO3Qc0|hMw{lMsX(hd_1=!tvH#E#6=al_; z6uDXG8PrDQ#@l1?!8|P}42tpct|zR;Luq>EzZ2WQ#H8+Z_0$8_-${RcyVQ^*h>XYF zfI2F9CN=&cDLF;<#OfI*w%2Ur!j0Dr>(2%@!vI>2`5>8*VB!g365j^SSjra>_q_RY z+AM9Hvjz(7h>31a^yzvOLZ0txu$P*ikGTyzUq9)R*WAoXxb0t0B)f;HOYhzRw{P8Q zeAn&Vh3}ScHX*z^+U{Q5-*lDcXavJEDD6bBBS*s*G`l9`L}o;f91EY_JjFSo+!>h? zJ#suepm~aGLb)q)30}Fz+nZCeCX{DIip?l1fbt3o^}%o$YwIsMxA1AEvyn{a+{6=P z?Xh3P8(h~cpiak%@8W<_+N^F9BAOR_kUcQl2!Wmk<(~)_e1kSQ?_}Bf>FW960KI4$ z=fl#vii5$i&Y%ZB(9IdN2Z2~x;tgZaQvM~ewQIwqzL3$!zSWv&B{QeK`fXq)?@M~^ z2z_7jn^H9HOKO%6+JgP;1mJ>ZqtPIiyO0@+w!O29Z6&LBiuWankA61FOQg&zUG0es z#_1z?uRZ}aO$w&Cq1;=#&sYBl`i5(TeM>)%;5uoRjzt!1VC^iYb;<&%e7V2cyv?J_ z``}w_s8ybt8$OK_eUOlPcWgB*+5*WD;z@?2Ci35b7|3c(%|<__wn^TkG~J%giFrw&gnrCale!D*Oof&-42n3{iDu?|`TYp9i{YbkGlO_E+8cZVlx4|j~+ z$EWpon1)U&U8=qMj3Vi8q7WjL&c*?)FQIMp_YJ5kzb<6QJO~=NjMw%iLj(6d37eFS z6TZkrIP$`wS5P@6rN0#86)6a+H<5_ipA%)adti9oMrSn|L9pnK1U5ny8m(yv^^8WS zccmIF@GvdyyQkO0A_Q_P@PPa=gmvMTmYNXGYZUS=FX2@myflk^vn5R zx+=KF&z(QdeCAXb47P{(hWoAE<9p}%_f4UC>GO~CL1u!8@xX?H^yS3re%38^>-mv} z-`9325A|t!_iDE#Xnq4{;~>|QLh8(W({T3!jk_T=O+q#9=7-ez@WS}~yTWMdp~0?E zEdzxMsQ>yJ@Yd2RFEk!b!`mHt#3x8$o$)rLiiJG-Qw#cF39uLR0q|K1`f6Fwq37~T z)C5Y0HT|Es=c?}yJczCk5~6t>>2KVY+;s97qhnD}t?n;eHCE+WX$t?BsVQg}0xtwR zhyye?HJ^d!4&$LBmmiv!IPb^@|LTGK^5t_VAn}T_zh)js$&Ee4s-`Nz0%k{T0|3=_pT|LQ-XTcAwX<}ZNGm7i_<>rg>I_gx1 zBlG_AaAS~tZP}3f&z$U-=Tq0SK0WHD$hD2Zc0%j!vw07bcu{_dG1QI=sV9k0cawuc zq;>aM3dp$oEMcGN-DlDmp)Y9^jq4Tn^OQ_>x1X2vWvS=5;0L}!p5{&tu*lO$CjpiV zq|e>S({A(-;V?iamZ!=1m=HA`?&WLb48x5yPcLW>7p;5WY1Dq%CokNIo~$jD-E#wn*OWS<%9o*!4h|L zw{vDmM#ae01F-fk%)_Zg6ETbD#vP+MUfbq?{zvrvR z(J)kwd36pS$f)PUgwFc6?O@-!#SohrzeAVWi?smFuYH5y1JN4+;Epj~Pj-2#)n(mN zm4$-Zz05ehs0a8>2S>8V*5~tK%&mQ-`Lb)&Fm9 zp*NF?Y zJm;fywGlqP2c8e%YJQ+vIb@~s0xd~=b+n3uPFq|}xH_b^3fabNSzQS%ZWSMgeiS(- z<4F*{fcieOD70c!O;+~(sH{4mX#b5bg%zyZzr0_lTrJh*lpb8Ug(z381|uM(ZpU{} zzR_os?_p_lKG^YJ|Lj2N^`fCbIv<{ZUgEithC+Bl1cD!T*3>4DTJvy=s5(Q-F`%>- z&_T6EXmEkK6YL)8e>aV>%HIGG03M}gEsx9Lx+o-|*({)GZ%M1bg$gc3qL6t|4Uq~8 zPgFrhos>^`@JL%pVti@jLUm>n2nt>&haha6EoK1mxIr@^Pd5^axY`n=ZKQnFsvl6x z+GvF@UXR&?-Pr?ZASN@8qa)`AVX*I2$%qkNJ+Qh${V|rz5qXg}(@+++e!YX$>PI>u zf>6n+>=!b+vnO*$E%M-C2)f;UtJF8qyXX#F8trfqoAF}gpkS41L})<$Lx`U@de{{{ zue|ibm2Voqu>oLErfSU9F!*JIz<@-OFRe*^Cuk^_2Tybr&YQIg3>3dYH7m4i19yAY z!2re`+LvV>R?oms{N{TfH-e@Gp}B501fXO96u2Oueg(({)F1GzN#!74>)q248*|@d zxtbfUg}=#tW^^Z>*v?;$;kmzLc{R7o;Sk+KMn-or}iF z{&YJLEySv7hWxgEf8;!@uDC&Rw((!cE-g2HOjk^U>3h<6u;+8ytOo!m%=7pf?nM$` z>&M2McBYmJ=k^1x0IXVmnUg?~Lwy^kmcm*W*?oR;aJli_#f{5zRnuPQ+QGqhIyA z!<8mZ>O9LXFflm0O?ML}*RX)PR;qKC9t;;7CCR+onD+wYH7-bo@x-P5OoVZE7h?cN z7?&j@e~n1H2Y0WP9zfG_o^&B(l-lWP{OZ*@3@x_$-WWJH=yaWHOiad3wu`t%7s27R z3TXyI)s&0xBI8P=Z>n&@JxahAY^rdnuSgDWtb*LAKcspMMuWvplgL7~zt#%zNrQ4oy~MP4*lCU3=ui8f z@Rfu@5pYIU1AzifOW9EP9^4uV$oRw(k6I&bMv!maCL}bzYBx32t$s*?!)UkW&-L4W(JcicaL^nE zuK9zf!*S!sEi;_!n{z8@Uk`{`H1Y_^Rbke%L1TcuOKNdX0~vE<#lb_a1~tM7jF%fo zY#)akXV|HLQ14@SAw_sBV6VSBY)kT)iTG~H1*5`>Ul5g!;-|#oWk;TZ^JAX zcE{_X_%JkJti+LdP_0F)D^Njnr>peX;=iIXP|&bapN-VTSg+F4U!ReFdQrj79NAk2 z^`)?xW-WW3*lUcmn~JT_N@=1@sL%ANu(VN0IRRLa4?8{QRc5HNOQQDC0Bb7wp7zaX zUb;UkBmU_O|F<&I{~jZdp8qQu@r{^q>G9WQ#9x--k7ks2UPk<_8S(Qo`~x%U``w+L z>mQzxerSe&L}&bNKax>@V@7$eWW>Li;lDK_{SPwYpUPY}0GSYuF!+%3(KUPHA zDFKnS#YrmrlL)7bLtsetVl>5g2vZT0Z1x@2BkgUI+)xt5Taws& zJX-dYgA#$Mqp*3KXUm@EQtt6QNvo9G%g~$0?bFV|6heVIN7GH9USpgj`*DWzu zG@iv)NUg4pK8ziRFhoY5ae=Pw!YhhG9OPO|q0wabL<@?L*XmE{@^1Ts?5QphB4}<) z-E_1RdI@YWWFR?T=W~T%3nKRd?1j2yWc*C7+@#I!Pwqr>JTM4n*7BI;P?_Ho=KEG| zH3(z}TjTm|%ZC|b(mU)LaJAppNv~kqqKrqBS2bRSZ;s znF~1M4GiF)Ivs&vPvZ>?=iiC;k@iSQd$9c*E6}v|zG)e^aDS?196cuQcjmW5?}DF9 z_6PV)Jh7g!dv#uf-c7Y!7MUMv*~*k5Y$fvXvNXh;(T(t8U(v zri{0o%8Ff=MvynluFFSDH2P?}E@>#xse3#xgR~m=;mMg}v^w2~2lJnKAATzC&r%l3 zN#1lba9oR5P{x_&OjxK4pN1}ZV}4kEjOn@Aqb!mQVgD%wE(@0&3Yi-y39DA;g(-#_ zjBjpVJth0sC6-TwvTMPzOVtd9(hR~#m_e8Y4-#N<4X(nNLo#@sgn%-x?t`KWe+g`J z#Kr|xk%YUou(o?r(FrcL2Zcb)n7wRRi?^0-)s}ywE1UB0k}iH=2+X2D-CuL&k*p`W z1`jA{?wPkC_AF-iX5rhGYw{%DSrZAW?K1T!jT@9$h7B~h+Az|gkJ#U8mQ(IiAj~*~ zBThZ5at#V6Ktoqc+D~$yg5z&a_L}{v3qO#LWSzz@u~7uGmx%Kx4z#R2in;=c+dcH& zj%S*&e5T&Kuwlhtim^OPh8UOGs~!vlzo)1CpKiCNyqrs7xbkYKrY9#v#-e;Ey{>tW zGdBN3!-EWdw3!+GHL%PZ&L$ZOP%))IUC}ka)*qPv;juLRfpd*-KqRPFAnFeoy@AGn zUYTwnwy$!UFZcIzv9$zO)0U=GP^I1mdBe=Onixh2J${SuOY@Mnk^vfJD;Y4#Rx8qQS9nQBX=xNjD>LHDEt@&WaC zC^w=PFlhZA}^kef0P|^i@HiPUF+hvMOy2lbp0W zwYGHhaIQWc;>%^fMh%!nordvTtU;$fj2vlu7{3pIp3*QDrVXRf-|iJo&8;pyf15QY z{^^0XV4Ph41y;7~dk}oF98i@4w3=G;&_paO8IIwtM0vh{F;)M+$n z?}v4Isdt{dhHGA3S$bV%CtDVN1>OVZ{0udRy}>JsHcyhdir^mdio%$rx#f2 z>3yl5?$he&;aqv_`-F>1S__H)ErIEHE)v!|mYfy1o*ODiA-$ZS0X0L;UA;I*hL~>( zM1EJhwjc2H*$xK;>Eh@uzdg|;%}*t;P@^V)$TD!e90oFc^&>!AqAMVP&ZEJ-NWbU` zuNdE8)nN}B;pXaOHiFM{;2v^SwfPuUDKZQG=wF>?BbY^oM^`L&1c`jKJ+l%E$yR2= z5z`^_x7*)zZ~t>{bj8h%urIp8a6oC~1%KUhwMYTedNDFUO<;n*&^%en4t z-_)Hr1NyZKq#ExMPu&MuN>=nar}=L51%~Az3{E$kSlrG{+&)pw#jM^SSvTh&_QgZ8Sf*Q}ah#X|M?6pay`%<1HrmF!8fVN!mg+vH}4w z_*>Ajm8wGlZBQ+wjxOQ^%_m{J0)%nwC_F&+2M}?+dVC!{>?oNJ8iXLcmX6}+!93R< z;DlG--NK2i@!xhntckRLgNNHKllVJpY|4go>t7k^^1p-68~7Z@=act3l_QfYF*<P6cpQj8xsOhs`DN5-gA846HZWgwd9fpWv1Kx_?H$Y^3DyDN35!J; z86(xtN;B#$VTcc5GSo&c#x;fub&f-APTVyun@Gb7l@k+@fsmLCcmQfU7)Ms5e*fRh z=*1Qp4ftmeO}{toFWHYv~khaE|*vvZB;af#!Utk`rR+l0>PQ@=_ zDRP}DAx}Ml14l?mDL^ftHokc*@vZA2br>Xp=l&JrbP&wtp;hTVyaM+?v;hx(f!CRS3>ze5kS z{#`5g`A9>8pnMB){*5dm4?qA+Xv+T1;_FWhD>c7#52|BJwLa{*#>+NmVF*9#)s0isN6liUi$OAQ@+c{F1%c^m3ELN}sm*8t7?-_0t0+U*MbzXdX)kWRqZ+`-C zO?7uq`wu$%tExo_xnw_7xe|C!<))&%$Y|r=*yDQChsSgpHEnw33o<@cs$NJlly`ki|m+y@hD4osXt4xh3(WKQ`3Q( z=02KWY=9T~E?)DiZrED<%b$-WI{G4CexS-MR+l3guRwe1R@rtDTD;GH9$C!o(OvGk zRRv-#Ve0lkm70sJ$XHO4fGt8~8Nb}KbQnfBacPzM_FoVO*_9WPs|%1QuL4RkrOQ2w zU$0VqK}0dBOf|1c-K*VcJ&qnb4z2db?fw~5_3iK(Pb33s0W`bM-}<~j4wV{P(CNgb z#y0$*zEJ_=enKHf{ZWz>bljUZQvWl~kU8n-IXO^5_tpOdt)~*}V8^*ReqX~K@Ky&) z-mV!bn2;DdT8;l4EE66Az{ZD1dzN0}8(N0J9PO^Tz)EpY4MYkFx=;s&54u$r!pgyu zl_JyP7i-2?F{9n8eF0KS{a2#U=(FBZseAEV^XArEEXhLZS)@T^Je$o#lN|AEwvVnk zpTY=*rpF14D5O~W&gbn|BOvt|V;+R=;cR+THFY1DubRvWZSf~DrC($Ku19#fa{pxbCT=0>slh9=RrCT(6@wK@xhn+IzurIZ%;QmO%| zm*)e(yB}d!A+U*E!k+SuI!{V?oL}-XWITB@TMAs&F`TBVKN8#rafdUc9t5Q_4^!Sd zMm;T6;{eEa_n*<&nvhgNy7rWA6jl0s^;G`|se4(5s+nUoV?1M0^}o55gZm4U6RaM#=_B?i=0NL*7B z%hHX&U8-@?hKh*2u}#&b*vhs zed^0VkAS-2Ce(e9Jl3Je`C^(x*PUx@(sj2YL39Vy(=QQ++kAH3T)aksZs5(-g^+to zFe%CT#u>?`yX@@C?Cgi;upBEpdXdkaT3(2Hvu7oiEP@Ckj~6=Fui7}<&Qi0| zZsg07AdhKhq^Io}mY*hu{21IU*o5`qqp2>%^VyaNN&~eDo5;~dQLBgC&A)WJ2gK0 z4p{j79dst3VmGAY^9#xPbA^Ke^xi}Q!RIfEqYFOQOR&c0SCZLXcJ}|Yv!9!uJsqE2 zkpb!WI#GJ%=@>#xzrHJ`kCk}8h0lMnYfR#^@ruUhjY7=@pMNwvZ7LbB+gX6mnb=cdmQg!?3-Ry5Petz}8us;rge0fkWI1Tk4iVvti1vSm*n@WYooyqp) zimo-t zM;ewl7by1-hA^aZ*g+&mu21?9Vh_k^$-BtUzY3sm`QUzvC;FhQ`D7%21vl`lN-aQd zIr!TmdB#i#KBToqJ;2=lDAUVBMkaVO>~*T`_?oHhyy0WqUfw*d~1e!cOcIq{c7Vg-DA!2H4sFZN{~B z3|Nf-S_?$Dq}oPQ+`{MqG@mMX%UHBmz4(V?Nqeo>z54vw`}7uW95zfC??O@XuPk{R zD2y)POaQk8@X5y~51#^jibB5r$V+zmGOVr~iP88~9-t#^cvk@!)T00|*WXy1>|t*E z8Auc)8&R$L&ax4^ztNCP;%euCE#|b;qSdkCE2gUmV!#f)n6Tn+BO%ei{B6tCPT$a} z&^2~Vp*|>*jv4t<%W`M4r>uT=0aO38B7Nl7p zxqWw?P7eqQRXu#IWm((*o>J|w8v!DWMJYi=;_$amcddOpbo)%OFh)*QM)dP&;eJDX=q-In= zqUsQZX3RoYrn5hlh^b@@J+mwLJqsJB1pwAop=(pw%U5J$5x%vG@{O_ToEJqTjnOVP zkGFpfxs8o>ZP*&l1Q>vb8&MS~cSqRZnWLUj4T$Qv$oOtDfFhNSLgQP>0B#{6Ke#s; zz~ctH$QyL)i&*SnW2K!2$Zyp-PS;tIFt*x}XmO!xo(YINofb4!Eo0EOPC+*_XuBO0 zQnTQ%RtxcsJs7n2#$s@bu@jmDbHMBN5e8#F(;4=ursZdr37ymXmp3_}7Q0E+evIXT zfJId7{mVE&N!36b4)nSQ7@)lF_b-z%%~SiA!5m+yt*^n`D5!0*U0Z7ZBK3U)161Vv z3T2c}w&LpbbSU@-*}wbAG``U+cOLApy`Us3PL%!tdQD!J6Ou zD4E@5XWwjRzcf8NK#{h88J2j07JxAG^cLm`+6%%mq~__>x|?0hD2cImF=92DAOmje zUCjJln(NB}u7Wa=ll%E~bXx5tC)>$zestNtgixJaRFeJ6?~(}7*LYs{?fchSGbg!!DF*dq8+uE#Plm-QAZmP` z0sda_c|W=kP`jt6<1;x58=qg$^`EQj5327WWfC8NIM#lAhXiYU=JKPny9_J)e@isr zdP{otbbQX(zpTXS4VutVM2>NGPndq2q_TH0&)W4S@!9=?#^*QnOec>1^_sNy8{6$H z*u_{)ov542w7*DCn}XnH>q_BszKzd2HOzl1)n{yGz*8%8cXBgRP%~I^1q>_GDm#}$kz1N$fIvNzTF&uOGQUC`x} zkP?GspVvH`BkXhMg+Sx$gL^afGs96sK=r>`&l~P%219Bt3qY=@+hU^Mj#v=k_8*|R zHmbsckc1Ld2SFw-Ib3#*D|C*YcQUWZn&RmgO1zw)@sgVvi};4rOzFAa&-BJ&9Luln zI1`(Lqadyr1=-Bx*G$qiue57^_9|&BcQU^PSVL+e0x&^7!<~#CUzC|g8E0O68o+|} zL%vCsAg;U(Oej@YZxJzBFogR;(T`ki#zdcz;7*^_QUF6b%Suo|g z{Y_8SJEiX~D=Pgs+&63I$lpdF-Vu=}j8~xaqNK$Kh(D?Fyel!6&wza5JI~s_8Mk8; zQ-b#vmiH03tEzc^g6jyrwJq@aT8H{taU1wAo~(UnKmoc}Y1Wdq;cmnR*}paIfDaOQ zpKr6XbYJ+qDbei(rN3GH4ooB*oZ*6s7#smOs9HN#8F3CE%ejbm9dPa8JYVY!7u={v zbLpioEE^DwyR(jrd`FwpfMO3`6`9wDUkcge>z|_^S|8<}=Z_^?+(lUYF}F3_E&5dA zA+D>LJK0+7F2a|?pP%;8207k8hI8g!m>y6qi}3KQAnv#r+52n5-~d4cAvJG7#|F~w#^4DO0LU_ICsxvWZQ$}n2yAvw_^qavA5u3K1zSJ{Qr zFl&puwPox&LQm#K)(3d|51^Zk1JBpdP<0a$Czj@`pULU~BL+E<0rYQzKcMcFP|pTu zWCQ|3>QNz#tb8C7ZLW|t2Y2FGf$~dPdC{GDssk}0bp)4M(5cwvv52-LF!x_%E0%*O z>kaMOU%yT05wur^!a{+-o^X^k5wIUS&4T^BHt6LoNT^BZAojxrAV-CA%3iUMbRG{9bUSnYupsv3X*(@1Fp#e#9 zlI{8pdPdO2+@~f2UAdj7%$1_B?=f+pX0}eB z-KNu@Dd>epY8*i$k`1{4owtM);R!&+nj3W1=TJpQFQgo$_CL+qkUM-udd~NNGFHyW zPW29byXyXg`t{3ty&{9oN%+7-99|gls|{0Jj*dP-)gajCF4<2&sO9igtJfyWluMbe zImxL1>!Q)9PWHPD$5%lGcjr0$>S>`18MgsWkUrX7dM;x6-vVTTt^ubpe)R>(k$U_L z-LzASjG050o_<8v^yCyM|K|DN6MmpvphYf5)i?ucAM8cZN%*gzbB0+AEW+vqnm-DDY12p?HVICFF#GQ2vtV}cy$BX} z9ydhwlBf_b(%ns&Qnk6P0QYB5(OUS%&#Mft3bG9!0XsPNJf(k+3}T4flu;ufv6npCi)%W;sUzH*?YFy*xv+VY`I<@D0L1nh*p4(vy zWv&K>s4%NXG-~oFY)+ei<_l;ROT_$2KwM_N7gXbPl_iHPFy5A)>0gJKR>@kwd+4)d z>{mkex)N7nDtP!t)}ji_d_E3LIJ~5AY7a)1(0vO-4GdZaMp(TGHxML0U=%KfRT(M< z#1SN;@Ejagx4tQ~r+D6cjQb~`)@T79;|wQrh`;te444k0ALI@%(d$S4pazPw6Mj^G z5sqh6rpp`Cxx6m#uZ`*)PkY0aI*;TRf3c)V`E{O@U$<1NE>Fe1DR)g7Wb7iDcShqs2~ZT!WN$@?}UKRObkh<7FtG!+K(ys2i#8P$ipx zQv6A^cX>vCQudP}*Mz<56wK2L#g4+g?&XLm?oBC@lvk${9QGgloKM~)f`v6Sk<G-A)m5mCJ;s3ouytvugR-!DaA?^K{-;MWis-7(eh zroy>msufJ^O9j4xz<2|r_!n>3ryULzV8Xmq!u1l(tY*76Oy#`P5*>Obaqutdl_#?0O zYMj%4g4*)W!tlS04TIdnTNs0lq(x$CIl668cUY?PKaieZ9>Xx3-$EGP+XgPK+YP1k zwH&#aGqVhxe@iky?WGf&+Ajf`q4~hqwDwf8J=3lBOwTNfz18I%O_nGAbbG9%Pqha- z#cO(0`?F+V8rYcMisxRnOO=c-*8JU4eTTN=idc?L9oxhbI!3oF%P-v-@yGg^ zYZ;&$)R7;nW07XFeCwDx#?Oz72QEikYNhLxnw=a0F5-s6QRq;)PYMqrgAuIxoJ=#B zLuw_?8_B;=ucn~p3z}9>Hl9Ldpw%BC788tQw+2&t141!1;o6vVZGvkI0`(n@DDRLH z8PsS@-&g}_AZk6Y<|`Q`KZKHNZj->EI(8|mDP%Qi^e`l|8*6i9s6_<+G#;74R;FE& z$uCR7&QAuIB!oIUFyAcu=~I$~=6-a*_)mNR8gEIBfQC#WVn?j9GP-Sg>E3Xknb!x@ z3tE1iE+XhuL8^Q?-6N$o`m_9Ty8OGkDSshohh6?{Cn-NU|3`z!qGr+|*ld&aii@UP z3s0M5UE(>GJ+@xc2W{V)!z!0`#lCf59EXpaI964%4a=L`3H|T1sss*t&LlR|I=1=} z@Wb4^0e}Y1K*_!!xnTMOEq4>Y_y)}ff`EQ2&lR#H;6>-|<-eMKu}EFBtjE!<3~+=m z#T8&@WK2*M{+x4xglRYqm^Rs-Gr&!?GO2aT=xOkQm=^l!KGRWJ?hg9{u(_Z7b85-+lmJdl-uSbwK3%j~YK=+L1mN9ws1x>d^>i7( z*=|r0a2&C^o8am)k^+yq%bn@J`c#G>C`Qd)nj^%YBJ#N{^{78nF z()~OvSOuvK?1gCT?$sXra2Iy4zsyrq}iS0;=5hAs}9NiCr*`$8i%0kxm^f=D{a2fpg1x3q)pR%waNM=09FRo+( zwF=M&#RR28GVc11;n#Q=3EH#pRb>(J+c0Rl@76oia~bg9Ml_Rzb${dx9sA3JU%;~t zwQuRdrtRyL=MvFVs{V3OR~jq! zIXjkd?qlALE-kNIc7Ck9l3Qt5oZcrGff!$XKZrRDLRx3L5U!3gt=lKdH}x+&MvJ{) zoq|2>7?OllJ$r?BfQyYE*@fW3FprhNPdsoTx3)!68@9GEV{=0r){iFS3AB_i0z@H< z$IH3`89b4<5RbtMPGE3^7eg_4DK-pQHx{dKZuD-RI5_88PjuYyDW_H1jQXE-ZW)E< zt2My))cfbf2&yt4C>n=fDAN6`h@0k;xA_Qq8C>zHxc81fD2L_aUQV7l!+za6GRJ<| z`}#@bTEo`_t6`YP0HkWlYGCR#PvDL-Fkk&9KsY`2jF37cjDf^b^UAzu1HO6LqYXjFQddLJjkYaL-Ya6q6EVc}H~=3u zMy_n%10>>vj2Z!z`@q<$OKUT)dhgA2Q}aXQdr$$2yWQbbHkH+*=eJUxPGvF3^p&VV z9^gx3oj60kprB<^QI$|`(N{-dQ%xQ-K$7xcpaA11s5&&g(qTKw!o*GNFd?W)edAZ8 zWtclPk>TF0EQkK>HMe)Gl!fPwC$4^2M?&fu`B!YOOCqn=7I2%3UQiCA~v;PR_ zU@Sj%j6gWQn`vMg#{niNcw(FsRj{Smn_36vgjxg=!KH^$uaj+ zF~uTT9!P5E1MC|YSe-w^M|YzPbqxOK1U>v?6ZEbN$rAL0+-i+OwdxA$vViVDXk=Fm zV#u5XJ-aS*)1IF(Zh~gqU~U0&#&X?xXep*f5KQ7wLgpgV`_uLDd8dKP!-Smq7FMdW zkWycig#-2&oj^0)H z!iIY%cCM1x*B@P%6{I`ab^l(f^}kaZcKPh(0G*zxC_zJ%Q>3s0s9UbvC_~2j5-J9|3h~Fq*e0w+^NK%4JN})2TTgqvs6dh{!sObUi1<2Y86b|GL`{nHKY+>h1H`kwxrIcT-0X9$-;Fd0sveeQE zorC$mQm>DyWPKD-eSR#g|3?)L&@wyBjx4ZNK7?X%Io0+B*rdvDUW}i%yclhNh2@zq z&jNWC$+K9VW8^tjo)hF*CeO+8td!?ec~;5uJb6x+=L~sXB+uFMwB3uZE&x_y#e17tRlrS!I~Q&`+)TLHaCLC=;5;MDpVz#M$jbJ)@4Zrf zy>tA1`t}R-A7BLs8qY!IWyIi+c^zV2Mhs284NJY{9y0vUyu0e0f%9CfYJg3TYwmg^0^G10FCNbt+^1e}?Pswwe zJl~e5XA$G%%CktGmGYb+&xRU?&XxC7@?0y=jq+6T^e<+de0hplyWP>OU>4fphnoy{ zCfoqH5ZrLMFdS^i1&iQLgc}QYDqIy@1a1c0C2%&}m2gqGtKb^oR=`~ccLUr_aJRtS z4)+tdb#Se4o{{FyYhFeIkKFfODZflSGM$TK9*JbC8Jvq+v}bFMt2@?0v^zk>|7Wd{LgS$ny<( zZs&8(n%5SA=D{sR%XZ>-FWj?mK799u3&Q;g-(&DQ9`0Sd55;dD+~IJrR2dw-652ol|*k#`_a+%!~Q#)1ja9hwlF$Nl#1v=Rx1d z?f-A5`+t+}|E8qdF?pWrelsuT^Er2ODtj%@uBAA8308>Qe6g!Q;%n7n*d)+$ zh1IhV0^^s%z6Wz>_C*ppM?xVUu~wHe-HHc+5#VZ%byjc0o3rUiVhC2Bo~+n_#+M-S z^Hkf5k+f^Db>F5c`$oR<3Q2pNhJ=5VJv56<-)@;r;eCf zWxps<{wz@>VH=`MDxFz5|1b6{5_WGo`OR+fxjOkgll+!+@+CU?TqO4_Ap{ntlV9j2 z_vz$*lYCY>Irh<5x(~^7CHcwe6F_fjx?Ua2m3rpxjvop4oRuk1J>zVYupmorqjhG2A3EZ z?!&6=xst`obc9O~A-qOBD@~>Qe<3zmv$C-xzBWV%I;Cl$6NCdbvG}+38_7*8~`$)ng&@~uHlPtECc>Yy9 zr6iH($l^dZ#D5k0aJ^1NyrPLVN7fBGLcT=!emcTp7B*RYuNGf!NX@Y;#pm*r&w1E! zL`-$gp-|G*@3t**swEDpUSHh3LWD{8FGfIH6b}pLvFxQ1?HE&JeV^1JYcaRJ@6??d zqyI0zfX*C3UFSJNAvA%B4j$FXgUzZk4B)yPdp!V+W$~j3h4>HZ++zGJ0KBQIRae3n z^HsQ3{pA*Yu;?g>hYKDLY9&FR*T-#NRuj*G#+T7j=SF$+;f*2+Xsib9+tE`sDtcII z3{ps9-zB~?)4tSZFXWD4WFz2-oo#Oe9qSquZ@bHfszy)MQ5Y$9qK;B%ze!Su@oP`6hbqRo82DAv(ILrSkxoH4AHd1`=e1xtK=yhxAGvr)nXw~hb*wP8 zz{V0Pmxt|ioB-AD3BN@9IHo01?Q^Z<$J@%-%1Cs6yln#C7GCbGTgw^tTOzi4CVIZp zx)uIV?>HypB9VYE)?2O<8IN12yQ8=iwB=lH)5d78^3o^fzYB$`!|hX$i|&>0Bfb5q z^osh*V7EVJ>JIss8Ud#M5GpswrY5q^>>s^9j9a{;195c+8U#)tDG^}sce<%jvb7jN z>Wo3G3vbC~%kkH-g16lA&rNbrJTU>R55UsVP=LHs3DbmC>SNC}1v?eEZKeoc>URS{ zfGTkQ9=GSvgMaw$Xef3+cojLUdsRg3c_wvo-54glAtNb0Qc1_UA0M^yXoNmL@+4So z)-;H@($DN3ot&S8%gysZqR42u8Z@hJB2Gh(j`NWdiN+t0;<1m7@8r6hHBR?S{)!bz z{)&Oz1Iq=HLs@|OeM{LMF>S%&>Vo2-U>506{$P70QV7aak@O(xPgPL8Yg)}(1n~J=y9OnosA64; zdqceocs04d3vwQ)W47r64vIVfi2&j&#}oO5wP+CkGBI7VDV2=oR2p23jWzqF$Lsx4 zJ&0ZeI5jZl+3&dccLnlOCkI?$eE1;Z)&=gjA>kH;#QGYqyO2wKg9kdBo`}`Nou&AO zCOi?e1y5IpbNx>7YQ7&o@nskJt!AESj&E4Xc3DmTCm$|?Qy0ytjXKwo-j=RrSypoc zJh5kTo^yjx>sBI19G6WDJm4)8$I2}e=kS(^!`)jZCi0evA?_^`U*IhhetpYCtf21V z+K!crQ4`WqwI@M5@&k_!0cdk)&N4GWyN-l{J^FU3SsG@az?AF((MdWoLk*tvQfAI^ z^L_I}2n{%WUAD}7;^_Ilp7&x)Xlv5wG`U%|A-6eGXWyLFAf%P6doN zdHX$-(5z*=cUHW@x3_2Y_G>dJ1hCduiiRyPO2|$hw}ocX$Vince*r9(LUWW?PiNF& z=024;Kzf01S^8#8$W(QpRhKZ!4qLT=W#+S1x&_{Hj`Yim*EDilE(u=|YA_Rp)6;v65r17speT zTE1KlH(%2WOTxluO-nAyt5r=a=&zZv?;?FC$cfaIbzc80(7+kc{M+bUPO}(~R|cW+ zdu7O(<#Q&@cB+cwFZ-jtx;Ob^Q{1ZK!yg@wp*Y&f7X96&0X^*_AQ&5kfS?I*^|el6 z=XY-kN6*0wH%7ogEwV?$x@m<5L0YnV{`bBhlydyAYO?=sIutL=NalRD*Hv+lNQ8@L2w~~#?MLWk; z*kb@z_DK9Ra7b&Au!DBlJ@Gxm7F1Rz7wn9v++Bur%#}sI&*=w@ zI*aNjN3n}rrflbr>k87V=~DoBfc^Y-!^8Jx`q)t@HLrUUw524;qMfJ`>XTfE`xvhW zWTc<#+Zl@$J3ZbJinoVLm9=~Xa0;U|T=K$(H`wAw{4}c(9oBq~iVl*@VxDS!(FeR6 zC&eEL#XG|B4~8uuEz9eAI)yp^F2!XwK-+L>32eaqkA6=}-l~{it53sB3xyiaYU!!R zqKBn=YJrbERl<&1fFnU7o`_!^aC-=u=5|ctD%S(bz2K}(fA7`U@e}}31u#aGy~Fg^ z9OtvvqhL{HRODBP9hT$vL+zMsgZLEvkOcs_!)qUm#f_L-FTW&tZa_gUFTY zcS$cz9{iS^Q?4e-Fx-#R)9AA>w3K0BB%+22b;F7h3*-41Wu3=@8mT`qDU6?6O%Ueu zWIqSD%Ej71reJGzmUy?&9%!w49I;*h*IE6Rru^&BwVWI|xWd(kkML4r0njP~A!BrCz)61^Mk6uwvw%(Rx!{9;Y zzt=rEKY%ki4iEvNSpLa+isuDGwU`-4Iam4a=M!MZSbJE0K%r zX}s+ttp6zl3XQAx&Cjb%oBC9keeoY`0OTQG<7wbS9WTIDmhiSzBym<$Py@k%nTdf&c94A^ zmM1v(5#=dv|5W&#p_qM-v|7hkPAu)1pXWTD{d{3ZVrT*(?4ZTIS#G@#(r_0$B)`v4 ze&W`z-bZ22(ar#Lx7Awim5y#H&jLJfEqBY5y{M-EXcjIYK5)5QO7cNWfrqfUtEvb6ZuwE@&pW+pn6ocjrCE{ z%wkgb@d@Qyss3YnSc3k9eRxoP1Huc`F;!*x{ulDA&IRbq3>@gZyvKJje3$h2 z9=-23%a5=FqXn`*K_NJpo9HO3^~5tKVy`$i`?u!Cx;XqeiK~RGy_8Ue8ZTXilli zO192M9?4eb1PzgE7({OV@LJV>K0kc;7=p|(S4qJvLF(CVlM%KXz~^Fl{0!c~W31dR zJO)KI?!HB;KQci5kzPe#E&xTeTbfX}SnruFle`zm;o}gRRaC295&o0SI+e|uBz0%A zj%Tx&DB0Q|&AM%=X%=|plfGt}<#JSq+N;4cn}+Zh5gM}oJ!y!2qY2V^si62{7$*0{KM(CY3Np!d_40oQ~$ zN7SzmBjX7CiS^Z)0qNSo=lZz(fcl5J4{^ETL3hGB;1FpOC7~sCSrHYzn$2LF@?}ep z`*}g=uU$oNVrc(}`pQ?`rp9iu8&GG{hridz_&&Ch!0=+mWy$+h_(MEUt6@SAm&RBM zfju04;Z5NX*qMZHEEOFWv*^sVEXsO zx-4Yr=lT{V(nrWZBB~9C2Q=aMR6mpLS=W-n`Rz8fWlcY9)ooq=mchGEBMa);KRv(o ze7fN-QXdyA(AlHZ2VLbwvm@#u0SqyBB8Su{nFlzeN^tZRqiWrYsC+Lf>|!)76>`ev z4vDCNbKQ{@^_$JaxZyekd=+E+xLl+tx^RjS3d`Xk+i8LnvYkszIsx zrtxa8kZZI7`{q1AZ7M;X2N18JrVhds5iBOI~cgT13e;u{oT;)w>`JXLsoGd1wFa@phuhbu0-`7nn_*y}Fd@_(0Sw7i zZ%b>4(MRi~nEsOMSO|jiRGSbX!rPUDV#fP30u5ka)PQ}d%LVL5J)77AvhNQ2jns#aT%|v0!2~{Rke~Y{~WC!)r|hWUyDTuBbR}HfLo3 zjLXanXEjCX#S7onD?+0s-YhrXY3X>Bo5Fm|-32J8B&k+NXM!24zuX$xfX?=~VQM}? z>O57DX@=Dx%+j>Q8^jIRtK*0y6JkLXw5WoYvsT0>n%2mdIa0kWGo8Qmk=XgVq$%n! zT~O)HrME=X(-o-5lgrv!DHp z-vEDA;h=r_@e2XxcBi=#;6vy808KwRb3b}wnmR;A54s!b%+zr;z}cpOb1PIGg*Heg zMCn{&Z~z$Gw?>_5hMv{Lb>(q2>=#HGH_<_j%6%f(OI2c9i5 zP4!Amw2(pehBfON^?C{iPN({i_&t~MI{|tJ)bb0>e-Jkpe%Zyq=%^Z1n)<-TttNd^ zf4O}USn#X;8`=uxZD}YH=(zv4f26OQNN${eOPA~Zw!Y%pg9hYbnENTA?Lrf{>A}Te zq0m)<{5E=Fa>-45v47G%FLUfp=@*W$QTB6YTvXXF>7Kvi6$22Wk92xzG~d5;Y+aUC zLW&(?4_ZcH!empI*bp0uJY5x-mX0@`(W0}N?wZZm8M)Z>5tgstPJIk=IZu{jgB)|5 zVw9&)(XCL(REP$v5%Z~Zl+Gzw0eoJa!HL$d3NV+L+cSElBoq|945(ETWulSZ*yQ%c z_l0OnZ~WZ#x;E`aCSV$_sM(4($$bPR-OX>-A0zT3cy~xsk(h!U@KCjC+Z=+9eKo$K z^q)&#s8zKW8DJhyMzvP`CKY8wts0jK9XQjqv~@wdy+Q+bbsBQ^%XkM7ybr&c2e=U1 zxc1WhV|>%ZK=@}0YL}nF3UmS(CQobt77%&RcDxcFkiCm|DCErai3*n3gz70`ZaHgj zqBk}uN*}kHuSF`VB`?RX)tXxd(Q|ncqUX}~*nBL8WRFs4oU55%0PM2A0n#X*H7X0u zbk2c7K1|*gp*~3C$ms=8NM72KKl6gLCT0zmQ&;@mY?Ti}+?k1+ijhjVC~#A$1XQu= zxsmV*q3F_o^tRZ0%uQ{y)E;o7rQF#h8!h7!7FNr=l-$ql7Hl-NG*Y5f)zU~27iR>R zzIscU*7T8kbU4z`hywePUM`62ThSD`0-OqVY?rzUlZ8t=8UJIp3)%aH`{xxlxv48` zD5i+tk5z%ki_Ovdn^2GkT7`{k0p56<=<&va9gU2Db*JxiY1doLHC6G*aVcdx>mC17dnW5S7AA^BE2Yu^$WpR->PI;37(_zl$iV z0-$7CANXK+NkrSx_zK$Y@%TNlQOL__VE@Gz=axkW#TSS4zEu<}UYU{Cv&8Sp%A2%;bP(y# zskps>%E?JGRLPY+vuSB?ed@QK@HhJCU=*E6QK#1DtP2Cw*&-Bceg@a+pejzznbWM+ zf|g2e!b;ToO8*c&-oDZd2f3oz-iT-z(k&3$pyd-Vq+tqEtJzY6sq`PwzV<>S=`3V^ zC`k$^ea>1=3w(voQAw!9cLH)xj2*YZtD<>LR~2?B3v7EA(e^2HzW!2>1% z_tGSwcRURK{T{%I@1;q=a_{(wFbVjOc+ezZdDi%ei1ADDph>{;?C}#}67UD`NZ!kq zqQ7&Y^U?&90RS~vh^TXQlyiY|p9Ft0ykWd@qeQ6=%vqa(+`O2Y7(9fdBLhw}oVv1aUA_$Pm`JL4il{P;Xy%a?SIK3~r zz*P*4o#hGx+o%ubfwrnvuF+JaU0*WI^>?*;nmwDAH!}XdX&;usF1M{vKW82y9DL$G zNNc3NGI2U9s#t04L?v6#!<&#xqYE0dP*2h1aVr{8bzd?pcy4?dTF8C4u}GJ~d#RYD zahchJRAC=)&PTQJ`*T@==xnFjhdDjK!y#JO7;GHx!!TItZye8(V!fs42_XJQJ6T%y zdW6=!9tL?-E{>g}qw{L3)pswHCB&@uj>i1VN(z^n!EoFEBd78xTjPkG)*l!9}70u{J}tb zeJY2`khrU~wxnBKfGw*y_buxW!-BO&zWn2+`=Y1RR;W{TVCmaS|7JgvN_=rf@lDu` zL-DDJK=U+E{b*i`_y{SG`2lUvL=g1r7YEF!RA*$`Ve&Zu=sy=P)YR8F)&rap4HS^8 zDs@~HSGzT8EI|w)`msJu){i#p)1%=H&+f87Q*1cT$j3sBi}Q$<*Yv9>-LVuDg!KBO z(Ghq2{m9nuHnNqwFuD?n~5kUT-vV>jH*x-65QV)_Vx3NDt#)8y0ENTSX10d5i87@g;9RFclmqF@z5FET#K+K=d-rML>VK!coX{icNB%eKzkvpg ztJ3;>niehkCwkNG;QlS?zx~OO=|0(?&(xn|djs|(oY_SC@gx;`LT0v*y*cGc15s)V zM6M-|C3?rjuGBX-Ihzh7%Mg0=uk`U&BKuTrwruJAE08Didr6P*yL*J++2i}xeZPC! zyG_d%DbL$qB>>7s%d3So0{+kB*40Z9ep38;4nLnseU`cE6cq7k`C&vIE1}#kI~y~Z+5ug#F%w|O0ZSJwpg-9TWE+=9>aBCr=UuSU2Qn0O z`11ECPZ;|`zTy$Zysg^byZ158kZ<5Mke!v)2fx8$c;Yv7OmlV?esi;iO4K|?#djF- zhG}^S5oL^1=06ga=RBu0pwwv2DUAf_+12VtUvyi(q`Z!ITKFLvy-579;*1?@Q%+|Z z{;+QNq%Ef5sBJz@9CV@$@rMg|Y^y*s_V9ex^~}JKkM~M^jJL7;ETeoSC=by+u2NZf z4$I`K_z3p(Yv=KkT@S^e?UinuqDG}c-xTTgAI$u)|CavNG$V7?J$M~8{nw@ndg}Ak z9fyt2vrUc0u}0^mYIF>Y!re!;z=(P}6$g0s#Z)!Zc*avK2Ha3&Vm+UI+|={q;aM9X zhx6a$2uWd#bPUX&F_2^#sjLSrAE+?fM4J!h%1mX_7pJ!S2kqe3Oa@>5`UxSEto7woN!gJ4{1T?bef10LWT3JYr%G5DrSzhR z5i`Qssj$PLh&Rc!5Y1hc`bZP8FJyEXh!?xe`q<6gj}YtmKzG;7c-wV=sW&!FZ|THc znG}bVR)M|j41;m$Ays4ipaOe(MjbH`u#R5=Dbho#=g`=%F7)6i@yFMXMLj%G=n{rf z?i>N1!M{Km+lu-xFsjS1_F~@4OXxB0+WbTUFKWt#T^`VT& zAP3}FDJxX5VaBr004-+9(PF0Oh*#VX?^UZ#G?j}^qh`X_g+3B_Dl+mJVe%QG^BDl8 zpOO?_^{-X2au+{hIrb0H#IFAOkT7)pZpvse?O>tB{{%ZFE&jB+e(rdt5XZDXrEgm| zAfl$Fa9EhddxXBSabOlXRKAc3KNSNUxyTlNL>-p$KT2zs22vix|1vWe()iz%(Ms^d zg8!zKpO9GuzO@C>FkE%7^@nnu(~a)8yB`JZmmv0|X5@#{MtrR0&mqx)4Eb2gA4G^Y z{CkX@GV1AK0pt21TA?GC#AT5pDmIZXkn-MzLcOp9BO4X+ON7LhEkZ9uycTkP*}8CukLudq3|JUbI2y#-7pVDXUF`FNqS4tPw~b( zvhfn{ z@Ilzlo~LnWo}H)phRJHwc#<3p603=Nj`5vds|kW#y!dc%0P!8UMLapLSp8uFxOeRS z`nZXSyfgBJu+k)7H(HYNukhGpw+R$|qs< zOGxpZVaU>1CR^D!J!&mK8PToQzG7i%qBs7K+x%VD^22mSW1NSwpDx^mGtCea26djqT5@Ol;%K%^HWdo*zXzU$-`S4mn<)VTXe{N@+6{r-!W1b4i; z>Gj^F&&Nizv@opnkBdSr@!-*T+cY0`18Hs!?ZLS<4pFrk<)W+*;VXLbDaBQy7(yo7 zyV1>NJ+})ihb+dk${A327A#`h1c> z|6iPDKl%XKIA*%}IGqVgn&=fL>ujraEL8#eCg%G}cW5=67T>tS9f>S}IRM`pXL{7R zn>+ZWd!xR(Bf6?uzVWYj@~6uV`qA7$|DwBtKAbz~W$q4of9{}{=pFQEVO^p0w#}__ z(R2idGZ=;;P(1gEsDq|=#b@F+EAsI~Cu!LQ;D2z0hcXJSw?I8fr2fMLlG;^8(kfC1 z65oC7p40rqSHZuCK3dr5qgl(BqT~bVq*==^L5S8%vzjA#htdUf(lFe}Dv(hqm!#MZ zgkQ_VBvoE8%$tvaHz=9tFGKNV;A@=7z>$^TEw#)%Sh?O@?Gg13mbszkBhM^J#9Cdf;_d z0~SAIK9zFJd>U+b?OUUIF8|HKbso+dW&$e`ljKx`s}JoSEh>C+9K`dnf@+$R3#uQW zCXiEc<0!rnH`PdA&q|2xY-sreanfCX=m7CDjW+XlkBe+Rc29q@1e9kuUzeSASdv1W z{K;R+?mA`4)yZd2c|gup{?l;#mnv4S{^KbwzKQ0fHTHB zvGIvv8pr&Y!vf8ZMMtA5p>gY)&;_wUxTw@$U8Sxa!x@0ge810(58~b%>^Eusz34)a z7U=FhIsXdi?R6AB8N0N$x<)kiQk#Q-Mip7VV1`g$8%e&p61s5Q(8G8Qq4hcj5;y!RBSjGkFoHbybg3f!Q zO^ka*L7*%_nkin|lGxlbC9CuuYx$oMQut2G1i$kavKLR_6Evs*2eU3V|XEV1eG=I+=^B!+n{Xx*suMHPzyi_y;^EPqN_H~ZR~ z*;bx&K_!dTqi7$6sAE{-rFx=IG&2|}Pi^s?JPy@~eIa8ts@wh#vP=b2Hw1 zj{PX?ddI#>*xO4DXQgR!a@{M4uLj0AqLD=~GpNP>3gaYS-&us3PMS&;98zUztl|^QXt8|LVNI@PW zBf&vC?Q;ykeDksOQ=GE2$_UyHdo*R97}WNPpkF5R8tjFcG#KubRhmzI-g|MS#4qz6 zAU@~+#y0S%z{r3jmIs`M8-X&ZEcSthV5(fw?M#{NEV8Q#=lRqUkbWVhv0h@-X&lJh z{C_e+nJ@d%#1z|Qdk&B#>)TN_7Uk&z^>=aVTU(t_LwaN7dms^qhDVVnI?k!YUU{Q=CT#UCGRfrAUGEQ{|tAzBdM zRg7CSUV*T6k(=XN^Ud6GTjL{Deubv>2m9by-!hw&2!ow-6N+m=6vCNDwDe}VBWXd<)Pz~>*R5ji2eJWBGN>>D2 zhMxn_7xm%7@%Ch8x+uw%L4;YNQsbb`&u!7gAsONo+lWupGt{oabiY(UUX>3ikplblWL-<~Ll*<8IO;;f`==g9psLqS?w%#zvW-r?t1VhE+ z101BGh-(JgYMO-j*n5jOZGOzD$@4fB_)2$LE59QFru^7A*doBKFSA=8s)_+Ajb8`h=hU}+Svf@DZHb3 zo{owM#H2ZE7~Xjq0@Brr_K7Hu)Cl}nhUx3NDsB)IpRgy13tBN5ZPtn)oQ^Q@l>C%5 zF5FQeV?`UjrTj&wdcPQ{ic+a^WD-NFJwK6Dw8W&1X6xv`W%ROC^vNdr6Z=KSPAX1o zGdeB|)OFG)f!%7|+%pB{^p38q;1akhIKCU#W9a-p@u~N-uRk99B@vumu5~4Wuu=i^ zj{lCbi9o!*$Q#Ras-rWN-m_iAWxnJp-`Y1S567hYt`vKr9{Lk^*N_^yDKw)aLO(fEqm& zmb77>8@WVFY>qU8prj)}wHwy5_My%h_(U=o-SJ=ufH0f_kFIARTZVucsJ{~}M?6gT zN7y6^l8t>G-`t!k-JAx&Z(RNCSb_Qye6+n=igImF8BZ2hOEj#LtR@BDME&dtOdR|{ zvIl=_H9Z4gkeo#Q+(<$Wrm0)>uw&r82#l!1k1#;*O*4 zS&b9hYM59nrlM{bmf{20vhAf4abOo5pAb6rqm^6xfu{(alB1@9VvvFMKoF5a|K6Kzw zm=W_l)1rgztS~7r%j75dHqw1|8@p^qb4#JA+Xuw;U0*pzI9% z1Z~F8gyc4S)`hCg>*YwJoP1#r)6MX zAVjSQ5%$6W^pJ}7)F*7qXZmG@h94MH>#Ua%oJ@`2whTU?PS5|LSwlR*-~42xO!&dO z4i`S)3z+gT|A&@?5BN>-ARSg3_F%Ry1_D_tVT7I&__p`5c=^LYX5#13`GOTbnY{$% zaL3+I;R~)svohwOe6+NfE$yg~{nXAnd?Xi+k@*~a!x-=liw2;`w^1ab5>}vKWA(yT z&zhJq!vZ?1iIf1?IW`#^jK~}*CSQ*1 zHij0&0}S7TJixJW?L3%~v@Lca0WULXzocVRNgvX6#rpe6Gv=+PpXo#feXMx>3~+xD z^@gUUPK6-eP$J$yWRAMbCf1=kzOE7Qs0-0c?C|EO$!JGcFSP}IFN=}-Is3L+04aP= zCMf;e1(c`=sxSSzq5$lInc(wrPU1pdwClk_J)d%EwBVHjp<190?5uQD(4Xhu!QJog zW(5bKhpvYEJ>0M0&V(P|GadcE*~9ODjXt>N=ghXkXKqjUk~o z5ljxd_(S^x+4GAJVt=5eJezA6o`&1=Q4J@%1KZU9-(^1;xcj-EFIoP5aEBk`e8~;B z%IyA$?J;Xp?;T}i&3Xz*M4qtt-*2yZs0i*qKYPvDJ?u4qIL;qf2Q7tvJ@WgQHoOm< zIdGitC(ZsG&%b<6B*6Qhe*qSLr1LNSB=2#GSiaI$H~$ zhuoyvm+&?wxvX0_)c!G0+TI4a!+NR!*f+wr>tt}q!P=VS!o}*BDA1``jA<;<#uQRM z_K@1`AEXjezOAjmEJqBi3$OYv8wo}U;vfnW&Ix0$Mm=^oS(qRN6Q9arko0$%3n!;6 zaO96r>c2QZ>8>X#<2#SCRz8ZlTCEMc_hbdZ)V_!xiWhMxnS5bKc^O$&4P*M_K1g2j z0so`Y{;uhn5F>w2A8Sg|i42&zDC zkj?^fUHJA%`NntViVr(UX8}>=oHf5d15Sqf9^8#^BjL`0n-2FpoF~Vdm6Ma5gFhc1 z2mI^R`!i($HT|Dh27nh^E4k8rQVWo_ZJ!CzMR zy>s?M(v*ic8?VIWPl2%LY3?89$ovK2sIT+#+&vlA`Go&<#qC^vyLjB2&1`L`^a*T= z@dIiZ$c{lbe(w-j3`2;9gLtIaAO@)|0N%rFwn^gk7lE`>Aw9lct^&4J`~n|!I92iU zLGGH}YQ7m>9PO~wJXA7<+@X1;n{8C@>gyAaiALrHsi4z9Q91;ggNzbD8v^*(HNZ{a zNi@dWtaPY7n4|M)c#n=>Sd$b_r%g_0DWJCllT7%GurJ z#s1h<$D_@CJgLu5Y<9|nHpMPtu>^(0TG_@;Ap<}}_*yGt0bYT&@5j5{HVB_fQ z?BE2r&2aqz`c3%t^z!xsy7W5epYI?D|2caL{s3_}-zF5X0}8AG8N_Q28>4I z_jEYeeKvnyykwb=gZz3j&pLk+Q0+rctd(R~0E8{Q1qj#ShmzCIHE5^2jPC2c+;|-1 z*bF+Wzw2|>VE5&#=H+z^2#J$pxi5#Apr?(`#U^=8o*U-{j4er3j$LMX*?1_m=iArx zMRmMzd2q+UoeWn7cLv-AaOc9!hFb`CB-|BngW;CJt%7sucaFc0by^)T<`u_Z^W)xSuO4Yf=#fUrW#C-(jen-JPhl*^uo#YTLdRPxaZ-mJ zb5|drB{U8(IWOhwCW`$7;5|slV4HGgJJi31QQF)5b)-N5`5wc@?Cfnda~~Gog=ue{ z$;+9U#2;uvxFuV5cxO2^)#Gj4hVewhI-6K-$8wg6ymT(85OWk>O;b>;YtD-e zi|^{E)$b93`ME`cnZJ|FeC(7vH{%ED6T1S@lj6Jj#|}ML{o!3g7rQ*sYmh3%T!XdS zH6T_8FF!JBDSwY1f!O)*fC7ifIsSkgUxVVruA#za_DY9=kJNSRT#A;)cZFhkNKEdg zrTk6w#$(buqvhKRUFyDdS?8*y7zXyYP)S)k+1n9n--b`DewMay^%EBU@ig>scTRTD zhu<*VMt^p28{A=V$Km@HgeBqr26qm=J^h41>DN1_pT8gf`pENOkG}h3>wmwGrq||v zbKGqnJJcAe8l=Y)4us$Lp7b_}G6eEiM}z@fjGlskkhQn_fgOP3D5mgZfP69(tmYi#7ExDf52D2( zrI-1=q{sJ{dwieY<9i?mbY}X~dW8Qmv2XZ&J-)3T@$c*r-nnmm#hzNAb_3ZKVKr%c z)R`W1Dg&5HgWc^Q<0F6>xMJICrYT9yg2vl^fCO2w!box*Ia(FR1g)9N=C|-|C$Zet z)QTH^oe#jTyWJlR*}bvI)&bWr;5G!fS=6rfda8^btYms8Rv}<~oTs|my}0i1@%T#v z8+Hwh4zz=*On!p&U9-B|v!c22ZG$EZLg3I;;2jK{$i?8=a$G?2@~DRQM3V<*~2ng|=J;DI}=mh%VazgLN<30JH~l#($b*TsKSTVomB`iWnK zp799ws6J+lo-B30h;%7hsIS`IQN{%+rs2B1viFSmMbbe~i%6Lh;Q;>7dbs+}Xe{-6 zgHS?oeoZ}wlI|L4iRY@-$QF9HxT_F5*|^W4sQ|s&oSbHTb7Oa00iF$5I_`#&M@!{i zYx3q2vT7kUQviwS)mpt3)rN`o;DWPir>Uv%ca)92Eb93lFRLbMavbJNl1*DVJ_z-{ zY3{abv^pEwyC^?AWt!@vGsT?{zu;l2WylzdxDeHX^J6EO9H!YX9uBpavMM)=Sf2fu z>F&D8T^HE*Wqf_nZ9}vmojmu5eUcBbpUFs&m$BOoEAbmlkWI;y4ZRzp(dK4BBcn96 zk9_t+JLF?V5PT_lOsfcvTSYyCXmNEl0ZB#@7cBoUxtsJIBX0}33*(t_)EJNO zR$<-$=H8?mXnOQwxsW=qYMOcha{}lrHveHlfrmuG>IQmk%t3D7iNBna{m`bJ*$gO9 zS7w{^atxO^q`rp8Fv}sZ(py9r2E1-Y{SXcqCcw&dyXQUGJHVJ;G6Li^xHH0BQ#Oy57CZboT zq6ba%Tiod5>b!)0uJph-^t1FJ(nL~eCYv;MZkk@$u>;&^m>5j2?rUIA4T-bVpo5F= z+0qY1!cP&QZ7gb`o&?g}b|VO9$-{}J{4wytmERNi)0AI^9}4Os+<&?!zY?ENbR_d( zs6z0_2DAimLfX`m(?IS3gZC7>-n7m>6X|4)gu}_b$<3&X(N^7^Gf^4~g+Z_E9NsI= zO10PUE})l%7DG8QhZwn)eepu9)NVHU)|IC+B`=@?CQ~ZBrE>il+UMpv&0dpA8&)SE zItO3?r$+|b-$;d&cXEMVqwZYEI?6=IwP;;1fLGL1Rt=a$&hLt3%>il(n+k*sk$r|-LDI>3WDW8(@D!Tzsgife(n%AO$b* zrz3|%rSl8$0fiW7uQJi>zrw%k*%lnFY&qL|ZSM+R%~<$O z+aRUm^afP6e_+BAs~ARuHOL+bJ&BuU(8Fy$nFjS^CKL~(EyB7cv5Nkv%w!Ii$w)eZ zN!7zL?H2&{1ME9Y3E-E9B1SG?f@PHb?UaAHf!v>we@70-28IP%z7}t2c^&|YGK!?j zs#Je`+P^TVdF4@&dhco(nq%yB#y?W6{zA{|^0%VE_`}q4Aop+q22hcg1Bkfxxz1*v zeuU}u)CTa}vYv_ne15nSHrv`o!yN7$Q9!-0rA!~#TIy+r5>R&LPN^tV?DRpC*{ zkQyR1mm4oR_7h0i^>D5I`&16a>c>b*;~@cXKgZdBNQIP}yia5V_qLc!LmfD29p81MR=1%ADN! zKAJ2?y|98L3W9C*lWnD;r-=H7v_)pcM;NiV7RZv1bI1`@FF{xnTC0D8Ao$CvW)Rqk z?{gi)iK}UOMj}oKxVq9LtG^ugrJ_Vo{E}{6+xkPNsg?hfMUbF(ce|b zO{S-jrS$cuN4?J_2hDH4wR^X=w+M8mh#gX*t@veMw6ZUl8QIk#Ot3C?=yj?hTktf$bcWIWrn4?e6#;^ zsFqiUXul1Zm#fa$R}0zm4@tR0y&+DhTm6Fh^D8aOeP0-YV_5^z{rp+2cDAVlN23plb)Fs>EAU5l;~>9 z-2q&=Uh@x^B1HS!*+4`+H+MaSlMqKIPmZX@HyMuXAb4Dc^T&P6{l<8?2|)5hEz+x5 z7#TX+9R%~)(Z)@8A<%3P4=CB#Fah^IAf5>iTz>NO<_U5V^yIUn^@| zqiUrMLgS9&R9+FS3v0%{M$OyKL=uK8k8!3a3|!YRaBo~5Mi1SC5z4_{OQ=$`3KwMjxwD7ro6gK$xQsX6#=VL1)id1$4n#M?Mz~ ztn*eQ=^9|QG$Yp6zJw(vP$KW-+$#a>ioW*c448+28W=CsFvq&Mxr;k8(wI7isn_0e zOGXl!LF+t)d7i6sRNvsfba*M z>&g(O2X?e?25LqRm9BsY@XNC2Cm6Ph0}|1@+smUPOn6PVi-FO(DVgs1?K|4Dm`f_w zg>RTx6&bO*+ndr+>fSU_=Ij$C7(K+4_545FD6j*CdUT!A-5!qeOmwgcHT}-cWU}iw z*gc7Ds4F0{Tmk&CLn+ET*;c3%DDS+l3bMra;36)VK8>i!8XW-!JI_Q(aLbfi z6wAxZE}rzp&cS-s&s`|M7r7pR#M^}qbDkUsc>5!&^Hsu&#D7#tvg|rYrNJhSxwOfG(U&dZIm!(2w7%AKvc=i=pxRRxkkUe2V0K zWZ!Tfz;xXdG?;g432!x<(bQiA0ol3Wuml1A1s;+%25=1_&D`w<1aS4B)e1{@Ik*`x zz6+)t{tnMb{QYceIWY`(eL9=1)-vxVS`w8DO8J5VLa^5}aS!bEz?QCExe)S9=K=Gt$WNOk2}>fcomfoSo_#|#BLPNHo$(L~i>TeXpE znL*|fb%Gn9JUFG1xO)t;m!Zl}Bo5h~`y_Ug={(d_lUPR%+J8$$J_E?NZ{(3C^2fWg z;9z}wApbUsx707dDq#MqwHrRbX-$Y+;fbTz%6A3eNCT#jQ2Ah%0~U+0e%S(vf#ws+ z?aMVeis2U$md>|15YpDN7n!xgm71NujKuy~lRUXD4}(Dc5Tg$M=&uQhHu~Tr(H6!F zu&)SwoV}Ty1762!rXbe-lgU7z!*HwcF0x@2E@u^Hpw4IcoWV3-RtyiT^_Vjzmj2FK zegs1w!sMJ^_&dlg!r6aFoaIXl24mdP$Rc6NidE1eXLaS{1}(yNrzsUg*e!CITV%IX zn&-B0R5r_Mx(BsH-NUH+?hfWaY7?qEk#k}(=)Juid3F9+QlY6)^Rn2yEHy6;=B3HJ ztip@r9Z`RJ#So7XI`3z(Cb0LKdI~k`JPYx0HOuRaN@{herZaakYPP|>y7JB=Ouo2H zzGt16GIBpe?tBm3O(RsGfy*dmStEvP&xEhldb&p}*Iww2KawR^+?9S{EkB+K9x41l zVBLi$Z*9%3p-s2b!7gx%mx>;=Z`rgJV8Z|kXSa_-9IN@e{07oh*QhUFrb+L{=xoT3 zu9f~xp_$dZlQF%brf6N)g%3eDeXpL|5epu5JHl#y91%3Ye)t9&HpW1~{viTnFU>A6 zepsTroqfX`RCg(@NQ6535bLEoFJ=z;Cbk_%4kp3HI>DIEXH(^sF!o_4c3poH^&}JZ z&Qw%CqlQe>eK6gR*m2DG$iYCsr{+*B5klP0a3<6h7UGD5l0umr5PjJrVVytVMBA zdlNF2QfpKW%YZPPv!B>z$^CauV+SI2{}X=Np6o~rSIQIegvks$3t(ZJEM^sY0KY-} z;6_}SjJ_5x2Qo4{Kk8n5K9|B-41qv|BrP}5ugdo5k)EGe;H#>I$=PBxMR-sw2%}$S z)T)RWrIU!*&{HHG46Lvh7)BHvK(2cI65>Fhr6OBogu!|1v9WVLneW9QE(CWsB@l|Uh9by+@fXaVOXshr5?W+6bjIR%`xwc<; zJjxNxlw9&hytGQMCT97>Qs+~E-hm7jPTG4eIG{+!iU!PT9O7!6)RWw9u00$o!7@!F zyMhXYR(0NjCwdsmI`zX1W?~v>hfPe|LM~kkL@^_u2onOjfWN^TF3naWL6bBpTqZu0 zC;&XU5+|Z|2xm=9skDzVSt2~7HeMu{;;v}KB%>WPF$DamV-b#Rzu4dkCl7ba+JlH8tn=?_RNv7-BV_196`8!becOJ7D|ULM(6@dRogn z@@4i2AloGPL*CaA1qK(PI~mdAGzLL!lE17(@ldY7-U?qSsz{VY?FFL9GZ z0*V7kx)m-+Z8O$(o!DV1O;y`BTIJ|CZOrVIn@?flqZrmA%C19P`frl1{@sW;QRNM!dM2=DCVw zsMf0azhUtraQZQTJ8l*O-JyITc`eldMP5Y(j-FXLV zW?F-$O>bNrT!Ws8odcrNTdeTaku(>mhS`GrxXAcW1SQ2LRGrpTy3_=rkn0XmNSQ7q zEyKR*LZMU0>q-<3|Lf3t)b^5;e`Fd8Ev`{jDWA#k2-DT56Qn$V80FoPSzZZ&cy%Y~ zc#Y~KNyRoE8brG{p?3S*nb8I2y*qD1s6EF72$}5U?vy>*_@zKRxoZ)CbclUoW(dfI zM-FRreMvycp@<_XlVgR@20A*TPL=fo`rK;zF>u=cX=Y;G?_FWyNmCUt-oD2K+f)NU z(Ro6!u|%ZsZ@~r94H%k`7(oCi#{MP=YT`1x2mS_vp{yB<<2Q<@q0e+?KOnjKpZC=E zH?3`k-WHQVCl}C>`d$^vtmC?uh?l~l9n=Wf50rCnz&Peg5}1Soj@tKp!B`w%yzHN z7W8KfkCIgt$6xlxf+lm=+4JD`_P*n0jjE3BN0#vWBXLfdrNuFrDhaDktlIs-S z)ibpqhT>s=-9)SDXkZxsbWlgb8~W3uuA7edl5PCqyhJ18={Sz0L3P9SH%vyD`yqzp zi1Q*DXh-L5_^d$}UEJytc-Yl*@x#6e$vP3wWH=Q|fVFR@3P`Nlo_@cH70N(`nCXwX zx<4*;QQ`7?T~vrp6h<*bMllbJVo(@GPIcWf?#T&`M3}yMha^(s)T$={+&GsM(8{45TtOT zyfWP`tNDHqJGX7tb$8)I+6OHs62T6WDe9Z2a*$u0w^lv3TdzygPB4gEpb>c# zs2AnWH#2H)5kG@sB|)(ug=$^_UqR@Idh4DP(c_*kc)C(xy4Cz;d_aT<1h$&aMe%dy z%&|r`0p$>fgb~7PIaM$q{?HyF!b^k*?-U~ZcR!53M|>1vBeMi9O0t%7GaX-Hu~-u! zUB*W(g=7z&kH%v=7z(`lek$N|UUmmrF$l;wu+diCPFG-N#9$l(E@CgoD{{;SS;%80 zK`dt9oobqo0A#ofqoLd1roDHC7(}4B4=PP zFuj8~`RZXn2=(vsF)@?ns&CfN3mmJ}#A~Uh;J$I*`2dmMZ?JhT3~7zpxs|#4p_=t; zE?zuV(+Q|3l(eoNjo;+m&yuSD2$AgTO?mbT7OxQk;4Dyok+O43-t2r15Vq%;h*Gga z1fr}kD%W`*gD*G1vJ7_f0nG9_)v6nG^ny-GVC_XFF6gm~fnReYkR~r=oLMH0P5TNx z^P6b$8_T%oo461P>ik&nF)a8H6VYPCY7_B*nZ8*qZK9A8jeZG$Qb8n-@AcM?wr?~^ zBc{sh5gk!cRImU=A<55?L~8=#JVB!Ec2?jdbeE$_lGD@}&TPj2b0sG*p40CJ+)-(8Z7q76t30c$=b9*hN%?giRpJHE6Z_+QYh&;)A!@){|F^Z;_Nle)tkL?f1^mbUzGvp%O^9f%_4W1rJ`cUwd*{!YnKNh3 zoH=vmOm?G)tm-&Dl_RIFIIi;b#IdQJg}5@`H3UELy8?-WQ@i|$1MLTPFXm_|28(B3 z=26~EgVGznk$ZQK{5=b98kCauY3oPmEq#j^_gB2?I5N*WDIv3T%Po>KH`0>RJdQHi zaFmLU)JoFDnyNZdQ{<&yZTy9hFDuIAX!}=Q=b*mRS06}tuv2S1d zWG_ncX<=KdU|o94i|NjTmYHbk)vvXH6XIZ;nyH6Qph3Mu|Jot6z>Vr6-PIxIA#eKn z1kCyWvi!psF#D;eKdq(7kls^mOsxp`^vO{nOpm+OQTx;!0NJas4FL7RER$D6c)5`N-X}Ceg(8b#dqI7Q^jlAf zUak07npTYofqV7SN9^H#6cUVo;01s+`XT%SuPm7&3`XdlU%g0iT*c;OJR68&GtcUr zt*6Mxv6o8ZqNdoJcugmI7SH?%RJNQb4n3^PrEq7%TteEmB`)#Ia%ElNOMEfg zc@_~JbF}(BDq&~PusK?4Dyfps)Mkc}n7rsFO{WUz35$>!H%yXueN$d~hFmU1MUx}N zZlVN9YnxO(WNd=dE%yKkx8@6-Yh-?@{OpY6na;bZEi;{8q+Saw9p&Uz<|o6c?m%iw zfPiJMrLylOj?}j&9+S$xpBU%fo>-E~?n>Z8jYX0Q9{3M=NI4bs_PT`+ihf5V%)!A{cS0Jq- zJv)b~VJ1fL_B1b!opqPg4>{S8x-gB*@g#ChsxO}5yXX*PY-g%bSA52Ercq|d=aAGU z*$d7lijDpqYnyDYBJm7DbT^4^@S5+}Qx2WHT%mfB@LD|J9oUSRuCgEXdFzTySM z(=FHXuI_+=ikP*TQm^;`kRgIP(a6SC{?FM&i>VXXKhWtfF1D}TbNW9Djp|Fg97BYg z6GNSOi21I377s<$f z-v{!GJ|e>^nS-!a+tsAvd^nKWtAMoI@Mi!`h^ueVM0d=U>q0$iajWf4GP@Sz*5$YI zp{c-X6*0-F4r)Vj) z5rlo2tE3oxY`xJO=TbK#^@&YGP*#$M2|If916lLP+V@%eeJ_Gm7OR_JCv>1zZ5auz zq{rS4L&{Bgy4W(wd!Q{$jdOsHc=39gfGCYd)*VAHXppj}fP9FP8PFJ4$2`h{DWADR z!zHdv9jw#oEi}DDo_M-%x|Ig!$J=oWovyA*!R`DE{b(@{NfHOMvHbw_;Fix$` z$*D~4wo%b(R6b^{`86@)9}}Ab|F6@h1=6E=jp{u2>OA@6!88a_A?#jMI+Rx?%y8va zYmMw@k)e3}R{!JVh80B9qmd)JzU9sEt+K9G57%(>C6c6aFg%j2I_GsU9~wfOtV`c# zjMO(m+7s0oB#`5LQIg9(O}VOaL#iCbca_r@Zqc<|DZeP7+Xb3> zpZQ2L1K67!l)M1RQ;(pgMfSHzk-L$4F{@%$)S0gn*dRyp)lQvN7J|d<1lcl`MA0_1 z6144U9jjF#e}kK_%ZL_4ESMTF)ZeBfnFVkfC8f6HO7$D##mujTRaHDk+BVYC5K&mi z>_Rr}8`T9`@`#ZAXq~;?%Wkiy3TDgNt-ZRVTG!ioH}gjU*`%FwsL9^6qOB(<+8aCw zO$Dy?RHR^ey#itIk`BfxFlN0Sr zbD$Tw=9UJpYK&X6_xnz>&m$43rx?`xbEp@_t=?ce57hS^rs2)Y!K>aq*~2CocNwXZ zXkLSw#9vNJ@Hei`gS4QF61CLyqqkM%R`LuFsFBNe>-nWFT|P!Vq*D8_9HhwuA!%y(!-*~=?*Jn? zq9y(*`N^|Xny!LpY)=$(P^TTb6rh_EBO%}PMxo=(w;(88#4}zIY&v^2)$mimkE>I4 zr*od(E2YV&FWgio>LLU#97$&UxH?%EB-^bUUI%=Wufc3%7w8;uwXcCC@sCUKb%`NT z7nsC8UKOnkvRI9)KWQ`xhYX`?nsKAIvKwW;=G9kIXkQt`908L2WOdWjtwz#-D;#U@ z$fZ7(D$?KyxkhUB!%Zg)Mxr;sovJWiZvwaE4I1TpP1B3@QWEja!SeZz0d+s#BQKTzZBJx|2bCngQA&&ZYl{*+E& zb0lKtc~~{_x+}nrW_B_G4B6i1E6E}MT&0lPj}fQ&7ASLw#L8kn6jOJ6-J`*$rF^*w zHb$)6Hm|$B*nT}%BazNs9{*iE_|2#axsga&2}tBubfoOE6sra=@^KxRxKyuEwW*4lAi}FvH}&c7;bEy@kRI>}9m1Pb~O%o8q3Y%&%6jX{=_6L;3$x1? zXO{%()l2TSsT5ti0{zBO727zeB;@#&?v4=3VV}?6Ucyi1X^Rub*)Qg5J&{`X9pE%e zTxxTuvUV|z`eQEod1=(|O?80GEsu>REgD<-zO%WMjEmBBLHX)zj`G!B*jpDe6#$4Hrt+l{jnF2r7MNRX#9F7g@imDT!Ej)&>2W$Ja%~ zD@0An7^|}`n7{dmx(FX~#4-|7lkfFN`M^eXyryf8ri*aqVsC{`5bB9hP1oz(6B`jR zX3CaeP>ZLM8a$uoru+o-@@Z$$NAg;B<$+V}3NNH)nx-*`FV*q@V?V5XU2fwOix^_z z6VODgzGxm6i$OPUv}49!ovACZ_XiR$v>L7BU(@Yc#X^?!)WyA1mq?e%2HSr4;@5@Z zi$8XTT7Q=ZzEI<7KEC=tnMJAL&qv?Q{0FBi5`QG381$)KbcJ4VC4=1c$+QseX>?Yt zh^rg#(Gio@6_ak+&;?$s3_fwWR+2m{_5SGOIA@(pzmuTfNYiRFBBKmTb>i1nG=H(R_Ey%h(t^XC z+9lL!97A`X)XtE#_9BVk!hqVvp>*w%zM;^qbFFBE^vUiK-0!GOw5d*S-gU z@sByH7FWJ))x9mX8=uOCtTitYp8lHDp`-4v=`}__#~p$Jf9(eWESmGVe;qK-ZOTC-%1sh%qG4DkN~AL6n>jq%~ICcO>nq6{-7W z-4A4$NU5$d=J z!VlZ04q24`Y(e{Hg9Mn2LwPe9hw)}I4wnk|6{NO=7>%>Jy5Tg9ijWL%iE?TeS8h#I zk`5~4~&S@*z_1Hh#*-RYW z6Nm3DWTt4y9*0W-b~TFUoz3A|J>>PE?lqS}>!C-KH_mjb2*e_%Z^J!&GWO-|(`I%5 zE8sC=P)D!e2Ti(+1KvXE7U_dMB1G>1HC&0gHxjU6eiz5;}$SQwzPc+%86@^l2d?psK0Eyolj$MEK)!XX{QH z#LP;2bp55itYH(_=tO*py|c^l;RpxIE-zNqG?KyH^m#q3vdhcVZ;rxRZjt+0t{#@p z^YkaX&wQjFDEWK!KuFKYNO(PcRb6;ASi+hFlar*_O!sKL13d9aS75^2L6X2y#kJJF zuD}#mGj)MDNS3>Td(x}QM7NfxYC64RT4A^H>uSYRlvJLB#FD1jIk zEJ`(?c?;4PlsgXr@)OagrkD1=G81&ooGwh+s_PyI$=vtJl0EFN3$YmFc=Ng+FxF7E zgf~eJCncFHyREvdm2X($Wr%+9Hf0 zRzG;8^hQLVE|43_Ft$l=49W~JZAE%xOz3!8!s@ir?I8&~b;bI^_Li9veCmotPF-+O zxCk-DidC!u*EcvR2haY1j0qQ&*avUdjkQ(zuWgi-(^q=Z~sH3>aN6Zm4Bn zeS>UfO+t3G+S+*&46qCOx7%fE73J9S0rT+Ll?%hIT*4P>sPAR5N$+?W_m_yK-6}@qNx#3m5aCIdx_JX(0xVN3s2YE+84hCStWMY)`ayU5FwhMnQY&9z#S)ey+^hGsr{#vy zZ8DTDMQmg!F>EWIa~jJ#W@LfU{kC6Zz4grrycw?#jhejG`bv-U*5s|p(M&Dj)aLAp z5zSNbv&loa0R7^>Id3rp$Jn(Vs7>0L_SB?$n2zhpD7E?LNJH{hGy8GngmDwRHx;{)ejZA01B0P+8-O8bjo%?M)3=mA6%QX?Z ztl{fF{I_Hc14iY?f9;w;M=0yI{_zXn)UL&=*j<5kbRWr#r@r}pecn$ySb%eTJ!Z8& zCX`$i^k%w=_lqXRx^qU*zis@Ch|}FZv*e_1B}4W^2w|e>b`A1|ejsNGkh#J8`0=qH zT$H+$n+>J~tePGEhsd!oyR3}Ggt|cV|I-5Sk>rZ>^u^AlVOalqzjbGQFug$-4U3rK z^nEfRx3856dQtisSswMS72#R_b!-x&J*P!h%Ltz(&i5nocAaRP;T@$;i`Ep$NzxWk z3@vg*F;s&a-Rc!6tbrncoZ6za0a4458p+|*;*L>+sx85wmk{gDS~;w;`R4byu4__l z#N0C|28v?3RjTS?SX8&nd7Ys(k)T-G)FtDBrcjJ`baieNfGPfB6O=YA>*wbY-(r4Zmz;HFe2#u}kQ z2=jPoJmhNUMtPT6>vf41};IJ=U-yJyg7WRwBR-IvGiw%mPAKE37cqkJ@~%=H4SG_xFOIJK(WmnbkRCTHs+ zr$vfgR9PEL_BplThV1Pk^NVn#YN#k@3ZM{{haaDE86*gji=gCkIm9A%AyF z`Sd0?=W82p5MLUX=;CC5d@ndw5nU8X2Ro+AKJ2_6Jo4eKQp;eW-f4@aFU_{~e`}Y? zeS*>_VdoUk-7-wtY`o&OyemtjM60j;=@Q2TXKLVp3hdxHEW&7gst zxS2d5HA`bx1odmQe(Y0O!U}$b-$hVw?Ee8A4QS07E7sSPgseN)2dR1c8mYeseCaiM zQl+=kKam-9QF^_g%BW)hp0b5O1Psw%0Xx{P(M|yRD*>u^4qV(38p-Lmm|121-Xq;W zb8^daz=^T-qifl+Me5ovx~+otYWW$`UM-emf%aC|w0_3)1BkLl_|>#vONHaQbjX;Z#O9(t!rkg5IK zsg+)DCl9f|#9Z#p#>+^-Z2T2e=*Dx_g__`^ngsqng1ea5ng7V6_XxwH`g1N=(emI- z;5Mk~7_Mk>fIs44rGwCv*q0~A!@^`eBSQVoUEB`2^Zn#PQfaS<5t5#(lL~o0CwsDU z#Q8?EXlv5>4vOp37CS4nDSA4{eU_wU$zQvY)cY6>aGYbUO%ZgzKCJ;*Fkd(5>@$1j z!xhf#5qDno&e;LysrEwW=j{vp-7kmR8}qs|!S>VXyy-*RQKEEC54P70S=3v{l>1O! z(AVBLwEgs9?F)vddPAjDAf~^OOIN$xGp2LKs0G*a@(QQhmDbDa1^g^Y#N=b zj-aVQ9meJ_ea7&n(}Z2puz3sEL||7kU2B^z0MLg`2A@KB*IenpDRl5lX%FPOV%dCQ6v55Gokn&yhnD<+C~EkWQ#94o<^Fga~X2~KQfI`^ntSR~YqT#Ch&-(Q|G{Bk1_op0PdmK6XuVWUn2P0^u*}-UX?$0?rifs24uZ_*w3Iow z2MDEPy&K=S#Bjk}kd)~>v->UyC%OskGLKzoXB(O4sGghosF%t73|X-xZ4*5o*fr`%P#}b3WrYWN+z^yu=yyi(Yus zd3WnWQ%gw?TfA&vEpyk4fqDE!Eo4R+t}f>Fc6%==G4yn?>vzj%Mh#Qhx$Y*EIu3m` zT_XE&Gw2p@1Zt`n?S1)PGmZHdFI&hW`ql@BjH(AnwVGXCM@=yZW#RBX2= zE=b1$?kp!;e0xS5sRPacQ9$IG)FpT%9PKboh$s+D8(WHOe)g0Ab^^P@@#LTIq@{tS z(wiY?n42N**u$3w23r>B`g2}9f9au40e#DkSGfDdV0x4szpdcPt^u? z4bJ|7o|F2^dCa6=e7m8`99ZSutE%%-BB=$kUm%6Wf-4u!SA3t z&)==md&sZxTNTK~XfJUHi-`u9SP|P`v(VP^Gew&|EV|O_#O+IMp626|X0pdH2HT9?GwLcj+T%SH8Po|IPDvJTp%w|Bn`H`{~DXI`9X^ntO=P zy8KssxMy&FF5%2vO;t_NMs*hEadNw{xV1VgF*dcc6vNRGt!VW+8mq=Xu|BWkeW z^h7?msK@K1Z0Ab&L&w@F{EbO&wFz;SG{U)@4HCJhT*&CKALea;cH`5uO`WtCxj5?+ zW*|Ac7x4iy`@{jj{pkCDuikt2`*_p4e;fJpvHvvoHQJxEY*9os-(9{qXTMUVEjEzS zu4E;N76rqMLcQgGW=|?RnxzT00_+641{|Cwx=xab^!XbRH5mn!-N_@J_)50N4luJa z<|}a)sgiR^pix^HJjq^D?tF1x?UM0Z7o<;H%)t1>GMs7OYuC8;vyuB^bWM|AUr?z= zYtck@ua1RSf+FY_%fXOhC5IfO=MX;|)vyiH7FpO8F6gMeoyxEv3))vf2=>G^L&6+O zlv8R{UQA>m)->hMY7d$ z5CEK`<*>`X^0qo?w${;BI;lr!ywi0#Da{qM!MN4-1*#!O_C6;wacZKZ*m#G)+MXQc z=2)UVLsXGKMP+z!Z(#CBdsYsU)%FzPz+?>q2Uui?mVnUke74mQt&ruB`?>k@wNVls zZe%jvk0S6Jd!HFw64immwqDB#j99lFxE@Xy>II})u zvnjD(ZROuq{-#kybferkb>0FR+o*hm(FU=X-@Oggm;Kr+!xJa!IdF zHmNILU-=~6p=VL5n0v{Q)W6k>JN`kFv7hJ2l?vrptDZ1 zo1jxznU^#crLxU^UYe15g^n8P46O_%3-6oTf@yM*nzw#X%;EQagP7EbzQkCkmIh)Q z`#Al16N(9;gUyK%sfR*DCtpCq!A-w~1;@zwZ20`6p7mR(?p~`=SLluY`vSDwn$B8= zjbjcX%idGs0IY5Kp@>bQhpaq)fi=B*eovRw5HF$91c&p%iM_0`RldqM5_@siJqisD zX1vKg5#&HjtdiO2jnw_kg5X5BWtS9`2rlRni1T}}+HjuX8fZCNt=pFzl3ox(cLt zY*KsxeRrHxEL5?rZS!4HWoyR6te%~2eM;wkgNge!Cek(})zV!?qDf~4tyY<2T;NvQ zS$yA@X*H;vCV&$aKQ+wM&V6XtE}F#PdL}SLhm{|ow11ZHI>iOr4*>IxiDS& z><7BEN4iwsWxJ;?#kF`n^V86{dg5|DH^Jr>IBQ?06yB^D2br4=)T{$1y0y;Qmn5Pt zn5^7h7syXo<{F|MRbecceaS=F=o$&zD#oRB9<7x_E2xk#^wa0H()wU|-w27hSLlXO zS0tKazEdmSL%BE#8eTAu_@Yhs6My#nG`<+&EH&MqY%=}?G^N+`Ae|+dvsNQ}tcQrt z9pEBjMI?u{>*;tc z)3>HK$ZP}uV#xpf$qX>iD=QXF>{@7*!)5`)A`j7HBDuf07traxOZc5tv*m>MclmrP z1C?7=aRFjaM~m-$^us#?7ri+U%*SfIlrd3go-`9c2W$)AD$3I}{h2LAbcAFFvENF=L`V50+LciGONhV2wF z?=zQ18q}?0G}-QWX8+Aq3(oEtIN8Ii>*H3dIEE4Jm2El9lS;YkscCJ$UoG=MiZyIM0pxW&sf}BwFLZ{E2%_A z|H$GV>3V>)>c?&U`&+Fgn+bASOCI4z%&6tJ0j61mjcB4`yQo%*un-lY_m*=YB#~W2 ziBQM8)4Y(sBJqeXWyDyN36fQP*))Xr5^XKnx|f?y?g~{eGc4smKK_6oqBNs*sm|mP zN3)BCgOtf1aY=fKzM2!&4gNHwYMG}&mov?!pZvr@)}7P2oy?eU-Kv3N#(Soszm-LCq-pl>wQ=0~a;dw>f?v&Zq0PdXz0H0}t?5d3UCV_0lgf z@&vu4D?H(8SaH&#Rbg3Je^*zE%UcA4qDU)KWov~NrN}~CCYHXFZ_A|&mzO*aAeJ0*eDjKw*nSU zlIh19`v(SFFLC%ykU}R#)jcheHYy8tVm}fKu71B3y->2Sw|0)Cm))Y-3%5_jJ^WN> zXv^CHid#96IaOA>Tbf7O4|`qKbbj9jKudKm)N0SXM9_&v zofV?+j1@U6P4MvCw{&;J#9l;Fq?Uciv1=+E}FCxYWbPk@gF@ z@@nk!c!zqPM#hDDj0wkW%{r~wDCqa0IM_Y?Sl2Vc66_6vF?$ZGU@qs-c!%HUAm`M&m>UXk`flBxT3aUpcIjYt>7aj)DB;3uYL6`}i)ySGB=uHO=(dxT}X0kdOw zFe~-|=6MaKU;vmX{o#T6R}-nG7p%8BH?pi1wxB9Brx(IJ+%BN59$|`mCOYC&$j0=- zp&FA=<@}!BwK_ZVm~O{MC^4{w2GXP zV);(3!nB}OCIK!?x{cb(zuwxY`I#d>YRYn*LpnBbfb41ihLK}DyfNWst7i1p7M**L zFWh&eoX#-AD(Lyn8)_0}tLB;)(%!$HFPyEK;;a=#85jwh7^nFwlm-b6V>m~(-AAau zF$oU-uBg}+U&P@n$UzJ$*zeB02|ra&nTqz-o+I@Z0}&sJGcb&DNX`c}!Sbl_-^1oV zPc1ILSe0nGUu=&=bYU}qxrSY#{w+7>e%Y_DcjnvUS1slwl6LMDW@~6M(~6%H_~smt zX92V7bb*jpyLkN0Kh^zf`tnom5 z1s&bj2)M{R*DhdzG1U>W(??>hRmXv=`87NP7uxG7V{;x)QR{3f}0v!Q~~!dSxw+_XBrLSDs*lOezcZ*b(^`^qj+E|X{;#bOr1E;Vuh_o(Q9+w z9m}QlLYO;8CliE7Ukc2n8)ax&Z961xm011Afwtz82zp6gR_F2dtbWVqP3G|C)qdVY zD#YZ+9m*nKo+&cFu^ej(3^X0foJ52j_PWPzBWvGh4{ z;~8%emZk6g)?1eDuU!B&stp%tQsdGktMzA)2;8aozGDT1TrkTfK@>95%SEg8t3pC` z1MUcW=R$pEs8o;U26dB$E^~LpJ~!8ZuM03aLdM!ZQmtJyaidk`hmuyUXXDCw1^|6JQM2Gx5(oz$j%^w3QsT#orqcJjL-|6 zM1iQ_`;NEe1dgVR2KD;uIw##L67ev59Z{KwP#5W&EMn>^p$YNnjp>MoSVr$z-gRZ7 z?c8n6_XNBT65G>tWu0Es>Qn8ncvT>`+wf6TMPDJ-a*_|?;i@Km!A)-cCuFG3(JeLW zvFm}+cUObpsiCHk++N$$zBxJaD7zH?;6 z(b2xXxV^sm0a z;Dx0~E^3};arz=9tjaxAA|gCedIc$9e{TJUi8yVH$rp%Fj=cO&;m*iU7fLO({KSyZ z_BDD5F>nFx-bHkpw~06X1igGd(Gz7ieBNz#V!VB)*KAwdJ=%+Pvw>VJ2v$Q;?a=(p z0i=?pxeIyl>h*ZtNrF}%DuVlRAiuT;kez)7q%73QhE_3RdPH(dK$jRBRbCuOl-j)> zq^1i8)J!HEb)gGJB%;P4+G;6#jQWEPh4Ij`N4?Cp=$i)Q*X-wLH$P`cwXJyKM6)W^ zm-h%A+24`H^|=P1SzPN>;;VQ~$)vE$j_45}rO| z;r8nCpw;$sL4?n}Vf;QmboZJ2i*#RCIMreMAS$jGF?wtFKc$Houk@z#-R7zpFKcY~ zvGH{aCCMUyn+DdtNAehEiNIh%6w+{*Cs3@t4vfCLsF97q#$X@jh4$Yh`g&$Ux#i>6 z=WB8&-~RB#pa`S)GReo)@p>HSG2&VE{CkOhA8Q;M-jrQCK@fMJ{EaT(&mQ9;Su+~D z6-;I}@W&fm$DHd8uF-Z$F0E!)GQ#>k55T#_#v$SdJuDKy}%j3&S9rw5Mn_8lYHAlpzI&AFC40T z*jRwqU~XIGO(01z6MERXadSstx-2()%syh5*+txHEE%kt$91Zka;ZGnd-|2KTJU$l z1;W~VT+GQCxUSVY1}lT6BkHFO12KN7B~v->q18 zE@yjr(yG8xtY42KLy_twL*9vGIee9|M??du)uFp(=7Y+y)z@Dsw?3gs)d6j6Cfh6_ znEb9k3QdRfu3vv@H~$=PEb9YpF`pM6|1h_t?4hnwHu(APKRi=3!mW z$%NsLSH81U>=Gi*qy9I?zmvW+kggETn0LD3qc_`i|9y(*9kjh27ykH{e#R*j;9-4$ zBAg!WaNu%=J~;3&`|^BLGoqE}d$&sh?{YU&{Sb}xB6TdvliE`YnH3t`u|5S!N{9iR*T=(7$|2cds6%YL%VLTZy&r$kiy69^NkAGP*8 zEnm?%!_Pk4E<*5Yf0L%q=9Cx8H~ieovD~0cY`IPtP(j@v)m4}P9c`_iV&w!(c@GjifJ(^5s~=e$@#?ZpNp5UNb(fIqPZ|fJFH1{-9U&h z@jFRkB@ZLX0l6fpi_aNm02U=j5OY*6MpV+X)ty+hm{pf_l|J8T|IGB(oxhXblKtT; z-|6y)f6aqwclg^pSMWq=h;PV;{mUDYZ=(GAC!qiO2cYPmdX@Rand;&fS`qy2yi4Qv z0e(_Z!Y$Wlq?1goKZltkb*GQ>!|vf89gsLvpE8ceV2FO9+gT zT<95`=n$*~q~}x5=chLBOJ>u9B-}TbkPlHa=VJOn5K}%d=Ahh%TWzaN#7dIU4K4ub zgV(_Ka2j_g&r+Vx^IXUCQ=ZFtDtK1&4B@$%XETp4^nrhQp?rTRV1kDfghGYEP-tjq zSg0U0JT&Z|>XeVj?2d=j=2tnRXRYg|W%Sq$_v#*-%MZh9)2aLT!mhbj7la?Srf-FV zW30;Gu-TGvhYF#+zMqaFxsH+k92mo=@P6{hzkxB0!b zPZ!TOiGPyc0=oG)exv+O=6QwpIsE##q(}1 zBH4$lQcw3{wcSCgxcbooolj(gxQh0tz29{iG9s?N>E%g0-n(`u*d?RSHE)o$o2Qlg z55jX=Ik{2L)ykbJ;nhJc(#S&NYSEp23mCiK|7W#c#E?ndw}Nq)Z?$r4%%|smQV&Yl z#-10dVj`Nx4T@?#0vJ*$W4~&(K1x#2k=!*;+8K1K9ao>3o5NSz<1CCMkJk`U%H|r< z!H3(BH4^@Dw1igcZGg1L(S!^Zx#*N0YV0rWbHt$=e5n4tY-YSvw_k01u&0n7ql--J z9aop8R+7Izr3)!>vZv27=rx_YQNmCq{UVE5BEgHP%-H zE@E5!;fr{_$+Mm3Zl3pfP9#pgeFMzQ&1+sTUnn79zJ>%1F}TV8B^2TD!_At1$3+%- zKzHs6el!yt9do(i)id3fqd|_2Ds6CIuJ@w0&2~fPz&drBr_L7dkv&HO?l_*4cxLd- z=J_nofAB2kN%FY(G5p;{g8BLQs4(=}KYYu);d`(dzG8ulKe*4o<(dg#mJLhLl7z6Y zs?^RBYuyBbz{G72X-r(s4-1M=p4GNL5xuqjYZbDH)`s1_x5LTPyj9Cm7&ScEYGWe` z?zEBj)bsu+{^XfPIXnygp{=d;qREXTSr^X2{!XtnFnBa;AWkb2pL%<^)pjE< zlrAfwj_U2Cpi;P_UTcDj`SIFeIHJ26+CQ~wu8(_%No^(10>AqvgzY^~??*g`%-R3c7j(?Cb z!}AEwA9*YgJ%i^kp0jy;?u5VFRIkJOMS#HnFrPH^rY~G}W|XI12;vGN-<*Wr%TU~K zybr!9)P}DXLtq!31aUQQ)5JA{pVX?Fy_5TZ%Dp{Q_SV+$%9O$ldS7 z@r}FJgGisQt@0>~y-x1}%Q?FHa|=DG>}ga=^H5z>PC}NbKTsp0^lEYQn0|<<`$|O0 z*BQq3*NvN-KOEM78dxxRY0-ZDx%e8>|K+v_&r(e9AJrR4@m1(0CDFi zXm?vL=Z|%V;}r4s?t$qm3FxIYT=qq1x_>S&xKoxqE%B&0b+=@)&W4j&g${g^> z?%)6Mi`~D^9P~YH(D$T4-v!I~&ho7&+}{$zYOO6T3iG>M!~F{Wjh?)a~cH(dxW7Kh+)3UhH(FY!6$VqllAp z-+H5_zT?dN$~TuT_dh%SO-=w^ApTMsRUUKyAwF3rV4)}TUUEdEdgWBjcATx;;k2y< zALTHey?}U^3~_7Lmde*T)_;0J-x<>0QY9V9X~vlS4E784>WPP`^XYO1K<}5C1f1QM zGy`z=NnW9+pvXME`Aet?sz#5Ug`$b^sZH8kB{43w=>cI%$xv_pGJf^2@8L*r(1horfJ8j{P?FX2i<}=QqCx8}ZeoknJqTbaF%C?4H;>uxjc})8EQJ2T7(vYV(^f$^&fxZ>^6#%a zZ?6A?)8u|gF>homum8mT2b_Me`G9I!3;`^uL{BiT z1KykNV#jLjkPvl^4nP{WT31R=@BCvv2Sy<5SW{kudJ7_BA?fT?vot`AK@vxcNz*#2 zt8tx($|LRaS&|O%Dn`U(62XBk{A@<2GMsQzDE=NI z9N#~`z9Oq8Zxb9+!&UQfL~|@(t|!C9xpKto1^A468}EwQP5D$B^VGO{tj_D7DY_l? zs*8kFw(`N`5p3E;>gv_=x_1JVJ6GNe%8TPFT_c$&3cJ}qQ?0%)+0XOi?I|Rr_7OD- zL6Y?4eTxQk(FdF&H04Y8{OA;cDBBZ-_GeDT<2+8gvtXVwLQKH19+wTytwTVgBmhow|w#lcCvSS|8G@E+r zz#g5_KBGUpoIKf$l2cVd2c|rBQ`7oDoB5n{ov7xLQMl}EhE;g`&u8plx}&CYH_I6bnd;?P=u0pa-{fTvbMah&26qYpLhE_ub2iE*Wl%J zF?nD?p6Ih(#KKVK!#Zf!`H1<<&RL?zp_9nef?Kr72_g zQb?jvJ)}8(2)2K!Fuq3hvs}Pr`|BRE7;?pGO1H53cVKMwsvH4?uF<1Km>Lqp5)R5P z(nAdk-5b1|OsQ^fUQKrC&6RYb)xMm+4a&bo!UD9gD$_#k)Ndc8>Z(BniI6iBGibOS zQ`I^hwX`-&A|rw4#5z)QX)m}n{>#*|Z5qBHU?0+e^Gbk`Y$C}(M^RIh!{3+nr+N#9 z27b$}u)c5B8dbxE1nwFyIzYiW*e+I#Q9@=EIL#ZWwMOJ+dJ2*%wk{FC{Ti0TJPpf% zX1%*_QviHUY*eT8XE}i^V!i%d&06)ue*{4^G)5;CP0JCM+?&`GCOkp-iJEY9nPOlE z)GA^Y5>wJ2^P)5#(t;XFW~VksiJe$0@N~WhOg`}nT_TKCbcE#%s?5kg(i%~`5L+rS zC5`Hae#q?t8K{-GpR?L7G3mJd1yKHOj+(s6eCrl-_5dJL8dYOIkZA&h8~}>?yK##O zsH08TM1MD-WvT8c*Oy%}#(RUY*~cAK+yd!2mzR8pwx%8^F%k>|-B3HlF7d$hv+Y|=P5Z907v>^!T%f~5X5>PPe=ou3 z|7!DzFre38*h6CCzYyNkTZ5|}h=t{E)Gis&|1UFq5ePf()-)-E#Oc}G*@F^~NA7=u zKGhJBMG^#Aqz*aBuX%qp18akVd|}ko4My9wtF&T9}hbrjh!x$f|L2Uf=0i9qY|8ep6DXUYW=+MPTUMfhlub<+B%EmE?i?UG)iK#((%khLs`n9a z!w5A@1eyv+pJ*D8b}+iMggKs6XNik^MS>U z>J~i#g`6FIhsV{XyXeBUTzzW1`urIYniXzleF6EG2dMTjPMegVy)h=fs8^S9?r@B$ zrx{+J%b#KPRlv%;iz3|F5f@ULqX{AqvkO^|HmCzMLCA6=W`ENw)?QBoypqq?B}cSp zuS}TY?XTt1{eYhH(oG+jPRW8~IxI=ws-1}1H+y*y23!(#F*l^uIGpPKI-( zos7KcEU)B+szvP|=CT)f*?;*n(~D`c$JF&8u@U@s&~H#e4e|^>Gq4c&Gco$(EIw*9 zu0^y9>jI=#w^xO0xVuyOuPP)Kw^o~2abi*roMNN1O+L#M5FE3xm;l{*G+D&GsvY6tZ)xt<`w8; zdv`Rk&}rLBIQ-{$=c|v%+mmbv{Ooag+nzXh(!Edfme?Qo6P-4BN5MLUL03gcP3Bgh z*nM7+_M!nzEpzt z#R3M+d2*<KC+POe z+rjcyCS*^OS`*6=Yy2F5KQ1>V|AaP+tW&S1^atLk11YbhULDdOyw(erL+MfOchihl zRJIq|b0|npMiQmIe7jI)h(0YMk90#s4%Le{9R?yd@EJF29ClEXOatMP+{SwuNEgTM za%vtlm4l5P6&`nw*cVD`<`ZYnmbW>)IsJNP?RTUp-@3CZK)&;}NTjE7Ss8M~b`vel zXXundzGbsXGW93{4L7t}-=~%$S(Q^Nw-a#%lDb~APKn(h>o-13!DA7w~wClOhaayk(mGCl1Qlnb>YZ$GGvTiI+Tw;HfO7(^8)$%jMUYM(5 zj&px@qjYAZBC9W3*9zq_LlliF1pV0G_VQ3niTdh~^=O%*UNreo&zLKRCbDjOP-mPX z_Y>e|ZZj#MjhPU5Ze2;DZ@7v6X<6g{0Q~=lfvzyaMcofq(ED9c{7gYiQ6#kpkCxb+ zo7$PIdZ+thGRD?E!bH&Mv=_kz+O{PQ&2B8_ts$O$!j<&TgezTaiH{qkKcC(q31bM7 z;QH>McfvC~t;jv)nX2?9N}N*zxDjA;ObX~`b5-=+6l1k@5Mms__Ady`g+=II(U1qEl{)q(P%PyPQF)hXg0B-f$I6UIBhlr#m z$0BHTsRW3HRAvc(?B@|>WmyfZJ8tv-i=dlnqnN37MQc4I4M0r7A!cK#hdL0 zapkSu^xA**;KXckj>2lA8qNit;0@l%+~Ll&Kzi+aU?N>WO=_jUclhI+w!+yYP%AH; zX|;WgkdFFT>b1bqy{>ffahV@ZZNaBrfRJUcrLylOj$EHVIWL(^W#3PXTR$~#a&=zP zPGxr`_E|qQe{ywxa$YLSt!(S3`X^WWxq!2ldy_>G$Nz%VmWk55WEB{Hc)W}8#Ig2h z4@bEMG$YYEyH~gGRC^@pGCxMTX^@3l|JF?Qr{d|I+ki&WlSd2OVx)~_c8Leqev$G$ z2^HrsdM z9%vA^eXF9rM94ewOnX1mK!a~H!UHzV$zWRVD)p6X&pOLQWM%8s%FU-mnFVgxy9lGm z6EYEsi`a&2MaSJSkjWbLaE(B{W=&~&)u1*p}^tS9)5)Tt^{68p2)CHYRX~RYC)q)(HD%z2>y*;nA^X0+p>d_Qlk53klcv{qG=DSi;#y2VQw7nnaKrQ^&c0q(uGC9LLq{4$Pxi6K>$-Amu# zIZ#*V+8i+SPgF=&GMOeaZ`TLos}jQ?kxPE3O)F8}lp>iTo4RxzS3Anw-o$&-cXFWq zAV3b08uY7mgp!UpR8k9RY#2?fhv~M7)U4&iJgC6Byo`5e!(3=r_?PVBXFJd03;HQV zIuur=&*RCR?>eAL0?g)y_^i}yPLr36Eo6ma;B5Gnyqg_De7tzuh+#8S1uyBA2XaYz zo57|2NA?m5l?jCEB&#qdIGFXDft1}SS>h@N3)YunF`JZ-YK;Aahl$=o&04!jm)VCw z?N*_kWf;vumhq`2-}7o_;HfkulkH@&66XGpdhnfXBqLda>Gv$)@QXT(#6%7s5>I)#82|3*FR3ow z2&(XQt_lrOh2P;iz`0se@-~*6dvV`e>u{mv$_Eoes=3JTHT)H<*&(f$5f&(Pxuh+J zBis>o9WZj#CY>8shm6g!f&Y}ex)IKmQc1aJBPC(|m>aAlJnsxO!n8!z(p*Qkc~#6B z+e#*~=>|8t4SwZjLUi@P35Ro8;5enUV+_bM>2vK-iNkbz>MGG=t?ZKFR?8b)c3R#^axA{U?7#Mq2HB?$+8*jlR9h&9wi2DH21Y9dsyo& zjFGjeCbI|^+i_@LFR|5?hKcI6@=2u4oItcNMYZuenuivt@9|>SdT=-(OxdVeH!Ur_);?p>=*m!ZkTrG_Q2_We?- zYbCtImynxTop#wYVoIH7E|TB`r)C}5jm@NSnkA*SSU@;Rl%#h06C)XJq50<4E9?UM zi|7)dVx=vnerO6!j0Czd9}jJ2Kjy!fTcx1hfSx0zQK3ePPaecXDPEHPrY+XB$aXVj zT)da-42;_jcLuCBvF^|Dn!iv7(>$kLlnpd@dUoSR-t_bekYuraqc^N&h7_)0Ukr@Q zWC0$Q#gVj1R}PCKJ_(2KKCu4>CQ$1zs_y!{j@Uo&z}nqp$n^0?<_Yb4&27rH2MO=i zO?ghDH~f{NsN>k}b)f=beLm}}n?(}vI9@Q_a;+rP5(dE`*q=wvM;0kS-n~!K9kM^QOHlSJM(Yk&&rG+IgnE0A@~Mb z;!Au+PwP+1J64X1L$uCynIJ=jMjnewE3Uq*rNScFdDJRaf~xj&J6H~GeM!e-!-8W4 zI^`pFCe3&;_N|X0s9_n*{a$hBvs_z<7Mk(!F80!Lv4Jzp>cr{Q#d+P&bH{f_b$-XG zyO^4z>HPF5fy&3MHtjQ0t^%8uaBk7t46h=Z>=@>@!A9EmWu^cLfiGgezk7IzlmN8x zkNJCnm(Ewi=uWxq!DJqzTH8QxWq&hs~-@k zbr6a3kf*uPuv&|5NYtEBA(y@H@Enp2!^wOL=rlscD7C`6O&X)tf_Xxb1>(JW7lkNf zQ3++rC)mu!!5-V{hiG391iI}~x)<7Hld7>%{Y5tNWVs`Bx;;isPpNh@f4@~|_2Q>u#RwA)j`BRv&ntKoQRT4Yz` z8mk@Q-k_0Xnx|%5uTd6PBWRaMU|cuEB}I9sG+3RbvO7|wuWqaSrM2c4AjbdT_+RP( zb1}U7IcPED^G#x9$r@MR=hZO54WjoI=d9Qj-%o#Q3ef~nY|r#6)r7}@QqpDC@(1FP znNpQHp`5b^lFnyz$GPpY>vCWU5LN~7 zR4>G4B)IEL+n`8|N4*0*ogG)NX*9V|KK-8DGeon${B_m?1NN7xbWO!J*=4SwcY+L` zq9_$_ko#a>#bSPC$=uwzm)6Y}k9IGI6|Gxxv@^rz$Lbq)OEfXmi<#5po2?==(7mTK zd7S-I4=I=;-Dt=~i{EO$>oi7$(Q8XZQH0;47c5gacQs4*JQ|GEBkisnh?>5;os>*s z*^TstPhHA*q?eFF_Gb3qq;U+tSv^F(!TbknjL2P|`9i|}?sUG>Jswvf0j9Fz*`ln8 z${&3LO*E!%|AwwlYG>4Hlab71RuoQNItf$uWD-h>l2*2OB9dtW#cebhD2_`ksA3cszdF)w0iEmMkIPl<_jlvih#FZB*{*)ral$x<(Kq~}b1l_T@nGjchkXpx+5 zIo;s@x%Bb)r_!^0+>hAuZZnu#9(Oy2&{HE%@ap`O2z?Bxv`wq1OUIN3;3N-cIL^GKl z&!S|gPhZJXM375&?;-fMJRp7jKTLXhQ%?POOh3J0jjFds&Js~>VWYc|zOrO7zUCvs z`oM}WyQD}REbL28&Cnl{>{%WXTs4;{R%|)_0}>kPVvPisgUw{*y+e_y2Vyr`B@xt4#T`BDzislu|2oHERAcKMf$G7pzH#Dhhs!V%mkF$ zS$^5R_UHRkYjwto%tF)^_7}Y1di6&$)5KIh6%~%mE#Bxs7JDgNc2uo>M+o&amB-X# z-6#>-HXIKzuraQu(FS#+h9U=iTn!=BOQTbVFATfXU(x$t21&eC6t&9 z+WXtMtxlWlz-<4`xZgNiyWb90JZyDtmdsY?oMZDUwn&XSVs2$#9y{*wft7hySLX2@ zZ7&J$@HLCgM`>abo$S!4%@y#T?stL}gNy8#n%(iFH16fGl)Ht}N@>&9VNX!u;&IPf zojny#u75^2*Y>Bz1&**fXGY4#{e0Ng_7Lwiks}E>B5zy|Zr{Sgwi0qgKEB_=?F35F zqa-PzCE;;3NB9YaKhBIC?S>u^aMSuFwA>3F;)Vt!^cV?+_ypvT)RuzOJLRxjsEFyQ zTnx{m4XPcUozfH8!S+*LZ)3n@#(*IqHS5c|tNXMJL3jJ?-*`#m>T6d*eKSjJ=#R3B zTvqYKzGk5OH%>bL#-JeuaW8sF0Oz9CnsY&!Gc47+Yw&f&!_t=oDtB3Hs)gbBIs(Ux z-xZ(D`t6c{I!#!*IbxMw`%Hl8Lu|yBc@jgD-~NVVim2PK(0!u~ZL^(X+7wgwYvDl# zd3qDQmF*M&>a}YmCDN4D_H9DVLf5|31DV|@Gq(CUN?LnmF0fOMoT~Svk6qPk5qFwM zgIq;~yvtFdRbCbZLAPq72UIPtX6OYm#gjOdOI+h67SGQvx6K(0Lr)QVg_qVANx@BS zl;Y}+0hx5-3v-F*4NNTjR;?S5_+LyrU1d^%?B23}A8(X}tnhSxWjW(hhf_0#V-;4O zbU9r70J}Y>YN)nX(iD2Smu>dU!DwR~&bnfm<++eQ)Y}p{KyQg8M#JkxfbG4-or|p2 zhv-CS71Zdr*4!oUBayf|&V+Z&*6IVeT(xm~n?A6k?tR?pa;fv0D@o~kJr1#2D6iPY zTB5A4(0ON*bh>PAollay(c`y}!)iN+584!!HicMJ=)BCKSlN^%z zp-H5)^gf*6#~5*2ZQrCWE`F@bMP@VGMy+XH1y9tsm{%m#FuyCKsjzDQ5VnKbR^r$pw`Qk}3teLd`@sk86#dXxAPWjoY~wg|@* zgi3ElL~dd6Th2mQFNqVgvY-+)w%yOJd`8Bxy=gZv2MHK1RTnUjO=bj>m;Dnj2@NaK zVul5V`cAetdl8IJm!Os#0HqAO%;WTxeT$bSmw6qeF(WTm|h*mfAnh<=7}KG&Q4mJu=kO>w!`(P}(+<-uSC2 zwV%vo>g~^@zDHuonUJF26}k}X+^6~SB_b8iaV7a}L!?Wz#_D;AZyT`IY@>#8)y-cA zSwbT0&~<@ux?NVHPKN|w56a(kiwKEc-tX|Po)BE23uH8f-f8SUY3J#dOU{f z)%CPS_ibDi@e22tzz`C-CG|kr|M0@*Upz1UyA;8Nlr-J-7GYi9B*!`-dlXF2dmPBECSMX7{=jN#@?67 z+1($=bdcJ9pK^2nP>W<(Xa~NT$;9E!9nmnxn}*c=LNLuGQhwLI6#yrqXvy7Xdq|_0h>Sqq4F{ql7IpcA#sQZF?j~CMNB#gWO#_B zE$z~+t+d)*y6aZ9wHRB4V35QX6<=zp+AVFVy=kyTr4S2s{@?F;o@X+d1SE>x{rrCf z<~;ZPo_p@O=brnH%iBK;-fVN#Z2{KkW0G;4=X>9cbWnVi3$7lxZs~I6qzPPk;&e@y zs~q^mFe>;D9xM7R@N9nsq(uu!ZrsRSPY8ZWg0p?s9RsRGjnmWNdhf%`P+VmP3Pue~ zz6f3ix+44x5l|xR$6&WfRSX;NL(|iwVzZTN$aIHmhSCp=c`n$TR>WzSG#?z3)le&W zt(Z0Ncignn_(M)pupWRHcQo>^H6Nrz$u@EZ&F2q`c@fP>E8V9ye}`y7aJcHZpW6Q| z7O|P8qOMBu(+ir^{dGqAB>8gRM;1SpbB zg*K!iFkuzVl_E(m!-d4g>1jSjkcr4tpE~kw3)4E8jk4arcHmNPquvHv2|x%|upFH% z?W$Qt#w^rypIPQ_SScagy$p8<;R@ADcFIuma;-~(=xPIlAl+o%2O`ef5~=aO3I4zo z3DhzHDC`#Vgd%=P{!J|P8rH8-H?F$!53yseL_J{za@F4n7ynlna5l!x>~HjZJ3i@+ z8@bwS%(OLbAqOby!4WB<(U`UK z*VI$aUECty%s+H58%01I)x1=GsM!{4+ulc3u${rC*&oL{_Ct5 z;awDr=HzgHFeZG9TWe&-7ip=1(gHAR`%gdlXzWiP1)QaRy{um^_nr;sAh8C>xprSR zb87Z4s@CeyVkqZMcom|-Ip!C5x@C@CyVJEh9=>f=3&*r291^$s=hw~xO;df1oBR+9 zhWJpAe#>NsKypcF(@J=#;YlLxq|m5yyr_y;hF=pqY|w(v{woJZ%M$+s2Fa^87$jFO ziQ5Kg6i(K@KmF_hkI? z{BhBNR&@n>&IrV<87cnw=s+{O0_`vY@oLi4?txORKpP&QCw}SO10+NOETJcU6S@cZ zy^tLUZkD_0}bzVOIrw$|fi{ zxIufJYZEDnYcriGc6T_nzG0*tJ6l?s2EetY$s=%>z~KU~5cnB^V+5uP94qj8f!t2r z(v%@^oIv(@Elr$rZ;^H0mZs@qo*~dD@HTzt`}41HU8qy^Y^`6zog*9fSEj{5tXb5I;NI2H@w$Z#aG__+5ox z8h+Q~Hvzv%_*LSUgWq)gX5n`$ehcthg5PrdD)3u_AM>zzt-m>ra3X<)=#dY zcMcltau2Z_hgt^jB_7K-Obo*TM_5kY-Tl3$KX_`Ka_d~Uv!lYe6Z^V>!=*c$lVVO6VM&#J2^jsoyrsShKYu0f-XCfxqJC! z3$A(p2Vw^IXb=`Q%~9)M{EmLL-Y_(_NZ)&kk6y&twEn>dn-DIpBPsZAG<+D`a|Wq$ zYaf()#I$v!sAs-_95>RPg9R_NC7*g6Zjf}k1aI8vhA6{r_mMjxNZi+a+e!! z4WyjA4H3|eQV^+iBVG81e)GC;r9*wzNG&8D&`&*b54?y^Kc*pU?N1`1uA@W&m-S}g zU1T zt4MtnzAOd0ZEU(fJyg3sc=}51I^>g#Wt0@?1M`tLm+w4N;mDmH*!UsN?u3^+=*2^@ z$qbetOMXZS>xI0@3ULZp%MZzJgzT+pD8QN_GK@02;`UW=Lhq7{AA7P1>Q2lO7pYg) z5G$Tt@!A42k$ze@1Kt^Osu^#FOV8~_7GBo;7L*o~)CiDc2DsJe+R?+UhO1W{HcDBf z?nA;RsX&Z=fiEC!Pw)@%+^6GBXaPIma;*~ebIBh)q{c%o?t~V0foT;(OVpzVX2`aF zEO^_`*+8o>--Q{$y*}kfetzB@VtUEV-q10>6kxfM+xb{_kvb+eyMYgIK<&8dA4Oq6 zG((v-H1nboz0yJ8H@MZQTs>MJT%$?`IzN<9t6ip-?js$yo_f-lEsRre?MxqQc z?)x@$uJ(FF!A)wI9R{~ay=v)*nWnQnT?Oi<`zl71sC)~Xz+mGh10#9|Z#i6Fk>gX} zK!C=&)cr_~)=jix_W>?CQ(rX9IN$73t0f(;jJi7t{r(8@xmH!2LRTEz&&2~t_vY^D z-Vl}U)lun=Fw&K+8SEO&_12|-KaH&!>_+~1TF|+Aw2OYx6o7#BqBBPe$MPS>MyZXf zbF{?ZbMXlsehO7-q(v$VDw;L9d6hq4d0@qc6G>>j`=QB!WpGc&*WkcGMk+?In6-fr z^fu1*2KPIWRfbKUii5o7Gp+WUVSE~lfxGr@b{jsFSFR!Uaq!{t27Jc3aYuX0KILf0 z8|P)SXjnAv%HY1MFmA!PLmOP^!}7FG37h5on^7k^~wZ6^Q9TxwzLNwV#u!?TyfkK-&~-Yhb^S zV!Y!PuC()Xo*@^zU{Ucr<&=X7ll4yjIx8h?kS>?na_g;ZqyMLxWm5qtrdI#0OW(x0 zCizpgPt7NbF5*PW7ym4Z33ZFoCB}sYdDsPY0uh7z3tAw$oW^8cGS-{5V|1mIf7RF= zP~j}>g=Qe=1Vo(d3qO&%6=+}%<^{~71ouxy%x}V%cZFb6-u0EJR9pZEm7>Xsa2S{) z>-)^Cqgz+s&CCT&hIe2)^)KzDn)G=s7FTa$?PJK7lee`-2S3P9PP$cHZs2?NDs5^Y zeO=H+t^K%lsdaFoKEEAbs_{@WpvFI)x)Wc6UMFj~wGIk9HC!GxJ)Tpd0Jqm{c0;;pb*OWRPz`ZWafDQZRwg^^f)8s~GNQODa}V|0=A{ zD?oid^&c2Z2KVQ6WaCr`(!d5XD;1%Lk&f4B5)pC@^0VdQVC`R|R`o4X&C(IJCSjCe z*5u>wM~cw*3jBx|#(dP5-#Z;HBrm7P1;0*Y9T`bsyJXgOs)Jhp(#C0VGDj4Cl4B&H zB7mE7PRRsb0u=p8GK$JL$x2BtHA152 ztKZ{@F9bZ8XW6MuM^RqxdI;RA&%gx(Jl*`j41{g1IS3ErVeX|h4jduQXM*cI-avmQ zx1B+Z&9a6!yzEh4-0FdQCrb4eA<{=w=mqvhC+QeU&Ts^vo=%l!#%_-De=Q)mSKqV? z=+TtOu9Jr7pHF=rv;Y^Jo8TeA13G4MzL#7w(9I-Yz*g35F#$e~rwb)!( zvu&)*N^QX>*g0mcQyUrVyjmL`>`d!$PSG%-qz#x77siKgnoIj^!CuTDg4f_@i^HD* zfE{W(E`q*QjL266v>Nr-({f%3Qrp9QPWn$LqRjQrW746OWWcz)mDJ39Cu_CcwQ)2! z09_6a2y?)ue>UMbrWoAJ3*TgZ5!G{Yx*Zbn1=xZc95z>73rzYP2fVHeuW_Sca)L60 zEi}dFda|GIR^AbUag(coYm&yhUvS5bjfHBC^iW`KR~@AV#gX)*nsY5&C0-lPsehuQzUk9Kz_{kN{;2e9rKF3M) zfg^HfYD_Yn$nj0>)F6tSlApcWUVSC<^iY3m|9}%R7+xF4R-iPX$3<#5XA@bxbDq7= ziB!e~Fp!^wKP&CJqdQ9uvRG2yS1&!w`^V4o@%dp zw?`q+9-VTfv?qWY#MulNw{SxgdXZqHaV7>o92#)&adHge6QPbQZlTKJ&U{54avzAp zT*FzkSK#9_9YHRYmzF;|cCE4YHMKNg`=F5=CC&jTA_fg$tT|2Q}gcg(8XlG-$Nsl^apHWjs;(d5Cys{iM1(h6i6^cXu z8_%b!>_A3H+^b+T35=rI{cQ4*9G)5f<1%TeR)x@Cj~Y1>9|tz@$5&m0{rR|I$+g>! z$7Vu9^nS8II6UFrO!X)DPPMpKSWSwDgizV5xB#R}5md&~L1_tvQmPA-Kl8cuZ zX@3+syWvU;%ZCR(Q9v%@>$|vZh%1jlAWDG&EWd~_ko@abXCJtKHM4GX<{G)j2`a?P zz8Pk;6`#sZMKUN;5c2*NZ4g*JQ7>@w*`Uw>&;b|wnT|dO9A5!rfG^=V1R?wDIXDWb zA0Ss)-*a+DkK!DpYT|yXGC2{0M~<&IyC)3^TvmsxLpJ;3Ce4cr3=THO2lvI-y%IQz zi}4fj)^!_O1b5&&N?UFHQ0|te4sPyaeB%|=rw&WJ^UTv2+duVIU*bgY)CA9DDd&0S z7m2$aeM(DliK<+VszOUZRfYP21_MjfXIHRw!@8tY*c=qu3hwH?ZSmrl zca8Vhr$Z%SLrMcuLm?o@HyFA-iBOP{Ey0^pw02f>S}=Tx>&qdeP(n4v?Nh&%$zyC8 z@VJ6?aEGhoK;C4B&8He5xY%2PEd$rk9W#wlPL~)?H$e|ELur}%&6&@mZ*($)6Ye@Y)TRn6noQ zag!OMnAA@8se9KOO52BNuHZm06`ykQ9LSsCu~m%mg@@H;;CYtgL2Mg787RvP@9Bi1 zr-RYZQ=vkQ{q38FOmds;b6(seAKT|XygeV=KDEnd1P^$F;h|M~tmzaY^nH{wxPL;6 zUhLM_I65XC=x3W=bF)o*lZX&W6DS}aE{0tOq?lv=B^R;gLzjDk|;?u4@TsGcnq zet9FV@-y_IEZ>=cJu5>C30e+R|2rTTuC@J{J)EE?lr9O)51P!7z*&|{OpMfw|G99L z-iKz@UcIDiu!MN+D`M=0G4`3=?Ktbs&QVpCp&dZS(GQnoo>W&L5bLpd!_|-*!(qdi z;K!wO!-(Q}-J8EP^jx zd9BuMg)e3ATYrWA`830>OAJ@uOXeMht=VlG`bQAI6)RFz++u-yZHN9rlmvOduFpzZ zRQ-W@?0PMG?BF_Qd?2y?Z`4OI?oy7G_XD1D7w zJ|o&2X57@jFA|FD$7?@i!1Z4&R26q3vBQ{oPPlzZONpAtw0WQSKt9$o6E;+01^V@7 zhEGz{;L?$(ZelRBQ#+c#NQ54Nd)|t1moO4D>bD=~8kV#as)?xiV%516Otaq&fSU?GQi|PZd3z2e$;t@6Bwt$2(%E=*EiQ2JH>L>fSs}bG1&7e6> zC#PV}1>$HEym48|3*iz~CqjsGaHv+ggQ<0eJa|EdiC2Mz*VPtY8r!&+n5cJ|`7I$oti7RP>@R&7VI-$y<^&zV2|CzRyHRfAvEiiB#_936dZOF3``RVQ*tv66xVn|BCjG8T-as zb~(PrT6QQ{82B05EmVczp8W|39~gny!3M@~!&KYAbh!KW$sNV3syE_(4BycJKo&u-ur>SS(X* zg=%*axr?=V3z)&!yp&u2PGE}Z|BZSDNvIl3|;tVWkjE8{Y*MSBnQ+ct3`j~cOedF<8L;s`j zn+6fa$$uO}2?zQOY)0E}!IljONPV?k&tIBtjT4B$^fX!9+3{3v*k$}9+tepo<__E*#YU5D6(?^(`<*MVs zkKh9-I2Z)4OX!c65Y$MQ8Gt+2x~Ju4rkkh_oXSD(lwi~5G$o+Hm1iH;JWUCShG~HR zKM4dX!?nYxiGVATMjWw8^0y(IjyuC^oa!qtp^+-;RPW%l)eDjAE0KN2 z=k=C`MXAGN&w!kP#Z$5>^;Q<#4pZGcG3~?LoqrG{SBct&CU58-Y5reF(u(G}qdvy* zEV&(%%ffYBN!nEjMv~SCcX9ogt>*tuw8EmyH+csWp1Ab7Hhz`$h{o!A(v{gPjjB8g zyW$5%+EeDqV*fypP#XIYP{WjJt|ybQt^rrCs(w}K8a2HFbu|v1l1Ili!RE=!6zk;W zB}Nl;1~<6-X#=GpCW`Ev2C0hnn!CmJ$d`3l>dKGi*%jZWy`s;fn07~^eP1wP>ZLOnO7 zI6E)Z8Ms3K(L?aXXo532?ofs?;K3B-4(6zTbsIkP!LZvMaz}i()3?>uhR&-AQox2u zY9!ZcQ*@A$8TLQZE@h1J7yCyLuNQAq{{atVzC!8j!DdK%*8J4uHFxozk5ti$z+VH; z&R3F$biwi2FI2q`Y2psHup>;33;a76L4TI# zT;MttS-Ua(`d#R=!B%_68@*ur(N5HN(487@-%=1cenIxOgT2?VUvuhnBfLG_;_a^P z#jR;>EWD|&%dMAK84U*#Wx0w;J@fO^c)sZES?J1k&q-{6aK+b-@8wVeQ|5)&I4H8v zsPOLQ@1<3xK0-Z35|12p3pQJ)x=JWWvv*x6@^7cWy+lhsG9yY;aw}F1QOBPT> zQfwvKV*MM^-ApyRn{w2v8_x+%t~oOzkhJ$QG>eV_HD{6oWA=_@6ZsM6_fhXBvG4h- zkHXCN3f3h{*J00o5m&Fj80cSmyIBqyRTJ$P8hjF~abLzuhYbC30@sqi#v));w?5UE z`3^Kltg%7sGFvlv4r_2Y#|?d`8gC{9y!vHLca@iy>%SQD^I*H@RQtZaC+L6Q_t#Mg ze+QE$cl76ypuMIs7{fk47Wq>U?pX3J71YXB6;+r$G2#om0G}rxCWuaj-iF)Idr9+pc8P!u#AClFDEv1 zpt;V1dP=nbSHLteef=J{WLyhX2pA#zQ@Z>c%^Som z8ujlKl4V_a&*=)cW#GYe{O(WzVKFdHVBj7GBjGv*Gl48E)#s}FI*5vRIqJ6OPlxfO z2RDDURJm@w*v*bWWi2mJpo5SZxzSqzyMxjpN^22VtCPA7<|!-cOkwy)69IsG>rf8bk-&~AmRe1kf!dI*d8=^ zci{|GW(3BK^RIV!m>REA3BLW?jwHxtB$|Qu9*ukpR4v8?hWJhlzL?V?4{|?_;8IT* zrUutRS9R3BSOfe!7J`L}3JnX8`bU9<)I?zPH`p+Tgp_@1jHGJe^GhQf@HyNunE1>= z2DNWL0QQN_##MhM+}Q>$#TV&JRNtH}Ik3yWie3J2qsvd)n?rOwwJ-8WTSv)W@={0Q zUPKebv6#)py%ad>HC{kc9K^Z8TJPT-m)(lpGP&9FQ+*g8_A?SXb%4onOM$EIKh30= zP*W*K8ftU826(o0Qu=mD0bEVm`sVS4>dO@xa$867AkK}V@HQI zIviI6G0VQfI3u0o2n?DsrWp^x46NA@KSCSIez;{yI$ch{B{}dHs0FfO;i7oere1JWWE9sdFAHvxW-j+U>FbhVA7QV$L8sHWhhQ_VUtLF_OGgrmEx*Vr0nm9 z_JC`eFME;6IN{n?WvCZ&82aj8+t4NE@n&Ms0M}k=H|Y&KDbK(17DxfL`WiiS7$$lC z#ku*4Nh$Hh+b<^}g!^$t4=N{mPO7-c;CDx3e%xX{`ikdNq071F0i@0=@hK%Oh9sCr z^(h#R!>0C=S{5jAQX92-F?$g2#7jYg+_*{kahgMD@OsrT^dH{r*YN-d778giwSF@Y zdBgWg7n_SXxWjz0fk-cP?I@3+QKPyw;KC-5pR5?P#cih zoc&>`Ya18>`V*!U3?&gh!wePC&=3bK6DD#`eD&=Qj2wZ)#-~JS* zaddN(mbVWp`Q1`!@}^*r)m0`C3tE2M`YVH-m#<9$hK@#O4j8DvZf~5wDUsVy?2WTv zILkm0G4R%AW^>lo1qh^JcZD-|3MYN4-T^fmbK|1&Vy=R3#cCNHhj-6HC!@ahIW8(q z7gfpK9ovHk(cT?=K@HiM+szw}vgzmH?KX$yas)0NtGif1&xsnUYBP*s>J7#)^-9)) zUR!{iQMOPXzUXeox5hU$-~yEbN5{2t0uQf;B8#Wc<>0>RXW`Z15(`~hZOw2vxi3yj z^CzIF#!x@c&uil`)L)45AQ;w`J)9e3E0o6ea(k~khPvwFd`wbEFt7fV9Af^8=E49P zIO(CuERh4_=O=)iF{Z{`Fa2tN#{v4OUypn~xGw=g&Xo_+cLYC3TIcL5WPUQwe z$qY94@5IbsgOpZC<7@K&>sDsw);4Tua&tpnj}2}d5J3em(bsDF;~W^(9^gPlok%h@ zk^pbNZ^?YV6`BR=embbikHh%Lx=8DE308Zc} zVgd)Ro!h@dZ3Lz8tz zm*6H~SKW8u%)`?4UuVJdHGeuNCr#qzj_@vyZPb5f!{vH7H`+&v4|d~BMqs|^jP3lg z^Ncsn83Q4XQn#<9viGKzRU(%!##h}S7cWL`UBsgep?-}sKE!oTU{nuP(;CJu4|)9g z*&S8SLyTs3EV&(WcX11jzW{dUoAb39^2$8)QLKtvPUBfT;|K^Y=A78iV28nlCthnoe7W0?o5o#28K>$JwT#ZKcSD*SjXb4N@E4ZsZt5)PM zPI@_~)_x!Y_?T!Rjkm>NS|d@+6b58}&jFjQVL=>}nJLA}Kdp=Np`jG3#fAgs{R7Se zNyhv!*Z3Rlx1Y4vvr|aGZu$?K8?fj1y!$DuV21v3Lo?blW%adKlN-+~`td zBeJ$6B-?AH)?(VJ!7t%wFdvBMPXG0g$09CX_aUV$9!``%GD!SAAjqbE-0pp5DZ%Q_W=G?F9X^bC?)`o>~bgvnxB|{Rt z1ug$g?RD3abL{0?%d=##%*Thm2?~Wf8tM5N$Mh%Sf&#~x< zqq1|s+R$IVc@t)bu$+Y2_u%>FVs(#nuGr~=HF=ZDO+sSL*Z~b^f031re;pf$nbaI6 zbwgBAS4Aat-aPba1~lfIA4YX?0O_WB@MHFL{^Qmfj=str-p%6H{*h{wIyymGed|Uc z0o+?RQUTy!@Qaus8m{ko2xbUZCr4KLgF9gBNZ0q6Q*5Ryr`bAq;V@{7vF52JFbvK* zlVRFU1&^|`wdHV5H6?H<(iz5a>{jV1cd~E9EUTwuBpuuJUtvDRqc_l5mp+uS=9Ls- z|5_m?EYsA8KXH`9<2h6O{m~6$n%?Y&<8DM8EK>?n#`K1R`z}&Akl_IZF9xuO*IGf*_NL>a!8_&ZP%y(M_$L$fS5qGC8t z>;yR++&)kWnOy{B0(1GrXd$?E?$C58d&CL_q44gWLYViz`absA54P_vaHrF2q)lpCg?`FlTmhr+MAz_1;JA_K1 z@9cmV4-lfQ42ncR0&1HP9IeanO^o>NCdVkvN{+Tja%3MP!Y83_&$#kDn)))hvFrRT zGe#G*10S;sqH&(zJ+Z6nNrsC}O+|Z$)IirWdcc2 z6DMTZlF%lc;5 zVeD|wrETw1!-GfSu!(ll6O_fAVBwy0^WTL5i{k`eim=tJli&Da3Ftke%z$#ae*my&j-d&j;p$H^5tvC;eCdp zMte?pLOsX#`1tVgC!(7G^(QJXC@poVC1J5WUCW%t&>)Ba7JZYe zbYz+its8S8i$MaOP4(bPx!G7N%#XtztpnR|(`(g;;0Kql9a_4$(LPhROTJ4apfMN3 zDCbd!7cz(`|IwL>KI#en0vq8n!x+benz-Fo40q5Fbv63uQSp&$si(jKt(*^}kB4z! z3#BpDRxF#;vn#bY(HMC zex1RMKQ90l1Fdv*Kb0kL2-uE$dj^0{jU8UYB_UvM3k=j}K<(B>VxQ3nBh~3FMz&Fm zFX2J>u;FaF)Hjnv(8{@vH<->a3BgP4pqR`UakENq8f88cTU+P*08aZ)L6D=yBEk6&9G1U3J{ArANlvcuigG zT9$O;uDb6M;YKEYD%VZjLmP!e!dh*z`ZmrW`&1aD^r`oSpicb|R>^)IHX`5%>3@^s zFwK~$huCGC>pgl_R;ed2Ao%yNc3D`!~Wo;t;j`l5BsLa6(4|02E>iKk$lb;^t6{Du z*V@tXVyo5oZdert^Lvv##*Owv;epCDBMOFxM}zL z{Z=Z*fnn7A5^i`n9fkiQIQT1jgu4mOW;445M`J^c&IXDIc^4K2gZjo!eVkyU6ru0{ zvx^!4S@-FwN*7Wr{;#D45#*@Jifr=7vI4rR&!D@y2Hn-X9^DmsDr%`7RrTM}Tb*T= zx~n)%E5RY^@yEOLo4iy%GOYw}Xb_J)jJ%$z!FpIy^*R}4^QyLVy>DnHZ}yKwkQ%&N3}1|jeWD0Z=g+j$=ZGV&l)vc7d4 znhIue$6%X!abvFAHxDJ69DYSKc2~nM!9T9Lp92Ov;{#tn@8a#y8n>n)(leZnJE&!kEO#8+COJ?kqg*JZ=8Sp5ZUj^#iq3HuI*Bi(LRRyQl3w3L;C2diqRc;)fixgJY-a` zq>Ieo{vm6BWs6$Mz(C|Vc6F)hR#>0Hl`~-+Tz8|hNcgoV>V>L5k%q{^JEpF>EaXmH zy~q&PkQb|If|<~W+i2mOP6BxnT0xa`18v~*K!*Aji0r@A8Y-5k)@uaWSp5DW-S|o_ z17yS@A+-$gkRz`!OGSWg7%bGl3F49W(aKYe&zs@9+V1}gCYf)RIoei?12Lw!8T~${7$%Zp_;Wq@7~rXm zGC`07dp*aT#;kJ1fMQi4RFmczga>%QZ5-_mK2-y|O{>)Bt;gPSywNRbvXUC7Ch#Hh z1%S(4T(s(RE$9?N3vFE%8iT?^&gKA zlT-|R2l(xvNBidhkXv%0YD$H4kwlu1$mqyjpGkq68W$vDo3<`GFM5U{(U<<<+Q^Os zeT{i{6VJ9@++o{wfw)Bqnc>$3V+Z@E=mH%E?d43!GBwx4rMSmoAhxrw) zMD9C21Q*VjE!WK}hqW<2l_PYt>pwgLx*C`NLT|}v{2>JmcSufD;~v7%y>jJ7Nb9oV zz)SvRkvhrsvkp-wtGrSt?W^pljL2=i4anA~4qs_7sW_tu8I2pg$N{Da)|JEG{#RB$ zUVIK78Co)VsH<)hV$ycyxtYXnLG-iNvhYtNbQ4AKy?eyh+H&WzY4m5|6U~2J|3pVA97&B@MjR7x$M=DQ2Rl+ zo@~i+)fK}K-p!pgY7Fw!6~d;BL>`SBSxJaN@!;8ef~!}!Z5`gJE0L5BlkRMg;a#sG zm`Vg%U|j^wf!1)fpRdvgulqUTvxs@65vrY3f)+WzzZIVC@39a+g_o}2=#{t9jdl{L z1$Bi{3x7gTv|f)Ihj!pob5VUb4G2h@gAu*q$_&+sazLFT+GxL+B1Q{;TylnnrcFis z9Q+E3)RKtfSQd@im=9rRN1VAsqJXNgS6w5H_V#a~wEjn|(%}&edg2s*O5!9?=C_SuPj~etXB42|TNO~fgcjLy%hyc<`?e29ORqfr%Dg(Vcu0sH% zg8<$p!_B=n1A!Vho`ExiFz%H=4RsorS*-pOYzJqqj9{%sugO62uuo72wv#rb!=)%K z#;7^?%!khRsxT@99%|(`NK}qBQB|!ClVJkGc*F^h%SetswGivwNT)VTw(Rm`F??#W z3l5yjx}2>mqNq{1NeR-<;a7%U;f168)YpW4y;1a!3Lnu!y239zSNMo} z(-l6mM|k6X>zAOlcIkh!z!P_vZ(Ns9V5O*?-!Mb~4wHq|qRYTQ$IxW19@P+2(FJTYyuouZ-Ovy7mGocsd<5)H# zLXj#~_rp(;+i(NZLMC2t{pm|ZPC&Dwym7Pn;33OXmaA(nRwPT*uYexr58z52mMqTm zW90CE6Xo0&Mcz-$i!%Oz97C%iIv%5=qY3y{Nh@W0ohyV-?y1#tz2Bi`A|R)pe~M)x z#s%W3R0Uy94aG4`s&X227n6i}{s$@&pLKCUuTXzr$<1qI66JIbR@#w-SKW@}k#xGQ zP%|0zd}K9k?;%J|9Of|l<_uf|mA?;lj^nuXZx-V^1ND8OFQ(945B>{^3B2O`Nl>OD zkHTz_091Itz-)j=LbP{j#QS!5yYb8LCq@UjITBzJHb~{4E-CWkQpm3KuZZ|xCQOGE zCKRj7#1);-20VIW?%>Cjv?wA(WbjlREtMU%Q`}w3HO7`r)h;y%V&V<>&Kz>=g0BY};4NCh4ks6s{HV7>ezJ z0lsNI^_cV}AfKy_H}u2NTY>Ay5~PW+vg=keQh#_%W`cRf*gj6{k9^7g0XMA`5{2ve~$mM+3gH)J{Vi|Og<-g%>7Nn#* zckYPz&IW3EB6R%yqWN<}B*d7;y41%|N(S;4tF_`m79Cm)x#<(D!J8e|70axs$~GLa zgx1Iihqy(E+Q1Nu48gL$7 zGhX@z^U8^XQ0>!jM(NFEU7>?HoJbXQE(HqDX#X*UGKK@2X?hC8!Psi(C9GwLEot+( zlmapiHyl%0H7t%L#!bl7u@Um)$pzy+^M|4MTJ0Y^flFdgxCNLAt@$#Q@%M*H257}@ zAaO@#IBR;!Gt>ZoO8wB4_veJa)Hj=hI&G-_ofLM5&09`~n>d!~aO>YWgK+ANM!0a4 z34xYy0O}=mY%1ZG`JaH$<}EF|SiEA@AK6kdM3dx{M6ntzH)5wlha3S`bR%XmI_Y<@ zwFr8)Fdm#d)CR|aZ0Hjffgr~9@sKYYM6WNn5Q5XVUu`uSau>ZaNUh00z>aIaRh~gC z4D`&a>v&Pw8EN?wTEe^ELYIc1yb)YI0*M&fXu7!RQjN&r-3JlIc#+-+uQH$l-~vT? z&RzxquCMRY_o0{*xF_OaGx3kZ{?gxL?g{&Pm$cw6^W;X%AniT`mQtr(#Nss?`vKAL z?!)2==>)83JTAr~H2zVHM`?URjEcsW#CVLx{bD>$<5MtVR{~wHe)OwC}-#W_&Jz zxm9Y<_@YBPE7&2qmA$9G8Go+$AJu!${}%W=Q-R-n(ViO7pHS|qvM4^qOk-mw|C?sUjH?bjwHj*$9EJPT8 zts5^aQS?o0K%tE!jlPLZD72Bp(KoU2ve)vdo1_}?<`|Knw)ZL!(Kj8A1Q=!oAZ`rs zBMHE!ZlrKRGy4J1%ahyyr_1$Clq)b@;ZvoSCz%G4ZD7R%(kLnt@b<+f${J$&-@w!# zBwz>QQ-2&NJ$Gm$*$M&bx6-f93V@kIF3Lg+at>fXk6*XE!n+woaUY1;*j5aQG`1yT zl*U#lMrmvXVq~$^6fsI;8!tv;t*#X#OQ%v`L}Qavc)IM{2?=vcOFPRQYTYIL|1BGI z1e}jFSPmBe*RuWS(xr5lyB5|)c!LAG!jnnQ6`p*Lx{svK)^M)yMy+>+C!3rlJX9q^ z=3?`*{vZqDtAAcgou`gq$O0vg8nnp>cR*q3YU3RPRSSX`?G4H#)n~9Q5@G4gM7|ZB z2;JrWsV?z=L^enw^fMCSv^f$XlbMMWM<*i8_xfOBLL>i>NR}i*2O|*--k1nk&P-%T zbRxovUy(#;G!r?2@`X0i0f_|nkQQ9vO)=yS&W`ONmNxCu;2z0Za|icGbj>)$g+<=B z@CBF97UvjWE;4%5B48@}_jvS(yK8aXbhz4~#?u`Ej7kYt+m#nC;oZctQE&~3WLEz` z*`bEQx%L2|u^6u2CQ15{9EghqOE{G@kw5htcm?;T@z8GYNPOv%g4=s%sP5<Nfl?@B;X4i{s4`JLvx%Fdsw{g>a}d)=4Q-^n%X~#n zssg+GpYxRoG-(b&?h|EbLW?ZN!)>CR>{({I#*pP>TaEGY+|Ari%XW(^2}`)J#)(#I zNFzddg`kY)>#F-L2o~*!kp_yPZjca>I}V>hC|&w-#^HjtQ5mQUbMqlCWr1sn(L)&A zqmF}+<^czdvw0ZYQ2G~HL?kYz_;{H?4|8JWO>J(WvayS5PWoo>_elxQ`sYDH?dwc1 zx-Sfb)71e;QYg1DQzBe}z1(l0uaf&j_@V=zmn)Z1Y_fiw*O!C~RT?rVQda@8zQfv8 z`b&-T;x@Bq8<*HT%N!2_k7)j-AlZv1$!dOwDgs4IY^G+pAv*MCh3oRy=U|9@i?8DM# zm#8i1)w^guCWhu|>Q-od2F)qTd0k*RVhGJSXNM`O_b|tRD#WF)>M2wQZmAXp0vCjk zc%S@`p7cdld8ES-oMlok#MwB@PnewhN2P7wx7whNdK9blklyIE78@becEcrG6vp+J z>7urhqay4rDLiluM7?uKt8E4{!7*qnAHm^mDiCd?@69SJ5JSI>HJSy;rz_$b*7WkULLjn&9Y!kR&V6(utCNTXP$!nd!9D$Ps zP7s(OFx@cU$na;z5!%KR+66iUIt97~dITm5OcCf6m?|($V7kBzffEEy6gXL6j=(&D z1p;RY^a-3VaDl)@0`CyGT%cdzN`aLEHG%5{t`}G%uufouz%2r|3fv}eyTFG8?hyE> zz?}jg6Szy@69StAJ}t0W;C_K^0uKs2B=9wXhXuYR@QA>p0+qmH0*?zkA+S^68G*J; zp}#rK##y=fhhvL0#gO12}~E5A#j4gi2^4J%n_I;ut4A}fj)ur1uhV{NZ=g; zmkaa@Tq&?ppeAsg!1V%a1l9>`5V%F)R)O0DZWs8Fz#Re~6}VI2V*+;xd_rK8z^4T^ z3*0ZTP2fR+hXlSR@UXzQ1RfE1RG<=gOyF^WCj@p1JR{I1ZO1OqAByfkoM+NQ__?W<50-q4rB=Bj0%>wreY!i4;;30vp2|O&Y zPGrjwF&`DE1RfK3T;K_TodVAYw23UT3v>u{3Umwf2uv23BG4-^RbZOHbb;$7_X%R2 zC~&gC9D#WP3k1#*=o2_!-~xe*1l}QVxj?_bl>#dTY68~@TraRjV4c7Qfm;M_6}U~{ zc7YEG+#&E$fjb30CUBR)Cj>SLd|F_$!2JT-1RfN4NZ@M%4-0%t;1PjG1uB8Z1RfW7 zLSU!BGXiZliTn}h5a<->7U&U}EHFi&S755ZG=b>?GXzc$I8oqafjI*61QrOKCD12u zzQ6?n7YV#W;BtX}fhz@83e*Iy6S!VrjlepA4Fb0a+$wOJ!0iGb61YR)qXKsdd`#dj zflml*68N;hW`X+!wh25a@Q}dQ1RfUnmcSzdj|x-*j|n_3@PxolfoBBTqzAVPbO>|` zbPMzdOct0T&?_)iV4A>mff)iP2%IQzvcMdHc>)Ur&JySoIA7obfr|v*A#k}szrd9O zD+Ou-*9lxNuts2=zy^U^1a1|$P2hHc4+-2M@KJ#~1wJNlm%t|kHVJ$hkXj&b_Og#@ z!*y4Ou5Q!!kGA1-M0VSIRRi^X3%BXEkUjOima#U>Mbz6m{uHG)W)IqSbwBref%x}Y z-fO?)fymo7xC#bqaRZwJ$rw_4V8)|@r{2{MQ(49L)s9@f4cjvKOe5D0oiDe){N~Gl ze);gg=L08By{{iXwH*8K+Ti0k^>)I`RfBO2p?j^PDv1{fuZf$3>kAJox&2x9IbIYg z(vJm4JFdYBcJNqQVdk6D`d|JKP^}oCHehO!W5s(gjtG_=ht?b%L@&HWR$LOgoN*fO zKV0bgp8o#rp`_4SduXmBRN~b059_m!hVnaW-(9h)Y^I)n~&lA6O{lAId)y%0IS#d_~d%T=gROHZDFKN(fckL$^3W zg+TeOAK=`sEtG#;&p)H}555#{Bv-oR2Y95wrrl$d+}@hVQX`}d?ly;3#E)B>lli)4kJ1SzP6M3$GwlxRT~;?^BV3r z0%8+49PHHp_;GLCiDJ6*GNS&mC^Re?k4=RGj_@!K4F3LhTXT3=3XFJ%%8O4lHi%Js zEET1w7@=;%d@lxDi52k+U%2j(4UbSZfN(X zVZvQ~Z4EYLec~!1sU7P2dryajoI*#g^@EN>DKhxh-)zS}n~q08$G%YyNaE3E5YQmb zn!v{=j?jR+96*D?n9KZMqQQ}mq(Sh0r)|xE;Qemg;T0@%+F&2N1|r5;5Xy)AaOONh z4l}vQqEE2wjI9HK&g4J@;gg;3tR9B1KKqPbTn_>}C?*g;z0 z6;w7YlZTGH1VadL0Z2|qhI(!-PAMd+$MM10(2h~z00n?bN26HS;buv3;0-=_=MNpg z!o|-zd+kLk-2TJc(M0Y8?l^__GqjY2n2^I|ENjTudZaLgVbCdp}ngM!+Uk@j~2CP9y zH6O^eY+n4QaNrN>v2}=XL8ccgoc>Ny^=hR4U1o*-FxX?#F}L6m+SEhHsUiPp7eV8N zpl_@Ibrzu}f}@4XRv|~CkdX4I-qDpnabf23bOkQ>vH-v> z`J2FP6Qb((J8^2=l{JM}J-|wT4Ot0VVcY>64CCTdeX$!`*cZDCONhV+@Yj!r0!O(h z{T)~g=Q%tWZaH%z&~W}Qwg@`&>eQ>S(dLRmA5-}{+zX3o8it65>0!jev~XfDoDe85 zqIaTQo2hCy8cz2~{vE0M>|=V|yl{s9&406l@$uiuC{_6NCEc4E;w)~z0R=gD5Jt$IxIm)%9;&em z=?dc-*64T$Dl0O2TV}o^_`6ZBwwYbHAq{O-|M_v(e-B2O zX^}2W!576vIWH za3Ccdz`aM9_g=U#Qe{F4WNkYUg*NQ~mz;zrUC94F^Pl+pajc;_5!=YZZyA6}1=5CucX~1jaP=YlX zEJ(H79a#L`$@tVZ(ITuk>nVd3@uVWWZ$^9J3Y&Y(K3t1T)s)?lc5QH7s%`z1rV!Z` z*D*@ZKc-_ZV(mmE+w9tgZHN>#W`Oa{DiN7SD(URFl2JyXWXQu+!+PtV+58mwd{bAI zAWY2^Rwm9`)Ifa+fSDYsdMPD`Lj_Uq3m0~;LBz0xMk2`$xq+asw(%X4BsCpNs2u~1 z8su%H3sGM(5YBh>!UmCqSUnno7(E6V`^a$1Wj`GI*6Bxf_VEm%zcV?1j z&V+}h!#a+JG{exCe++?A8EE$L#{4sxvyWxYK9kv&{Zb(5skunI!(IO(_FC*4Gz4o$ z`;NE=wuNN4aO&ld3=<4iJ9}Mq^I;Jv!iNT@up2{AA!aV z)-i?~nI{`%Fy%i8<*3*fx-lIQ6yLW9;xf4UE$CoFjSYlfuOs|+4dGAL6F##Juzbtc zAC*tzcKLi;lTUr6e7?U@KL6#%=bKM@|52kI0zE(o7`voU`sM1oP0%icsyf7oJ- zY8&%AQNJA4LgWu}?QY>7hbt3V$R!tWoGrYWSCQA4|1=JTs&9doKp8ety5-KG|xNL>k=rr>B2lKo0y@t%X*65T&L`1M40_WRYz zCHl?K#`^0oDGx+V_*cOL_U!ko{@nfbUqpKC8;JDUzr;rREqcbYM8ZO0jWHc}&_C`8 zyL)*US9O6&Fnh+m5{>wcIf9p%ML?jbXX53WG8GPBZsv?BX~`=2$Cp3Cc<;5K;V%zi zkbt&T3j9zv^WN)8N+~f27!IHhHuXjSzh7>1`>8ysRz!#9*d+?lo^hW}R^l%Bnsw8n z4=oU!k4Ud*7n$et;36JKSOn5YfR(Le!Sa>wW zT6i>NU3fI5Nq96RM|d<_NO&|kFg%*v6&}4sV1vLqfi(iR3*0Jjo4|);Rd%_+g9a4$ zm16b_oFMQuaX&2ZErCY_9u=qr9us(6;0b}90?!CM1PCQ4`ajx44}QDoaFGHRDR7Yj z7b$R&0v9Q8kpdSfaFGHRDR7Yj7b$R&0v9Q8kpdSfaFGI^1_d}dc=7Kd1ujzHA_Xo| z;35SsQs5#5E>htC_Y~m$yNeFn-5EFWPzN@Beb)H;vW)Lme7AlM<{X=Q2Y%56sjgmW z!*9`@D^{1{d;KzaemTYFUVxwOwYd-C_c^T2-#gUiPX4vsjqT62bo1->*xY#thka(Y z#qf7uZFAR5v$^{kA6G_qi~kmPGoeh_XmQTJWh+;dtZD^{(j_LnV}u+?Q%Ys#u( z+)%#d<4RYqxKoNJ<%Rv8>bnek;jQz1rMdZqBI~p>)!k_$9MC~ z&12+J#-1^4wu!MB&-5FA<4sY1q&M=fuF@(E1fmN12I%?Zl{WVw(DP1w_hN%_4d|bY zdbl3+z6bk@mtKNB#>qDKn{fLj!W_TM=DrH%#9=mfIhOjjA^abQqh5yC+>2pedX>$6 z81In&4dKqfylIrd19og$G5@@uR=&x2Z!R|9gsyxYpH{xTl{X&wlCALP{oxeEZ5*7b@Sr@D=m?-;h@q zGT*-N)rHKrFMM?&^X&^?UC4ZUo~e!_-E1iLgm|6 zI)AG9o`uf6wWAA3XR4Eyz7fq=pLV`yYeyF{-@erEr=71QG%kKGQs6>SfMdhTrOWOv z)4Im0mG=h90%cwHsB~9%c?Z*s=z&W zVl-?bx3n6gV{OIiRo?QYD^`{*pX6Oxw#qwsiWd7Jysm_d)C(0kj%+fmp<>h5n5pUZ~ef(S0$3H9RYQbztYOG_(P z2C7R*0WnlAUA}z9s=G{bc*kXopWywBe7cZ=sb^Y3!?I;nWf}`}m*yviB3r&$x7W<5phQFyaly}6Ti5qFbr zuuru3!1OolJ=5#q-YvYZ@D_`IBYBu^-STC+y@ic(?-ss$SObUd>2~4OTiBlI8sYP& z(Fd@rEk^K;@#}_9jGsyCUeoMGpZT*2$7Pa2V|!&gTbDnh^{9T+e_BB<{*TWX>zg}k z;ke9<8@n?-YO*UG6SbHSJ^d$k3lUvDOIDao#}@5p@=rwG#rUxhF@9|E-BUE;beACA z^Xe`oEWcbvj7iII>yA~#Eee|$JV~T(awEpyjM*hWdczrk1hsB{F)?G(?Ue~)!Z3v% zjLaM5jS>a?ypHrDMdXre7C7 zGM-guR*YyjD`XV@#IHvlQU1iQM?RK+Y+kYMR(?_C?KQtB|6cR6{A2Trb+_^}+C@() zS~8=Xe^idW`uB>l)vnAuqSCN%U|L=ISeP3*^mIo8X68Npx>78>)feeC%u111bSEv) zKBPy9^)q#lUi}y+3jH4G_2y@#7wgCRCmua|rfy|BR|tz{pu#!QA=S^F$GJindf&N1 zSbTN1Jf`K&&Yv}FW-eJHy2D`kNt<)|OX<%NpE}>!;#%&c`ML7!%|ANNSpVoeWBp?C zlv<1}qZudS*GpdF*GoR)ZslRpGLlX&bd2~#=Mfz*I*({~qfMDSbr#w)@!rCjTJEwH!oau8* z3#Szpn@quQ({pFdnwmT9mT32Bv*yfakiuJwZ{?SBTbQruwpRxB$X*$SiT>OFq1}DO zH~I9f@yB_LLosf+(#duNZbPHOdElmE+?YtG=@x>Sf64ec!baS$z|0l16#P7JOGSEg z<64IozmzC9ZZS#4FAZ+VW;o)OhF?ZhdWo>}Ho=0ZxVZbrmVw`bsBpOX$(DoP$|yIM zD-XZAC^znfBC~9ZN)I=Z*>EwF?TM&xcoV~hM?!4-qugl6)Tr%Hlp8Pnn1$bwsPym( zj*TNd73Ic#Sw8%1w!{csNKaO-2X3T2X-BuMm}eS}FaH+cmkNKee2M^@vZ^ujEIEM3 zN~7(|R#f^qeOz5u%`l}amK%uNv$R^n?DpMdoJ__a45dq}?h>=M;+`@Z_+1^)#I3T- zn1t?1r*zqBT7EtE?0=pc40Z=KtLX;#IFXwX8f$JXIwKVUtQ%jXyjeCbmhuBu?)cwk#v?}^}w3N zWgQy(?<5Gr03GhVGwh?QZy3!oU5lyKxxV~4#4m5=tswr=Z(a_96fe?X0>;8wfB~FQ$~-SSnbUX;5(t(o4;xq3|ZCQ*-L4dP|cRr^+*2Z zUP8(PwrM+lY~O6Bqwyn?Uxl9+KmO(5_Xr}@;QOD9jNe}w8NYY=MFQ7TkRXBn{33w| z`1RsqDt>bim){zjZ6m)(KBaZE z_}1Y2I^!eaA%5ZZD}M23lG*kM-1zrBe3||rWWYQI1JKKbZw(bwfHi<;rKG#2-80qU#5F0zFvGU!?y&&>MLtp>4m~ly~zW#0d1aTkw z1aWtmam_006WTjJLEK%RAa0Wxmpt0nzh*OTPG2J;{6RBr&Bus)*o-R;tdH@JnsL2- zjK|=|%(!glef>LO;f#oVZ4YOn;`X&Y*ps{DMqlGPqT=?Ir`=I;`^sC%pCGO`DsErv zDJ?3lw~rM(Au4W7ALHgk#of`zxCK#hbNU$9XT~L8;2ys7?oXJ_{7(>fff<)P)z^IQ z_ylqNW?bUWKd->^1C?f6w%xwAU(Jk5I`_35t&1veU*p!8ajgf_&#$CLs5&#Qw=a>* zunlHhD{5cl&eoW?eJS&{n7DnBJKJO8_C0r-pH=ve`0k8}>-~uE(cZga;@a%z zPpzhyxH-P_=j!H|xHUV@zlPgl;x->Q74qnUoyB}GCaz2}oF#0m^J}qjo6kSrw_@Yk z&Ofe-jeGuNwspqFJ%2LW9G7I!y2glv)JeN61V0oVPl;a^%7UYoCkj`KTBMm@A{~} zm7gH)y0gTMI!AZb?CZ`FH#S0VeA;lHaeL#nt>+oHw?1xrOx&~074*hyJIuH&PxLRg zyqs5#{d+npE}MWAKQ>%%abv?=v|psaMGE}ir2v+~Y}4k>_RY$loj+&(TrQ0Xve9mN z`O|ZYX3ZD(yRi^Q!`=TMd+!3LRaN$XuMIPZh zWbLDMV@x;UI^?sFLc5jMjXcy^|7v*|Eqo!h@=j6g@JB*piK?|qYDKn0Fa0b1Y+pU< zXOXjhNE9TXHrVFfGxk=!60dpB$X;R{E!m^R`@u>zy{ue^rE2aBRW)~-exHe$lJ}89 z^HzZbW9G%dUSv)6`(gHb$o^#ZENPzJ=ZHDn`{}$>7Ii8xYhlN%?d%Rjd6sR^>`TxQ zhw68<^2XML?@VkgPNdx;g(vFH8h3Q?fxc_lmr&p6_@V9~Yes`9e= zR}=P%`IqZ5FmHaPP7l&k@4X;-i5=-VCCx5)KO^tIg7+$gd&j$4+Vv*^ z?hgO7eed!HrlDzhzOyUWlJ9D4Yv{Z|Ub^u40O^yPU$*4U*)!jm4f0sR7W@kR>|d9p z^O2M-=VjUycG-*W;F--o+AA^3JNLkDTFKODIh(o04)X=ZF=cE@1z8vDahJV9vR6P} zpKHDZL~GS$DcnbtW|x!;%9H5iIi@qPTU^cibo&X+;_|r*%C9M3@J9SweD(b5^2^Y; zXyJnETr>4SexZHze6iT*rXjx1H`?1bD`6{vD%ja4+Gz)zHi zNLv-ynf4(RRl%OC^MhT@krn>V(QTZ_NV%0Xo3wDz!g7;5dQDBni)m8BTJjAWV1$sjZl0OfO-Qw~0G3%cX$E?5XE4%d;^nbr`d}0S?SX z6N@urFpGX!sho&8^dDCNRosaS8Lxgn0>OiSO2rd6^oX zS7|dTc(<2X%kzWQ+>3cT&wbWhiFp^#d#w2o=6yUL1VhPz4IlS1FYzpUgCs}xV;+7^ zu?SWW8uKL09&2b*^5-o{+)amZpvHQyH?NZ zs9oN|-k?q`rY`H&+ji7k_V%!;DBRz)Snq?W?8x(_Djx;r#r49rDz+V=gbhxMTC4J{ z`Q>e0O|@b)%J^GWv6wF&o3(rCt0R+ASGRW7F3T^-FR!g%ohHrJn2y!$UDb{GRyM~N zm6disR8^i2h&v?~^xZr+b!actA{(|=ee{<}3!d4AWYWk!=fo5|OX392B2j140G@1d zf}>RMkgsoOwt+{sBzIIjIo_%Dl{UTi&jmKsW)>Ul{rf8_S@}>B)ruy10 z!;rmS#{Z@j@UC?BOOR@b&7pX;nQtxtVdE-1dLVOmp8rh0b&p9E1g)VAhxY_rSdTWjlV zrf6PE*XnlE=teDYM~$zwyAAn{ze&6?A5iNZm#q!CrWIPLxNplfNCS~uNky@F4UZ(7 z9`Kh(?1|iKo;fH%nEZ?$J}mF3ZS8Dnl6iJ#CmS`5ZD6kx zCRf|uu6JujT7!N@XM0{+ebFb)85!A4eo_Tm+4X4)M`wH9HseWmjZARbWCN|)%o?@r zK^Sw(`SzXQbKFAgs!`_E7xZBfpXAdZF7!OC)&Gm>=kXP zwH=}5>sHe|yQQA1khNUYvN&8IUz;pZ zbav4cwb(j1b-Kj4A*XYv$?aGR-8!kB$io!3{b-Gc!E{bX7lx=KvpIi+Fj%+!h9Stt zFvXn)NDJvSl4BLv%xn{0SJp&nla#dCFMD}8u|YRT((LDIX#vO~(=}R0#!Xj;WQKiS zMSByO?NU@d9w+Ohc2A>`2trukwY@1E{N-#<3BK#^az+Uq1X#DObCh$<(vBA8(n+ht4p*t$0PTT234x0|6U-QhkPP?JC z?QTy5Hb^&PXSC?EO&s0E&NL{ddDE6!r{zkQB20(Zo^O?tGeSMmvZsYT;?pIeKF}TG zuQZ3z#O?H0$21&Ht#(SD4v*2}xTU!Zdq=`sV9%a-eJHA{NcuGie?wD;i9=_1-Hi=xZ??Jrz>wmLy0N0I!TPLCVzB!Zs^v7_RxK6exohpl=IX28N#*H-jtXATFP}WtO;anc7=YBU9{DF8-n|; zHsd;QD|X3%#_Y@-Mi&cGEbK2NEHQUoIR?W`e2gMr>%=}45vMV?{e6p5;EuA)kS3Z# z+cc4SBmr{gB0*RZcHws~uI{9pV1AHvQ)x=`mBGBm^&_&2c@f4_{BYd3Uc}t=_id5u zm#oz%f)djavyTVo2<~D*in%jwRugkKNs%b;Buc~^oM#TmA%fWn&zllEOWfAmy$gk2NX70!_ zYi7KZHB~qpO%NolB|eO#srQTo9hu;ZF>#}ZI4k9(cV{qxThXo4oT*KBM=LR|TOI!b z%;cYpF}vGwX-A4$j_F-|^~<53JnU*fof0)g%GoEOYH+-!x{G5iOg>taEV9QP zhWQ`3Cq=@%rVY*p-**aAhYOuD+mtUd_2d%1=r=0`Sy?dA@}f@$>SECLowZrkcV*o* zW}p06Q`}13)N72m4D`6+;+xQHtrJ}dm!1@)giGA&)hcJ*(C7>nPfd8Wzm$k<%S}yD zjWcoXtgof(c8YO4`*i%|f&!h$jJG9u?GPlJ9A|1>ZgEP})!EFY49)ow>AJKBONl+Le&oOEo_hsEMoE6Gx4@-}S@MsiC~Vof+=`e)L@%rAve zUz=?}ojJU)rKyvJminOWllZ2M_k?Koq#;9KI@8d?yh4y#z)XY1?C$G_+c?A?A@ zyGc)uqDwTDsf%d1dyQ{$-f*SOiq^6CTWL`fUkoAR~3Lp{Y{>VROgk zLl>*3eC@ruwLW)a8-+0;BN@S44$YT*>t=kxiU-Rb%eq^271vfVf0`O}6^))OM^6^IUwD_)2f!lph@!>Y2Rlktj>kQBa=~ zGO-b{t)p5-#-}vau{2BZGa9JqFt^>*l+UuF6pn`U$+T8ag`Y zD6{%~L3UZUX;O5a1pde7BHD&EZAoWo=^VdP-A7S3GE|n@tn^sP5)hS*n14=AX+P8C zv)%6Uye_A9;z~g?eL`GTkAmG{i;*!)?Gi9|`7aS}v*4L%UUa$EeHQ5x_e;0xtkXr~ zi=aH2rM+ks-X?8AzP-Dyxv5@S{lH%8v@2^?GmUNBZ*y=&n_VlB{IPO+pcJ`nCEK&X z6hfzkaTgzy=v1rAcdg7zO`)S;k{7>$iS|hrm}ObjE<-yht$UuR<A3_WGa0x#}uCh1X4(9kDF7slTsc&lv5(h1_mTKu-j#1M+YAW2LMVkRuXN|AZb zl(p{|bYj=(DY;Hht%E_V7(yk?nZr39qh;-oKgR8CnXKwp+|fu<_6q1}4x1AwJR+#yg}T#Z?SEy}JPA)epPm;oI7-P1 zB?|@2f{tQDYr`mmA3GU$3zQx2_t$Mp8j&S!ZL)l#%b`s?eYlCNB!q(~JFLap^tdR>}OGc}2%t+jMC^|c8b@Lz*i@(Gw)S=(jbqA$VI=ZwWUB7ZUd#JpP zo~itlX1s3d%IZN+5c3or=51*pYhNRiiDm|5X4%>{AscTC!Z%d1w;4~Rk;~TQDXn=7 zw0y>cgbo&O8yfABiE8ZXYVVYp)T-6GxCi@k3T3257%7o)9T&Ql-P6YJCbF9?C|SLt z;nrgt_d;124X}z;E3b;JBS@epSgkT`kg+e+!Agu31Tq;RO9npzz_6f(P&CtY4It{5MhTJ^|4QmlpUOEVMk zEUcMf*h5(oQm-d6c#FR;P1O}Em85wX23a)i<_)KGbHOQ5L46L>kL7*6)UQJk%67?2 z->%I&Lkrd+bKEZL>$C_Gt5n- z1LswlDPlBqNT$EY77TC#zxAktcPviSQ{@XbA~@mil$MJ9ZSI;-O8E0Z`3U?rO}?y$ zM}be1>oVI`!t|0g8RjD4nO>44DQRB8;hl?Yaz(O?F}h`X-PukZFqJSx_R8|>a^*|d zq`vU-D8qtqn|Z7BiJh?_XiC_nZwZzIbx@9?9hUrRZMS_(+JrU5AA5s?iLE2k*=XOx zrO9;KPA-@uvcFI(NO#LHgx6!t?SpPb1#-;R8G_hFo%D8D;^ZuR2DzfxM@JoIVBWxt z#13D=HDqy>5*D^)8Tmk#);m=?O;*1w%|-QGGzEHSSqo-FsXBDCW0x;XP+~glxJ9BR zt)_L69+%jLoJ3fTHa&udJ&1=LL&*d;Tu+xkq{T&7hs0QeY3XbARj&YC)8ornZv@C(4)t&)GnhbHEzLzci=?H zRGCKJE;ZM&-Kv455o4Xw23%8KHGkf9R$9t;G&qw6#Js)7o(|^Jts0~4rOK)C`%2yo%lGVD{xMl znK&nsJ)Uk>-WgvZ*PhqwTk+Xxs+=TyF#E9{i@aTY#P&$#lXbNEXk4V_%$8}^CE{zh z@%pv6dePkUF%deVeu5#H1St`2@l!8MF!Ghxt9JL5E-x}^(plk-p;P=W<7+YY9Jlr)cx$IxR2@^+JTiu=?tn8@iRLS_$o z)i<#vCME1r!rka8J?3QrFUy{732cf?)DZB7Iw)YFoUN7Zvg_A2NGUp)?3uJ^Yv!G# zovYZD2&{0ux&)31#$~!C>TV%9ktST;ZqMo7(fu zyccp`c8DLZwqJq3>u*!!{b{H3t}94uD=*{jg7WXam)AvQnGA(YA~}AGY*>axhPr3h zaO(97uY}uzvT9}Q_%T%`mY4DhCYyMX9QmR9n%EpzySE=VFxYLEhTmqjF6$-@v|PXK zupJDhP0Nxx3ewTa#@+)b!W*WalQ{atQ~V92DI-pJ9p@%S5kuA~7+=DhvT@pW{# zE3KxW>vklIJKOTvye*W8wH-nKKr0r!O6_JXpKmKzVY)d{u3cTux>nE*WLGva1jw>p z8obR;grVP+R^pyA8gXA9$Kvm-wnlRDKB1LF6HYJ%Hc9DpVez~`PqYHd`vy6jJS(rk zvt5nsGz_-j1jC|a7@`$f!Y_j$zNDecl}?Z~(KdNi6YQr6R22A6MJ-sFJ<=Ntw~sP4 zFp37AJ^yyz$wD?Gf zQuM_-NUg^yw5jb`P)_?@&DG&qF`aCpI`;EMIv$oI&8!JiOqXq+!`F^(oZ>U&csQI! zCfTjT(nTkTv>rAGUH@GjY+G%+DXPM$ItpjZ{fEiD-&eeL<7JzS;C0%v=BDM1!3vZc zKHk+jjj+30C9W^69e4FadoGWx!=2f?^1-_g8hP_=u1!lfPW{jB<7p)0lc-rYisE|W zvwJrj-HiBI8({S+@p3JZzIMP|;E(tg*Vh>=WfcZ0U8lXhS?dYjjWBO88*=nJRq=$M z8z&o{WZf)~m&VW;=EZfm?YNm1$qp9={^YDRTBz&g!nPWF1+VUy%pziIqx`!-$KwDdKv z$HP?6;V?4hy_NL!_NARW#L(_!0Ou4k*|NYF=i$~P8}3LCd;i&#U}}2O53_x;u*XWc zlPs6r8cwR2ve;iU@5GZY~oR!p_+eQmwWzbIp^(So9DFKraNqV#Y; zCklTO_WkWo3H`8pQesM69n^Z(tQjxzYZcdVx1D@l*i_#n%Y{_n zZa&`*7OLa!%rU~{LwzpNN;zm z#Eo$#Bjo4}rqR*e8nwX5Hz6{=moj{w1|uH%{6aQL1$}KOtyIEYwBaqqb>vpQJdwU(I-8m=$a2&M zyJYgA)--o4#7#{)boyRCr_Hu4OGbhWcihA_zc_qT%uO-EeSGp1ly5WA40gtg-kVz4 zChYdnv2k!{uUCgD1kP)pgk7jKg@d)d7!j7h_Mmg+0_9g;(}~y8#X4 zg7!d?A>c_n?KTe~-|n}grf}X3?YrF9my7k-LW(8^25}j&osNvq)G=%9(LRv^iNWU8W|IdKQ1q57xlLY{gei4 zmr@dxvUXtvjX9bXyPay%PL7;3sS@akVP>(ZYrvp~#e!HX?X4p!@vkQ>f4qCaK(0q|)-to?tm{Qy#xuL+h{(_~@}t2TPXh`NB0^ z)R~p-oN`I0e96GazjhUH_8avEJ=&qjE({P4`s}Kb^DY)%ioVX~{xwb_JfW>U&M;K{ znv!Wc_Cc6i>Z3Dp>^wl9g(DMxdBB}~fT0f)n4IOdKA4lU=ER&p2Wt>I-iynt*6V12;0h3-V0z#eRR2t(;Re=c@AR@~Xuqh`~S%H!G%}&l?-siufk-tm)W| zbJ>q=-RYgoR7o}>>dI~$*xh{MW!PBj1-D2(tj0RWaMj5P7reRBBS+aNAB?L+B&nXxAfySoKiaW zCNF}8{N#K&9@d!K)QClCVBJOvO;h7!P=Q;$4jFt57JXxz7KY?{O{B||!TwYw+{M%+ z?9z%$LAsgMT{{-Ec@^m~X^>W^l5U)w4|6=}CN05}ZX7)YB`E1Oz2vy%I2Qh>@DRdC zmr3tvUq*awH{D%YObT`OS9GMkWzZ;XjY)pphsF2wN+KF}CJsk(NEpkjs@OAFwXjm; zs;^yKZRlLx(p6UlG~gR|mGc+Qug>alFS-(1eeK)|EmyTTpmVMH%5omigD*lCmuY(K zTw{OjTw{OjTzzFQdbEet*Up>2(8w8cl{H^mVf9%5uC@MMyV&Ym9OyIduC@MES^ui6 ze^ti6vZ}ci;&B<_7kc%=E3aLcWgNk@f)#r>oFm1#05WyC7RW~cSA)3(PR``M43xpF z01FAhW#DQcv7JlA=i+!iDO(1wiXE79=WuQ`DNrVM*Kxih?ke$kKB+w)-qp~B@U9kn z++U49mtnq)RJ|HKS6|8Zc+G6{m$@1TaS;?}J`lW$6|VhOIPtm3k=8oH)fx8%EPB$` z5)-ps?Vmf2b?TzFbIg?9XbsrqyRR)>z8#}$J;A&(oVRH%_mY};#^&|G*k00He#teK zF%H6a}&d}p&QMdw-KJz#E@5=VK z(vZl@f|ZLP9XY}~_6@tFDP@C=_xc+k8I}Y|BUUmd)8pW-Rp$C$+L|eg&EAh$a(;4_ zUuE#_K0Aw>cg?-J!k=qq7CgZ(xv+VOu~LP0Gy1o4^jUwW%rBdjm9R0sTq1OsD2yzp zF!VJJ0=uj9WzbWu%&(5~-Ndjquj#b<+9^b4ni@9bjb1{ z@_6Cgzsx)=EAfl6P;PQY-pM!3;E%^mjr*)2dzQ+4V!XhH|Gn@{@?uX2LxIdMa^6Om$5+`YYEC%A8BM zuS4$3=)SX~ zCwy7-H^M)ke7Mx=KUMS-zTmgU%AIQMM`0oHSMM2=c@6T6KQc3rKN0&Zyw_tD7EEzx ze?KR!<#7rS`(E6>+s0Y=-?#cFiG8tfl=|mbm8laql!5QzM;|hi;Wrd%YyGE=G?0g1 zl7~W{`!{#o%Y*a#x8u*b@Pqul9=%^B4$b)e$OM(yPnwModq*~S9BOq)m1xEDgK0V1mt(w>>~PE8C;YyC_-gwNXfwW%o;KcpJR! zW0LxL1Gb_gn8nB3NEeuIu~v?L!|z|WwU?7qBfTl>9aAom*}I%Bn|&iICsQtIm^$T> zmARJA<+;X&j`M`Fu#$a!R*%nf6<6gdxZt6@Dz_lK^&_5tg?@-Ux@Blj^BA};bT?^| zeB1mw>-CgNtlzK8UXm>dq|(-G*rVN2cw5JPwurCPW$u``hY<^|A2PkY3j4wfALv(&r#1g@;~(_cVC=O+w%w9%Y7I(<8~!| zf})N1p!6w6`IBMC)bplKri0aAx6F+upQhWkdO~-0b)Y|Yh4m^}ab!-jU_SR=<*Mc^ zEL+6XDP_&jEKB5C8gxxz{jvO-%G_0RmdK4li|1d@yvY3(=HXEY4pT$b5H(7TR%6r& zY7ohFBA0gzEB1=KL0-{d$p`6+f?r{L3fmV>^jP}^j z2A23Gy6liSC4J7EBwMbhT!NF_vgX?5o!N7;jI8-YuR1qx!JNxEmS|yhY-~8VXmIi1 zAw@%rhYlG^6pOtfg9mwo_!SK*9yElzW3U(V;6Z=>^I!h**T3$3FZZp`&-K!mOLw=C z1maPhPP*L3^M0|XpS&NYbeDnsSnR(K?Cxzf^n2|G+-j zn|?(eUERqAK(Nk+97D*5dG{`_a9UI$;I{CX(=!{39%Ukn}K zco4*2c=G!IW9lW~eT-jrgG(7ly_GS}=${v5PR4$+r5VQ0Ww;ZWanO3kWFN!bK;3c8E7_8fT0@PCo9nS@{B@5=v(M5}}+;rg-j{1fMSuk-v< z=lLm~+pX-+oacSc^Urziv2LDro`1n}pXEQ}JpUKZ5*P{3FP-O|JWDv`_ig9-3FrAc z&hy7m5V+q3U&1NB?>f)lYKKuMhDR9=! zFbZ!EMpVG#?|9nwF|_W|!vFvLr@seg2V{La7m;;Lm5+aTFo_b`aW$c_({~h#ZDe=B zw5i6<-jGMV=KRZc&dYaoIlNGZ!;8z_RL=o2k+gOf@T_!>xGzHN&_;hFk>!{X*}G&H9_(E!&Q`v3dv`r7 z;e!6%46&l6)`Sade?%S5yeT<+P)8K}-&hyIu_Iy7d85xf3WrR=xUhUq)q?AC)m3xm zaX%6RpDW%;YPi)+c1Xg%iLZ|+rfSa+#9Z1`oLr5^B&K4(a# z5rhGC9!^!?T_Q$lo2~%WA1YSWx0v2Eu#q^$yt`Oc++VC-_;j)Q+9}MX=UZ2|IPC`==tMV_IsViauWP2 z;D2sBd*oRNydIsE==mz))0oz;`R-=IgU904E{re z}WUeFLcjM-tU^MQ2 z1P&68OR$@Pn=;&g1ONVj?#FTaTl8<{c_w~7f!$YecNx!TA^$h@{*iF5L;iQ@$s_kC z;?|AKTy%Bf|2uHIk>`cTehqy$V^@KWo1ovt?zg1JBKX6hFQfAxB8T3&m`{Q~3b{$- z&Bx*8@#hZYK98UGK;K5%4MNv{d88xgGul+@EkZWenLD!BX58AvY4e|3>FU z@ZJplHDP=kbSUXRAAB1BuSMtO=s64j-$1;cmJ8mDuT#W1(p10!fPeqROS&QEB zk`{#Fhdj@MzY8}vqwDq9HxZss@H`3nE5g?d?!$ctasDRH?*=d7_vi8R2K25VOg{d6 z3H~|AkB9#$__yHx5d0PJuH*U3=zA@8H{<7S!uA!y`6Kj>!Oib+|8De@fC0srDa}RV4{6)Aq8@I0`E(hTM4L1|fwI09D#myt|r@&i=pI^qE zf?tl@LlQ>(KY(AS;?gLgb(UqHCJ(Ba}1Yr~_-jM(}y?9q=2VK3}ZHf@xqLr~_{U z9|E5PKLo!3&x2vxiq%=*jo@m~0@i_#fycle@ErITIPD9?>O626xDMP5?gXC!yTI?k zkS`Xiv%x%22W|rog71UBf|I_44zLI`fK^~4cnmxV{s0DTM+cY>y1+WH8SDbjfPa7y zUoKW9U=dgbZU+y59pIRKFEVxz=y!6z&F5?;CI0LDsI6=;2O{k-VYuI zKLCFOLw6LbGr$|b0?+{70qzD{!7gwByaZ1E8s!ko2RDKbfCs@2@DuP`@Ha5*>%0k?zuz-PhZU@!O`_%rx7@V`mez!jhoyaQ|mp9Wt5d%$zxzroPQi`7VQ9+(4a zKpVIf+yx#5Pk^6+=fR+FQK!IUFb`Z0ZUnc0jo?x6ZSZUGFEC;!Z2_nRH-c4Q9e4zM z5qt;y7x)_({_SEl4$J^ofqL*R@DcC`_%?V3`~kcKhCV?Z02hO6K?~>s8^LDq4e%8B zJ@^MG{tk5kOagBNi@`F`1=fT6!56^y!7spb;4sMSqMn2Ez$`Ei+yI)uDzE`;1owl_ zfG>l`!BgNj;CXP;cZ=0IU?x}u@?aIX4fKLX!4B|!@C$GV6nziBK^DvaSAts51MUEu z!S}(Rz`wwd?~@*22Dk#$f)(H%@EP!3@H_A~Fnl*<47?tcgQcJuya(J5c7UhBpFq(M z2m_c7t_1bqt)K^d7(4>L1a^YogBQR_PtvY~$)F4@1s&l1U^CbOehLnQ6MsnC2&RMi zpb9JnZw2oF8^FiGXTZ0>kHK@`WpLsi>LR!Zlz}Cn5imO8ebr!9q(~Qa9D6{HSHsxJ zGn{QwC#jR!kZ}t8qfX{(5KJU)1R14HqYN1-h9)mZjDz#Wu^CiwTe3i3AU8k;BH}Kx<&FU>Gr)pHKs#Eps z_06kgYPo7uP3lH(qPI?dpAMy?Vd8Lw!JPP#;uxst>8V)Q8na)JN4u^)Yp~`ncMp z?os!u`&6&GUwuM7pdM78RG(6xR-4sB>S6VW+M+(A9#x-JTh-^(W9sv2oBD$KqWY5B zuD-0kqQ0tjsIRH7t8cK!;hXAl^)0nieOo=DzN2=j@2c;q@2lPF2kJ@nL$yc!Nc~v- zMD0~SRZpp(v8Vdy>S^^0^^E#2^-J|DwO{>O{YL#(9ZJ_rzV;|gLvsKJH&Kv3-?+x=# z@P>OQdM9}&dl~N(?^N$J&-X@nBfU}HXm5;nx;NGv=Z*I!cxQN7?@aG3?`&_P_ZsgU z@3r0}?{(g}-s`=|-W2aV?|iSso9a#Trh7BI3%m=xi@cfM#ojFM4c=_;jou~RrCzBw z$Ggm%>y>%s-aPMeufm(}UEy8nE%2`L7J7@kO7BfxmABZd_OAA>@viljc-MK?dpCGX zy*GPr@p4{`SL@Yz^ZJO1CjZ-M(!6B<-!ln!P6fE z1}6vF)1zfqtv^IyIQ?8;F=dOkR zRI(p#(!IVQueP~9H%HDUt!@jI@&2k26ZFg5= zu9eJk+zG#~sjD-|GsjJ)xi%+eq}dc|zG+pOJAHUwA`Es%wi}EluKgfM4eJQkmTOI7 zPh3jO^#U%7q8;9{Vhfgyt(B4D8xx4aCoVXrfs5h$)xkCC`p$E?W8LhJwaTo8+3b_x zb>#DLj$Hj|!eGVlb*dbSC}-a$Ez-Qfy{_5?ZgpkltmV)`E_HVeISwya5$A9^bay_d zkH63^xwAdEqj6anbcZR`z-WM3+u&S?oW?a*0Lqr*n60gL{o3mDwnB;E@Gj1d=xC0( zjrn>xOH$w7D2MMxHadUWbUm@zPgvyy2kr<9BFX(x6uRI>zliJjAa};m93?UvRocRc zhWa#5Uo0r4D9)A))7z;-wh@*K`vRYrHFtM52CZxq>R2A=LSG;4pbv$OMVDMU&9Sr{ zw!jfmZQ-;dAJ1wDwQVPQtx~f=Aa7I^maxZ%k=A>V`0{LB~dZQH@bE~!(#ID$ZiT7ABlFLA+#-Q zd|YRGd}xQHXPNr^3IgN6{8QZ%)rMH?A z&Hh?VvFoSR)K+|=SkMBBg>wx=dZCXTFi>nD>RnA-36YE>$5v3a`S4TD;tLv{bRUxq zxP(H^N3}DE)KH3jFmeel0d&)=y}N@858{QspH4x%3)_%X&qCXHr(gv2_{hB%+zkd> zhe;S2>cz^HW}6z?E}d&y48)Bt;cXpu;7B{Jy~KhEk-omYKx=T^K))9KdlnXAW;*@2 zq6fs4{@l%tWwHyDQ1S(>e7Qz=*gxIX9t#hbVsT|vjHhhM1EwRBF( z?N7eIQ>j5*z}?!#L9IDCydoAMQ@8Z}J+8)x9i@()UFX8#all|CK)0>CHLW|wZ{z}n zaKaa}k%Q^X@x6soa)fCi*B%Qd0d+KmlgD79>Dsw%u*q2TGflIZ9pmJdnMxXGn%*Vm z4Yhk}GD$5jHRGf;NK0y(t-mQ0lG^iXZe+&K;Jv%q#7LjIs+WnRwU#rcq%dY$?U&Sz~M#$b*sDbI;?ilC>%Nl{Yf-Qm&QV75{yT5FwEuWy4i5d$qBsUzF-<} zJ7>2$aAx(vvZh4YT$&y&S!!Ovj6YmYNS)~?XZhMJ1t^-zYZkput*nITNOA6Y`2Ce( zbekg1MdUemJZ(m4PIF}jaW1=`btuP4u&&~;%;~bR+V9wQa1U^sSyObliSeJYY3f`t zO~)XXJ>{zWJY@~H;Yn$6!8B@p&-keS)a+)nk88_)Q z%rJ(PkD`-dI*voA~w2dAY zaEiJ)Cq4)-9~_#Z<}iX=31Z75=+Mi+tRezi1Lzm{1;)XQW ziFusXpm~nQ!a1FGW+!dwuATCt9d~yy1|)P*2ODEYB{mAQ6`|bNLkn!e7fz`{nP7&b zhoUmdk59J5%fN}-ZVTU(UH#HQ&Q;-V_P{%Hs%mI**0;2rG3Sa|pSEl{(ZaatJ1^ue1rPnqNhyMuQdp|qY6*UFV_5z9%@u*wDfNa!lG zi6%m#JZM4mNMDvv!ojAomD5IYiQ;QUl5Sl`jW`rmJc|+)TE70}*0X}jY}p(V!@=B9 zS&JhL5TFrQi&MG=$fs+h3Db@x=#s;N6AW6ZFlH1c5AS?%&we7{h+1y)4al-OtZ~v?SzNC=g}9S>I1Li(|-|a$jimHQre73U&E7l0g-AG z?~+_6X={ICpGexEKM|{NO*F_YJ0%o5nMgz@GHo{HmR5Uxe<|fReSSS-`Zigi1 z{uamrJ5%Kf6WLuD6Spb-g|HJ{gl5@hL!QGj8tWorHc=O0*wK4L$DCX@bFJ`$V<3Zd zMc2kon}ZQ|x>ZcjeG#Oc(}dd;idP(I+g*!XyLmyZh2o95u+mn!G(Tm9OY_6kEisu! zJ}mJCZGPlNFQwY{UARFL9_!o+!Y2qqVZuF0SZ}CWghliQ67)JDOKVFLKR36go87oD<(GBOLppQ66n^j5zGU;k}k= zcoW=&F-T8;xF|oLR4bz%p8*Q4VncX~gg^B%#$9~6B;8+SAOMzo4 za4ZFmrNFTiIF)>1w%Q*!pXFy$O`u{&N43${P)7Fqm_$x1kqvV4wRAUhe^^Bvhz z+@#6!3AdK*feOUm*~m^qR@@6pElv766TXDG2PzQRYGkKdSuvLa(UFu*^S2q<8CJFk zky4N*o91s1vKJsLehPZ}kq!LSj&LY$Hz147FuwiC2L8ITn~}ZP$_~`uK4fP(@g0c2 zdy##E6W=WHkU}SAN+4xQkXAMhAUoTUE$v4(NUI*~1roo*$iC5$6@Hq(fvlTWMSm{J zlp-s6D&RR)Hc00l>;>X)7Flj1)3RbN1xNC?2YZ3IosH~`j=#cBlMVcJ!@LC9n;d`p zlTC|n7qZP(wg^8qN`9WkiAuD0xr6}_WD?5mA^cP>r-(-AeAp3wT z+mF8@n~ZNYvY)cDB;$bmZAbRguIvE(U61UhJ|}-m)AMK&K}yDV6SDWXvOPzZb?d?w zWbZ{*(pcy30Q}vF?0v560Q`Lh*R{FbwM)|3?+yQe;2r%Jv*t){Sp9vY$d$cmwsf8QD*}vIFpU zEwY>4Fb^P|HzNB`O!ny0c?+@+yI~%HzdMnABqn?G{yu~37G$N((BsI`Bj*uG8MezyVeK>M@(k=z61-UTFSA!*WM zA#F@EvV&aNtch=$taL|ieAgp8*p(%lm;bnZiTj3e9gDza{v_ab|?m6f_u3Z$JrnsMD>WG6bZJ;-JIkxhaXmX-9UlD~qT7$tL~13)%CXFb~Av z?Z}q6vIFq<840tB`h7&zAaFEw{~)qc#3dOdd6NZ4E35veD03dNrN|&YAXy*T^-h>Y zN1DHB^>;F|?{{Q-UPV?1jsQv+%aGmR#JBWSWP7j|h-?kAA9Q4ef21(G{;omxE@VrQ z5nV!$B-?|%K-_Lb_QQ^>@Q)`MpnWy zP=ALXW{l*@4#3~Z$ZkQll&DJD4J5t`ko}A+n?3sYHY58evOzkR8n2byM=0qffsu8U zwDPnt&Xh7NqQ$`)B2+}??Gfg@5uHbn*~XKMK&4V;eRX2Y;$BqF3sPx_)bLj3kg|~Px>pe$@tDj z_KV1tihCe5&EK^6E=BfBj%*LIS&;NMExv1z-R{VWT$;aW@x2S#FDGQv{7sAR7Gy8z zQ-gb~f2GhPwK?KWAZfE3*$W+6;U7s>3n3`72a&zVku8On7T>gV&itMASVy)8*(^Ak zbe@6i#g44VrG+^yofjZGDYkb~Ca8TW0R1I5`^GMr0qdvZ8w+vg?t31X+=j zvN#ag&B$&+wg;(!%I-$?GssFB3{>_YvX3HLioa4O2NLGtFBE0ILb8gSmgSH5pG;@T z-{hEoBC=n@sgy%q76%|(hV0j^>_Gi(K=vC}R?0_^W=9j|9%TEF6+gAV1pG+x)sAo| zZZ{(PEjPXckll{#PB*>-kllyux83*-K=v@QYZLKB91j1T@s;GSv^j2khyJrD^B(K3 zmf_FQ%1%Ufos|vJ`DkTJk$ta~)%iOBf0rOT2U+n``^%pr`P+j#fw*l(w#<$10A$x8 zTkghp0J0AvJI{^p0AzO{+tKH&Z6bT5@+@%`;7lDrw$qg*p|bGP>QTXX^2MUe3M(tR zMB&l;TY~ILS9SpYRwH{CvSIsd{Y{Qlg7Vx$&;%03c4R;7%36QZWRvk-kL*W~4dNNl zG}&a|y#?8iy0QcCcQ>*dku9}x7>K_Ik^Pt}I{<%&|Enl-H?lqWEBQJQe@l@4xGOsV zf2)zbMXAB!XIA_zlHLsOgZ4^z{De11Zc^vJKu9~X?{Z|b@DMMM6}N*3Q}7e>dSu`I zit)EsTOcWVQ~Vt=L@aP*$rfbaJjUNtcYk?sQkpd3)$lcvsI_lS_chTxffm> zy~6x=B9F;(wGY{kII@x`fvnrMr^y~b_G8G3do42n*%y$#+saC~2jcJWmna)nmJ~i} zS#c`Aamc@dyfF>zZyB;2;QSxS4$P-xu8*a_u@pF#0>@I|SPC3V0Z9R_CVb_PD$ZO> z?;Ak)!L!i7Y@Sm7){ONxzP6a5Vb8bu! zp{1w#dxY*e#Xlr;|4IJvDZ(G^PZD})sJ}qyp3#1d(30c*HQN4of1}XKk`7a3V$@-&9puLnE zp?gmBtA%EV`3*u#NBCVrONRODh4!4{Zx-5qioaXvhSUASLTgU){i(t~$)6##beLZ) zv~rkVBXqy-uM=7`%-<-q=Olldro;R`Z9m%IFSPPB{{^8NhWY+9X!{6%qR>5*KcU%E z{iQXrFh4UL{+?m}459mn`AdWz8s>KiRVVlxH9f`O zAvAM>zh7wf1Yga7mYm>E5~@b{l|nNk{ASG`<8KhUb+q3rw0*R{O=#%}{!XDiWBh$W zvt#_B7eFgd@GFIGpnM6~U=%G{n4MN*b^LGl}pYexY3{_+OnL>NB z{!*cbPW0Ca&7A3P7MdOF?-9B+>mL?cn)N5nf-2vy6q@ndHt7*m`K3mMA{h315aKB4vX1KpeXm+^2TWHB}|De#` z6a8^-gw~MnLQ8QcRGsAS6uRLw|FF=?(f-6sgbw$sg_fS|_X@2U?jI1^KHMLDDYR#} zzeMN;^a$-8?(Y)1b-14?g=S9iD}?q9_csXLGu-bJx_`K@=0MdLze4Dt;r<$JKGEMH zbbr=AsQFoc(q))4WBnSTeOZ5aMOy%&1O_uGYLvi=sK*^&Np+MfKLhq-i= z-!62|>HapM`zQDZg>v&>$>q?kw4Xvt$M{=?R*vxx2(208XDXoWWBdg|H&FhC_Kxv) z2`!!A7tI&@34WQ-o(cXcp&KUnJB4P)`$MmQmW=evgtnjQuM?U*)8DE2_q&AljQ1ZDT1o#Pbk7-n(N)k5=n>jG-rpc} z>v(^+(7y40W+8OXcz>zT{p0;!p@+u%&j?i${7H+T8QNQ+*$Mu3p*17@7ldvl9V?-S z#`--%+XOV0F*s-b(b{%oO@`+DjPfglZW!gS z(&lk~pEi&44{P%o{>*Ez?;Yo_5xRAp|BTQ+{J$2uXPm!8=zjDI-H`R45qfBZpIrhi z8SPgK&5ZNc3OzK=-zjthH%DFvRpb51LNnw28lg33`WrO=On;ZqJ!Adh*9-p)zf`Ci z=dTjFf2_YnOih(~9SOb3zY|@n^pUs!sRU2<;o?Zx^~}ls_~F-B0=n?HlXgr78Xj z-Fk+ft$`jo!*3AUJJ#PObk9h?s1{n2^(%z#AL*|XdT5ltN7IqMUx!(Z@*9O_M)?m4 zEjitPPH5@r{^WXS<>`Kd&>G5%&|b>3(Cj#WXaltG48KBC+G(No*C3yN%_z=fJmrtR zpg8jZ%#F}{pS3ze$w?UtTe*nt9BY!ge344hAMksrF{4G%S ztN8n&?BnpWbBg6%qrVi|2i*wW1>FVxE_CQ+#hLFx%b?$fwnIM%?Sm?J@li{ zozUIT4E@MPXf>2|R(~V(0q9=nhee)#=GD(1t``!P?ZKlvoI9r||oTcDdUABH{z zok@SfzBa!H+78_TU52|N`Vsc5`PI;iFmHl>5%V+9tc41?CL>$qvlxq3_1L6UuvMzleV18_?O%#qfKeWzZea zZ^AzWy&Ll+`jb`AM(A?rc4!{^=b$T~S^ANE&_?Kou>B7XG2FoS3y4t-2rWcsy7#Bp26KrXcOkO&>NwB(3_yc-$MHct%hC-y$f0j z-4C4%os^>-6%jw^OM}r19fA1;s1Kc8Q=AzIT@M`seFmC=POL4?jDj{mPl0ZQK9BrC z=xLZ|*HK>x*IMY?p*x`mpsKz&^E+q-^jYXSXcyt=gT4dvA?P~jO0%#BPJm`bamyzEE9gX=Q^fKts<;9unp_8E3K`WuxLVKV~pqruBKzBl02y1iBX51N|8MP0$B1Z->spya)PM%r8KnhfZuN&ioH_0rW9w7xXZ6 zBlK_3txzAiUC_T{-Us~$^bqs~Xy(S^%s-)%p||3$4EjFIOQ7wTo1rga?t%Ub+6#RN zx*f`EFn>4n73cwI748p1J!tl(;>;VM6;NIa`i)Rts`+c7^P#=aw?cP7KZX20=z7ct zq3?vM=Hg5-bR6_%=uGHPXa)3mXalqZ+5;U1-2^=Wx(zxUx(9k9^cko+_B)mW$5P<` z^(pYcnJSZpWW)kDNq(A{wrg-2|EPHX3*TM8^72bB9NOR4^NKh4xRcMg^qu1WbGOj9 z-Ws)EpBwXyvW3rwi4?C-G@_+OF&U&#+q-vdvB=fR+5L(~K? z3oHT6paA!hN#oQByb_P0$c-@ zft$g4unBAd+rb|28}K5?T!|c*1}*`WpaI+rZU=XRZD1GJ2mT0N1Sc&Rq9%fwU;$_V zJ>X98FxUZ}0)GTAfuUCsH*hYP0ZKs?XaHScE!YSi244qzz#l=;Lh1^b1{Q#2pbOjv zHi9kSaj+LW3tj}7MbsNG8!QDKU<23!c7X#xRSr?(z$|bLXa{$JFM_AQv*2Yg{7r-# zOa`;TLQn@*fIGov@D;Ed{1O}jFN2e+2sbzv%mP*5Mz9v#3mygA!4u$V@OMzO7{9S zfGW@q)`4EI9qa;6gM;8@aOyRr1E>HsV1?jvbVIj;C&7O3cQE8y@&RN)38(Z&!9nl>82)DJCYTIL!4hyIxD9Lsn?WCV3Ooy52IJmBJqA~RI`9r~H+U561be}= zV0aGQ;2ba$%mYh77q}g40*`^6U=Mf}90r4GhzmF!OawE*W#Agn2v&f#;7-sB9s}P4 zzX8vKA+^YYnc#Y`2HXWUgU7*B;92l87*|L7f(t<@r~+>RUEo%*5o`f{U>`ULUIN4G zkp+{%EKmWeKn+*}HiA!q9pJ~{S@0ql(m)=8ncxbr6s!PufX!e#cpU5o&w@ep$D_e{ zU^b`%HJ}x&0e6B%%J>p656l2(f#KlAd6XmYG}sNk0v-l;gFC<)&>- z#)HSkuE)l%j7^V?U5|}jk34etKiBr1gXdOVS6RI%cQbdmw$-aE0<*sG_LJUa^A~ZY zQE*@IWNp^h8`~R%S80y9%*fn6xmt7N9>Od2lUAf2(9fbt?lo2FP1-D1EE@BtLVJBd zqN)zfTvNo9;rAqX(zAjn4-aHfKI&P~r*FAqw^V+*R z*`{)Ze&#mD1{0^-v{`N?RO-|ESz=<$OSD;H!mVo^tK|l`&NjAQZ4TYV`5!fWx$?V} z`-9aSZC;kE>t42uOWM`>+N>{s*4H3vY4vb%c~w=ey_+leIy%}q)Hdykd#r=3Q6JJA zxqpuRp!#`ESy>fs5 z#*_mSo-YnvR9U`I-$8hjsK~W;H#e)tT&`BNHO3)<)mL1OPW~H$GT36uWN+xAp((E( z(P8gw)z`5vQ)-0{i`+-9Lt@KQ`H=E!Dsxwrg&Z}%-;?m+=OM`m4SZwFcudFDq zvISXv&E<(ZdqMCMNq*CcTyws4c^Bp6&0$FME%hzz6B;~s(N&dXZA&{Bi+1Mfs8Toa zU9INo+k+b{?`N)7?aYMqzg)iK(^p--gwB!qo3S(Z8LPA0xa!=W=yC{Go>F{<%hNeC z-sR}x$0cj(1kEjLT24v3x}CbpW}+buZ(dVtZL{1js>UVd)$xwI#oXPi-KxH1OmvkT zF|2CN!m^ycnq8@XIx(8x+9dZ*suvwz5R!j5yeK5|f{@7V?`o(Mia=Mf!!x1!=CH*T zbEf9RfqL9LS99}jCzsT*E%6EAOq({t*ndx(F1XN`z8{zz_dgWg^qJQEPsDV=)M>{3 z-oWIz-+bIvWfvH0^^ks!EawDe%r?6n`MkO(tP#R&?aZrJ2I(>;B}3==OOaXU?#E57 z;eNap^-DJg$L1|Tnh+f>rB`bLb7xnFn17(dU3q2s zb#z|!-E#jrH?($jD)ppm!)35#6-s?O;_0;ed1SU7$@?OX_CFVy!`Rmp@VKN?T^;9Y z>8dzSm;c)$UIW)AugIH=g4KHp_>v8B9kx>MPTHyaBM$k>jjUEnZ<4RxQ&c`TcX`#K zt1IQ|`W$J5m-=GnFN%$%9Q=|T?LF!FuHpJl@r84)DmNLR9yn2RbbPK?a~3b0np-rt zy1bfu$E)TqygWxWQcoE-JoX;9V3A>-chdF2qk6lOYps%PYM;@>wT~^f z$LD;PqqSY*a%_DVPSu>NB$~9CZ%?<$)pm1Tt+_T> zb)~pzX`^mSlcDSP@h9n;8>BVKY6niVom|VRZZWaabzLgu_l-tL%g*k)8yT{ic4COp zV@t#bj4PdJIm^4-@?>E24o9nulx}y-+?mc;YG^^YxSizqN=BsSGU}$boCI8bGYSvm z@qDY?D;wm<17?&gSDrW5GBh@0(=UW&UwRrD4}aF>=$7Z}E~m4NvbHp+k@PWUhH&t> zMVDQXYi(+n*2(yOuo=}!y6ADnpvbJ#xyYDrZf>emWxC(Xx7M3su`1VQ5jBI%y46}l z%?tSrdc+m*Tch^7wzG9A*ZMLuA-|M*Yr;ksYq?xo6&05+ynOyb8f+>Y3H;r`Wfi7T zJ*4B&**cA=DD{H0_qP3S>g>|YZw7sUG*ES`1MAur%ICJgPS@^BO>USvuP>#iZPfRa z)7i#zudG5>jZQV5lvy}WDhihpH{+*zo6a|BYU5?`KF!x^P3c7G-%lb}bwup-%bhf# zGA|2rP#TzAeaGtdt~T}Ykjv0@mGnw`b?kNVmL^#()M?J>gpNVRCH30OGvhs_8bZ?r z7b=wxOpNW6S{9fX+wp=&n;P<+T%cXAE(%TghWvERQrBu;NBsMt?QayW-0&c#Nv(warj zG={X|*Wfq@spDfD(erGi$M|kyqLa{zxkjU7_xpb3@Ldh+S5j<8Xxn;9VRLg+Z5VBJ zcAOtXL!EE3&UP+e!!*Oinvz> zT&a~Idv(B#^^;2it~5ZQ-nM{CbE}tv)W4%Sgt)XfR=-7$N2qe9QB-$mvkagX=qDWj zG$?hi9l3NeT9OpID@-vNyL7iONX)lTqkE%P+cenfm%5JDb>?e3>Kk)PJ)WFd=(guP zx9yQJLUUW&P4rkdn!aVhqD5CSyp`VN|7!2s!>TINw_kLds8ncVm}I2XFon4e?>e7Q zp)^rZNUbPDHww801T->g$f&T$P#JTKii{d7rmwrkPgb2|8#`&v^4y$kD7)g{*q)!e z9LRagZ*29a=fI#SIQdpSH6t6JU38MI7{=bMMJL(Hu8V!tBS1?|vWHuLj&hBxlkb56 zWmosY8SFQmCtf)TYJ-q@-b}>LONNg$b>?7pldnpR zpEEI`@5=5z*%tTe)}Cw&rU$&05oNOOH@9czt8dZO5#0S%aJ8t4>^hB%|H!FZV?Xb3>Nr zr7gxa)8LttlM+*B$0sFDjq`4dtn}8w*T~6+u3{3IPhF6fmx(H}tZy3(z~!JM`Tf>l zPmYiTZ%q;uazZ>ivUh}|@p)*ld(KG{lcr8~H@i2cd!J$}X3j`DqQKX=nQ`G z@C=t)v5|)H!G@WP^w`$YZ2$5=x~oD%y)~J=t9qw}xh3Xf8~RBcJ!hK)?Ogx@-II z7v}lSt`f*Urptl*gtbb@B?BhSNX^VkU74PXSenh27-D}Sdc}!-S>D4 zM`0M-%gxu_R=0za?)}Pw%&84%o+{8@=@*C#?5e@%P>Jo{!4TiuG4AIM9EHqQ2^`*X5gE%&FsJ#b7u^~60^ z_w9j?GOg!Xoh2u%$9I-*yqn41REH;)i52O)%0KO^9t8CX;A?0qgxGgJkyB9gVl*XU# z-XwYJ=ACd z?xKaFB*={4Elp1qIYl7npM0CjYXUjos)s3!d?;NJ` z99l}e%#pW`tPwb>rZVH=G-);(m#6`VZ`T{lOwUc7G=q>Yy)7=mUXsP?&*B-q zCMWsI-NvTq2%%bxPwaEoPEHFf#9X4Ukn0Y|Cw*%t5%Rga+P~Spw_GOuYbaypLWc&5|+|q$l^AdBj7oyjjoqHL^ z4zrZVx?ZSqs|H<}1wG&or2FFw7DDiVjNwQiErd*F=l{*kL)cj+djg^N=p=1Wa(eDk zG+Xm=0{4W3jQ7m~lfN-BJ(tB*8oC9O8SlgihMstYseW=szqQF3tlVQI*~8ZM-R{J^ zqqlojP+VqS+5+6XyK_S3g50#+8!_gAJTh${OPWlu`IYHO3Gncyum=woV?5&07c5`A zI6e2sIP7qb&qUDjoT)G-=aR*2&2*QKPH_ilE+Nz6XU~XF5CwO7$Ylhk>p}!5nZn)y z5%5d~fd#lQ1EY62TgOao66fy6)?G+aAt=1ZHGpD^vJsKkKO4Eg?YXMwV6FG=dctnd zjZ~7BlR18A-uN3bv&Q2HW_JH0{O^4_>(rH<8i7+IaB2ijjlloL5kNx_T*Uji0xuMQL-2QK?_a!}`uQ&& z0d))s{V%?~Q@8eiH3C6yFob)*N~hl^gWT_(f%#w5ZzbLaks&^&Z}5A7*5dzV|Ifc= z=h(yk7cUhLWC%NlB#~778&78A-BdD@%)s(g{CgSRv!Ct0ukqDuY~0y5{`9>%?pE)2 zEDh*=f8?bdD}r#me3DBtNfud*qh*o+Nym}1$RYy4N9x^uIN&@7{l;Dw;9o*klJWTL zWbCt))ico&JQ%fV|F&XPnDu$+iMw zf_g{QPnNr*`k%~0GDayI$5?`MLq0>NvwQbu=g4u6AAytIehzOKla4$M91GCWDc9H)Pw?NmS24r+D!YBS#| zunMgrtJo^BO06=h+}dbWSd~_lwZ*Eowpuk-tyO2$TXFUjJHbx0lkItSx$`6|V6k2v zFW|o67Vtmux#AK!PMR*=FMT9!Fy1y4Gv3TLL#zqbWNWUq#QKA^-ukn(&3emfv%0Kc zJHj??KpTn1p$>nWy-C}TIFHoY2_v5ZDpVGjS{2|S1(X` zb)q^;O;eYtx2kK^ht;Rmm(;h_ed;%AkTzVqK;yNE+AJ+iTc+Krt<@gZg7tH8C-Kf> z?0$3HVJ2IJVDTpLW$~ZlBlHpJH0^9{j+U-Hru|JT(Hry$#x(OLv&j6_B1P^Hk>Pw3 ze*oiiu`o$U7H$^S3(wIfBtx!~ign1zP1CZpKWa7F zZtZma_xiQ^3jHq_(O>klj6(Ze`x@s_hivtZe+jpQ-^Py>#?iZ^U!-{XfV@O`McJf2 zrIz5+T?VNq#KiHR#ruN$qQ`OB<$# z>JOVq_Ukrj!q;HovqQPd`G9!4_>nk(j;55x)92_mx?7ql$0+wHf5G`aQM#22Ra<3o zuu5I8R;hneUqhsxsZG#QwI#OC8N%kE&6|Tz?gB1_OXL17M2R2Lz49z&jxtRDgZ{Ry zIkt13Q{}wr>|y(NdNDeL8_DUM!;`VWexR3dN@`D9SNpTiB4bCp7(P?s;offCn zX>;1015St2>2x{WP7gZ;xWrs+t}}O7?^&7 zsY&Vs>LJzAuG6x$+q9)Rv3+*19b$*tVRksOCDM+vqwN@*v#G5jcVg}SIhkV5xBYg8 z9k6rke7nFdw2SOwyTmTF%j|M{qg`Q>$RJXI>kxUJ@8OBy6M}^hAyfzx!i5OoZJ|Z@ zLKr2ch)-aS?x6QeKS`ryL(Y@W>xUX$YPZ^ROrC~o5n7}crA2Eo8mCcB)l4l`i_@lP z30k6-tj*I>wE3D}JJXzCUT&tEH=7Td&zWzVNkE+EtR5@O{)~+=7v#p+NWM`xTfCB< zBXvmM$MVPK|+w2 zfM~czEmn78G!5;q+6P*w9%_s;es8Flo0-P_MuGW+`K@)0{f&Ld4tCCRu5f0uYrvO# zvsk5EBKIk`hu6g!bQS%Yj+AytpGw`*4CP{VlKP-ptB%wz(HgWf^(*yf^>AajnPJ^* ztpm0lv`)ty++tVTd+aZ5GCv5<*`d$D&F4PjJ`ytNW7L)=OPi(7r03;-$ZyI&$b*#- z7(>W{dfAMx}+!SbM-~~ zQvD9SO5dVa>s$32y;iT&>w#ap^hUkG*kv>tO-8fPVze4eX;zuF zW}R7YHkiB2Ml;>M+y2=8#Xj3HoOI`I=P%A{&Ib;`7gA@iA?22F8@U?pb?zWHisyKn zf1BUKxA7MUmk85@*}@XxPN7ox5?TCv(H0ZL$HXRauXs@WS-gNwpeyK0$gURYMO`u{ zn{&)od!K#S9_?g052FJ8#OAEX%gw>uDCG9z+-sP*)A+Y(qBK`pE&mM|`<*-*G5Ld* z=HBs_dY67!Kg~Gbm}H#GK3^8ZV46I{y~@4MjpoPl7JoOtncvNi5aNW}g~8GU$&#i? z3#4qRNLnpDBK=j`Exm;b_my;58YmB!$H?PkMUIs(mn-Eb9xm1Z)HUQTS zD`%@IYPNcdx>VbweQJDfbeY78vl6XtYbdL0l|f*{gd7$!fsX6MDshh(L@%J*rMYsJ zoG-7(F~3)asG;g)twbBESLnPk%{ap>um;#?*<{Q4L7HTNSok)Mfq*w257Iyz9eNSGxo6)VJN=_j;C z+9vsx3?-oCDEUf(Qm7Ou#Y%}%s+1|^%0{I^sZ^?zElRbrRjE;Gl{%$fX;5}4jY^Z! zth6YtN;x9$Bkfmhm42T-+PK8XG;T508_yaez#VddLqFSRIWwFjpmYl`78h0@IUGr{<~mX*;wwZHMuNF~VGCwwmucAF|Ih1(6iIH1jQdE8?jg z6}E%#Ti_^5b5ypCQVZIr5voyH!+u~Myk;Lm;5^H!s^&pKoc!&qJl)O>`^ zNm~$!z{?WzN9!Ux)&9HvsXfHeoLTI=ok6b7X0@b%{~I49Y!pIq>@m`<(x>vJx~R8e zjz^mRv}*19+5TjJi)$VHUxg}q4X)q~={~t$Zk3->!qm~~UbPQV*8)>U=vV1$_5J#L z#`&ll1Kik%1mn4#tKxQYjodq2H#dkM!7t$p`RDkTc^MhBUZ@f77XKl(i4l~e)9G@$ zp6;eUqAE4X!;~4y&*}x*B5i}#sHK^AnD3cGEz7#g8f=eZ*B3d!tIzy=`U{N)cl$;9 zqkKQ&c$@qZxa1r1yK* zy~c|`^=?zK9=BSpRMb1-R66gWHVlAvBt+n5a=&or@t5*f@b~hM^P`1m;cnq6;ao9Q z+#o(KHi!b9N$1mLK>Ww(%XAO@oc7SeQUGk|cgjP`J4y;FimKHDNwW3LdW^Bac*9s~ zJ_N2d%6i_eXK|D0jpZd=Dp$h&nLor&5dGpqA}`5OnzTq-kJ*1&+9ieHIDYMR{Zaiz z{T=-?)F#cCVJtN6Fm~JR_W9s1NluCLwL|6)aCzNKu0{Ap7%h%cvcZ#nQO;1$M;%(C zU8oN;74uPZV=rHS&3?uChRs3F08$KpXfC&k`z!YW7sOu%G<#a86}Ag63$F=p3GWGe zg?++j!a?CX;YZ9u~w`T>oJnM#73Zav)CfGA|~6BdmUn@_zhU=FLa9p;c;=+NA^F3Z2jZ-BOQ4WS<-?hsdFFm>e!g$dPiC9F1t=WGbuj zByhADN-j|C7HESV%FD`Y%3I2N%3j3OXUaj;;2)J=l|kw-XoYjs^H7O@k4h}522{i4 z>U1!)tJG9AU0nkGaD#fYdYfC1%hio)g<1*5x&>8vt6BqwP^Z?b4eBnn@g&NtFXNAB z9gjmj45WKmdrf;wdr#Yoy8Rgx+IQNIK+-|_Fnzdwj((m#4qSc$D!8Ff)Gybk>q)?i zR6Si^qA$~L&~Mg@^%A{QFVoBQji?oszfs?t^k%(9Z`IrMcKv|fp?9JxcI!RRTRtP$ z2!ZMfGs=x;jDtqEF~AHr4RbD3$p-TUpvO1nVKdB9tr=F1wHEp?%GT_w?VIeiz|L3g zHv3=pS1cEbyx0v#^?wSL^=s}Neggj?p95}r6MX@!`4Q_?_41g@j8sQQ$M02 z2gjU@k+0IOgxVQrMp|Q?cxWB(dK@mApU&&TZp8lY=v3%c71wc-GDdY&8N6tQ@qqcX z*=9aveQf=M-ADZZ7w=oRbNRV^CI5i9RIZQ>HBlX)ZPtF)?$;L>L(NX}HY?JOfOa5F z1Ki&?{}z|W|GtAWZW~X=t`OLVYxthR{$NM#E_YeFH4sFcOV%W(sC=G%&NxYPSwp9abl_ zdAD^tbc5-{I&sbvC&5W{lAU=@iZkCi3FVF?dm_R)!ebi1Dk`sO%Z+j{VsWIJpnjna*G7X!zp8(wkAb#W0)6ti5rkQrYbHVwR3j>O z*~6Xl9o?<916>`N#;pKTeVeNWTX|CWP?#vKkg}8qlx@m~s-hF~LNmc!4UObjnebpf zM>QMl2ySg1Nao>kRW5;B$!+1@lo!;W)K9dF^w;&l<^$FX)&j(13slrx@HreLaUfhDa z!)-wId58O!yOO_52*aJ^*b=vwRQp<|E&XEuK$r3 zLcc^cyb;``SiM_~I!2SXYhP-f(mPot*kC+hJZd}*^%rc81;d*I^tlVFZ-?0eH}4`V z)|zLfSo1Bvm0<-?1y1H5F0eDf^egQudkfU?R=dWowXcIdB=rMbFC>MZ&-?idKEUVj z`FsJ`Y`l;l%!B(dADk&e42U`KmI@Guzo!MXkQQOAOK2%AqvdoXjR9|1BQ2GWM~T(Y zD98H_8CpQg(ekwdpv6N#&~EDuHcm|gU2dhpTRR;b`WIom7%$!owlW-CcWAAJ#~dra;st_%q96*r8J@`i8={F`vFw^`x?;@#47 z(s(GhKY}lRj~Y8eJxBW&SnEt9!zjhs1WlrUz^H5Td}x5NN{0HmS`Wl4!EwsK5;htYMkV5Li&1TCHEJ+kbw<6> za1sZh!#Ea`hgs3~baqdXK6hO5p-NNWl3puRfSU$M=St6l+np`zaw?R-Td2~HLoXGB zA8pr7<4R+Wb*<}I@33FC;mx7bg#Y=*jTWvKMoM!KA3LGYUzbONn^mhM*5~qyk-}}_ z^Wsvv0f-a>R{4Vzg6w)1u6UQ~L!|6yIiBcq@sLGj5ns%g@TGi;oG#ym*}XzZS5_#u zD`%-$V1R#sr@m2tMjr}gy36#z=U!p$wSw&L?K; zFNp7p*C49nIH z;5dVobCk>B@ZX`VQ(jaKDI3*qfy-xT=fJmqP}`=pXfvRUTJ(F&?dCyX;s`d*MLrh? zr*R9pa_%*88hw@CBqhp4+8@Dr-obv@rwr#q|9={o+S_6~og=5fr_6A@h?R1Yd8sh&*2RCXXnDlya+C)0KdqFgLwt~%Q8Ko+ zSqau`)Q{^>J+4RXSb^TtDs-OKpzpK^U8l!TWuHOEX@}Kd?Y5e%Jz%E$!ArjaEB(nL z_G$3LN5Bmq126nyIN>sU@JZ-Q&49ObH5~9o@V|3W4R3+>eHWbX4X8q!QG=dB1$q%G z{S~{>eg}NzV<_z}>`wT#6tk}04=?&z^&cv@t2R{|s4v$)(huoF zjDHy|P!`Kvm+cYjS0e8PW@ZrUQDOxQ0R5GG@!lE8pVfa@=bABz*|Wzmk65Fg+Zo5vfN3H)3=S$f4>cup>^N0`y1( za%AWMU`M`Q0Q4yOk2HVlzt#HTMuZUwM2R+HfGHGx64QtUqRcZ=fGK`(hJcY{Pm=z8biUb0wmI(}sv!(!r60PL_fX7z% z>wq^{yWkc#SVLBjO4@v+9P#esg1HbNSr``%EQ{o#fMziq2M<8yOk`>tHwDTxkxS<0p*K4p-OdbT zZxL6F3@!y*Er%CW!Bs+IZsDrAt?+khxjL?%Yv6W)Z#HqwTnpFAwH@Ohgz%y0w}$f( zV7XCzG#>-xq`bQVDNl3t!D|HJgP%%sl7bC<- zV1Be1BXS}YRdm7Wh766I9^G_ApN2z4h>zU@HN4%!J!?S^+wB%c%vTn&}NfUGe$z6I!$eE_MvYrV1)Q0@q#+7dk|qA{WDx>OmhrA04p{bgcdGf?L&a^uEiW z`-6eoMd+<|>l7GTjZSJ5Fs=fa6$T6{#Z~xl#zN@hE}KK1Zb2Qy{e=#4pXZ50CT&D! zgd);Q5V-`ASb)gt6k?!~TfmIE@gz++5Jv?Inuq>>4%kl-ysa|yKq|p}YJnmxK#p#B zG~qxB6^`CKAVL9)J?;Y5vn{78f(7nhsp}bIdTD1R`ChWMm4lnt?PX@qN~>|x1fXACby$I)d5xB zEfd9uCkaB8FeMy{D^iJq=891`MTO>y>wOlCf>7t=I(zEdUnWP9uRY8^LNr zp|eZi8xzGu@25uTRATT6+CCF(P2b`hg4$T!+{=U zK#E|XLXlmEJff(j)p$k--#$&E!SADxB^9V$VW>r=h+iLSMIo@iOW?rWx4=`10;;wl z?_VRd9;54n^GacYEJy231z_SP|3iC&S zXmMaK$%sBb+_!vSS}{X8#*oKV5ChBx2fO5w*J&b-M#|*@O5BL9LEJosL0`HpMtp>10%BKV~@}kyng-C`V7U z3jNR;^g_Vv>pA=F7#l0=)Z)a_Y#HY7AY!k9I9?IDy|>VnvWbRhQC=31y=>N zQiBTH0AINoN~IlDwF?#1hiV!oML?s(pq84bqY0>?DX55wYu!x}sl(tsyIn&IBG zqb7DKJ@D#7)G##yzDOv!jQ#t+9PAF8QXEmg~1#Z(Qfs6+R(5znl)!l&tg zH`fDqE(9J;1fDdD!Bb`?{Fww)*c5cq1Mp@F(FZC;CRYGos`1og9iF9VgeTLgwZoC= zg1+)WTZKVaML| -#include -#else #include #include -#endif // return data from the server #define CURL_GLOBAL_ALL (CURL_GLOBAL_SSL|CURL_GLOBAL_WIN32) diff --git a/iguana.vcxproj b/iguana.vcxproj index e7a0d7a57..16d1eced8 100644 --- a/iguana.vcxproj +++ b/iguana.vcxproj @@ -73,12 +73,16 @@ true + $(ProjectDir)\includes;$(IncludePath) + $(ProjectDir)\OSlibs\win;$(LibraryPath) true false + C:\Users\faded_000\Desktop\needupdate\includes;$(IncludePath) + C:\Users\faded_000\Desktop\needupdate\OSlibs\win;$(LibraryPath) false @@ -97,7 +101,7 @@ Console true - Ws2_32.lib;pthreadVC2.lib;nanomsg.lib;%(AdditionalDependencies) + Ws2_32.lib;pthreadVC2.lib;nanomsg.lib;libcurl.lib;%(AdditionalDependencies) .\iguana;.\OSlibs\win;%(AdditionalLibraryDirectories) @@ -133,7 +137,7 @@ true true true - Ws2_32.lib;pthreadVC2.lib;nanomsg.lib;%(AdditionalDependencies) + Ws2_32.lib;pthreadVC2.lib;nanomsg.lib;libcurl.lib;%(AdditionalDependencies) .\OSlibs\win\release;%(AdditionalLibraryDirectories) diff --git a/includes/curl/.gitignore b/includes/curl/.gitignore new file mode 100644 index 000000000..228a961fb --- /dev/null +++ b/includes/curl/.gitignore @@ -0,0 +1,4 @@ +curlbuild.h +curlver.h.dist +stamp-h2 +stamp-h3 diff --git a/includes/curl/Makefile.am b/includes/curl/Makefile.am new file mode 100644 index 000000000..7c924fcb5 --- /dev/null +++ b/includes/curl/Makefile.am @@ -0,0 +1,53 @@ +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at https://curl.haxx.se/docs/copyright.html. +# +# You may opt to use, copy, modify, merge, publish, distribute and/or sell +# copies of the Software, and permit persons to whom the Software is +# furnished to do so, under the terms of the COPYING file. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +########################################################################### +pkginclude_HEADERS = \ + curl.h curlver.h easy.h mprintf.h stdcheaders.h multi.h \ + typecheck-gcc.h curlbuild.h curlrules.h + +pkgincludedir= $(includedir)/curl + +# curlbuild.h does not exist in the git tree. When the original libcurl +# source code distribution archive file is created, curlbuild.h.dist is +# renamed to curlbuild.h and included in the tarball so that it can be +# used directly on non-configure systems. +# +# The distributed curlbuild.h will be overwritten on configure systems +# when the configure script runs, with one that is suitable and specific +# to the library being configured and built. +# +# curlbuild.h.in is the distributed template file from which the configure +# script creates curlbuild.h at library configuration time, overwiting the +# one included in the distribution archive. +# +# curlbuild.h.dist is not included in the source code distribution archive. + +EXTRA_DIST = curlbuild.h.in + +DISTCLEANFILES = curlbuild.h + +checksrc: + @@PERL@ $(top_srcdir)/lib/checksrc.pl -Wcurlbuild.h -D$(top_srcdir)/include/curl $(pkginclude_HEADERS) $(EXTRA_DIST) + +if CURLDEBUG +# for debug builds, we scan the sources on all regular make invokes +all-local: checksrc +endif diff --git a/includes/curl/curl.h b/includes/curl/curl.h new file mode 100644 index 000000000..7c7d28d6a --- /dev/null +++ b/includes/curl/curl.h @@ -0,0 +1,2551 @@ +#ifndef __CURL_CURL_H +#define __CURL_CURL_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2017, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* + * If you have libcurl problems, all docs and details are found here: + * https://curl.haxx.se/libcurl/ + * + * curl-library mailing list subscription and unsubscription web interface: + * https://cool.haxx.se/mailman/listinfo/curl-library/ + */ + +#ifdef CURL_NO_OLDIES +#define CURL_STRICTER +#endif + +#include "curlver.h" /* libcurl version defines */ +#include "curlbuild.h" /* libcurl build definitions */ +#include "curlrules.h" /* libcurl rules enforcement */ + +/* + * Define WIN32 when build target is Win32 API + */ + +#if (defined(_WIN32) || defined(__WIN32__)) && \ + !defined(WIN32) && !defined(__SYMBIAN32__) +#define WIN32 +#endif + +#include +#include + +#if defined(__FreeBSD__) && (__FreeBSD__ >= 2) +/* Needed for __FreeBSD_version symbol definition */ +#include +#endif + +/* The include stuff here below is mainly for time_t! */ +#include +#include + +#if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__CYGWIN__) +#if !(defined(_WINSOCKAPI_) || defined(_WINSOCK_H) || \ + defined(__LWIP_OPT_H__) || defined(LWIP_HDR_OPT_H)) +/* The check above prevents the winsock2 inclusion if winsock.h already was + included, since they can't co-exist without problems */ +#include +#include +#endif +#endif + +/* HP-UX systems version 9, 10 and 11 lack sys/select.h and so does oldish + libc5-based Linux systems. Only include it on systems that are known to + require it! */ +#if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \ + defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \ + defined(ANDROID) || defined(__ANDROID__) || defined(__OpenBSD__) || \ + (defined(__FreeBSD_version) && (__FreeBSD_version < 800000)) +#include +#endif + +#if !defined(WIN32) && !defined(_WIN32_WCE) +#include +#endif + +#if !defined(WIN32) && !defined(__WATCOMC__) && !defined(__VXWORKS__) +#include +#endif + +#ifdef __BEOS__ +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(BUILDING_LIBCURL) || defined(CURL_STRICTER) +typedef struct Curl_easy CURL; +typedef struct Curl_share CURLSH; +#else +typedef void CURL; +typedef void CURLSH; +#endif + +/* + * libcurl external API function linkage decorations. + */ + +#ifdef CURL_STATICLIB +# define CURL_EXTERN +#elif defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__) +# if defined(BUILDING_LIBCURL) +# define CURL_EXTERN __declspec(dllexport) +# else +# define CURL_EXTERN __declspec(dllimport) +# endif +#elif defined(BUILDING_LIBCURL) && defined(CURL_HIDDEN_SYMBOLS) +# define CURL_EXTERN CURL_EXTERN_SYMBOL +#else +# define CURL_EXTERN +#endif + +#ifndef curl_socket_typedef +/* socket typedef */ +#if defined(WIN32) && !defined(__LWIP_OPT_H__) && !defined(LWIP_HDR_OPT_H) +typedef SOCKET curl_socket_t; +#define CURL_SOCKET_BAD INVALID_SOCKET +#else +typedef int curl_socket_t; +#define CURL_SOCKET_BAD -1 +#endif +#define curl_socket_typedef +#endif /* curl_socket_typedef */ + +struct curl_httppost { + struct curl_httppost *next; /* next entry in the list */ + char *name; /* pointer to allocated name */ + long namelength; /* length of name length */ + char *contents; /* pointer to allocated data contents */ + long contentslength; /* length of contents field, see also + CURL_HTTPPOST_LARGE */ + char *buffer; /* pointer to allocated buffer contents */ + long bufferlength; /* length of buffer field */ + char *contenttype; /* Content-Type */ + struct curl_slist *contentheader; /* list of extra headers for this form */ + struct curl_httppost *more; /* if one field name has more than one + file, this link should link to following + files */ + long flags; /* as defined below */ + +/* specified content is a file name */ +#define CURL_HTTPPOST_FILENAME (1<<0) +/* specified content is a file name */ +#define CURL_HTTPPOST_READFILE (1<<1) +/* name is only stored pointer do not free in formfree */ +#define CURL_HTTPPOST_PTRNAME (1<<2) +/* contents is only stored pointer do not free in formfree */ +#define CURL_HTTPPOST_PTRCONTENTS (1<<3) +/* upload file from buffer */ +#define CURL_HTTPPOST_BUFFER (1<<4) +/* upload file from pointer contents */ +#define CURL_HTTPPOST_PTRBUFFER (1<<5) +/* upload file contents by using the regular read callback to get the data and + pass the given pointer as custom pointer */ +#define CURL_HTTPPOST_CALLBACK (1<<6) +/* use size in 'contentlen', added in 7.46.0 */ +#define CURL_HTTPPOST_LARGE (1<<7) + + char *showfilename; /* The file name to show. If not set, the + actual file name will be used (if this + is a file part) */ + void *userp; /* custom pointer used for + HTTPPOST_CALLBACK posts */ + curl_off_t contentlen; /* alternative length of contents + field. Used if CURL_HTTPPOST_LARGE is + set. Added in 7.46.0 */ +}; + +/* This is the CURLOPT_PROGRESSFUNCTION callback proto. It is now considered + deprecated but was the only choice up until 7.31.0 */ +typedef int (*curl_progress_callback)(void *clientp, + double dltotal, + double dlnow, + double ultotal, + double ulnow); + +/* This is the CURLOPT_XFERINFOFUNCTION callback proto. It was introduced in + 7.32.0, it avoids floating point and provides more detailed information. */ +typedef int (*curl_xferinfo_callback)(void *clientp, + curl_off_t dltotal, + curl_off_t dlnow, + curl_off_t ultotal, + curl_off_t ulnow); + +#ifndef CURL_MAX_READ_SIZE + /* The maximum receive buffer size configurable via CURLOPT_BUFFERSIZE. */ +#define CURL_MAX_READ_SIZE 524288 +#endif + +#ifndef CURL_MAX_WRITE_SIZE + /* Tests have proven that 20K is a very bad buffer size for uploads on + Windows, while 16K for some odd reason performed a lot better. + We do the ifndef check to allow this value to easier be changed at build + time for those who feel adventurous. The practical minimum is about + 400 bytes since libcurl uses a buffer of this size as a scratch area + (unrelated to network send operations). */ +#define CURL_MAX_WRITE_SIZE 16384 +#endif + +#ifndef CURL_MAX_HTTP_HEADER +/* The only reason to have a max limit for this is to avoid the risk of a bad + server feeding libcurl with a never-ending header that will cause reallocs + infinitely */ +#define CURL_MAX_HTTP_HEADER (100*1024) +#endif + +/* This is a magic return code for the write callback that, when returned, + will signal libcurl to pause receiving on the current transfer. */ +#define CURL_WRITEFUNC_PAUSE 0x10000001 + +typedef size_t (*curl_write_callback)(char *buffer, + size_t size, + size_t nitems, + void *outstream); + + + +/* enumeration of file types */ +typedef enum { + CURLFILETYPE_FILE = 0, + CURLFILETYPE_DIRECTORY, + CURLFILETYPE_SYMLINK, + CURLFILETYPE_DEVICE_BLOCK, + CURLFILETYPE_DEVICE_CHAR, + CURLFILETYPE_NAMEDPIPE, + CURLFILETYPE_SOCKET, + CURLFILETYPE_DOOR, /* is possible only on Sun Solaris now */ + + CURLFILETYPE_UNKNOWN /* should never occur */ +} curlfiletype; + +#define CURLFINFOFLAG_KNOWN_FILENAME (1<<0) +#define CURLFINFOFLAG_KNOWN_FILETYPE (1<<1) +#define CURLFINFOFLAG_KNOWN_TIME (1<<2) +#define CURLFINFOFLAG_KNOWN_PERM (1<<3) +#define CURLFINFOFLAG_KNOWN_UID (1<<4) +#define CURLFINFOFLAG_KNOWN_GID (1<<5) +#define CURLFINFOFLAG_KNOWN_SIZE (1<<6) +#define CURLFINFOFLAG_KNOWN_HLINKCOUNT (1<<7) + +/* Content of this structure depends on information which is known and is + achievable (e.g. by FTP LIST parsing). Please see the url_easy_setopt(3) man + page for callbacks returning this structure -- some fields are mandatory, + some others are optional. The FLAG field has special meaning. */ +struct curl_fileinfo { + char *filename; + curlfiletype filetype; + time_t time; + unsigned int perm; + int uid; + int gid; + curl_off_t size; + long int hardlinks; + + struct { + /* If some of these fields is not NULL, it is a pointer to b_data. */ + char *time; + char *perm; + char *user; + char *group; + char *target; /* pointer to the target filename of a symlink */ + } strings; + + unsigned int flags; + + /* used internally */ + char *b_data; + size_t b_size; + size_t b_used; +}; + +/* return codes for CURLOPT_CHUNK_BGN_FUNCTION */ +#define CURL_CHUNK_BGN_FUNC_OK 0 +#define CURL_CHUNK_BGN_FUNC_FAIL 1 /* tell the lib to end the task */ +#define CURL_CHUNK_BGN_FUNC_SKIP 2 /* skip this chunk over */ + +/* if splitting of data transfer is enabled, this callback is called before + download of an individual chunk started. Note that parameter "remains" works + only for FTP wildcard downloading (for now), otherwise is not used */ +typedef long (*curl_chunk_bgn_callback)(const void *transfer_info, + void *ptr, + int remains); + +/* return codes for CURLOPT_CHUNK_END_FUNCTION */ +#define CURL_CHUNK_END_FUNC_OK 0 +#define CURL_CHUNK_END_FUNC_FAIL 1 /* tell the lib to end the task */ + +/* If splitting of data transfer is enabled this callback is called after + download of an individual chunk finished. + Note! After this callback was set then it have to be called FOR ALL chunks. + Even if downloading of this chunk was skipped in CHUNK_BGN_FUNC. + This is the reason why we don't need "transfer_info" parameter in this + callback and we are not interested in "remains" parameter too. */ +typedef long (*curl_chunk_end_callback)(void *ptr); + +/* return codes for FNMATCHFUNCTION */ +#define CURL_FNMATCHFUNC_MATCH 0 /* string corresponds to the pattern */ +#define CURL_FNMATCHFUNC_NOMATCH 1 /* pattern doesn't match the string */ +#define CURL_FNMATCHFUNC_FAIL 2 /* an error occurred */ + +/* callback type for wildcard downloading pattern matching. If the + string matches the pattern, return CURL_FNMATCHFUNC_MATCH value, etc. */ +typedef int (*curl_fnmatch_callback)(void *ptr, + const char *pattern, + const char *string); + +/* These are the return codes for the seek callbacks */ +#define CURL_SEEKFUNC_OK 0 +#define CURL_SEEKFUNC_FAIL 1 /* fail the entire transfer */ +#define CURL_SEEKFUNC_CANTSEEK 2 /* tell libcurl seeking can't be done, so + libcurl might try other means instead */ +typedef int (*curl_seek_callback)(void *instream, + curl_off_t offset, + int origin); /* 'whence' */ + +/* This is a return code for the read callback that, when returned, will + signal libcurl to immediately abort the current transfer. */ +#define CURL_READFUNC_ABORT 0x10000000 +/* This is a return code for the read callback that, when returned, will + signal libcurl to pause sending data on the current transfer. */ +#define CURL_READFUNC_PAUSE 0x10000001 + +typedef size_t (*curl_read_callback)(char *buffer, + size_t size, + size_t nitems, + void *instream); + +typedef enum { + CURLSOCKTYPE_IPCXN, /* socket created for a specific IP connection */ + CURLSOCKTYPE_ACCEPT, /* socket created by accept() call */ + CURLSOCKTYPE_LAST /* never use */ +} curlsocktype; + +/* The return code from the sockopt_callback can signal information back + to libcurl: */ +#define CURL_SOCKOPT_OK 0 +#define CURL_SOCKOPT_ERROR 1 /* causes libcurl to abort and return + CURLE_ABORTED_BY_CALLBACK */ +#define CURL_SOCKOPT_ALREADY_CONNECTED 2 + +typedef int (*curl_sockopt_callback)(void *clientp, + curl_socket_t curlfd, + curlsocktype purpose); + +struct curl_sockaddr { + int family; + int socktype; + int protocol; + unsigned int addrlen; /* addrlen was a socklen_t type before 7.18.0 but it + turned really ugly and painful on the systems that + lack this type */ + struct sockaddr addr; +}; + +typedef curl_socket_t +(*curl_opensocket_callback)(void *clientp, + curlsocktype purpose, + struct curl_sockaddr *address); + +typedef int +(*curl_closesocket_callback)(void *clientp, curl_socket_t item); + +typedef enum { + CURLIOE_OK, /* I/O operation successful */ + CURLIOE_UNKNOWNCMD, /* command was unknown to callback */ + CURLIOE_FAILRESTART, /* failed to restart the read */ + CURLIOE_LAST /* never use */ +} curlioerr; + +typedef enum { + CURLIOCMD_NOP, /* no operation */ + CURLIOCMD_RESTARTREAD, /* restart the read stream from start */ + CURLIOCMD_LAST /* never use */ +} curliocmd; + +typedef curlioerr (*curl_ioctl_callback)(CURL *handle, + int cmd, + void *clientp); + +#ifndef CURL_DID_MEMORY_FUNC_TYPEDEFS +/* + * The following typedef's are signatures of malloc, free, realloc, strdup and + * calloc respectively. Function pointers of these types can be passed to the + * curl_global_init_mem() function to set user defined memory management + * callback routines. + */ +typedef void *(*curl_malloc_callback)(size_t size); +typedef void (*curl_free_callback)(void *ptr); +typedef void *(*curl_realloc_callback)(void *ptr, size_t size); +typedef char *(*curl_strdup_callback)(const char *str); +typedef void *(*curl_calloc_callback)(size_t nmemb, size_t size); + +#define CURL_DID_MEMORY_FUNC_TYPEDEFS +#endif + +/* the kind of data that is passed to information_callback*/ +typedef enum { + CURLINFO_TEXT = 0, + CURLINFO_HEADER_IN, /* 1 */ + CURLINFO_HEADER_OUT, /* 2 */ + CURLINFO_DATA_IN, /* 3 */ + CURLINFO_DATA_OUT, /* 4 */ + CURLINFO_SSL_DATA_IN, /* 5 */ + CURLINFO_SSL_DATA_OUT, /* 6 */ + CURLINFO_END +} curl_infotype; + +typedef int (*curl_debug_callback) + (CURL *handle, /* the handle/transfer this concerns */ + curl_infotype type, /* what kind of data */ + char *data, /* points to the data */ + size_t size, /* size of the data pointed to */ + void *userptr); /* whatever the user please */ + +/* All possible error codes from all sorts of curl functions. Future versions + may return other values, stay prepared. + + Always add new return codes last. Never *EVER* remove any. The return + codes must remain the same! + */ + +typedef enum { + CURLE_OK = 0, + CURLE_UNSUPPORTED_PROTOCOL, /* 1 */ + CURLE_FAILED_INIT, /* 2 */ + CURLE_URL_MALFORMAT, /* 3 */ + CURLE_NOT_BUILT_IN, /* 4 - [was obsoleted in August 2007 for + 7.17.0, reused in April 2011 for 7.21.5] */ + CURLE_COULDNT_RESOLVE_PROXY, /* 5 */ + CURLE_COULDNT_RESOLVE_HOST, /* 6 */ + CURLE_COULDNT_CONNECT, /* 7 */ + CURLE_WEIRD_SERVER_REPLY, /* 8 */ + CURLE_REMOTE_ACCESS_DENIED, /* 9 a service was denied by the server + due to lack of access - when login fails + this is not returned. */ + CURLE_FTP_ACCEPT_FAILED, /* 10 - [was obsoleted in April 2006 for + 7.15.4, reused in Dec 2011 for 7.24.0]*/ + CURLE_FTP_WEIRD_PASS_REPLY, /* 11 */ + CURLE_FTP_ACCEPT_TIMEOUT, /* 12 - timeout occurred accepting server + [was obsoleted in August 2007 for 7.17.0, + reused in Dec 2011 for 7.24.0]*/ + CURLE_FTP_WEIRD_PASV_REPLY, /* 13 */ + CURLE_FTP_WEIRD_227_FORMAT, /* 14 */ + CURLE_FTP_CANT_GET_HOST, /* 15 */ + CURLE_HTTP2, /* 16 - A problem in the http2 framing layer. + [was obsoleted in August 2007 for 7.17.0, + reused in July 2014 for 7.38.0] */ + CURLE_FTP_COULDNT_SET_TYPE, /* 17 */ + CURLE_PARTIAL_FILE, /* 18 */ + CURLE_FTP_COULDNT_RETR_FILE, /* 19 */ + CURLE_OBSOLETE20, /* 20 - NOT USED */ + CURLE_QUOTE_ERROR, /* 21 - quote command failure */ + CURLE_HTTP_RETURNED_ERROR, /* 22 */ + CURLE_WRITE_ERROR, /* 23 */ + CURLE_OBSOLETE24, /* 24 - NOT USED */ + CURLE_UPLOAD_FAILED, /* 25 - failed upload "command" */ + CURLE_READ_ERROR, /* 26 - couldn't open/read from file */ + CURLE_OUT_OF_MEMORY, /* 27 */ + /* Note: CURLE_OUT_OF_MEMORY may sometimes indicate a conversion error + instead of a memory allocation error if CURL_DOES_CONVERSIONS + is defined + */ + CURLE_OPERATION_TIMEDOUT, /* 28 - the timeout time was reached */ + CURLE_OBSOLETE29, /* 29 - NOT USED */ + CURLE_FTP_PORT_FAILED, /* 30 - FTP PORT operation failed */ + CURLE_FTP_COULDNT_USE_REST, /* 31 - the REST command failed */ + CURLE_OBSOLETE32, /* 32 - NOT USED */ + CURLE_RANGE_ERROR, /* 33 - RANGE "command" didn't work */ + CURLE_HTTP_POST_ERROR, /* 34 */ + CURLE_SSL_CONNECT_ERROR, /* 35 - wrong when connecting with SSL */ + CURLE_BAD_DOWNLOAD_RESUME, /* 36 - couldn't resume download */ + CURLE_FILE_COULDNT_READ_FILE, /* 37 */ + CURLE_LDAP_CANNOT_BIND, /* 38 */ + CURLE_LDAP_SEARCH_FAILED, /* 39 */ + CURLE_OBSOLETE40, /* 40 - NOT USED */ + CURLE_FUNCTION_NOT_FOUND, /* 41 - NOT USED starting with 7.53.0 */ + CURLE_ABORTED_BY_CALLBACK, /* 42 */ + CURLE_BAD_FUNCTION_ARGUMENT, /* 43 */ + CURLE_OBSOLETE44, /* 44 - NOT USED */ + CURLE_INTERFACE_FAILED, /* 45 - CURLOPT_INTERFACE failed */ + CURLE_OBSOLETE46, /* 46 - NOT USED */ + CURLE_TOO_MANY_REDIRECTS, /* 47 - catch endless re-direct loops */ + CURLE_UNKNOWN_OPTION, /* 48 - User specified an unknown option */ + CURLE_TELNET_OPTION_SYNTAX, /* 49 - Malformed telnet option */ + CURLE_OBSOLETE50, /* 50 - NOT USED */ + CURLE_PEER_FAILED_VERIFICATION, /* 51 - peer's certificate or fingerprint + wasn't verified fine */ + CURLE_GOT_NOTHING, /* 52 - when this is a specific error */ + CURLE_SSL_ENGINE_NOTFOUND, /* 53 - SSL crypto engine not found */ + CURLE_SSL_ENGINE_SETFAILED, /* 54 - can not set SSL crypto engine as + default */ + CURLE_SEND_ERROR, /* 55 - failed sending network data */ + CURLE_RECV_ERROR, /* 56 - failure in receiving network data */ + CURLE_OBSOLETE57, /* 57 - NOT IN USE */ + CURLE_SSL_CERTPROBLEM, /* 58 - problem with the local certificate */ + CURLE_SSL_CIPHER, /* 59 - couldn't use specified cipher */ + CURLE_SSL_CACERT, /* 60 - problem with the CA cert (path?) */ + CURLE_BAD_CONTENT_ENCODING, /* 61 - Unrecognized/bad encoding */ + CURLE_LDAP_INVALID_URL, /* 62 - Invalid LDAP URL */ + CURLE_FILESIZE_EXCEEDED, /* 63 - Maximum file size exceeded */ + CURLE_USE_SSL_FAILED, /* 64 - Requested FTP SSL level failed */ + CURLE_SEND_FAIL_REWIND, /* 65 - Sending the data requires a rewind + that failed */ + CURLE_SSL_ENGINE_INITFAILED, /* 66 - failed to initialise ENGINE */ + CURLE_LOGIN_DENIED, /* 67 - user, password or similar was not + accepted and we failed to login */ + CURLE_TFTP_NOTFOUND, /* 68 - file not found on server */ + CURLE_TFTP_PERM, /* 69 - permission problem on server */ + CURLE_REMOTE_DISK_FULL, /* 70 - out of disk space on server */ + CURLE_TFTP_ILLEGAL, /* 71 - Illegal TFTP operation */ + CURLE_TFTP_UNKNOWNID, /* 72 - Unknown transfer ID */ + CURLE_REMOTE_FILE_EXISTS, /* 73 - File already exists */ + CURLE_TFTP_NOSUCHUSER, /* 74 - No such user */ + CURLE_CONV_FAILED, /* 75 - conversion failed */ + CURLE_CONV_REQD, /* 76 - caller must register conversion + callbacks using curl_easy_setopt options + CURLOPT_CONV_FROM_NETWORK_FUNCTION, + CURLOPT_CONV_TO_NETWORK_FUNCTION, and + CURLOPT_CONV_FROM_UTF8_FUNCTION */ + CURLE_SSL_CACERT_BADFILE, /* 77 - could not load CACERT file, missing + or wrong format */ + CURLE_REMOTE_FILE_NOT_FOUND, /* 78 - remote file not found */ + CURLE_SSH, /* 79 - error from the SSH layer, somewhat + generic so the error message will be of + interest when this has happened */ + + CURLE_SSL_SHUTDOWN_FAILED, /* 80 - Failed to shut down the SSL + connection */ + CURLE_AGAIN, /* 81 - socket is not ready for send/recv, + wait till it's ready and try again (Added + in 7.18.2) */ + CURLE_SSL_CRL_BADFILE, /* 82 - could not load CRL file, missing or + wrong format (Added in 7.19.0) */ + CURLE_SSL_ISSUER_ERROR, /* 83 - Issuer check failed. (Added in + 7.19.0) */ + CURLE_FTP_PRET_FAILED, /* 84 - a PRET command failed */ + CURLE_RTSP_CSEQ_ERROR, /* 85 - mismatch of RTSP CSeq numbers */ + CURLE_RTSP_SESSION_ERROR, /* 86 - mismatch of RTSP Session Ids */ + CURLE_FTP_BAD_FILE_LIST, /* 87 - unable to parse FTP file list */ + CURLE_CHUNK_FAILED, /* 88 - chunk callback reported error */ + CURLE_NO_CONNECTION_AVAILABLE, /* 89 - No connection available, the + session will be queued */ + CURLE_SSL_PINNEDPUBKEYNOTMATCH, /* 90 - specified pinned public key did not + match */ + CURLE_SSL_INVALIDCERTSTATUS, /* 91 - invalid certificate status */ + CURLE_HTTP2_STREAM, /* 92 - stream error in HTTP/2 framing layer + */ + CURL_LAST /* never use! */ +} CURLcode; + +#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all + the obsolete stuff removed! */ + +/* Previously obsolete error code re-used in 7.38.0 */ +#define CURLE_OBSOLETE16 CURLE_HTTP2 + +/* Previously obsolete error codes re-used in 7.24.0 */ +#define CURLE_OBSOLETE10 CURLE_FTP_ACCEPT_FAILED +#define CURLE_OBSOLETE12 CURLE_FTP_ACCEPT_TIMEOUT + +/* compatibility with older names */ +#define CURLOPT_ENCODING CURLOPT_ACCEPT_ENCODING +#define CURLE_FTP_WEIRD_SERVER_REPLY CURLE_WEIRD_SERVER_REPLY + +/* The following were added in 7.21.5, April 2011 */ +#define CURLE_UNKNOWN_TELNET_OPTION CURLE_UNKNOWN_OPTION + +/* The following were added in 7.17.1 */ +/* These are scheduled to disappear by 2009 */ +#define CURLE_SSL_PEER_CERTIFICATE CURLE_PEER_FAILED_VERIFICATION + +/* The following were added in 7.17.0 */ +/* These are scheduled to disappear by 2009 */ +#define CURLE_OBSOLETE CURLE_OBSOLETE50 /* no one should be using this! */ +#define CURLE_BAD_PASSWORD_ENTERED CURLE_OBSOLETE46 +#define CURLE_BAD_CALLING_ORDER CURLE_OBSOLETE44 +#define CURLE_FTP_USER_PASSWORD_INCORRECT CURLE_OBSOLETE10 +#define CURLE_FTP_CANT_RECONNECT CURLE_OBSOLETE16 +#define CURLE_FTP_COULDNT_GET_SIZE CURLE_OBSOLETE32 +#define CURLE_FTP_COULDNT_SET_ASCII CURLE_OBSOLETE29 +#define CURLE_FTP_WEIRD_USER_REPLY CURLE_OBSOLETE12 +#define CURLE_FTP_WRITE_ERROR CURLE_OBSOLETE20 +#define CURLE_LIBRARY_NOT_FOUND CURLE_OBSOLETE40 +#define CURLE_MALFORMAT_USER CURLE_OBSOLETE24 +#define CURLE_SHARE_IN_USE CURLE_OBSOLETE57 +#define CURLE_URL_MALFORMAT_USER CURLE_NOT_BUILT_IN + +#define CURLE_FTP_ACCESS_DENIED CURLE_REMOTE_ACCESS_DENIED +#define CURLE_FTP_COULDNT_SET_BINARY CURLE_FTP_COULDNT_SET_TYPE +#define CURLE_FTP_QUOTE_ERROR CURLE_QUOTE_ERROR +#define CURLE_TFTP_DISKFULL CURLE_REMOTE_DISK_FULL +#define CURLE_TFTP_EXISTS CURLE_REMOTE_FILE_EXISTS +#define CURLE_HTTP_RANGE_ERROR CURLE_RANGE_ERROR +#define CURLE_FTP_SSL_FAILED CURLE_USE_SSL_FAILED + +/* The following were added earlier */ + +#define CURLE_OPERATION_TIMEOUTED CURLE_OPERATION_TIMEDOUT + +#define CURLE_HTTP_NOT_FOUND CURLE_HTTP_RETURNED_ERROR +#define CURLE_HTTP_PORT_FAILED CURLE_INTERFACE_FAILED +#define CURLE_FTP_COULDNT_STOR_FILE CURLE_UPLOAD_FAILED + +#define CURLE_FTP_PARTIAL_FILE CURLE_PARTIAL_FILE +#define CURLE_FTP_BAD_DOWNLOAD_RESUME CURLE_BAD_DOWNLOAD_RESUME + +/* This was the error code 50 in 7.7.3 and a few earlier versions, this + is no longer used by libcurl but is instead #defined here only to not + make programs break */ +#define CURLE_ALREADY_COMPLETE 99999 + +/* Provide defines for really old option names */ +#define CURLOPT_FILE CURLOPT_WRITEDATA /* name changed in 7.9.7 */ +#define CURLOPT_INFILE CURLOPT_READDATA /* name changed in 7.9.7 */ +#define CURLOPT_WRITEHEADER CURLOPT_HEADERDATA + +/* Since long deprecated options with no code in the lib that does anything + with them. */ +#define CURLOPT_WRITEINFO CURLOPT_OBSOLETE40 +#define CURLOPT_CLOSEPOLICY CURLOPT_OBSOLETE72 + +#endif /*!CURL_NO_OLDIES*/ + +/* This prototype applies to all conversion callbacks */ +typedef CURLcode (*curl_conv_callback)(char *buffer, size_t length); + +typedef CURLcode (*curl_ssl_ctx_callback)(CURL *curl, /* easy handle */ + void *ssl_ctx, /* actually an + OpenSSL SSL_CTX */ + void *userptr); + +typedef enum { + CURLPROXY_HTTP = 0, /* added in 7.10, new in 7.19.4 default is to use + CONNECT HTTP/1.1 */ + CURLPROXY_HTTP_1_0 = 1, /* added in 7.19.4, force to use CONNECT + HTTP/1.0 */ + CURLPROXY_HTTPS = 2, /* added in 7.52.0 */ + CURLPROXY_SOCKS4 = 4, /* support added in 7.15.2, enum existed already + in 7.10 */ + CURLPROXY_SOCKS5 = 5, /* added in 7.10 */ + CURLPROXY_SOCKS4A = 6, /* added in 7.18.0 */ + CURLPROXY_SOCKS5_HOSTNAME = 7 /* Use the SOCKS5 protocol but pass along the + host name rather than the IP address. added + in 7.18.0 */ +} curl_proxytype; /* this enum was added in 7.10 */ + +/* + * Bitmasks for CURLOPT_HTTPAUTH and CURLOPT_PROXYAUTH options: + * + * CURLAUTH_NONE - No HTTP authentication + * CURLAUTH_BASIC - HTTP Basic authentication (default) + * CURLAUTH_DIGEST - HTTP Digest authentication + * CURLAUTH_NEGOTIATE - HTTP Negotiate (SPNEGO) authentication + * CURLAUTH_GSSNEGOTIATE - Alias for CURLAUTH_NEGOTIATE (deprecated) + * CURLAUTH_NTLM - HTTP NTLM authentication + * CURLAUTH_DIGEST_IE - HTTP Digest authentication with IE flavour + * CURLAUTH_NTLM_WB - HTTP NTLM authentication delegated to winbind helper + * CURLAUTH_ONLY - Use together with a single other type to force no + * authentication or just that single type + * CURLAUTH_ANY - All fine types set + * CURLAUTH_ANYSAFE - All fine types except Basic + */ + +#define CURLAUTH_NONE ((unsigned long)0) +#define CURLAUTH_BASIC (((unsigned long)1)<<0) +#define CURLAUTH_DIGEST (((unsigned long)1)<<1) +#define CURLAUTH_NEGOTIATE (((unsigned long)1)<<2) +/* Deprecated since the advent of CURLAUTH_NEGOTIATE */ +#define CURLAUTH_GSSNEGOTIATE CURLAUTH_NEGOTIATE +#define CURLAUTH_NTLM (((unsigned long)1)<<3) +#define CURLAUTH_DIGEST_IE (((unsigned long)1)<<4) +#define CURLAUTH_NTLM_WB (((unsigned long)1)<<5) +#define CURLAUTH_ONLY (((unsigned long)1)<<31) +#define CURLAUTH_ANY (~CURLAUTH_DIGEST_IE) +#define CURLAUTH_ANYSAFE (~(CURLAUTH_BASIC|CURLAUTH_DIGEST_IE)) + +#define CURLSSH_AUTH_ANY ~0 /* all types supported by the server */ +#define CURLSSH_AUTH_NONE 0 /* none allowed, silly but complete */ +#define CURLSSH_AUTH_PUBLICKEY (1<<0) /* public/private key files */ +#define CURLSSH_AUTH_PASSWORD (1<<1) /* password */ +#define CURLSSH_AUTH_HOST (1<<2) /* host key files */ +#define CURLSSH_AUTH_KEYBOARD (1<<3) /* keyboard interactive */ +#define CURLSSH_AUTH_AGENT (1<<4) /* agent (ssh-agent, pageant...) */ +#define CURLSSH_AUTH_DEFAULT CURLSSH_AUTH_ANY + +#define CURLGSSAPI_DELEGATION_NONE 0 /* no delegation (default) */ +#define CURLGSSAPI_DELEGATION_POLICY_FLAG (1<<0) /* if permitted by policy */ +#define CURLGSSAPI_DELEGATION_FLAG (1<<1) /* delegate always */ + +#define CURL_ERROR_SIZE 256 + +enum curl_khtype { + CURLKHTYPE_UNKNOWN, + CURLKHTYPE_RSA1, + CURLKHTYPE_RSA, + CURLKHTYPE_DSS +}; + +struct curl_khkey { + const char *key; /* points to a zero-terminated string encoded with base64 + if len is zero, otherwise to the "raw" data */ + size_t len; + enum curl_khtype keytype; +}; + +/* this is the set of return values expected from the curl_sshkeycallback + callback */ +enum curl_khstat { + CURLKHSTAT_FINE_ADD_TO_FILE, + CURLKHSTAT_FINE, + CURLKHSTAT_REJECT, /* reject the connection, return an error */ + CURLKHSTAT_DEFER, /* do not accept it, but we can't answer right now so + this causes a CURLE_DEFER error but otherwise the + connection will be left intact etc */ + CURLKHSTAT_LAST /* not for use, only a marker for last-in-list */ +}; + +/* this is the set of status codes pass in to the callback */ +enum curl_khmatch { + CURLKHMATCH_OK, /* match */ + CURLKHMATCH_MISMATCH, /* host found, key mismatch! */ + CURLKHMATCH_MISSING, /* no matching host/key found */ + CURLKHMATCH_LAST /* not for use, only a marker for last-in-list */ +}; + +typedef int + (*curl_sshkeycallback) (CURL *easy, /* easy handle */ + const struct curl_khkey *knownkey, /* known */ + const struct curl_khkey *foundkey, /* found */ + enum curl_khmatch, /* libcurl's view on the keys */ + void *clientp); /* custom pointer passed from app */ + +/* parameter for the CURLOPT_USE_SSL option */ +typedef enum { + CURLUSESSL_NONE, /* do not attempt to use SSL */ + CURLUSESSL_TRY, /* try using SSL, proceed anyway otherwise */ + CURLUSESSL_CONTROL, /* SSL for the control connection or fail */ + CURLUSESSL_ALL, /* SSL for all communication or fail */ + CURLUSESSL_LAST /* not an option, never use */ +} curl_usessl; + +/* Definition of bits for the CURLOPT_SSL_OPTIONS argument: */ + +/* - ALLOW_BEAST tells libcurl to allow the BEAST SSL vulnerability in the + name of improving interoperability with older servers. Some SSL libraries + have introduced work-arounds for this flaw but those work-arounds sometimes + make the SSL communication fail. To regain functionality with those broken + servers, a user can this way allow the vulnerability back. */ +#define CURLSSLOPT_ALLOW_BEAST (1<<0) + +/* - NO_REVOKE tells libcurl to disable certificate revocation checks for those + SSL backends where such behavior is present. */ +#define CURLSSLOPT_NO_REVOKE (1<<1) + +#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all + the obsolete stuff removed! */ + +/* Backwards compatibility with older names */ +/* These are scheduled to disappear by 2009 */ + +#define CURLFTPSSL_NONE CURLUSESSL_NONE +#define CURLFTPSSL_TRY CURLUSESSL_TRY +#define CURLFTPSSL_CONTROL CURLUSESSL_CONTROL +#define CURLFTPSSL_ALL CURLUSESSL_ALL +#define CURLFTPSSL_LAST CURLUSESSL_LAST +#define curl_ftpssl curl_usessl +#endif /*!CURL_NO_OLDIES*/ + +/* parameter for the CURLOPT_FTP_SSL_CCC option */ +typedef enum { + CURLFTPSSL_CCC_NONE, /* do not send CCC */ + CURLFTPSSL_CCC_PASSIVE, /* Let the server initiate the shutdown */ + CURLFTPSSL_CCC_ACTIVE, /* Initiate the shutdown */ + CURLFTPSSL_CCC_LAST /* not an option, never use */ +} curl_ftpccc; + +/* parameter for the CURLOPT_FTPSSLAUTH option */ +typedef enum { + CURLFTPAUTH_DEFAULT, /* let libcurl decide */ + CURLFTPAUTH_SSL, /* use "AUTH SSL" */ + CURLFTPAUTH_TLS, /* use "AUTH TLS" */ + CURLFTPAUTH_LAST /* not an option, never use */ +} curl_ftpauth; + +/* parameter for the CURLOPT_FTP_CREATE_MISSING_DIRS option */ +typedef enum { + CURLFTP_CREATE_DIR_NONE, /* do NOT create missing dirs! */ + CURLFTP_CREATE_DIR, /* (FTP/SFTP) if CWD fails, try MKD and then CWD + again if MKD succeeded, for SFTP this does + similar magic */ + CURLFTP_CREATE_DIR_RETRY, /* (FTP only) if CWD fails, try MKD and then CWD + again even if MKD failed! */ + CURLFTP_CREATE_DIR_LAST /* not an option, never use */ +} curl_ftpcreatedir; + +/* parameter for the CURLOPT_FTP_FILEMETHOD option */ +typedef enum { + CURLFTPMETHOD_DEFAULT, /* let libcurl pick */ + CURLFTPMETHOD_MULTICWD, /* single CWD operation for each path part */ + CURLFTPMETHOD_NOCWD, /* no CWD at all */ + CURLFTPMETHOD_SINGLECWD, /* one CWD to full dir, then work on file */ + CURLFTPMETHOD_LAST /* not an option, never use */ +} curl_ftpmethod; + +/* bitmask defines for CURLOPT_HEADEROPT */ +#define CURLHEADER_UNIFIED 0 +#define CURLHEADER_SEPARATE (1<<0) + +/* CURLPROTO_ defines are for the CURLOPT_*PROTOCOLS options */ +#define CURLPROTO_HTTP (1<<0) +#define CURLPROTO_HTTPS (1<<1) +#define CURLPROTO_FTP (1<<2) +#define CURLPROTO_FTPS (1<<3) +#define CURLPROTO_SCP (1<<4) +#define CURLPROTO_SFTP (1<<5) +#define CURLPROTO_TELNET (1<<6) +#define CURLPROTO_LDAP (1<<7) +#define CURLPROTO_LDAPS (1<<8) +#define CURLPROTO_DICT (1<<9) +#define CURLPROTO_FILE (1<<10) +#define CURLPROTO_TFTP (1<<11) +#define CURLPROTO_IMAP (1<<12) +#define CURLPROTO_IMAPS (1<<13) +#define CURLPROTO_POP3 (1<<14) +#define CURLPROTO_POP3S (1<<15) +#define CURLPROTO_SMTP (1<<16) +#define CURLPROTO_SMTPS (1<<17) +#define CURLPROTO_RTSP (1<<18) +#define CURLPROTO_RTMP (1<<19) +#define CURLPROTO_RTMPT (1<<20) +#define CURLPROTO_RTMPE (1<<21) +#define CURLPROTO_RTMPTE (1<<22) +#define CURLPROTO_RTMPS (1<<23) +#define CURLPROTO_RTMPTS (1<<24) +#define CURLPROTO_GOPHER (1<<25) +#define CURLPROTO_SMB (1<<26) +#define CURLPROTO_SMBS (1<<27) +#define CURLPROTO_ALL (~0) /* enable everything */ + +/* long may be 32 or 64 bits, but we should never depend on anything else + but 32 */ +#define CURLOPTTYPE_LONG 0 +#define CURLOPTTYPE_OBJECTPOINT 10000 +#define CURLOPTTYPE_STRINGPOINT 10000 +#define CURLOPTTYPE_FUNCTIONPOINT 20000 +#define CURLOPTTYPE_OFF_T 30000 + +/* *STRINGPOINT is an alias for OBJECTPOINT to allow tools to extract the + string options from the header file */ + +/* name is uppercase CURLOPT_, + type is one of the defined CURLOPTTYPE_ + number is unique identifier */ +#ifdef CINIT +#undef CINIT +#endif + +#ifdef CURL_ISOCPP +#define CINIT(na,t,nu) CURLOPT_ ## na = CURLOPTTYPE_ ## t + nu +#else +/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */ +#define LONG CURLOPTTYPE_LONG +#define OBJECTPOINT CURLOPTTYPE_OBJECTPOINT +#define STRINGPOINT CURLOPTTYPE_OBJECTPOINT +#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT +#define OFF_T CURLOPTTYPE_OFF_T +#define CINIT(name,type,number) CURLOPT_/**/name = type + number +#endif + +/* + * This macro-mania below setups the CURLOPT_[what] enum, to be used with + * curl_easy_setopt(). The first argument in the CINIT() macro is the [what] + * word. + */ + +typedef enum { + /* This is the FILE * or void * the regular output should be written to. */ + CINIT(WRITEDATA, OBJECTPOINT, 1), + + /* The full URL to get/put */ + CINIT(URL, STRINGPOINT, 2), + + /* Port number to connect to, if other than default. */ + CINIT(PORT, LONG, 3), + + /* Name of proxy to use. */ + CINIT(PROXY, STRINGPOINT, 4), + + /* "user:password;options" to use when fetching. */ + CINIT(USERPWD, STRINGPOINT, 5), + + /* "user:password" to use with proxy. */ + CINIT(PROXYUSERPWD, STRINGPOINT, 6), + + /* Range to get, specified as an ASCII string. */ + CINIT(RANGE, STRINGPOINT, 7), + + /* not used */ + + /* Specified file stream to upload from (use as input): */ + CINIT(READDATA, OBJECTPOINT, 9), + + /* Buffer to receive error messages in, must be at least CURL_ERROR_SIZE + * bytes big. If this is not used, error messages go to stderr instead: */ + CINIT(ERRORBUFFER, OBJECTPOINT, 10), + + /* Function that will be called to store the output (instead of fwrite). The + * parameters will use fwrite() syntax, make sure to follow them. */ + CINIT(WRITEFUNCTION, FUNCTIONPOINT, 11), + + /* Function that will be called to read the input (instead of fread). The + * parameters will use fread() syntax, make sure to follow them. */ + CINIT(READFUNCTION, FUNCTIONPOINT, 12), + + /* Time-out the read operation after this amount of seconds */ + CINIT(TIMEOUT, LONG, 13), + + /* If the CURLOPT_INFILE is used, this can be used to inform libcurl about + * how large the file being sent really is. That allows better error + * checking and better verifies that the upload was successful. -1 means + * unknown size. + * + * For large file support, there is also a _LARGE version of the key + * which takes an off_t type, allowing platforms with larger off_t + * sizes to handle larger files. See below for INFILESIZE_LARGE. + */ + CINIT(INFILESIZE, LONG, 14), + + /* POST static input fields. */ + CINIT(POSTFIELDS, OBJECTPOINT, 15), + + /* Set the referrer page (needed by some CGIs) */ + CINIT(REFERER, STRINGPOINT, 16), + + /* Set the FTP PORT string (interface name, named or numerical IP address) + Use i.e '-' to use default address. */ + CINIT(FTPPORT, STRINGPOINT, 17), + + /* Set the User-Agent string (examined by some CGIs) */ + CINIT(USERAGENT, STRINGPOINT, 18), + + /* If the download receives less than "low speed limit" bytes/second + * during "low speed time" seconds, the operations is aborted. + * You could i.e if you have a pretty high speed connection, abort if + * it is less than 2000 bytes/sec during 20 seconds. + */ + + /* Set the "low speed limit" */ + CINIT(LOW_SPEED_LIMIT, LONG, 19), + + /* Set the "low speed time" */ + CINIT(LOW_SPEED_TIME, LONG, 20), + + /* Set the continuation offset. + * + * Note there is also a _LARGE version of this key which uses + * off_t types, allowing for large file offsets on platforms which + * use larger-than-32-bit off_t's. Look below for RESUME_FROM_LARGE. + */ + CINIT(RESUME_FROM, LONG, 21), + + /* Set cookie in request: */ + CINIT(COOKIE, STRINGPOINT, 22), + + /* This points to a linked list of headers, struct curl_slist kind. This + list is also used for RTSP (in spite of its name) */ + CINIT(HTTPHEADER, OBJECTPOINT, 23), + + /* This points to a linked list of post entries, struct curl_httppost */ + CINIT(HTTPPOST, OBJECTPOINT, 24), + + /* name of the file keeping your private SSL-certificate */ + CINIT(SSLCERT, STRINGPOINT, 25), + + /* password for the SSL or SSH private key */ + CINIT(KEYPASSWD, STRINGPOINT, 26), + + /* send TYPE parameter? */ + CINIT(CRLF, LONG, 27), + + /* send linked-list of QUOTE commands */ + CINIT(QUOTE, OBJECTPOINT, 28), + + /* send FILE * or void * to store headers to, if you use a callback it + is simply passed to the callback unmodified */ + CINIT(HEADERDATA, OBJECTPOINT, 29), + + /* point to a file to read the initial cookies from, also enables + "cookie awareness" */ + CINIT(COOKIEFILE, STRINGPOINT, 31), + + /* What version to specifically try to use. + See CURL_SSLVERSION defines below. */ + CINIT(SSLVERSION, LONG, 32), + + /* What kind of HTTP time condition to use, see defines */ + CINIT(TIMECONDITION, LONG, 33), + + /* Time to use with the above condition. Specified in number of seconds + since 1 Jan 1970 */ + CINIT(TIMEVALUE, LONG, 34), + + /* 35 = OBSOLETE */ + + /* Custom request, for customizing the get command like + HTTP: DELETE, TRACE and others + FTP: to use a different list command + */ + CINIT(CUSTOMREQUEST, STRINGPOINT, 36), + + /* FILE handle to use instead of stderr */ + CINIT(STDERR, OBJECTPOINT, 37), + + /* 38 is not used */ + + /* send linked-list of post-transfer QUOTE commands */ + CINIT(POSTQUOTE, OBJECTPOINT, 39), + + CINIT(OBSOLETE40, OBJECTPOINT, 40), /* OBSOLETE, do not use! */ + + CINIT(VERBOSE, LONG, 41), /* talk a lot */ + CINIT(HEADER, LONG, 42), /* throw the header out too */ + CINIT(NOPROGRESS, LONG, 43), /* shut off the progress meter */ + CINIT(NOBODY, LONG, 44), /* use HEAD to get http document */ + CINIT(FAILONERROR, LONG, 45), /* no output on http error codes >= 400 */ + CINIT(UPLOAD, LONG, 46), /* this is an upload */ + CINIT(POST, LONG, 47), /* HTTP POST method */ + CINIT(DIRLISTONLY, LONG, 48), /* bare names when listing directories */ + + CINIT(APPEND, LONG, 50), /* Append instead of overwrite on upload! */ + + /* Specify whether to read the user+password from the .netrc or the URL. + * This must be one of the CURL_NETRC_* enums below. */ + CINIT(NETRC, LONG, 51), + + CINIT(FOLLOWLOCATION, LONG, 52), /* use Location: Luke! */ + + CINIT(TRANSFERTEXT, LONG, 53), /* transfer data in text/ASCII format */ + CINIT(PUT, LONG, 54), /* HTTP PUT */ + + /* 55 = OBSOLETE */ + + /* DEPRECATED + * Function that will be called instead of the internal progress display + * function. This function should be defined as the curl_progress_callback + * prototype defines. */ + CINIT(PROGRESSFUNCTION, FUNCTIONPOINT, 56), + + /* Data passed to the CURLOPT_PROGRESSFUNCTION and CURLOPT_XFERINFOFUNCTION + callbacks */ + CINIT(PROGRESSDATA, OBJECTPOINT, 57), +#define CURLOPT_XFERINFODATA CURLOPT_PROGRESSDATA + + /* We want the referrer field set automatically when following locations */ + CINIT(AUTOREFERER, LONG, 58), + + /* Port of the proxy, can be set in the proxy string as well with: + "[host]:[port]" */ + CINIT(PROXYPORT, LONG, 59), + + /* size of the POST input data, if strlen() is not good to use */ + CINIT(POSTFIELDSIZE, LONG, 60), + + /* tunnel non-http operations through a HTTP proxy */ + CINIT(HTTPPROXYTUNNEL, LONG, 61), + + /* Set the interface string to use as outgoing network interface */ + CINIT(INTERFACE, STRINGPOINT, 62), + + /* Set the krb4/5 security level, this also enables krb4/5 awareness. This + * is a string, 'clear', 'safe', 'confidential' or 'private'. If the string + * is set but doesn't match one of these, 'private' will be used. */ + CINIT(KRBLEVEL, STRINGPOINT, 63), + + /* Set if we should verify the peer in ssl handshake, set 1 to verify. */ + CINIT(SSL_VERIFYPEER, LONG, 64), + + /* The CApath or CAfile used to validate the peer certificate + this option is used only if SSL_VERIFYPEER is true */ + CINIT(CAINFO, STRINGPOINT, 65), + + /* 66 = OBSOLETE */ + /* 67 = OBSOLETE */ + + /* Maximum number of http redirects to follow */ + CINIT(MAXREDIRS, LONG, 68), + + /* Pass a long set to 1 to get the date of the requested document (if + possible)! Pass a zero to shut it off. */ + CINIT(FILETIME, LONG, 69), + + /* This points to a linked list of telnet options */ + CINIT(TELNETOPTIONS, OBJECTPOINT, 70), + + /* Max amount of cached alive connections */ + CINIT(MAXCONNECTS, LONG, 71), + + CINIT(OBSOLETE72, LONG, 72), /* OBSOLETE, do not use! */ + + /* 73 = OBSOLETE */ + + /* Set to explicitly use a new connection for the upcoming transfer. + Do not use this unless you're absolutely sure of this, as it makes the + operation slower and is less friendly for the network. */ + CINIT(FRESH_CONNECT, LONG, 74), + + /* Set to explicitly forbid the upcoming transfer's connection to be re-used + when done. Do not use this unless you're absolutely sure of this, as it + makes the operation slower and is less friendly for the network. */ + CINIT(FORBID_REUSE, LONG, 75), + + /* Set to a file name that contains random data for libcurl to use to + seed the random engine when doing SSL connects. */ + CINIT(RANDOM_FILE, STRINGPOINT, 76), + + /* Set to the Entropy Gathering Daemon socket pathname */ + CINIT(EGDSOCKET, STRINGPOINT, 77), + + /* Time-out connect operations after this amount of seconds, if connects are + OK within this time, then fine... This only aborts the connect phase. */ + CINIT(CONNECTTIMEOUT, LONG, 78), + + /* Function that will be called to store headers (instead of fwrite). The + * parameters will use fwrite() syntax, make sure to follow them. */ + CINIT(HEADERFUNCTION, FUNCTIONPOINT, 79), + + /* Set this to force the HTTP request to get back to GET. Only really usable + if POST, PUT or a custom request have been used first. + */ + CINIT(HTTPGET, LONG, 80), + + /* Set if we should verify the Common name from the peer certificate in ssl + * handshake, set 1 to check existence, 2 to ensure that it matches the + * provided hostname. */ + CINIT(SSL_VERIFYHOST, LONG, 81), + + /* Specify which file name to write all known cookies in after completed + operation. Set file name to "-" (dash) to make it go to stdout. */ + CINIT(COOKIEJAR, STRINGPOINT, 82), + + /* Specify which SSL ciphers to use */ + CINIT(SSL_CIPHER_LIST, STRINGPOINT, 83), + + /* Specify which HTTP version to use! This must be set to one of the + CURL_HTTP_VERSION* enums set below. */ + CINIT(HTTP_VERSION, LONG, 84), + + /* Specifically switch on or off the FTP engine's use of the EPSV command. By + default, that one will always be attempted before the more traditional + PASV command. */ + CINIT(FTP_USE_EPSV, LONG, 85), + + /* type of the file keeping your SSL-certificate ("DER", "PEM", "ENG") */ + CINIT(SSLCERTTYPE, STRINGPOINT, 86), + + /* name of the file keeping your private SSL-key */ + CINIT(SSLKEY, STRINGPOINT, 87), + + /* type of the file keeping your private SSL-key ("DER", "PEM", "ENG") */ + CINIT(SSLKEYTYPE, STRINGPOINT, 88), + + /* crypto engine for the SSL-sub system */ + CINIT(SSLENGINE, STRINGPOINT, 89), + + /* set the crypto engine for the SSL-sub system as default + the param has no meaning... + */ + CINIT(SSLENGINE_DEFAULT, LONG, 90), + + /* Non-zero value means to use the global dns cache */ + CINIT(DNS_USE_GLOBAL_CACHE, LONG, 91), /* DEPRECATED, do not use! */ + + /* DNS cache timeout */ + CINIT(DNS_CACHE_TIMEOUT, LONG, 92), + + /* send linked-list of pre-transfer QUOTE commands */ + CINIT(PREQUOTE, OBJECTPOINT, 93), + + /* set the debug function */ + CINIT(DEBUGFUNCTION, FUNCTIONPOINT, 94), + + /* set the data for the debug function */ + CINIT(DEBUGDATA, OBJECTPOINT, 95), + + /* mark this as start of a cookie session */ + CINIT(COOKIESESSION, LONG, 96), + + /* The CApath directory used to validate the peer certificate + this option is used only if SSL_VERIFYPEER is true */ + CINIT(CAPATH, STRINGPOINT, 97), + + /* Instruct libcurl to use a smaller receive buffer */ + CINIT(BUFFERSIZE, LONG, 98), + + /* Instruct libcurl to not use any signal/alarm handlers, even when using + timeouts. This option is useful for multi-threaded applications. + See libcurl-the-guide for more background information. */ + CINIT(NOSIGNAL, LONG, 99), + + /* Provide a CURLShare for mutexing non-ts data */ + CINIT(SHARE, OBJECTPOINT, 100), + + /* indicates type of proxy. accepted values are CURLPROXY_HTTP (default), + CURLPROXY_HTTPS, CURLPROXY_SOCKS4, CURLPROXY_SOCKS4A and + CURLPROXY_SOCKS5. */ + CINIT(PROXYTYPE, LONG, 101), + + /* Set the Accept-Encoding string. Use this to tell a server you would like + the response to be compressed. Before 7.21.6, this was known as + CURLOPT_ENCODING */ + CINIT(ACCEPT_ENCODING, STRINGPOINT, 102), + + /* Set pointer to private data */ + CINIT(PRIVATE, OBJECTPOINT, 103), + + /* Set aliases for HTTP 200 in the HTTP Response header */ + CINIT(HTTP200ALIASES, OBJECTPOINT, 104), + + /* Continue to send authentication (user+password) when following locations, + even when hostname changed. This can potentially send off the name + and password to whatever host the server decides. */ + CINIT(UNRESTRICTED_AUTH, LONG, 105), + + /* Specifically switch on or off the FTP engine's use of the EPRT command ( + it also disables the LPRT attempt). By default, those ones will always be + attempted before the good old traditional PORT command. */ + CINIT(FTP_USE_EPRT, LONG, 106), + + /* Set this to a bitmask value to enable the particular authentications + methods you like. Use this in combination with CURLOPT_USERPWD. + Note that setting multiple bits may cause extra network round-trips. */ + CINIT(HTTPAUTH, LONG, 107), + + /* Set the ssl context callback function, currently only for OpenSSL ssl_ctx + in second argument. The function must be matching the + curl_ssl_ctx_callback proto. */ + CINIT(SSL_CTX_FUNCTION, FUNCTIONPOINT, 108), + + /* Set the userdata for the ssl context callback function's third + argument */ + CINIT(SSL_CTX_DATA, OBJECTPOINT, 109), + + /* FTP Option that causes missing dirs to be created on the remote server. + In 7.19.4 we introduced the convenience enums for this option using the + CURLFTP_CREATE_DIR prefix. + */ + CINIT(FTP_CREATE_MISSING_DIRS, LONG, 110), + + /* Set this to a bitmask value to enable the particular authentications + methods you like. Use this in combination with CURLOPT_PROXYUSERPWD. + Note that setting multiple bits may cause extra network round-trips. */ + CINIT(PROXYAUTH, LONG, 111), + + /* FTP option that changes the timeout, in seconds, associated with + getting a response. This is different from transfer timeout time and + essentially places a demand on the FTP server to acknowledge commands + in a timely manner. */ + CINIT(FTP_RESPONSE_TIMEOUT, LONG, 112), +#define CURLOPT_SERVER_RESPONSE_TIMEOUT CURLOPT_FTP_RESPONSE_TIMEOUT + + /* Set this option to one of the CURL_IPRESOLVE_* defines (see below) to + tell libcurl to resolve names to those IP versions only. This only has + affect on systems with support for more than one, i.e IPv4 _and_ IPv6. */ + CINIT(IPRESOLVE, LONG, 113), + + /* Set this option to limit the size of a file that will be downloaded from + an HTTP or FTP server. + + Note there is also _LARGE version which adds large file support for + platforms which have larger off_t sizes. See MAXFILESIZE_LARGE below. */ + CINIT(MAXFILESIZE, LONG, 114), + + /* See the comment for INFILESIZE above, but in short, specifies + * the size of the file being uploaded. -1 means unknown. + */ + CINIT(INFILESIZE_LARGE, OFF_T, 115), + + /* Sets the continuation offset. There is also a LONG version of this; + * look above for RESUME_FROM. + */ + CINIT(RESUME_FROM_LARGE, OFF_T, 116), + + /* Sets the maximum size of data that will be downloaded from + * an HTTP or FTP server. See MAXFILESIZE above for the LONG version. + */ + CINIT(MAXFILESIZE_LARGE, OFF_T, 117), + + /* Set this option to the file name of your .netrc file you want libcurl + to parse (using the CURLOPT_NETRC option). If not set, libcurl will do + a poor attempt to find the user's home directory and check for a .netrc + file in there. */ + CINIT(NETRC_FILE, STRINGPOINT, 118), + + /* Enable SSL/TLS for FTP, pick one of: + CURLUSESSL_TRY - try using SSL, proceed anyway otherwise + CURLUSESSL_CONTROL - SSL for the control connection or fail + CURLUSESSL_ALL - SSL for all communication or fail + */ + CINIT(USE_SSL, LONG, 119), + + /* The _LARGE version of the standard POSTFIELDSIZE option */ + CINIT(POSTFIELDSIZE_LARGE, OFF_T, 120), + + /* Enable/disable the TCP Nagle algorithm */ + CINIT(TCP_NODELAY, LONG, 121), + + /* 122 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 123 OBSOLETE. Gone in 7.16.0 */ + /* 124 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 125 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 126 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 127 OBSOLETE. Gone in 7.16.0 */ + /* 128 OBSOLETE. Gone in 7.16.0 */ + + /* When FTP over SSL/TLS is selected (with CURLOPT_USE_SSL), this option + can be used to change libcurl's default action which is to first try + "AUTH SSL" and then "AUTH TLS" in this order, and proceed when a OK + response has been received. + + Available parameters are: + CURLFTPAUTH_DEFAULT - let libcurl decide + CURLFTPAUTH_SSL - try "AUTH SSL" first, then TLS + CURLFTPAUTH_TLS - try "AUTH TLS" first, then SSL + */ + CINIT(FTPSSLAUTH, LONG, 129), + + CINIT(IOCTLFUNCTION, FUNCTIONPOINT, 130), + CINIT(IOCTLDATA, OBJECTPOINT, 131), + + /* 132 OBSOLETE. Gone in 7.16.0 */ + /* 133 OBSOLETE. Gone in 7.16.0 */ + + /* zero terminated string for pass on to the FTP server when asked for + "account" info */ + CINIT(FTP_ACCOUNT, STRINGPOINT, 134), + + /* feed cookie into cookie engine */ + CINIT(COOKIELIST, STRINGPOINT, 135), + + /* ignore Content-Length */ + CINIT(IGNORE_CONTENT_LENGTH, LONG, 136), + + /* Set to non-zero to skip the IP address received in a 227 PASV FTP server + response. Typically used for FTP-SSL purposes but is not restricted to + that. libcurl will then instead use the same IP address it used for the + control connection. */ + CINIT(FTP_SKIP_PASV_IP, LONG, 137), + + /* Select "file method" to use when doing FTP, see the curl_ftpmethod + above. */ + CINIT(FTP_FILEMETHOD, LONG, 138), + + /* Local port number to bind the socket to */ + CINIT(LOCALPORT, LONG, 139), + + /* Number of ports to try, including the first one set with LOCALPORT. + Thus, setting it to 1 will make no additional attempts but the first. + */ + CINIT(LOCALPORTRANGE, LONG, 140), + + /* no transfer, set up connection and let application use the socket by + extracting it with CURLINFO_LASTSOCKET */ + CINIT(CONNECT_ONLY, LONG, 141), + + /* Function that will be called to convert from the + network encoding (instead of using the iconv calls in libcurl) */ + CINIT(CONV_FROM_NETWORK_FUNCTION, FUNCTIONPOINT, 142), + + /* Function that will be called to convert to the + network encoding (instead of using the iconv calls in libcurl) */ + CINIT(CONV_TO_NETWORK_FUNCTION, FUNCTIONPOINT, 143), + + /* Function that will be called to convert from UTF8 + (instead of using the iconv calls in libcurl) + Note that this is used only for SSL certificate processing */ + CINIT(CONV_FROM_UTF8_FUNCTION, FUNCTIONPOINT, 144), + + /* if the connection proceeds too quickly then need to slow it down */ + /* limit-rate: maximum number of bytes per second to send or receive */ + CINIT(MAX_SEND_SPEED_LARGE, OFF_T, 145), + CINIT(MAX_RECV_SPEED_LARGE, OFF_T, 146), + + /* Pointer to command string to send if USER/PASS fails. */ + CINIT(FTP_ALTERNATIVE_TO_USER, STRINGPOINT, 147), + + /* callback function for setting socket options */ + CINIT(SOCKOPTFUNCTION, FUNCTIONPOINT, 148), + CINIT(SOCKOPTDATA, OBJECTPOINT, 149), + + /* set to 0 to disable session ID re-use for this transfer, default is + enabled (== 1) */ + CINIT(SSL_SESSIONID_CACHE, LONG, 150), + + /* allowed SSH authentication methods */ + CINIT(SSH_AUTH_TYPES, LONG, 151), + + /* Used by scp/sftp to do public/private key authentication */ + CINIT(SSH_PUBLIC_KEYFILE, STRINGPOINT, 152), + CINIT(SSH_PRIVATE_KEYFILE, STRINGPOINT, 153), + + /* Send CCC (Clear Command Channel) after authentication */ + CINIT(FTP_SSL_CCC, LONG, 154), + + /* Same as TIMEOUT and CONNECTTIMEOUT, but with ms resolution */ + CINIT(TIMEOUT_MS, LONG, 155), + CINIT(CONNECTTIMEOUT_MS, LONG, 156), + + /* set to zero to disable the libcurl's decoding and thus pass the raw body + data to the application even when it is encoded/compressed */ + CINIT(HTTP_TRANSFER_DECODING, LONG, 157), + CINIT(HTTP_CONTENT_DECODING, LONG, 158), + + /* Permission used when creating new files and directories on the remote + server for protocols that support it, SFTP/SCP/FILE */ + CINIT(NEW_FILE_PERMS, LONG, 159), + CINIT(NEW_DIRECTORY_PERMS, LONG, 160), + + /* Set the behaviour of POST when redirecting. Values must be set to one + of CURL_REDIR* defines below. This used to be called CURLOPT_POST301 */ + CINIT(POSTREDIR, LONG, 161), + + /* used by scp/sftp to verify the host's public key */ + CINIT(SSH_HOST_PUBLIC_KEY_MD5, STRINGPOINT, 162), + + /* Callback function for opening socket (instead of socket(2)). Optionally, + callback is able change the address or refuse to connect returning + CURL_SOCKET_BAD. The callback should have type + curl_opensocket_callback */ + CINIT(OPENSOCKETFUNCTION, FUNCTIONPOINT, 163), + CINIT(OPENSOCKETDATA, OBJECTPOINT, 164), + + /* POST volatile input fields. */ + CINIT(COPYPOSTFIELDS, OBJECTPOINT, 165), + + /* set transfer mode (;type=) when doing FTP via an HTTP proxy */ + CINIT(PROXY_TRANSFER_MODE, LONG, 166), + + /* Callback function for seeking in the input stream */ + CINIT(SEEKFUNCTION, FUNCTIONPOINT, 167), + CINIT(SEEKDATA, OBJECTPOINT, 168), + + /* CRL file */ + CINIT(CRLFILE, STRINGPOINT, 169), + + /* Issuer certificate */ + CINIT(ISSUERCERT, STRINGPOINT, 170), + + /* (IPv6) Address scope */ + CINIT(ADDRESS_SCOPE, LONG, 171), + + /* Collect certificate chain info and allow it to get retrievable with + CURLINFO_CERTINFO after the transfer is complete. */ + CINIT(CERTINFO, LONG, 172), + + /* "name" and "pwd" to use when fetching. */ + CINIT(USERNAME, STRINGPOINT, 173), + CINIT(PASSWORD, STRINGPOINT, 174), + + /* "name" and "pwd" to use with Proxy when fetching. */ + CINIT(PROXYUSERNAME, STRINGPOINT, 175), + CINIT(PROXYPASSWORD, STRINGPOINT, 176), + + /* Comma separated list of hostnames defining no-proxy zones. These should + match both hostnames directly, and hostnames within a domain. For + example, local.com will match local.com and www.local.com, but NOT + notlocal.com or www.notlocal.com. For compatibility with other + implementations of this, .local.com will be considered to be the same as + local.com. A single * is the only valid wildcard, and effectively + disables the use of proxy. */ + CINIT(NOPROXY, STRINGPOINT, 177), + + /* block size for TFTP transfers */ + CINIT(TFTP_BLKSIZE, LONG, 178), + + /* Socks Service */ + CINIT(SOCKS5_GSSAPI_SERVICE, STRINGPOINT, 179), /* DEPRECATED, do not use! */ + + /* Socks Service */ + CINIT(SOCKS5_GSSAPI_NEC, LONG, 180), + + /* set the bitmask for the protocols that are allowed to be used for the + transfer, which thus helps the app which takes URLs from users or other + external inputs and want to restrict what protocol(s) to deal + with. Defaults to CURLPROTO_ALL. */ + CINIT(PROTOCOLS, LONG, 181), + + /* set the bitmask for the protocols that libcurl is allowed to follow to, + as a subset of the CURLOPT_PROTOCOLS ones. That means the protocol needs + to be set in both bitmasks to be allowed to get redirected to. Defaults + to all protocols except FILE and SCP. */ + CINIT(REDIR_PROTOCOLS, LONG, 182), + + /* set the SSH knownhost file name to use */ + CINIT(SSH_KNOWNHOSTS, STRINGPOINT, 183), + + /* set the SSH host key callback, must point to a curl_sshkeycallback + function */ + CINIT(SSH_KEYFUNCTION, FUNCTIONPOINT, 184), + + /* set the SSH host key callback custom pointer */ + CINIT(SSH_KEYDATA, OBJECTPOINT, 185), + + /* set the SMTP mail originator */ + CINIT(MAIL_FROM, STRINGPOINT, 186), + + /* set the list of SMTP mail receiver(s) */ + CINIT(MAIL_RCPT, OBJECTPOINT, 187), + + /* FTP: send PRET before PASV */ + CINIT(FTP_USE_PRET, LONG, 188), + + /* RTSP request method (OPTIONS, SETUP, PLAY, etc...) */ + CINIT(RTSP_REQUEST, LONG, 189), + + /* The RTSP session identifier */ + CINIT(RTSP_SESSION_ID, STRINGPOINT, 190), + + /* The RTSP stream URI */ + CINIT(RTSP_STREAM_URI, STRINGPOINT, 191), + + /* The Transport: header to use in RTSP requests */ + CINIT(RTSP_TRANSPORT, STRINGPOINT, 192), + + /* Manually initialize the client RTSP CSeq for this handle */ + CINIT(RTSP_CLIENT_CSEQ, LONG, 193), + + /* Manually initialize the server RTSP CSeq for this handle */ + CINIT(RTSP_SERVER_CSEQ, LONG, 194), + + /* The stream to pass to INTERLEAVEFUNCTION. */ + CINIT(INTERLEAVEDATA, OBJECTPOINT, 195), + + /* Let the application define a custom write method for RTP data */ + CINIT(INTERLEAVEFUNCTION, FUNCTIONPOINT, 196), + + /* Turn on wildcard matching */ + CINIT(WILDCARDMATCH, LONG, 197), + + /* Directory matching callback called before downloading of an + individual file (chunk) started */ + CINIT(CHUNK_BGN_FUNCTION, FUNCTIONPOINT, 198), + + /* Directory matching callback called after the file (chunk) + was downloaded, or skipped */ + CINIT(CHUNK_END_FUNCTION, FUNCTIONPOINT, 199), + + /* Change match (fnmatch-like) callback for wildcard matching */ + CINIT(FNMATCH_FUNCTION, FUNCTIONPOINT, 200), + + /* Let the application define custom chunk data pointer */ + CINIT(CHUNK_DATA, OBJECTPOINT, 201), + + /* FNMATCH_FUNCTION user pointer */ + CINIT(FNMATCH_DATA, OBJECTPOINT, 202), + + /* send linked-list of name:port:address sets */ + CINIT(RESOLVE, OBJECTPOINT, 203), + + /* Set a username for authenticated TLS */ + CINIT(TLSAUTH_USERNAME, STRINGPOINT, 204), + + /* Set a password for authenticated TLS */ + CINIT(TLSAUTH_PASSWORD, STRINGPOINT, 205), + + /* Set authentication type for authenticated TLS */ + CINIT(TLSAUTH_TYPE, STRINGPOINT, 206), + + /* Set to 1 to enable the "TE:" header in HTTP requests to ask for + compressed transfer-encoded responses. Set to 0 to disable the use of TE: + in outgoing requests. The current default is 0, but it might change in a + future libcurl release. + + libcurl will ask for the compressed methods it knows of, and if that + isn't any, it will not ask for transfer-encoding at all even if this + option is set to 1. + + */ + CINIT(TRANSFER_ENCODING, LONG, 207), + + /* Callback function for closing socket (instead of close(2)). The callback + should have type curl_closesocket_callback */ + CINIT(CLOSESOCKETFUNCTION, FUNCTIONPOINT, 208), + CINIT(CLOSESOCKETDATA, OBJECTPOINT, 209), + + /* allow GSSAPI credential delegation */ + CINIT(GSSAPI_DELEGATION, LONG, 210), + + /* Set the name servers to use for DNS resolution */ + CINIT(DNS_SERVERS, STRINGPOINT, 211), + + /* Time-out accept operations (currently for FTP only) after this amount + of miliseconds. */ + CINIT(ACCEPTTIMEOUT_MS, LONG, 212), + + /* Set TCP keepalive */ + CINIT(TCP_KEEPALIVE, LONG, 213), + + /* non-universal keepalive knobs (Linux, AIX, HP-UX, more) */ + CINIT(TCP_KEEPIDLE, LONG, 214), + CINIT(TCP_KEEPINTVL, LONG, 215), + + /* Enable/disable specific SSL features with a bitmask, see CURLSSLOPT_* */ + CINIT(SSL_OPTIONS, LONG, 216), + + /* Set the SMTP auth originator */ + CINIT(MAIL_AUTH, STRINGPOINT, 217), + + /* Enable/disable SASL initial response */ + CINIT(SASL_IR, LONG, 218), + + /* Function that will be called instead of the internal progress display + * function. This function should be defined as the curl_xferinfo_callback + * prototype defines. (Deprecates CURLOPT_PROGRESSFUNCTION) */ + CINIT(XFERINFOFUNCTION, FUNCTIONPOINT, 219), + + /* The XOAUTH2 bearer token */ + CINIT(XOAUTH2_BEARER, STRINGPOINT, 220), + + /* Set the interface string to use as outgoing network + * interface for DNS requests. + * Only supported by the c-ares DNS backend */ + CINIT(DNS_INTERFACE, STRINGPOINT, 221), + + /* Set the local IPv4 address to use for outgoing DNS requests. + * Only supported by the c-ares DNS backend */ + CINIT(DNS_LOCAL_IP4, STRINGPOINT, 222), + + /* Set the local IPv4 address to use for outgoing DNS requests. + * Only supported by the c-ares DNS backend */ + CINIT(DNS_LOCAL_IP6, STRINGPOINT, 223), + + /* Set authentication options directly */ + CINIT(LOGIN_OPTIONS, STRINGPOINT, 224), + + /* Enable/disable TLS NPN extension (http2 over ssl might fail without) */ + CINIT(SSL_ENABLE_NPN, LONG, 225), + + /* Enable/disable TLS ALPN extension (http2 over ssl might fail without) */ + CINIT(SSL_ENABLE_ALPN, LONG, 226), + + /* Time to wait for a response to a HTTP request containing an + * Expect: 100-continue header before sending the data anyway. */ + CINIT(EXPECT_100_TIMEOUT_MS, LONG, 227), + + /* This points to a linked list of headers used for proxy requests only, + struct curl_slist kind */ + CINIT(PROXYHEADER, OBJECTPOINT, 228), + + /* Pass in a bitmask of "header options" */ + CINIT(HEADEROPT, LONG, 229), + + /* The public key in DER form used to validate the peer public key + this option is used only if SSL_VERIFYPEER is true */ + CINIT(PINNEDPUBLICKEY, STRINGPOINT, 230), + + /* Path to Unix domain socket */ + CINIT(UNIX_SOCKET_PATH, STRINGPOINT, 231), + + /* Set if we should verify the certificate status. */ + CINIT(SSL_VERIFYSTATUS, LONG, 232), + + /* Set if we should enable TLS false start. */ + CINIT(SSL_FALSESTART, LONG, 233), + + /* Do not squash dot-dot sequences */ + CINIT(PATH_AS_IS, LONG, 234), + + /* Proxy Service Name */ + CINIT(PROXY_SERVICE_NAME, STRINGPOINT, 235), + + /* Service Name */ + CINIT(SERVICE_NAME, STRINGPOINT, 236), + + /* Wait/don't wait for pipe/mutex to clarify */ + CINIT(PIPEWAIT, LONG, 237), + + /* Set the protocol used when curl is given a URL without a protocol */ + CINIT(DEFAULT_PROTOCOL, STRINGPOINT, 238), + + /* Set stream weight, 1 - 256 (default is 16) */ + CINIT(STREAM_WEIGHT, LONG, 239), + + /* Set stream dependency on another CURL handle */ + CINIT(STREAM_DEPENDS, OBJECTPOINT, 240), + + /* Set E-xclusive stream dependency on another CURL handle */ + CINIT(STREAM_DEPENDS_E, OBJECTPOINT, 241), + + /* Do not send any tftp option requests to the server */ + CINIT(TFTP_NO_OPTIONS, LONG, 242), + + /* Linked-list of host:port:connect-to-host:connect-to-port, + overrides the URL's host:port (only for the network layer) */ + CINIT(CONNECT_TO, OBJECTPOINT, 243), + + /* Set TCP Fast Open */ + CINIT(TCP_FASTOPEN, LONG, 244), + + /* Continue to send data if the server responds early with an + * HTTP status code >= 300 */ + CINIT(KEEP_SENDING_ON_ERROR, LONG, 245), + + /* The CApath or CAfile used to validate the proxy certificate + this option is used only if PROXY_SSL_VERIFYPEER is true */ + CINIT(PROXY_CAINFO, STRINGPOINT, 246), + + /* The CApath directory used to validate the proxy certificate + this option is used only if PROXY_SSL_VERIFYPEER is true */ + CINIT(PROXY_CAPATH, STRINGPOINT, 247), + + /* Set if we should verify the proxy in ssl handshake, + set 1 to verify. */ + CINIT(PROXY_SSL_VERIFYPEER, LONG, 248), + + /* Set if we should verify the Common name from the proxy certificate in ssl + * handshake, set 1 to check existence, 2 to ensure that it matches + * the provided hostname. */ + CINIT(PROXY_SSL_VERIFYHOST, LONG, 249), + + /* What version to specifically try to use for proxy. + See CURL_SSLVERSION defines below. */ + CINIT(PROXY_SSLVERSION, LONG, 250), + + /* Set a username for authenticated TLS for proxy */ + CINIT(PROXY_TLSAUTH_USERNAME, STRINGPOINT, 251), + + /* Set a password for authenticated TLS for proxy */ + CINIT(PROXY_TLSAUTH_PASSWORD, STRINGPOINT, 252), + + /* Set authentication type for authenticated TLS for proxy */ + CINIT(PROXY_TLSAUTH_TYPE, STRINGPOINT, 253), + + /* name of the file keeping your private SSL-certificate for proxy */ + CINIT(PROXY_SSLCERT, STRINGPOINT, 254), + + /* type of the file keeping your SSL-certificate ("DER", "PEM", "ENG") for + proxy */ + CINIT(PROXY_SSLCERTTYPE, STRINGPOINT, 255), + + /* name of the file keeping your private SSL-key for proxy */ + CINIT(PROXY_SSLKEY, STRINGPOINT, 256), + + /* type of the file keeping your private SSL-key ("DER", "PEM", "ENG") for + proxy */ + CINIT(PROXY_SSLKEYTYPE, STRINGPOINT, 257), + + /* password for the SSL private key for proxy */ + CINIT(PROXY_KEYPASSWD, STRINGPOINT, 258), + + /* Specify which SSL ciphers to use for proxy */ + CINIT(PROXY_SSL_CIPHER_LIST, STRINGPOINT, 259), + + /* CRL file for proxy */ + CINIT(PROXY_CRLFILE, STRINGPOINT, 260), + + /* Enable/disable specific SSL features with a bitmask for proxy, see + CURLSSLOPT_* */ + CINIT(PROXY_SSL_OPTIONS, LONG, 261), + + /* Name of pre proxy to use. */ + CINIT(PRE_PROXY, STRINGPOINT, 262), + + /* The public key in DER form used to validate the proxy public key + this option is used only if PROXY_SSL_VERIFYPEER is true */ + CINIT(PROXY_PINNEDPUBLICKEY, STRINGPOINT, 263), + + /* Path to an abstract Unix domain socket */ + CINIT(ABSTRACT_UNIX_SOCKET, STRINGPOINT, 264), + + /* Suppress proxy CONNECT response headers from user callbacks */ + CINIT(SUPPRESS_CONNECT_HEADERS, LONG, 265), + + CURLOPT_LASTENTRY /* the last unused */ +} CURLoption; + +#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all + the obsolete stuff removed! */ + +/* Backwards compatibility with older names */ +/* These are scheduled to disappear by 2011 */ + +/* This was added in version 7.19.1 */ +#define CURLOPT_POST301 CURLOPT_POSTREDIR + +/* These are scheduled to disappear by 2009 */ + +/* The following were added in 7.17.0 */ +#define CURLOPT_SSLKEYPASSWD CURLOPT_KEYPASSWD +#define CURLOPT_FTPAPPEND CURLOPT_APPEND +#define CURLOPT_FTPLISTONLY CURLOPT_DIRLISTONLY +#define CURLOPT_FTP_SSL CURLOPT_USE_SSL + +/* The following were added earlier */ + +#define CURLOPT_SSLCERTPASSWD CURLOPT_KEYPASSWD +#define CURLOPT_KRB4LEVEL CURLOPT_KRBLEVEL + +#else +/* This is set if CURL_NO_OLDIES is defined at compile-time */ +#undef CURLOPT_DNS_USE_GLOBAL_CACHE /* soon obsolete */ +#endif + + + /* Below here follows defines for the CURLOPT_IPRESOLVE option. If a host + name resolves addresses using more than one IP protocol version, this + option might be handy to force libcurl to use a specific IP version. */ +#define CURL_IPRESOLVE_WHATEVER 0 /* default, resolves addresses to all IP + versions that your system allows */ +#define CURL_IPRESOLVE_V4 1 /* resolve to IPv4 addresses */ +#define CURL_IPRESOLVE_V6 2 /* resolve to IPv6 addresses */ + + /* three convenient "aliases" that follow the name scheme better */ +#define CURLOPT_RTSPHEADER CURLOPT_HTTPHEADER + + /* These enums are for use with the CURLOPT_HTTP_VERSION option. */ +enum { + CURL_HTTP_VERSION_NONE, /* setting this means we don't care, and that we'd + like the library to choose the best possible + for us! */ + CURL_HTTP_VERSION_1_0, /* please use HTTP 1.0 in the request */ + CURL_HTTP_VERSION_1_1, /* please use HTTP 1.1 in the request */ + CURL_HTTP_VERSION_2_0, /* please use HTTP 2 in the request */ + CURL_HTTP_VERSION_2TLS, /* use version 2 for HTTPS, version 1.1 for HTTP */ + CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE, /* please use HTTP 2 without HTTP/1.1 + Upgrade */ + + CURL_HTTP_VERSION_LAST /* *ILLEGAL* http version */ +}; + +/* Convenience definition simple because the name of the version is HTTP/2 and + not 2.0. The 2_0 version of the enum name was set while the version was + still planned to be 2.0 and we stick to it for compatibility. */ +#define CURL_HTTP_VERSION_2 CURL_HTTP_VERSION_2_0 + +/* + * Public API enums for RTSP requests + */ +enum { + CURL_RTSPREQ_NONE, /* first in list */ + CURL_RTSPREQ_OPTIONS, + CURL_RTSPREQ_DESCRIBE, + CURL_RTSPREQ_ANNOUNCE, + CURL_RTSPREQ_SETUP, + CURL_RTSPREQ_PLAY, + CURL_RTSPREQ_PAUSE, + CURL_RTSPREQ_TEARDOWN, + CURL_RTSPREQ_GET_PARAMETER, + CURL_RTSPREQ_SET_PARAMETER, + CURL_RTSPREQ_RECORD, + CURL_RTSPREQ_RECEIVE, + CURL_RTSPREQ_LAST /* last in list */ +}; + + /* These enums are for use with the CURLOPT_NETRC option. */ +enum CURL_NETRC_OPTION { + CURL_NETRC_IGNORED, /* The .netrc will never be read. + * This is the default. */ + CURL_NETRC_OPTIONAL, /* A user:password in the URL will be preferred + * to one in the .netrc. */ + CURL_NETRC_REQUIRED, /* A user:password in the URL will be ignored. + * Unless one is set programmatically, the .netrc + * will be queried. */ + CURL_NETRC_LAST +}; + +enum { + CURL_SSLVERSION_DEFAULT, + CURL_SSLVERSION_TLSv1, /* TLS 1.x */ + CURL_SSLVERSION_SSLv2, + CURL_SSLVERSION_SSLv3, + CURL_SSLVERSION_TLSv1_0, + CURL_SSLVERSION_TLSv1_1, + CURL_SSLVERSION_TLSv1_2, + CURL_SSLVERSION_TLSv1_3, + + CURL_SSLVERSION_LAST /* never use, keep last */ +}; + +enum { + CURL_SSLVERSION_MAX_NONE = 0, + CURL_SSLVERSION_MAX_DEFAULT = (CURL_SSLVERSION_TLSv1 << 16), + CURL_SSLVERSION_MAX_TLSv1_0 = (CURL_SSLVERSION_TLSv1_0 << 16), + CURL_SSLVERSION_MAX_TLSv1_1 = (CURL_SSLVERSION_TLSv1_1 << 16), + CURL_SSLVERSION_MAX_TLSv1_2 = (CURL_SSLVERSION_TLSv1_2 << 16), + CURL_SSLVERSION_MAX_TLSv1_3 = (CURL_SSLVERSION_TLSv1_3 << 16), + + /* never use, keep last */ + CURL_SSLVERSION_MAX_LAST = (CURL_SSLVERSION_LAST << 16) +}; + +enum CURL_TLSAUTH { + CURL_TLSAUTH_NONE, + CURL_TLSAUTH_SRP, + CURL_TLSAUTH_LAST /* never use, keep last */ +}; + +/* symbols to use with CURLOPT_POSTREDIR. + CURL_REDIR_POST_301, CURL_REDIR_POST_302 and CURL_REDIR_POST_303 + can be bitwise ORed so that CURL_REDIR_POST_301 | CURL_REDIR_POST_302 + | CURL_REDIR_POST_303 == CURL_REDIR_POST_ALL */ + +#define CURL_REDIR_GET_ALL 0 +#define CURL_REDIR_POST_301 1 +#define CURL_REDIR_POST_302 2 +#define CURL_REDIR_POST_303 4 +#define CURL_REDIR_POST_ALL \ + (CURL_REDIR_POST_301|CURL_REDIR_POST_302|CURL_REDIR_POST_303) + +typedef enum { + CURL_TIMECOND_NONE, + + CURL_TIMECOND_IFMODSINCE, + CURL_TIMECOND_IFUNMODSINCE, + CURL_TIMECOND_LASTMOD, + + CURL_TIMECOND_LAST +} curl_TimeCond; + + +/* curl_strequal() and curl_strnequal() are subject for removal in a future + libcurl, see lib/README.curlx for details + + !checksrc! disable SPACEBEFOREPAREN 2 +*/ +CURL_EXTERN int (curl_strequal)(const char *s1, const char *s2); +CURL_EXTERN int (curl_strnequal)(const char *s1, const char *s2, size_t n); + +/* name is uppercase CURLFORM_ */ +#ifdef CFINIT +#undef CFINIT +#endif + +#ifdef CURL_ISOCPP +#define CFINIT(name) CURLFORM_ ## name +#else +/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */ +#define CFINIT(name) CURLFORM_/**/name +#endif + +typedef enum { + CFINIT(NOTHING), /********* the first one is unused ************/ + + /* */ + CFINIT(COPYNAME), + CFINIT(PTRNAME), + CFINIT(NAMELENGTH), + CFINIT(COPYCONTENTS), + CFINIT(PTRCONTENTS), + CFINIT(CONTENTSLENGTH), + CFINIT(FILECONTENT), + CFINIT(ARRAY), + CFINIT(OBSOLETE), + CFINIT(FILE), + + CFINIT(BUFFER), + CFINIT(BUFFERPTR), + CFINIT(BUFFERLENGTH), + + CFINIT(CONTENTTYPE), + CFINIT(CONTENTHEADER), + CFINIT(FILENAME), + CFINIT(END), + CFINIT(OBSOLETE2), + + CFINIT(STREAM), + CFINIT(CONTENTLEN), /* added in 7.46.0, provide a curl_off_t length */ + + CURLFORM_LASTENTRY /* the last unused */ +} CURLformoption; + +#undef CFINIT /* done */ + +/* structure to be used as parameter for CURLFORM_ARRAY */ +struct curl_forms { + CURLformoption option; + const char *value; +}; + +/* use this for multipart formpost building */ +/* Returns code for curl_formadd() + * + * Returns: + * CURL_FORMADD_OK on success + * CURL_FORMADD_MEMORY if the FormInfo allocation fails + * CURL_FORMADD_OPTION_TWICE if one option is given twice for one Form + * CURL_FORMADD_NULL if a null pointer was given for a char + * CURL_FORMADD_MEMORY if the allocation of a FormInfo struct failed + * CURL_FORMADD_UNKNOWN_OPTION if an unknown option was used + * CURL_FORMADD_INCOMPLETE if the some FormInfo is not complete (or error) + * CURL_FORMADD_MEMORY if a curl_httppost struct cannot be allocated + * CURL_FORMADD_MEMORY if some allocation for string copying failed. + * CURL_FORMADD_ILLEGAL_ARRAY if an illegal option is used in an array + * + ***************************************************************************/ +typedef enum { + CURL_FORMADD_OK, /* first, no error */ + + CURL_FORMADD_MEMORY, + CURL_FORMADD_OPTION_TWICE, + CURL_FORMADD_NULL, + CURL_FORMADD_UNKNOWN_OPTION, + CURL_FORMADD_INCOMPLETE, + CURL_FORMADD_ILLEGAL_ARRAY, + CURL_FORMADD_DISABLED, /* libcurl was built with this disabled */ + + CURL_FORMADD_LAST /* last */ +} CURLFORMcode; + +/* + * NAME curl_formadd() + * + * DESCRIPTION + * + * Pretty advanced function for building multi-part formposts. Each invoke + * adds one part that together construct a full post. Then use + * CURLOPT_HTTPPOST to send it off to libcurl. + */ +CURL_EXTERN CURLFORMcode curl_formadd(struct curl_httppost **httppost, + struct curl_httppost **last_post, + ...); + +/* + * callback function for curl_formget() + * The void *arg pointer will be the one passed as second argument to + * curl_formget(). + * The character buffer passed to it must not be freed. + * Should return the buffer length passed to it as the argument "len" on + * success. + */ +typedef size_t (*curl_formget_callback)(void *arg, const char *buf, + size_t len); + +/* + * NAME curl_formget() + * + * DESCRIPTION + * + * Serialize a curl_httppost struct built with curl_formadd(). + * Accepts a void pointer as second argument which will be passed to + * the curl_formget_callback function. + * Returns 0 on success. + */ +CURL_EXTERN int curl_formget(struct curl_httppost *form, void *arg, + curl_formget_callback append); +/* + * NAME curl_formfree() + * + * DESCRIPTION + * + * Free a multipart formpost previously built with curl_formadd(). + */ +CURL_EXTERN void curl_formfree(struct curl_httppost *form); + +/* + * NAME curl_getenv() + * + * DESCRIPTION + * + * Returns a malloc()'ed string that MUST be curl_free()ed after usage is + * complete. DEPRECATED - see lib/README.curlx + */ +CURL_EXTERN char *curl_getenv(const char *variable); + +/* + * NAME curl_version() + * + * DESCRIPTION + * + * Returns a static ascii string of the libcurl version. + */ +CURL_EXTERN char *curl_version(void); + +/* + * NAME curl_easy_escape() + * + * DESCRIPTION + * + * Escapes URL strings (converts all letters consider illegal in URLs to their + * %XX versions). This function returns a new allocated string or NULL if an + * error occurred. + */ +CURL_EXTERN char *curl_easy_escape(CURL *handle, + const char *string, + int length); + +/* the previous version: */ +CURL_EXTERN char *curl_escape(const char *string, + int length); + + +/* + * NAME curl_easy_unescape() + * + * DESCRIPTION + * + * Unescapes URL encoding in strings (converts all %XX codes to their 8bit + * versions). This function returns a new allocated string or NULL if an error + * occurred. + * Conversion Note: On non-ASCII platforms the ASCII %XX codes are + * converted into the host encoding. + */ +CURL_EXTERN char *curl_easy_unescape(CURL *handle, + const char *string, + int length, + int *outlength); + +/* the previous version */ +CURL_EXTERN char *curl_unescape(const char *string, + int length); + +/* + * NAME curl_free() + * + * DESCRIPTION + * + * Provided for de-allocation in the same translation unit that did the + * allocation. Added in libcurl 7.10 + */ +CURL_EXTERN void curl_free(void *p); + +/* + * NAME curl_global_init() + * + * DESCRIPTION + * + * curl_global_init() should be invoked exactly once for each application that + * uses libcurl and before any call of other libcurl functions. + * + * This function is not thread-safe! + */ +CURL_EXTERN CURLcode curl_global_init(long flags); + +/* + * NAME curl_global_init_mem() + * + * DESCRIPTION + * + * curl_global_init() or curl_global_init_mem() should be invoked exactly once + * for each application that uses libcurl. This function can be used to + * initialize libcurl and set user defined memory management callback + * functions. Users can implement memory management routines to check for + * memory leaks, check for mis-use of the curl library etc. User registered + * callback routines with be invoked by this library instead of the system + * memory management routines like malloc, free etc. + */ +CURL_EXTERN CURLcode curl_global_init_mem(long flags, + curl_malloc_callback m, + curl_free_callback f, + curl_realloc_callback r, + curl_strdup_callback s, + curl_calloc_callback c); + +/* + * NAME curl_global_cleanup() + * + * DESCRIPTION + * + * curl_global_cleanup() should be invoked exactly once for each application + * that uses libcurl + */ +CURL_EXTERN void curl_global_cleanup(void); + +/* linked-list structure for the CURLOPT_QUOTE option (and other) */ +struct curl_slist { + char *data; + struct curl_slist *next; +}; + +/* + * NAME curl_slist_append() + * + * DESCRIPTION + * + * Appends a string to a linked list. If no list exists, it will be created + * first. Returns the new list, after appending. + */ +CURL_EXTERN struct curl_slist *curl_slist_append(struct curl_slist *, + const char *); + +/* + * NAME curl_slist_free_all() + * + * DESCRIPTION + * + * free a previously built curl_slist. + */ +CURL_EXTERN void curl_slist_free_all(struct curl_slist *); + +/* + * NAME curl_getdate() + * + * DESCRIPTION + * + * Returns the time, in seconds since 1 Jan 1970 of the time string given in + * the first argument. The time argument in the second parameter is unused + * and should be set to NULL. + */ +CURL_EXTERN time_t curl_getdate(const char *p, const time_t *unused); + +/* info about the certificate chain, only for OpenSSL builds. Asked + for with CURLOPT_CERTINFO / CURLINFO_CERTINFO */ +struct curl_certinfo { + int num_of_certs; /* number of certificates with information */ + struct curl_slist **certinfo; /* for each index in this array, there's a + linked list with textual information in the + format "name: value" */ +}; + +/* enum for the different supported SSL backends */ +typedef enum { + CURLSSLBACKEND_NONE = 0, + CURLSSLBACKEND_OPENSSL = 1, + CURLSSLBACKEND_GNUTLS = 2, + CURLSSLBACKEND_NSS = 3, + CURLSSLBACKEND_OBSOLETE4 = 4, /* Was QSOSSL. */ + CURLSSLBACKEND_GSKIT = 5, + CURLSSLBACKEND_POLARSSL = 6, + CURLSSLBACKEND_CYASSL = 7, + CURLSSLBACKEND_SCHANNEL = 8, + CURLSSLBACKEND_DARWINSSL = 9, + CURLSSLBACKEND_AXTLS = 10, + CURLSSLBACKEND_MBEDTLS = 11 +} curl_sslbackend; + +/* aliases for library clones and renames */ +#define CURLSSLBACKEND_LIBRESSL 1 +#define CURLSSLBACKEND_BORINGSSL 1 +#define CURLSSLBACKEND_WOLFSSL 6 + +/* Information about the SSL library used and the respective internal SSL + handle, which can be used to obtain further information regarding the + connection. Asked for with CURLINFO_TLS_SSL_PTR or CURLINFO_TLS_SESSION. */ +struct curl_tlssessioninfo { + curl_sslbackend backend; + void *internals; +}; + +#define CURLINFO_STRING 0x100000 +#define CURLINFO_LONG 0x200000 +#define CURLINFO_DOUBLE 0x300000 +#define CURLINFO_SLIST 0x400000 +#define CURLINFO_SOCKET 0x500000 +#define CURLINFO_MASK 0x0fffff +#define CURLINFO_TYPEMASK 0xf00000 + +typedef enum { + CURLINFO_NONE, /* first, never use this */ + CURLINFO_EFFECTIVE_URL = CURLINFO_STRING + 1, + CURLINFO_RESPONSE_CODE = CURLINFO_LONG + 2, + CURLINFO_TOTAL_TIME = CURLINFO_DOUBLE + 3, + CURLINFO_NAMELOOKUP_TIME = CURLINFO_DOUBLE + 4, + CURLINFO_CONNECT_TIME = CURLINFO_DOUBLE + 5, + CURLINFO_PRETRANSFER_TIME = CURLINFO_DOUBLE + 6, + CURLINFO_SIZE_UPLOAD = CURLINFO_DOUBLE + 7, + CURLINFO_SIZE_DOWNLOAD = CURLINFO_DOUBLE + 8, + CURLINFO_SPEED_DOWNLOAD = CURLINFO_DOUBLE + 9, + CURLINFO_SPEED_UPLOAD = CURLINFO_DOUBLE + 10, + CURLINFO_HEADER_SIZE = CURLINFO_LONG + 11, + CURLINFO_REQUEST_SIZE = CURLINFO_LONG + 12, + CURLINFO_SSL_VERIFYRESULT = CURLINFO_LONG + 13, + CURLINFO_FILETIME = CURLINFO_LONG + 14, + CURLINFO_CONTENT_LENGTH_DOWNLOAD = CURLINFO_DOUBLE + 15, + CURLINFO_CONTENT_LENGTH_UPLOAD = CURLINFO_DOUBLE + 16, + CURLINFO_STARTTRANSFER_TIME = CURLINFO_DOUBLE + 17, + CURLINFO_CONTENT_TYPE = CURLINFO_STRING + 18, + CURLINFO_REDIRECT_TIME = CURLINFO_DOUBLE + 19, + CURLINFO_REDIRECT_COUNT = CURLINFO_LONG + 20, + CURLINFO_PRIVATE = CURLINFO_STRING + 21, + CURLINFO_HTTP_CONNECTCODE = CURLINFO_LONG + 22, + CURLINFO_HTTPAUTH_AVAIL = CURLINFO_LONG + 23, + CURLINFO_PROXYAUTH_AVAIL = CURLINFO_LONG + 24, + CURLINFO_OS_ERRNO = CURLINFO_LONG + 25, + CURLINFO_NUM_CONNECTS = CURLINFO_LONG + 26, + CURLINFO_SSL_ENGINES = CURLINFO_SLIST + 27, + CURLINFO_COOKIELIST = CURLINFO_SLIST + 28, + CURLINFO_LASTSOCKET = CURLINFO_LONG + 29, + CURLINFO_FTP_ENTRY_PATH = CURLINFO_STRING + 30, + CURLINFO_REDIRECT_URL = CURLINFO_STRING + 31, + CURLINFO_PRIMARY_IP = CURLINFO_STRING + 32, + CURLINFO_APPCONNECT_TIME = CURLINFO_DOUBLE + 33, + CURLINFO_CERTINFO = CURLINFO_SLIST + 34, + CURLINFO_CONDITION_UNMET = CURLINFO_LONG + 35, + CURLINFO_RTSP_SESSION_ID = CURLINFO_STRING + 36, + CURLINFO_RTSP_CLIENT_CSEQ = CURLINFO_LONG + 37, + CURLINFO_RTSP_SERVER_CSEQ = CURLINFO_LONG + 38, + CURLINFO_RTSP_CSEQ_RECV = CURLINFO_LONG + 39, + CURLINFO_PRIMARY_PORT = CURLINFO_LONG + 40, + CURLINFO_LOCAL_IP = CURLINFO_STRING + 41, + CURLINFO_LOCAL_PORT = CURLINFO_LONG + 42, + CURLINFO_TLS_SESSION = CURLINFO_SLIST + 43, + CURLINFO_ACTIVESOCKET = CURLINFO_SOCKET + 44, + CURLINFO_TLS_SSL_PTR = CURLINFO_SLIST + 45, + CURLINFO_HTTP_VERSION = CURLINFO_LONG + 46, + CURLINFO_PROXY_SSL_VERIFYRESULT = CURLINFO_LONG + 47, + CURLINFO_PROTOCOL = CURLINFO_LONG + 48, + CURLINFO_SCHEME = CURLINFO_STRING + 49, + /* Fill in new entries below here! */ + + CURLINFO_LASTONE = 49 +} CURLINFO; + +/* CURLINFO_RESPONSE_CODE is the new name for the option previously known as + CURLINFO_HTTP_CODE */ +#define CURLINFO_HTTP_CODE CURLINFO_RESPONSE_CODE + +typedef enum { + CURLCLOSEPOLICY_NONE, /* first, never use this */ + + CURLCLOSEPOLICY_OLDEST, + CURLCLOSEPOLICY_LEAST_RECENTLY_USED, + CURLCLOSEPOLICY_LEAST_TRAFFIC, + CURLCLOSEPOLICY_SLOWEST, + CURLCLOSEPOLICY_CALLBACK, + + CURLCLOSEPOLICY_LAST /* last, never use this */ +} curl_closepolicy; + +#define CURL_GLOBAL_SSL (1<<0) +#define CURL_GLOBAL_WIN32 (1<<1) +#define CURL_GLOBAL_ALL (CURL_GLOBAL_SSL|CURL_GLOBAL_WIN32) +#define CURL_GLOBAL_NOTHING 0 +#define CURL_GLOBAL_DEFAULT CURL_GLOBAL_ALL +#define CURL_GLOBAL_ACK_EINTR (1<<2) + + +/***************************************************************************** + * Setup defines, protos etc for the sharing stuff. + */ + +/* Different data locks for a single share */ +typedef enum { + CURL_LOCK_DATA_NONE = 0, + /* CURL_LOCK_DATA_SHARE is used internally to say that + * the locking is just made to change the internal state of the share + * itself. + */ + CURL_LOCK_DATA_SHARE, + CURL_LOCK_DATA_COOKIE, + CURL_LOCK_DATA_DNS, + CURL_LOCK_DATA_SSL_SESSION, + CURL_LOCK_DATA_CONNECT, + CURL_LOCK_DATA_LAST +} curl_lock_data; + +/* Different lock access types */ +typedef enum { + CURL_LOCK_ACCESS_NONE = 0, /* unspecified action */ + CURL_LOCK_ACCESS_SHARED = 1, /* for read perhaps */ + CURL_LOCK_ACCESS_SINGLE = 2, /* for write perhaps */ + CURL_LOCK_ACCESS_LAST /* never use */ +} curl_lock_access; + +typedef void (*curl_lock_function)(CURL *handle, + curl_lock_data data, + curl_lock_access locktype, + void *userptr); +typedef void (*curl_unlock_function)(CURL *handle, + curl_lock_data data, + void *userptr); + + +typedef enum { + CURLSHE_OK, /* all is fine */ + CURLSHE_BAD_OPTION, /* 1 */ + CURLSHE_IN_USE, /* 2 */ + CURLSHE_INVALID, /* 3 */ + CURLSHE_NOMEM, /* 4 out of memory */ + CURLSHE_NOT_BUILT_IN, /* 5 feature not present in lib */ + CURLSHE_LAST /* never use */ +} CURLSHcode; + +typedef enum { + CURLSHOPT_NONE, /* don't use */ + CURLSHOPT_SHARE, /* specify a data type to share */ + CURLSHOPT_UNSHARE, /* specify which data type to stop sharing */ + CURLSHOPT_LOCKFUNC, /* pass in a 'curl_lock_function' pointer */ + CURLSHOPT_UNLOCKFUNC, /* pass in a 'curl_unlock_function' pointer */ + CURLSHOPT_USERDATA, /* pass in a user data pointer used in the lock/unlock + callback functions */ + CURLSHOPT_LAST /* never use */ +} CURLSHoption; + +CURL_EXTERN CURLSH *curl_share_init(void); +CURL_EXTERN CURLSHcode curl_share_setopt(CURLSH *, CURLSHoption option, ...); +CURL_EXTERN CURLSHcode curl_share_cleanup(CURLSH *); + +/**************************************************************************** + * Structures for querying information about the curl library at runtime. + */ + +typedef enum { + CURLVERSION_FIRST, + CURLVERSION_SECOND, + CURLVERSION_THIRD, + CURLVERSION_FOURTH, + CURLVERSION_LAST /* never actually use this */ +} CURLversion; + +/* The 'CURLVERSION_NOW' is the symbolic name meant to be used by + basically all programs ever that want to get version information. It is + meant to be a built-in version number for what kind of struct the caller + expects. If the struct ever changes, we redefine the NOW to another enum + from above. */ +#define CURLVERSION_NOW CURLVERSION_FOURTH + +typedef struct { + CURLversion age; /* age of the returned struct */ + const char *version; /* LIBCURL_VERSION */ + unsigned int version_num; /* LIBCURL_VERSION_NUM */ + const char *host; /* OS/host/cpu/machine when configured */ + int features; /* bitmask, see defines below */ + const char *ssl_version; /* human readable string */ + long ssl_version_num; /* not used anymore, always 0 */ + const char *libz_version; /* human readable string */ + /* protocols is terminated by an entry with a NULL protoname */ + const char * const *protocols; + + /* The fields below this were added in CURLVERSION_SECOND */ + const char *ares; + int ares_num; + + /* This field was added in CURLVERSION_THIRD */ + const char *libidn; + + /* These field were added in CURLVERSION_FOURTH */ + + /* Same as '_libiconv_version' if built with HAVE_ICONV */ + int iconv_ver_num; + + const char *libssh_version; /* human readable string */ + +} curl_version_info_data; + +#define CURL_VERSION_IPV6 (1<<0) /* IPv6-enabled */ +#define CURL_VERSION_KERBEROS4 (1<<1) /* Kerberos V4 auth is supported + (deprecated) */ +#define CURL_VERSION_SSL (1<<2) /* SSL options are present */ +#define CURL_VERSION_LIBZ (1<<3) /* libz features are present */ +#define CURL_VERSION_NTLM (1<<4) /* NTLM auth is supported */ +#define CURL_VERSION_GSSNEGOTIATE (1<<5) /* Negotiate auth is supported + (deprecated) */ +#define CURL_VERSION_DEBUG (1<<6) /* Built with debug capabilities */ +#define CURL_VERSION_ASYNCHDNS (1<<7) /* Asynchronous DNS resolves */ +#define CURL_VERSION_SPNEGO (1<<8) /* SPNEGO auth is supported */ +#define CURL_VERSION_LARGEFILE (1<<9) /* Supports files larger than 2GB */ +#define CURL_VERSION_IDN (1<<10) /* Internationized Domain Names are + supported */ +#define CURL_VERSION_SSPI (1<<11) /* Built against Windows SSPI */ +#define CURL_VERSION_CONV (1<<12) /* Character conversions supported */ +#define CURL_VERSION_CURLDEBUG (1<<13) /* Debug memory tracking supported */ +#define CURL_VERSION_TLSAUTH_SRP (1<<14) /* TLS-SRP auth is supported */ +#define CURL_VERSION_NTLM_WB (1<<15) /* NTLM delegation to winbind helper + is suported */ +#define CURL_VERSION_HTTP2 (1<<16) /* HTTP2 support built-in */ +#define CURL_VERSION_GSSAPI (1<<17) /* Built against a GSS-API library */ +#define CURL_VERSION_KERBEROS5 (1<<18) /* Kerberos V5 auth is supported */ +#define CURL_VERSION_UNIX_SOCKETS (1<<19) /* Unix domain sockets support */ +#define CURL_VERSION_PSL (1<<20) /* Mozilla's Public Suffix List, used + for cookie domain verification */ +#define CURL_VERSION_HTTPS_PROXY (1<<21) /* HTTPS-proxy support built-in */ + + /* + * NAME curl_version_info() + * + * DESCRIPTION + * + * This function returns a pointer to a static copy of the version info + * struct. See above. + */ +CURL_EXTERN curl_version_info_data *curl_version_info(CURLversion); + +/* + * NAME curl_easy_strerror() + * + * DESCRIPTION + * + * The curl_easy_strerror function may be used to turn a CURLcode value + * into the equivalent human readable error string. This is useful + * for printing meaningful error messages. + */ +CURL_EXTERN const char *curl_easy_strerror(CURLcode); + +/* + * NAME curl_share_strerror() + * + * DESCRIPTION + * + * The curl_share_strerror function may be used to turn a CURLSHcode value + * into the equivalent human readable error string. This is useful + * for printing meaningful error messages. + */ +CURL_EXTERN const char *curl_share_strerror(CURLSHcode); + +/* + * NAME curl_easy_pause() + * + * DESCRIPTION + * + * The curl_easy_pause function pauses or unpauses transfers. Select the new + * state by setting the bitmask, use the convenience defines below. + * + */ +CURL_EXTERN CURLcode curl_easy_pause(CURL *handle, int bitmask); + +#define CURLPAUSE_RECV (1<<0) +#define CURLPAUSE_RECV_CONT (0) + +#define CURLPAUSE_SEND (1<<2) +#define CURLPAUSE_SEND_CONT (0) + +#define CURLPAUSE_ALL (CURLPAUSE_RECV|CURLPAUSE_SEND) +#define CURLPAUSE_CONT (CURLPAUSE_RECV_CONT|CURLPAUSE_SEND_CONT) + +#ifdef __cplusplus +} +#endif + +/* unfortunately, the easy.h and multi.h include files need options and info + stuff before they can be included! */ +#include "easy.h" /* nothing in curl is fun without the easy stuff */ +#include "multi.h" + +/* the typechecker doesn't work in C++ (yet) */ +#if defined(__GNUC__) && defined(__GNUC_MINOR__) && \ + ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) && \ + !defined(__cplusplus) && !defined(CURL_DISABLE_TYPECHECK) +#include "typecheck-gcc.h" +#else +#if defined(__STDC__) && (__STDC__ >= 1) +/* This preprocessor magic that replaces a call with the exact same call is + only done to make sure application authors pass exactly three arguments + to these functions. */ +#define curl_easy_setopt(handle,opt,param) curl_easy_setopt(handle,opt,param) +#define curl_easy_getinfo(handle,info,arg) curl_easy_getinfo(handle,info,arg) +#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param) +#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param) +#endif /* __STDC__ >= 1 */ +#endif /* gcc >= 4.3 && !__cplusplus */ + +#endif /* __CURL_CURL_H */ diff --git a/includes/curl/curlbuild.h.cmake b/includes/curl/curlbuild.h.cmake new file mode 100644 index 000000000..bbb31a940 --- /dev/null +++ b/includes/curl/curlbuild.h.cmake @@ -0,0 +1,197 @@ +#ifndef __CURL_CURLBUILD_H +#define __CURL_CURLBUILD_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2008, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* ================================================================ */ +/* NOTES FOR CONFIGURE CAPABLE SYSTEMS */ +/* ================================================================ */ + +/* + * NOTE 1: + * ------- + * + * Nothing in this file is intended to be modified or adjusted by the + * curl library user nor by the curl library builder. + * + * If you think that something actually needs to be changed, adjusted + * or fixed in this file, then, report it on the libcurl development + * mailing list: https://cool.haxx.se/mailman/listinfo/curl-library/ + * + * This header file shall only export symbols which are 'curl' or 'CURL' + * prefixed, otherwise public name space would be polluted. + * + * NOTE 2: + * ------- + * + * Right now you might be staring at file include/curl/curlbuild.h.in or + * at file include/curl/curlbuild.h, this is due to the following reason: + * + * On systems capable of running the configure script, the configure process + * will overwrite the distributed include/curl/curlbuild.h file with one that + * is suitable and specific to the library being configured and built, which + * is generated from the include/curl/curlbuild.h.in template file. + * + */ + +/* ================================================================ */ +/* DEFINITION OF THESE SYMBOLS SHALL NOT TAKE PLACE ANYWHERE ELSE */ +/* ================================================================ */ + +#ifdef CURL_SIZEOF_LONG +#error "CURL_SIZEOF_LONG shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_LONG_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_SOCKLEN_T +#error "CURL_TYPEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_SOCKLEN_T +#error "CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_OFF_T +#error "CURL_TYPEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_T +#error "CURL_FORMAT_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_TU +#error "CURL_FORMAT_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_already_defined +#endif + +#ifdef CURL_FORMAT_OFF_T +#error "CURL_FORMAT_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_OFF_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_OFF_T +#error "CURL_SIZEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_T +#error "CURL_SUFFIX_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_TU +#error "CURL_SUFFIX_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_already_defined +#endif + +/* ================================================================ */ +/* EXTERNAL INTERFACE SETTINGS FOR CONFIGURE CAPABLE SYSTEMS ONLY */ +/* ================================================================ */ + +/* Configure process defines this to 1 when it finds out that system */ +/* header file ws2tcpip.h must be included by the external interface. */ +#cmakedefine CURL_PULL_WS2TCPIP_H +#ifdef CURL_PULL_WS2TCPIP_H +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif +# include +# include +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file sys/types.h must be included by the external interface. */ +#cmakedefine CURL_PULL_SYS_TYPES_H +#ifdef CURL_PULL_SYS_TYPES_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file stdint.h must be included by the external interface. */ +#cmakedefine CURL_PULL_STDINT_H +#ifdef CURL_PULL_STDINT_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file inttypes.h must be included by the external interface. */ +#cmakedefine CURL_PULL_INTTYPES_H +#ifdef CURL_PULL_INTTYPES_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file sys/socket.h must be included by the external interface. */ +#cmakedefine CURL_PULL_SYS_SOCKET_H +#ifdef CURL_PULL_SYS_SOCKET_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file sys/poll.h must be included by the external interface. */ +#cmakedefine CURL_PULL_SYS_POLL_H +#ifdef CURL_PULL_SYS_POLL_H +# include +#endif + +/* The size of `long', as computed by sizeof. */ +#define CURL_SIZEOF_LONG ${CURL_SIZEOF_LONG} + +/* Integral data type used for curl_socklen_t. */ +#define CURL_TYPEOF_CURL_SOCKLEN_T ${CURL_TYPEOF_CURL_SOCKLEN_T} + +/* The size of `curl_socklen_t', as computed by sizeof. */ +#define CURL_SIZEOF_CURL_SOCKLEN_T ${CURL_SIZEOF_CURL_SOCKLEN_T} + +/* Data type definition of curl_socklen_t. */ +typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t; + +/* Signed integral data type used for curl_off_t. */ +#define CURL_TYPEOF_CURL_OFF_T ${CURL_TYPEOF_CURL_OFF_T} + +/* Data type definition of curl_off_t. */ +typedef CURL_TYPEOF_CURL_OFF_T curl_off_t; + +/* curl_off_t formatting string directive without "%" conversion specifier. */ +#define CURL_FORMAT_CURL_OFF_T "${CURL_FORMAT_CURL_OFF_T}" + +/* unsigned curl_off_t formatting string without "%" conversion specifier. */ +#define CURL_FORMAT_CURL_OFF_TU "${CURL_FORMAT_CURL_OFF_TU}" + +/* curl_off_t formatting string directive with "%" conversion specifier. */ +#define CURL_FORMAT_OFF_T "${CURL_FORMAT_OFF_T}" + +/* The size of `curl_off_t', as computed by sizeof. */ +#define CURL_SIZEOF_CURL_OFF_T ${CURL_SIZEOF_CURL_OFF_T} + +/* curl_off_t constant suffix. */ +#define CURL_SUFFIX_CURL_OFF_T ${CURL_SUFFIX_CURL_OFF_T} + +/* unsigned curl_off_t constant suffix. */ +#define CURL_SUFFIX_CURL_OFF_TU ${CURL_SUFFIX_CURL_OFF_TU} + +#endif /* __CURL_CURLBUILD_H */ diff --git a/includes/curl/curlbuild.h.dist b/includes/curl/curlbuild.h.dist new file mode 100644 index 000000000..ae95095fa --- /dev/null +++ b/includes/curl/curlbuild.h.dist @@ -0,0 +1,586 @@ +#ifndef __CURL_CURLBUILD_H +#define __CURL_CURLBUILD_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* ================================================================ */ +/* NOTES FOR CONFIGURE CAPABLE SYSTEMS */ +/* ================================================================ */ + +/* + * NOTE 1: + * ------- + * + * See file include/curl/curlbuild.h.in, run configure, and forget + * that this file exists it is only used for non-configure systems. + * But you can keep reading if you want ;-) + * + */ + +/* ================================================================ */ +/* NOTES FOR NON-CONFIGURE SYSTEMS */ +/* ================================================================ */ + +/* + * NOTE 1: + * ------- + * + * Nothing in this file is intended to be modified or adjusted by the + * curl library user nor by the curl library builder. + * + * If you think that something actually needs to be changed, adjusted + * or fixed in this file, then, report it on the libcurl development + * mailing list: https://cool.haxx.se/mailman/listinfo/curl-library/ + * + * Try to keep one section per platform, compiler and architecture, + * otherwise, if an existing section is reused for a different one and + * later on the original is adjusted, probably the piggybacking one can + * be adversely changed. + * + * In order to differentiate between platforms/compilers/architectures + * use only compiler built in predefined preprocessor symbols. + * + * This header file shall only export symbols which are 'curl' or 'CURL' + * prefixed, otherwise public name space would be polluted. + * + * NOTE 2: + * ------- + * + * For any given platform/compiler curl_off_t must be typedef'ed to a + * 64-bit wide signed integral data type. The width of this data type + * must remain constant and independent of any possible large file + * support settings. + * + * As an exception to the above, curl_off_t shall be typedef'ed to a + * 32-bit wide signed integral data type if there is no 64-bit type. + * + * As a general rule, curl_off_t shall not be mapped to off_t. This + * rule shall only be violated if off_t is the only 64-bit data type + * available and the size of off_t is independent of large file support + * settings. Keep your build on the safe side avoiding an off_t gating. + * If you have a 64-bit off_t then take for sure that another 64-bit + * data type exists, dig deeper and you will find it. + * + * NOTE 3: + * ------- + * + * Right now you might be staring at file include/curl/curlbuild.h.dist or + * at file include/curl/curlbuild.h, this is due to the following reason: + * file include/curl/curlbuild.h.dist is renamed to include/curl/curlbuild.h + * when the libcurl source code distribution archive file is created. + * + * File include/curl/curlbuild.h.dist is not included in the distribution + * archive. File include/curl/curlbuild.h is not present in the git tree. + * + * The distributed include/curl/curlbuild.h file is only intended to be used + * on systems which can not run the also distributed configure script. + * + * On systems capable of running the configure script, the configure process + * will overwrite the distributed include/curl/curlbuild.h file with one that + * is suitable and specific to the library being configured and built, which + * is generated from the include/curl/curlbuild.h.in template file. + * + * If you check out from git on a non-configure platform, you must run the + * appropriate buildconf* script to set up curlbuild.h and other local files. + * + */ + +/* ================================================================ */ +/* DEFINITION OF THESE SYMBOLS SHALL NOT TAKE PLACE ANYWHERE ELSE */ +/* ================================================================ */ + +#ifdef CURL_SIZEOF_LONG +# error "CURL_SIZEOF_LONG shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_LONG_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_SOCKLEN_T +# error "CURL_TYPEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_SOCKLEN_T +# error "CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_OFF_T +# error "CURL_TYPEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_T +# error "CURL_FORMAT_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_TU +# error "CURL_FORMAT_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_already_defined +#endif + +#ifdef CURL_FORMAT_OFF_T +# error "CURL_FORMAT_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_OFF_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_OFF_T +# error "CURL_SIZEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_T +# error "CURL_SUFFIX_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_TU +# error "CURL_SUFFIX_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_already_defined +#endif + +/* ================================================================ */ +/* EXTERNAL INTERFACE SETTINGS FOR NON-CONFIGURE SYSTEMS ONLY */ +/* ================================================================ */ + +#if defined(__DJGPP__) || defined(__GO32__) +# if defined(__DJGPP__) && (__DJGPP__ > 1) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__SALFORDC__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__BORLANDC__) +# if (__BORLANDC__ < 0x520) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__TURBOC__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__WATCOMC__) +# if defined(__386__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__POCC__) +# if (__POCC__ < 280) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# elif defined(_MSC_VER) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__LCC__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__SYMBIAN32__) +# if defined(__EABI__) /* Treat all ARM compilers equally */ +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(__CW32__) +# pragma longlong on +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(__VC32__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__MWERKS__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(_WIN32_WCE) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__MINGW32__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__VMS) +# if defined(__VAX) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__OS400__) +# if defined(__ILEC400__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 +# endif + +#elif defined(__MVS__) +# if defined(__IBMC__) || defined(__IBMCPP__) +# if defined(_ILP32) +# define CURL_SIZEOF_LONG 4 +# elif defined(_LP64) +# define CURL_SIZEOF_LONG 8 +# endif +# if defined(_LONG_LONG) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(_LP64) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 +# endif + +#elif defined(__370__) +# if defined(__IBMC__) || defined(__IBMCPP__) +# if defined(_ILP32) +# define CURL_SIZEOF_LONG 4 +# elif defined(_LP64) +# define CURL_SIZEOF_LONG 8 +# endif +# if defined(_LONG_LONG) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(_LP64) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 +# endif + +#elif defined(TPF) +# define CURL_SIZEOF_LONG 8 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +/* ===================================== */ +/* KEEP MSVC THE PENULTIMATE ENTRY */ +/* ===================================== */ + +#elif defined(_MSC_VER) +# if (_MSC_VER >= 900) && (_INTEGRAL_MAX_BITS >= 64) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +/* ===================================== */ +/* KEEP GENERIC GCC THE LAST ENTRY */ +/* ===================================== */ + +#elif defined(__GNUC__) +# if !defined(__LP64__) && (defined(__ILP32__) || \ + defined(__i386__) || defined(__ppc__) || defined(__arm__) || \ + defined(__sparc__) || defined(__mips__) || defined(__sh__)) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(__LP64__) || \ + defined(__x86_64__) || defined(__ppc64__) || defined(__sparc64__) +# define CURL_SIZEOF_LONG 8 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 + +#else +# error "Unknown non-configure build target!" + Error Compilation_aborted_Unknown_non_configure_build_target +#endif + +/* CURL_PULL_SYS_TYPES_H is defined above when inclusion of header file */ +/* sys/types.h is required here to properly make type definitions below. */ +#ifdef CURL_PULL_SYS_TYPES_H +# include +#endif + +/* CURL_PULL_SYS_SOCKET_H is defined above when inclusion of header file */ +/* sys/socket.h is required here to properly make type definitions below. */ +#ifdef CURL_PULL_SYS_SOCKET_H +# include +#endif + +/* Data type definition of curl_socklen_t. */ + +#ifdef CURL_TYPEOF_CURL_SOCKLEN_T + typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t; +#endif + +/* Data type definition of curl_off_t. */ + +#ifdef CURL_TYPEOF_CURL_OFF_T + typedef CURL_TYPEOF_CURL_OFF_T curl_off_t; +#endif + +#endif /* __CURL_CURLBUILD_H */ diff --git a/includes/curl/curlbuild.h.in b/includes/curl/curlbuild.h.in new file mode 100644 index 000000000..ffab35670 --- /dev/null +++ b/includes/curl/curlbuild.h.in @@ -0,0 +1,197 @@ +#ifndef __CURL_CURLBUILD_H +#define __CURL_CURLBUILD_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* ================================================================ */ +/* NOTES FOR CONFIGURE CAPABLE SYSTEMS */ +/* ================================================================ */ + +/* + * NOTE 1: + * ------- + * + * Nothing in this file is intended to be modified or adjusted by the + * curl library user nor by the curl library builder. + * + * If you think that something actually needs to be changed, adjusted + * or fixed in this file, then, report it on the libcurl development + * mailing list: https://cool.haxx.se/mailman/listinfo/curl-library/ + * + * This header file shall only export symbols which are 'curl' or 'CURL' + * prefixed, otherwise public name space would be polluted. + * + * NOTE 2: + * ------- + * + * Right now you might be staring at file include/curl/curlbuild.h.in or + * at file include/curl/curlbuild.h, this is due to the following reason: + * + * On systems capable of running the configure script, the configure process + * will overwrite the distributed include/curl/curlbuild.h file with one that + * is suitable and specific to the library being configured and built, which + * is generated from the include/curl/curlbuild.h.in template file. + * + */ + +/* ================================================================ */ +/* DEFINITION OF THESE SYMBOLS SHALL NOT TAKE PLACE ANYWHERE ELSE */ +/* ================================================================ */ + +#ifdef CURL_SIZEOF_LONG +#error "CURL_SIZEOF_LONG shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_LONG_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_SOCKLEN_T +#error "CURL_TYPEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_SOCKLEN_T +#error "CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_OFF_T +#error "CURL_TYPEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_T +#error "CURL_FORMAT_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_TU +#error "CURL_FORMAT_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_already_defined +#endif + +#ifdef CURL_FORMAT_OFF_T +#error "CURL_FORMAT_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_OFF_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_OFF_T +#error "CURL_SIZEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_T +#error "CURL_SUFFIX_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_TU +#error "CURL_SUFFIX_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_already_defined +#endif + +/* ================================================================ */ +/* EXTERNAL INTERFACE SETTINGS FOR CONFIGURE CAPABLE SYSTEMS ONLY */ +/* ================================================================ */ + +/* Configure process defines this to 1 when it finds out that system */ +/* header file ws2tcpip.h must be included by the external interface. */ +#undef CURL_PULL_WS2TCPIP_H +#ifdef CURL_PULL_WS2TCPIP_H +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif +# include +# include +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file sys/types.h must be included by the external interface. */ +#undef CURL_PULL_SYS_TYPES_H +#ifdef CURL_PULL_SYS_TYPES_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file stdint.h must be included by the external interface. */ +#undef CURL_PULL_STDINT_H +#ifdef CURL_PULL_STDINT_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file inttypes.h must be included by the external interface. */ +#undef CURL_PULL_INTTYPES_H +#ifdef CURL_PULL_INTTYPES_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file sys/socket.h must be included by the external interface. */ +#undef CURL_PULL_SYS_SOCKET_H +#ifdef CURL_PULL_SYS_SOCKET_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file sys/poll.h must be included by the external interface. */ +#undef CURL_PULL_SYS_POLL_H +#ifdef CURL_PULL_SYS_POLL_H +# include +#endif + +/* The size of `long', as computed by sizeof. */ +#undef CURL_SIZEOF_LONG + +/* Integral data type used for curl_socklen_t. */ +#undef CURL_TYPEOF_CURL_SOCKLEN_T + +/* The size of `curl_socklen_t', as computed by sizeof. */ +#undef CURL_SIZEOF_CURL_SOCKLEN_T + +/* Data type definition of curl_socklen_t. */ +typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t; + +/* Signed integral data type used for curl_off_t. */ +#undef CURL_TYPEOF_CURL_OFF_T + +/* Data type definition of curl_off_t. */ +typedef CURL_TYPEOF_CURL_OFF_T curl_off_t; + +/* curl_off_t formatting string directive without "%" conversion specifier. */ +#undef CURL_FORMAT_CURL_OFF_T + +/* unsigned curl_off_t formatting string without "%" conversion specifier. */ +#undef CURL_FORMAT_CURL_OFF_TU + +/* curl_off_t formatting string directive with "%" conversion specifier. */ +#undef CURL_FORMAT_OFF_T + +/* The size of `curl_off_t', as computed by sizeof. */ +#undef CURL_SIZEOF_CURL_OFF_T + +/* curl_off_t constant suffix. */ +#undef CURL_SUFFIX_CURL_OFF_T + +/* unsigned curl_off_t constant suffix. */ +#undef CURL_SUFFIX_CURL_OFF_TU + +#endif /* __CURL_CURLBUILD_H */ diff --git a/includes/curl/curlrules.h b/includes/curl/curlrules.h new file mode 100644 index 000000000..55d21f68f --- /dev/null +++ b/includes/curl/curlrules.h @@ -0,0 +1,262 @@ +#ifndef __CURL_CURLRULES_H +#define __CURL_CURLRULES_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* ================================================================ */ +/* COMPILE TIME SANITY CHECKS */ +/* ================================================================ */ + +/* + * NOTE 1: + * ------- + * + * All checks done in this file are intentionally placed in a public + * header file which is pulled by curl/curl.h when an application is + * being built using an already built libcurl library. Additionally + * this file is also included and used when building the library. + * + * If compilation fails on this file it is certainly sure that the + * problem is elsewhere. It could be a problem in the curlbuild.h + * header file, or simply that you are using different compilation + * settings than those used to build the library. + * + * Nothing in this file is intended to be modified or adjusted by the + * curl library user nor by the curl library builder. + * + * Do not deactivate any check, these are done to make sure that the + * library is properly built and used. + * + * You can find further help on the libcurl development mailing list: + * https://cool.haxx.se/mailman/listinfo/curl-library/ + * + * NOTE 2 + * ------ + * + * Some of the following compile time checks are based on the fact + * that the dimension of a constant array can not be a negative one. + * In this way if the compile time verification fails, the compilation + * will fail issuing an error. The error description wording is compiler + * dependent but it will be quite similar to one of the following: + * + * "negative subscript or subscript is too large" + * "array must have at least one element" + * "-1 is an illegal array size" + * "size of array is negative" + * + * If you are building an application which tries to use an already + * built libcurl library and you are getting this kind of errors on + * this file, it is a clear indication that there is a mismatch between + * how the library was built and how you are trying to use it for your + * application. Your already compiled or binary library provider is the + * only one who can give you the details you need to properly use it. + */ + +/* + * Verify that some macros are actually defined. + */ + +#ifndef CURL_SIZEOF_LONG +# error "CURL_SIZEOF_LONG definition is missing!" + Error Compilation_aborted_CURL_SIZEOF_LONG_is_missing +#endif + +#ifndef CURL_TYPEOF_CURL_SOCKLEN_T +# error "CURL_TYPEOF_CURL_SOCKLEN_T definition is missing!" + Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_is_missing +#endif + +#ifndef CURL_SIZEOF_CURL_SOCKLEN_T +# error "CURL_SIZEOF_CURL_SOCKLEN_T definition is missing!" + Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_is_missing +#endif + +#ifndef CURL_TYPEOF_CURL_OFF_T +# error "CURL_TYPEOF_CURL_OFF_T definition is missing!" + Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_is_missing +#endif + +#ifndef CURL_FORMAT_CURL_OFF_T +# error "CURL_FORMAT_CURL_OFF_T definition is missing!" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_is_missing +#endif + +#ifndef CURL_FORMAT_CURL_OFF_TU +# error "CURL_FORMAT_CURL_OFF_TU definition is missing!" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_is_missing +#endif + +#ifndef CURL_FORMAT_OFF_T +# error "CURL_FORMAT_OFF_T definition is missing!" + Error Compilation_aborted_CURL_FORMAT_OFF_T_is_missing +#endif + +#ifndef CURL_SIZEOF_CURL_OFF_T +# error "CURL_SIZEOF_CURL_OFF_T definition is missing!" + Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_is_missing +#endif + +#ifndef CURL_SUFFIX_CURL_OFF_T +# error "CURL_SUFFIX_CURL_OFF_T definition is missing!" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_is_missing +#endif + +#ifndef CURL_SUFFIX_CURL_OFF_TU +# error "CURL_SUFFIX_CURL_OFF_TU definition is missing!" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_is_missing +#endif + +/* + * Macros private to this header file. + */ + +#define CurlchkszEQ(t, s) sizeof(t) == s ? 1 : -1 + +#define CurlchkszGE(t1, t2) sizeof(t1) >= sizeof(t2) ? 1 : -1 + +/* + * Verify that the size previously defined and expected for long + * is the same as the one reported by sizeof() at compile time. + */ + +typedef char + __curl_rule_01__ + [CurlchkszEQ(long, CURL_SIZEOF_LONG)]; + +/* + * Verify that the size previously defined and expected for + * curl_off_t is actually the the same as the one reported + * by sizeof() at compile time. + */ + +typedef char + __curl_rule_02__ + [CurlchkszEQ(curl_off_t, CURL_SIZEOF_CURL_OFF_T)]; + +/* + * Verify at compile time that the size of curl_off_t as reported + * by sizeof() is greater or equal than the one reported for long + * for the current compilation. + */ + +typedef char + __curl_rule_03__ + [CurlchkszGE(curl_off_t, long)]; + +/* + * Verify that the size previously defined and expected for + * curl_socklen_t is actually the the same as the one reported + * by sizeof() at compile time. + */ + +typedef char + __curl_rule_04__ + [CurlchkszEQ(curl_socklen_t, CURL_SIZEOF_CURL_SOCKLEN_T)]; + +/* + * Verify at compile time that the size of curl_socklen_t as reported + * by sizeof() is greater or equal than the one reported for int for + * the current compilation. + */ + +typedef char + __curl_rule_05__ + [CurlchkszGE(curl_socklen_t, int)]; + +/* ================================================================ */ +/* EXTERNALLY AND INTERNALLY VISIBLE DEFINITIONS */ +/* ================================================================ */ + +/* + * CURL_ISOCPP and CURL_OFF_T_C definitions are done here in order to allow + * these to be visible and exported by the external libcurl interface API, + * while also making them visible to the library internals, simply including + * curl_setup.h, without actually needing to include curl.h internally. + * If some day this section would grow big enough, all this should be moved + * to its own header file. + */ + +/* + * Figure out if we can use the ## preprocessor operator, which is supported + * by ISO/ANSI C and C++. Some compilers support it without setting __STDC__ + * or __cplusplus so we need to carefully check for them too. + */ + +#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) || \ + defined(__HP_aCC) || defined(__BORLANDC__) || defined(__LCC__) || \ + defined(__POCC__) || defined(__SALFORDC__) || defined(__HIGHC__) || \ + defined(__ILEC400__) + /* This compiler is believed to have an ISO compatible preprocessor */ +#define CURL_ISOCPP +#else + /* This compiler is believed NOT to have an ISO compatible preprocessor */ +#undef CURL_ISOCPP +#endif + +/* + * Macros for minimum-width signed and unsigned curl_off_t integer constants. + */ + +#if defined(__BORLANDC__) && (__BORLANDC__ == 0x0551) +# define __CURL_OFF_T_C_HLPR2(x) x +# define __CURL_OFF_T_C_HLPR1(x) __CURL_OFF_T_C_HLPR2(x) +# define CURL_OFF_T_C(Val) __CURL_OFF_T_C_HLPR1(Val) ## \ + __CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_T) +# define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val) ## \ + __CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_TU) +#else +# ifdef CURL_ISOCPP +# define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val ## Suffix +# else +# define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val/**/Suffix +# endif +# define __CURL_OFF_T_C_HLPR1(Val,Suffix) __CURL_OFF_T_C_HLPR2(Val,Suffix) +# define CURL_OFF_T_C(Val) __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_T) +# define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_TU) +#endif + +/* + * Get rid of macros private to this header file. + */ + +#undef CurlchkszEQ +#undef CurlchkszGE + +/* + * Get rid of macros not intended to exist beyond this point. + */ + +#undef CURL_PULL_WS2TCPIP_H +#undef CURL_PULL_SYS_TYPES_H +#undef CURL_PULL_SYS_SOCKET_H +#undef CURL_PULL_SYS_POLL_H +#undef CURL_PULL_STDINT_H +#undef CURL_PULL_INTTYPES_H + +#undef CURL_TYPEOF_CURL_SOCKLEN_T +#undef CURL_TYPEOF_CURL_OFF_T + +#ifdef CURL_NO_OLDIES +#undef CURL_FORMAT_OFF_T /* not required since 7.19.0 - obsoleted in 7.20.0 */ +#endif + +#endif /* __CURL_CURLRULES_H */ diff --git a/includes/curl/curlver.h b/includes/curl/curlver.h new file mode 100644 index 000000000..7beda3fa7 --- /dev/null +++ b/includes/curl/curlver.h @@ -0,0 +1,77 @@ +#ifndef __CURL_CURLVER_H +#define __CURL_CURLVER_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2017, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* This header file contains nothing but libcurl version info, generated by + a script at release-time. This was made its own header file in 7.11.2 */ + +/* This is the global package copyright */ +#define LIBCURL_COPYRIGHT "1996 - 2017 Daniel Stenberg, ." + +/* This is the version number of the libcurl package from which this header + file origins: */ +#define LIBCURL_VERSION "7.54.0-DEV" + +/* The numeric version number is also available "in parts" by using these + defines: */ +#define LIBCURL_VERSION_MAJOR 7 +#define LIBCURL_VERSION_MINOR 54 +#define LIBCURL_VERSION_PATCH 0 + +/* This is the numeric version of the libcurl version number, meant for easier + parsing and comparions by programs. The LIBCURL_VERSION_NUM define will + always follow this syntax: + + 0xXXYYZZ + + Where XX, YY and ZZ are the main version, release and patch numbers in + hexadecimal (using 8 bits each). All three numbers are always represented + using two digits. 1.2 would appear as "0x010200" while version 9.11.7 + appears as "0x090b07". + + This 6-digit (24 bits) hexadecimal number does not show pre-release number, + and it is always a greater number in a more recent release. It makes + comparisons with greater than and less than work. + + Note: This define is the full hex number and _does not_ use the + CURL_VERSION_BITS() macro since curl's own configure script greps for it + and needs it to contain the full number. +*/ +#define LIBCURL_VERSION_NUM 0x073600 + +/* + * This is the date and time when the full source package was created. The + * timestamp is not stored in git, as the timestamp is properly set in the + * tarballs by the maketgz script. + * + * The format of the date should follow this template: + * + * "Mon Feb 12 11:35:33 UTC 2007" + */ +#define LIBCURL_TIMESTAMP "DEV" + +#define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|z) +#define CURL_AT_LEAST_VERSION(x,y,z) \ + (LIBCURL_VERSION_NUM >= CURL_VERSION_BITS(x, y, z)) + +#endif /* __CURL_CURLVER_H */ diff --git a/includes/curl/easy.h b/includes/curl/easy.h new file mode 100644 index 000000000..752c5049f --- /dev/null +++ b/includes/curl/easy.h @@ -0,0 +1,102 @@ +#ifndef __CURL_EASY_H +#define __CURL_EASY_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#ifdef __cplusplus +extern "C" { +#endif + +CURL_EXTERN CURL *curl_easy_init(void); +CURL_EXTERN CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...); +CURL_EXTERN CURLcode curl_easy_perform(CURL *curl); +CURL_EXTERN void curl_easy_cleanup(CURL *curl); + +/* + * NAME curl_easy_getinfo() + * + * DESCRIPTION + * + * Request internal information from the curl session with this function. The + * third argument MUST be a pointer to a long, a pointer to a char * or a + * pointer to a double (as the documentation describes elsewhere). The data + * pointed to will be filled in accordingly and can be relied upon only if the + * function returns CURLE_OK. This function is intended to get used *AFTER* a + * performed transfer, all results from this function are undefined until the + * transfer is completed. + */ +CURL_EXTERN CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...); + + +/* + * NAME curl_easy_duphandle() + * + * DESCRIPTION + * + * Creates a new curl session handle with the same options set for the handle + * passed in. Duplicating a handle could only be a matter of cloning data and + * options, internal state info and things like persistent connections cannot + * be transferred. It is useful in multithreaded applications when you can run + * curl_easy_duphandle() for each new thread to avoid a series of identical + * curl_easy_setopt() invokes in every thread. + */ +CURL_EXTERN CURL *curl_easy_duphandle(CURL *curl); + +/* + * NAME curl_easy_reset() + * + * DESCRIPTION + * + * Re-initializes a CURL handle to the default values. This puts back the + * handle to the same state as it was in when it was just created. + * + * It does keep: live connections, the Session ID cache, the DNS cache and the + * cookies. + */ +CURL_EXTERN void curl_easy_reset(CURL *curl); + +/* + * NAME curl_easy_recv() + * + * DESCRIPTION + * + * Receives data from the connected socket. Use after successful + * curl_easy_perform() with CURLOPT_CONNECT_ONLY option. + */ +CURL_EXTERN CURLcode curl_easy_recv(CURL *curl, void *buffer, size_t buflen, + size_t *n); + +/* + * NAME curl_easy_send() + * + * DESCRIPTION + * + * Sends data over the connected socket. Use after successful + * curl_easy_perform() with CURLOPT_CONNECT_ONLY option. + */ +CURL_EXTERN CURLcode curl_easy_send(CURL *curl, const void *buffer, + size_t buflen, size_t *n); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/includes/curl/mprintf.h b/includes/curl/mprintf.h new file mode 100644 index 000000000..e20f546e1 --- /dev/null +++ b/includes/curl/mprintf.h @@ -0,0 +1,50 @@ +#ifndef __CURL_MPRINTF_H +#define __CURL_MPRINTF_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +#include +#include /* needed for FILE */ +#include "curl.h" /* for CURL_EXTERN */ + +#ifdef __cplusplus +extern "C" { +#endif + +CURL_EXTERN int curl_mprintf(const char *format, ...); +CURL_EXTERN int curl_mfprintf(FILE *fd, const char *format, ...); +CURL_EXTERN int curl_msprintf(char *buffer, const char *format, ...); +CURL_EXTERN int curl_msnprintf(char *buffer, size_t maxlength, + const char *format, ...); +CURL_EXTERN int curl_mvprintf(const char *format, va_list args); +CURL_EXTERN int curl_mvfprintf(FILE *fd, const char *format, va_list args); +CURL_EXTERN int curl_mvsprintf(char *buffer, const char *format, va_list args); +CURL_EXTERN int curl_mvsnprintf(char *buffer, size_t maxlength, + const char *format, va_list args); +CURL_EXTERN char *curl_maprintf(const char *format, ...); +CURL_EXTERN char *curl_mvaprintf(const char *format, va_list args); + +#ifdef __cplusplus +} +#endif + +#endif /* __CURL_MPRINTF_H */ diff --git a/includes/curl/multi.h b/includes/curl/multi.h new file mode 100644 index 000000000..d1e00cc5d --- /dev/null +++ b/includes/curl/multi.h @@ -0,0 +1,439 @@ +#ifndef __CURL_MULTI_H +#define __CURL_MULTI_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +/* + This is an "external" header file. Don't give away any internals here! + + GOALS + + o Enable a "pull" interface. The application that uses libcurl decides where + and when to ask libcurl to get/send data. + + o Enable multiple simultaneous transfers in the same thread without making it + complicated for the application. + + o Enable the application to select() on its own file descriptors and curl's + file descriptors simultaneous easily. + +*/ + +/* + * This header file should not really need to include "curl.h" since curl.h + * itself includes this file and we expect user applications to do #include + * without the need for especially including multi.h. + * + * For some reason we added this include here at one point, and rather than to + * break existing (wrongly written) libcurl applications, we leave it as-is + * but with this warning attached. + */ +#include "curl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(BUILDING_LIBCURL) || defined(CURL_STRICTER) +typedef struct Curl_multi CURLM; +#else +typedef void CURLM; +#endif + +typedef enum { + CURLM_CALL_MULTI_PERFORM = -1, /* please call curl_multi_perform() or + curl_multi_socket*() soon */ + CURLM_OK, + CURLM_BAD_HANDLE, /* the passed-in handle is not a valid CURLM handle */ + CURLM_BAD_EASY_HANDLE, /* an easy handle was not good/valid */ + CURLM_OUT_OF_MEMORY, /* if you ever get this, you're in deep sh*t */ + CURLM_INTERNAL_ERROR, /* this is a libcurl bug */ + CURLM_BAD_SOCKET, /* the passed in socket argument did not match */ + CURLM_UNKNOWN_OPTION, /* curl_multi_setopt() with unsupported option */ + CURLM_ADDED_ALREADY, /* an easy handle already added to a multi handle was + attempted to get added - again */ + CURLM_LAST +} CURLMcode; + +/* just to make code nicer when using curl_multi_socket() you can now check + for CURLM_CALL_MULTI_SOCKET too in the same style it works for + curl_multi_perform() and CURLM_CALL_MULTI_PERFORM */ +#define CURLM_CALL_MULTI_SOCKET CURLM_CALL_MULTI_PERFORM + +/* bitmask bits for CURLMOPT_PIPELINING */ +#define CURLPIPE_NOTHING 0L +#define CURLPIPE_HTTP1 1L +#define CURLPIPE_MULTIPLEX 2L + +typedef enum { + CURLMSG_NONE, /* first, not used */ + CURLMSG_DONE, /* This easy handle has completed. 'result' contains + the CURLcode of the transfer */ + CURLMSG_LAST /* last, not used */ +} CURLMSG; + +struct CURLMsg { + CURLMSG msg; /* what this message means */ + CURL *easy_handle; /* the handle it concerns */ + union { + void *whatever; /* message-specific data */ + CURLcode result; /* return code for transfer */ + } data; +}; +typedef struct CURLMsg CURLMsg; + +/* Based on poll(2) structure and values. + * We don't use pollfd and POLL* constants explicitly + * to cover platforms without poll(). */ +#define CURL_WAIT_POLLIN 0x0001 +#define CURL_WAIT_POLLPRI 0x0002 +#define CURL_WAIT_POLLOUT 0x0004 + +struct curl_waitfd { + curl_socket_t fd; + short events; + short revents; /* not supported yet */ +}; + +/* + * Name: curl_multi_init() + * + * Desc: inititalize multi-style curl usage + * + * Returns: a new CURLM handle to use in all 'curl_multi' functions. + */ +CURL_EXTERN CURLM *curl_multi_init(void); + +/* + * Name: curl_multi_add_handle() + * + * Desc: add a standard curl handle to the multi stack + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_add_handle(CURLM *multi_handle, + CURL *curl_handle); + + /* + * Name: curl_multi_remove_handle() + * + * Desc: removes a curl handle from the multi stack again + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle, + CURL *curl_handle); + + /* + * Name: curl_multi_fdset() + * + * Desc: Ask curl for its fd_set sets. The app can use these to select() or + * poll() on. We want curl_multi_perform() called as soon as one of + * them are ready. + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_fdset(CURLM *multi_handle, + fd_set *read_fd_set, + fd_set *write_fd_set, + fd_set *exc_fd_set, + int *max_fd); + +/* + * Name: curl_multi_wait() + * + * Desc: Poll on all fds within a CURLM set as well as any + * additional fds passed to the function. + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_wait(CURLM *multi_handle, + struct curl_waitfd extra_fds[], + unsigned int extra_nfds, + int timeout_ms, + int *ret); + + /* + * Name: curl_multi_perform() + * + * Desc: When the app thinks there's data available for curl it calls this + * function to read/write whatever there is right now. This returns + * as soon as the reads and writes are done. This function does not + * require that there actually is data available for reading or that + * data can be written, it can be called just in case. It returns + * the number of handles that still transfer data in the second + * argument's integer-pointer. + * + * Returns: CURLMcode type, general multi error code. *NOTE* that this only + * returns errors etc regarding the whole multi stack. There might + * still have occurred problems on invidual transfers even when this + * returns OK. + */ +CURL_EXTERN CURLMcode curl_multi_perform(CURLM *multi_handle, + int *running_handles); + + /* + * Name: curl_multi_cleanup() + * + * Desc: Cleans up and removes a whole multi stack. It does not free or + * touch any individual easy handles in any way. We need to define + * in what state those handles will be if this function is called + * in the middle of a transfer. + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle); + +/* + * Name: curl_multi_info_read() + * + * Desc: Ask the multi handle if there's any messages/informationals from + * the individual transfers. Messages include informationals such as + * error code from the transfer or just the fact that a transfer is + * completed. More details on these should be written down as well. + * + * Repeated calls to this function will return a new struct each + * time, until a special "end of msgs" struct is returned as a signal + * that there is no more to get at this point. + * + * The data the returned pointer points to will not survive calling + * curl_multi_cleanup(). + * + * The 'CURLMsg' struct is meant to be very simple and only contain + * very basic informations. If more involved information is wanted, + * we will provide the particular "transfer handle" in that struct + * and that should/could/would be used in subsequent + * curl_easy_getinfo() calls (or similar). The point being that we + * must never expose complex structs to applications, as then we'll + * undoubtably get backwards compatibility problems in the future. + * + * Returns: A pointer to a filled-in struct, or NULL if it failed or ran out + * of structs. It also writes the number of messages left in the + * queue (after this read) in the integer the second argument points + * to. + */ +CURL_EXTERN CURLMsg *curl_multi_info_read(CURLM *multi_handle, + int *msgs_in_queue); + +/* + * Name: curl_multi_strerror() + * + * Desc: The curl_multi_strerror function may be used to turn a CURLMcode + * value into the equivalent human readable error string. This is + * useful for printing meaningful error messages. + * + * Returns: A pointer to a zero-terminated error message. + */ +CURL_EXTERN const char *curl_multi_strerror(CURLMcode); + +/* + * Name: curl_multi_socket() and + * curl_multi_socket_all() + * + * Desc: An alternative version of curl_multi_perform() that allows the + * application to pass in one of the file descriptors that have been + * detected to have "action" on them and let libcurl perform. + * See man page for details. + */ +#define CURL_POLL_NONE 0 +#define CURL_POLL_IN 1 +#define CURL_POLL_OUT 2 +#define CURL_POLL_INOUT 3 +#define CURL_POLL_REMOVE 4 + +#define CURL_SOCKET_TIMEOUT CURL_SOCKET_BAD + +#define CURL_CSELECT_IN 0x01 +#define CURL_CSELECT_OUT 0x02 +#define CURL_CSELECT_ERR 0x04 + +typedef int (*curl_socket_callback)(CURL *easy, /* easy handle */ + curl_socket_t s, /* socket */ + int what, /* see above */ + void *userp, /* private callback + pointer */ + void *socketp); /* private socket + pointer */ +/* + * Name: curl_multi_timer_callback + * + * Desc: Called by libcurl whenever the library detects a change in the + * maximum number of milliseconds the app is allowed to wait before + * curl_multi_socket() or curl_multi_perform() must be called + * (to allow libcurl's timed events to take place). + * + * Returns: The callback should return zero. + */ +typedef int (*curl_multi_timer_callback)(CURLM *multi, /* multi handle */ + long timeout_ms, /* see above */ + void *userp); /* private callback + pointer */ + +CURL_EXTERN CURLMcode curl_multi_socket(CURLM *multi_handle, curl_socket_t s, + int *running_handles); + +CURL_EXTERN CURLMcode curl_multi_socket_action(CURLM *multi_handle, + curl_socket_t s, + int ev_bitmask, + int *running_handles); + +CURL_EXTERN CURLMcode curl_multi_socket_all(CURLM *multi_handle, + int *running_handles); + +#ifndef CURL_ALLOW_OLD_MULTI_SOCKET +/* This macro below was added in 7.16.3 to push users who recompile to use + the new curl_multi_socket_action() instead of the old curl_multi_socket() +*/ +#define curl_multi_socket(x,y,z) curl_multi_socket_action(x,y,0,z) +#endif + +/* + * Name: curl_multi_timeout() + * + * Desc: Returns the maximum number of milliseconds the app is allowed to + * wait before curl_multi_socket() or curl_multi_perform() must be + * called (to allow libcurl's timed events to take place). + * + * Returns: CURLM error code. + */ +CURL_EXTERN CURLMcode curl_multi_timeout(CURLM *multi_handle, + long *milliseconds); + +#undef CINIT /* re-using the same name as in curl.h */ + +#ifdef CURL_ISOCPP +#define CINIT(name,type,num) CURLMOPT_ ## name = CURLOPTTYPE_ ## type + num +#else +/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */ +#define LONG CURLOPTTYPE_LONG +#define OBJECTPOINT CURLOPTTYPE_OBJECTPOINT +#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT +#define OFF_T CURLOPTTYPE_OFF_T +#define CINIT(name,type,number) CURLMOPT_/**/name = type + number +#endif + +typedef enum { + /* This is the socket callback function pointer */ + CINIT(SOCKETFUNCTION, FUNCTIONPOINT, 1), + + /* This is the argument passed to the socket callback */ + CINIT(SOCKETDATA, OBJECTPOINT, 2), + + /* set to 1 to enable pipelining for this multi handle */ + CINIT(PIPELINING, LONG, 3), + + /* This is the timer callback function pointer */ + CINIT(TIMERFUNCTION, FUNCTIONPOINT, 4), + + /* This is the argument passed to the timer callback */ + CINIT(TIMERDATA, OBJECTPOINT, 5), + + /* maximum number of entries in the connection cache */ + CINIT(MAXCONNECTS, LONG, 6), + + /* maximum number of (pipelining) connections to one host */ + CINIT(MAX_HOST_CONNECTIONS, LONG, 7), + + /* maximum number of requests in a pipeline */ + CINIT(MAX_PIPELINE_LENGTH, LONG, 8), + + /* a connection with a content-length longer than this + will not be considered for pipelining */ + CINIT(CONTENT_LENGTH_PENALTY_SIZE, OFF_T, 9), + + /* a connection with a chunk length longer than this + will not be considered for pipelining */ + CINIT(CHUNK_LENGTH_PENALTY_SIZE, OFF_T, 10), + + /* a list of site names(+port) that are blacklisted from + pipelining */ + CINIT(PIPELINING_SITE_BL, OBJECTPOINT, 11), + + /* a list of server types that are blacklisted from + pipelining */ + CINIT(PIPELINING_SERVER_BL, OBJECTPOINT, 12), + + /* maximum number of open connections in total */ + CINIT(MAX_TOTAL_CONNECTIONS, LONG, 13), + + /* This is the server push callback function pointer */ + CINIT(PUSHFUNCTION, FUNCTIONPOINT, 14), + + /* This is the argument passed to the server push callback */ + CINIT(PUSHDATA, OBJECTPOINT, 15), + + CURLMOPT_LASTENTRY /* the last unused */ +} CURLMoption; + + +/* + * Name: curl_multi_setopt() + * + * Desc: Sets options for the multi handle. + * + * Returns: CURLM error code. + */ +CURL_EXTERN CURLMcode curl_multi_setopt(CURLM *multi_handle, + CURLMoption option, ...); + + +/* + * Name: curl_multi_assign() + * + * Desc: This function sets an association in the multi handle between the + * given socket and a private pointer of the application. This is + * (only) useful for curl_multi_socket uses. + * + * Returns: CURLM error code. + */ +CURL_EXTERN CURLMcode curl_multi_assign(CURLM *multi_handle, + curl_socket_t sockfd, void *sockp); + + +/* + * Name: curl_push_callback + * + * Desc: This callback gets called when a new stream is being pushed by the + * server. It approves or denies the new stream. + * + * Returns: CURL_PUSH_OK or CURL_PUSH_DENY. + */ +#define CURL_PUSH_OK 0 +#define CURL_PUSH_DENY 1 + +struct curl_pushheaders; /* forward declaration only */ + +CURL_EXTERN char *curl_pushheader_bynum(struct curl_pushheaders *h, + size_t num); +CURL_EXTERN char *curl_pushheader_byname(struct curl_pushheaders *h, + const char *name); + +typedef int (*curl_push_callback)(CURL *parent, + CURL *easy, + size_t num_headers, + struct curl_pushheaders *headers, + void *userp); + +#ifdef __cplusplus +} /* end of extern "C" */ +#endif + +#endif diff --git a/includes/curl/stdcheaders.h b/includes/curl/stdcheaders.h new file mode 100644 index 000000000..027b6f421 --- /dev/null +++ b/includes/curl/stdcheaders.h @@ -0,0 +1,33 @@ +#ifndef __STDC_HEADERS_H +#define __STDC_HEADERS_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +#include + +size_t fread(void *, size_t, size_t, FILE *); +size_t fwrite(const void *, size_t, size_t, FILE *); + +int strcasecmp(const char *, const char *); +int strncasecmp(const char *, const char *, size_t); + +#endif /* __STDC_HEADERS_H */ diff --git a/includes/curl/typecheck-gcc.h b/includes/curl/typecheck-gcc.h new file mode 100644 index 000000000..3d683152b --- /dev/null +++ b/includes/curl/typecheck-gcc.h @@ -0,0 +1,624 @@ +#ifndef __CURL_TYPECHECK_GCC_H +#define __CURL_TYPECHECK_GCC_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* wraps curl_easy_setopt() with typechecking */ + +/* To add a new kind of warning, add an + * if(_curl_is_sometype_option(_curl_opt)) + * if(!_curl_is_sometype(value)) + * _curl_easy_setopt_err_sometype(); + * block and define _curl_is_sometype_option, _curl_is_sometype and + * _curl_easy_setopt_err_sometype below + * + * NOTE: We use two nested 'if' statements here instead of the && operator, in + * order to work around gcc bug #32061. It affects only gcc 4.3.x/4.4.x + * when compiling with -Wlogical-op. + * + * To add an option that uses the same type as an existing option, you'll just + * need to extend the appropriate _curl_*_option macro + */ +#define curl_easy_setopt(handle, option, value) \ +__extension__ ({ \ + __typeof__(option) _curl_opt = option; \ + if(__builtin_constant_p(_curl_opt)) { \ + if(_curl_is_long_option(_curl_opt)) \ + if(!_curl_is_long(value)) \ + _curl_easy_setopt_err_long(); \ + if(_curl_is_off_t_option(_curl_opt)) \ + if(!_curl_is_off_t(value)) \ + _curl_easy_setopt_err_curl_off_t(); \ + if(_curl_is_string_option(_curl_opt)) \ + if(!_curl_is_string(value)) \ + _curl_easy_setopt_err_string(); \ + if(_curl_is_write_cb_option(_curl_opt)) \ + if(!_curl_is_write_cb(value)) \ + _curl_easy_setopt_err_write_callback(); \ + if((_curl_opt) == CURLOPT_READFUNCTION) \ + if(!_curl_is_read_cb(value)) \ + _curl_easy_setopt_err_read_cb(); \ + if((_curl_opt) == CURLOPT_IOCTLFUNCTION) \ + if(!_curl_is_ioctl_cb(value)) \ + _curl_easy_setopt_err_ioctl_cb(); \ + if((_curl_opt) == CURLOPT_SOCKOPTFUNCTION) \ + if(!_curl_is_sockopt_cb(value)) \ + _curl_easy_setopt_err_sockopt_cb(); \ + if((_curl_opt) == CURLOPT_OPENSOCKETFUNCTION) \ + if(!_curl_is_opensocket_cb(value)) \ + _curl_easy_setopt_err_opensocket_cb(); \ + if((_curl_opt) == CURLOPT_PROGRESSFUNCTION) \ + if(!_curl_is_progress_cb(value)) \ + _curl_easy_setopt_err_progress_cb(); \ + if((_curl_opt) == CURLOPT_DEBUGFUNCTION) \ + if(!_curl_is_debug_cb(value)) \ + _curl_easy_setopt_err_debug_cb(); \ + if((_curl_opt) == CURLOPT_SSL_CTX_FUNCTION) \ + if(!_curl_is_ssl_ctx_cb(value)) \ + _curl_easy_setopt_err_ssl_ctx_cb(); \ + if(_curl_is_conv_cb_option(_curl_opt)) \ + if(!_curl_is_conv_cb(value)) \ + _curl_easy_setopt_err_conv_cb(); \ + if((_curl_opt) == CURLOPT_SEEKFUNCTION) \ + if(!_curl_is_seek_cb(value)) \ + _curl_easy_setopt_err_seek_cb(); \ + if(_curl_is_cb_data_option(_curl_opt)) \ + if(!_curl_is_cb_data(value)) \ + _curl_easy_setopt_err_cb_data(); \ + if((_curl_opt) == CURLOPT_ERRORBUFFER) \ + if(!_curl_is_error_buffer(value)) \ + _curl_easy_setopt_err_error_buffer(); \ + if((_curl_opt) == CURLOPT_STDERR) \ + if(!_curl_is_FILE(value)) \ + _curl_easy_setopt_err_FILE(); \ + if(_curl_is_postfields_option(_curl_opt)) \ + if(!_curl_is_postfields(value)) \ + _curl_easy_setopt_err_postfields(); \ + if((_curl_opt) == CURLOPT_HTTPPOST) \ + if(!_curl_is_arr((value), struct curl_httppost)) \ + _curl_easy_setopt_err_curl_httpost(); \ + if(_curl_is_slist_option(_curl_opt)) \ + if(!_curl_is_arr((value), struct curl_slist)) \ + _curl_easy_setopt_err_curl_slist(); \ + if((_curl_opt) == CURLOPT_SHARE) \ + if(!_curl_is_ptr((value), CURLSH)) \ + _curl_easy_setopt_err_CURLSH(); \ + } \ + curl_easy_setopt(handle, _curl_opt, value); \ +}) + +/* wraps curl_easy_getinfo() with typechecking */ +/* FIXME: don't allow const pointers */ +#define curl_easy_getinfo(handle, info, arg) \ +__extension__ ({ \ + __typeof__(info) _curl_info = info; \ + if(__builtin_constant_p(_curl_info)) { \ + if(_curl_is_string_info(_curl_info)) \ + if(!_curl_is_arr((arg), char *)) \ + _curl_easy_getinfo_err_string(); \ + if(_curl_is_long_info(_curl_info)) \ + if(!_curl_is_arr((arg), long)) \ + _curl_easy_getinfo_err_long(); \ + if(_curl_is_double_info(_curl_info)) \ + if(!_curl_is_arr((arg), double)) \ + _curl_easy_getinfo_err_double(); \ + if(_curl_is_slist_info(_curl_info)) \ + if(!_curl_is_arr((arg), struct curl_slist *)) \ + _curl_easy_getinfo_err_curl_slist(); \ + } \ + curl_easy_getinfo(handle, _curl_info, arg); \ +}) + +/* TODO: typechecking for curl_share_setopt() and curl_multi_setopt(), + * for now just make sure that the functions are called with three + * arguments + */ +#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param) +#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param) + + +/* the actual warnings, triggered by calling the _curl_easy_setopt_err* + * functions */ + +/* To define a new warning, use _CURL_WARNING(identifier, "message") */ +#define _CURL_WARNING(id, message) \ + static void __attribute__((__warning__(message))) \ + __attribute__((__unused__)) __attribute__((__noinline__)) \ + id(void) { __asm__(""); } + +_CURL_WARNING(_curl_easy_setopt_err_long, + "curl_easy_setopt expects a long argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_curl_off_t, + "curl_easy_setopt expects a curl_off_t argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_string, + "curl_easy_setopt expects a " + "string ('char *' or char[]) argument for this option" + ) +_CURL_WARNING(_curl_easy_setopt_err_write_callback, + "curl_easy_setopt expects a curl_write_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_read_cb, + "curl_easy_setopt expects a curl_read_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_ioctl_cb, + "curl_easy_setopt expects a curl_ioctl_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_sockopt_cb, + "curl_easy_setopt expects a curl_sockopt_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_opensocket_cb, + "curl_easy_setopt expects a " + "curl_opensocket_callback argument for this option" + ) +_CURL_WARNING(_curl_easy_setopt_err_progress_cb, + "curl_easy_setopt expects a curl_progress_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_debug_cb, + "curl_easy_setopt expects a curl_debug_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_ssl_ctx_cb, + "curl_easy_setopt expects a curl_ssl_ctx_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_conv_cb, + "curl_easy_setopt expects a curl_conv_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_seek_cb, + "curl_easy_setopt expects a curl_seek_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_cb_data, + "curl_easy_setopt expects a " + "private data pointer as argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_error_buffer, + "curl_easy_setopt expects a " + "char buffer of CURL_ERROR_SIZE as argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_FILE, + "curl_easy_setopt expects a 'FILE *' argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_postfields, + "curl_easy_setopt expects a 'void *' or 'char *' argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_curl_httpost, + "curl_easy_setopt expects a 'struct curl_httppost *' " + "argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_curl_slist, + "curl_easy_setopt expects a 'struct curl_slist *' argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_CURLSH, + "curl_easy_setopt expects a CURLSH* argument for this option") + +_CURL_WARNING(_curl_easy_getinfo_err_string, + "curl_easy_getinfo expects a pointer to 'char *' for this info") +_CURL_WARNING(_curl_easy_getinfo_err_long, + "curl_easy_getinfo expects a pointer to long for this info") +_CURL_WARNING(_curl_easy_getinfo_err_double, + "curl_easy_getinfo expects a pointer to double for this info") +_CURL_WARNING(_curl_easy_getinfo_err_curl_slist, + "curl_easy_getinfo expects a pointer to 'struct curl_slist *' for this info") + +/* groups of curl_easy_setops options that take the same type of argument */ + +/* To add a new option to one of the groups, just add + * (option) == CURLOPT_SOMETHING + * to the or-expression. If the option takes a long or curl_off_t, you don't + * have to do anything + */ + +/* evaluates to true if option takes a long argument */ +#define _curl_is_long_option(option) \ + (0 < (option) && (option) < CURLOPTTYPE_OBJECTPOINT) + +#define _curl_is_off_t_option(option) \ + ((option) > CURLOPTTYPE_OFF_T) + +/* evaluates to true if option takes a char* argument */ +#define _curl_is_string_option(option) \ + ((option) == CURLOPT_ABSTRACT_UNIX_SOCKET || \ + (option) == CURLOPT_ACCEPT_ENCODING || \ + (option) == CURLOPT_CAINFO || \ + (option) == CURLOPT_CAPATH || \ + (option) == CURLOPT_COOKIE || \ + (option) == CURLOPT_COOKIEFILE || \ + (option) == CURLOPT_COOKIEJAR || \ + (option) == CURLOPT_COOKIELIST || \ + (option) == CURLOPT_CRLFILE || \ + (option) == CURLOPT_CUSTOMREQUEST || \ + (option) == CURLOPT_DEFAULT_PROTOCOL || \ + (option) == CURLOPT_DNS_INTERFACE || \ + (option) == CURLOPT_DNS_LOCAL_IP4 || \ + (option) == CURLOPT_DNS_LOCAL_IP6 || \ + (option) == CURLOPT_DNS_SERVERS || \ + (option) == CURLOPT_EGDSOCKET || \ + (option) == CURLOPT_FTPPORT || \ + (option) == CURLOPT_FTP_ACCOUNT || \ + (option) == CURLOPT_FTP_ALTERNATIVE_TO_USER || \ + (option) == CURLOPT_INTERFACE || \ + (option) == CURLOPT_ISSUERCERT || \ + (option) == CURLOPT_KEYPASSWD || \ + (option) == CURLOPT_KRBLEVEL || \ + (option) == CURLOPT_LOGIN_OPTIONS || \ + (option) == CURLOPT_MAIL_AUTH || \ + (option) == CURLOPT_MAIL_FROM || \ + (option) == CURLOPT_NETRC_FILE || \ + (option) == CURLOPT_NOPROXY || \ + (option) == CURLOPT_PASSWORD || \ + (option) == CURLOPT_PINNEDPUBLICKEY || \ + (option) == CURLOPT_PROXY || \ + (option) == CURLOPT_PROXYPASSWORD || \ + (option) == CURLOPT_PROXYUSERNAME || \ + (option) == CURLOPT_PROXYUSERPWD || \ + (option) == CURLOPT_PROXY_SERVICE_NAME || \ + (option) == CURLOPT_RANDOM_FILE || \ + (option) == CURLOPT_RANGE || \ + (option) == CURLOPT_REFERER || \ + (option) == CURLOPT_RTSP_SESSION_ID || \ + (option) == CURLOPT_RTSP_STREAM_URI || \ + (option) == CURLOPT_RTSP_TRANSPORT || \ + (option) == CURLOPT_SERVICE_NAME || \ + (option) == CURLOPT_SOCKS5_GSSAPI_SERVICE || \ + (option) == CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 || \ + (option) == CURLOPT_SSH_KNOWNHOSTS || \ + (option) == CURLOPT_SSH_PRIVATE_KEYFILE || \ + (option) == CURLOPT_SSH_PUBLIC_KEYFILE || \ + (option) == CURLOPT_SSLCERT || \ + (option) == CURLOPT_SSLCERTTYPE || \ + (option) == CURLOPT_SSLENGINE || \ + (option) == CURLOPT_SSLKEY || \ + (option) == CURLOPT_SSLKEYTYPE || \ + (option) == CURLOPT_SSL_CIPHER_LIST || \ + (option) == CURLOPT_TLSAUTH_PASSWORD || \ + (option) == CURLOPT_TLSAUTH_TYPE || \ + (option) == CURLOPT_TLSAUTH_USERNAME || \ + (option) == CURLOPT_UNIX_SOCKET_PATH || \ + (option) == CURLOPT_URL || \ + (option) == CURLOPT_USERAGENT || \ + (option) == CURLOPT_USERNAME || \ + (option) == CURLOPT_USERPWD || \ + (option) == CURLOPT_XOAUTH2_BEARER || \ + 0) + +/* evaluates to true if option takes a curl_write_callback argument */ +#define _curl_is_write_cb_option(option) \ + ((option) == CURLOPT_HEADERFUNCTION || \ + (option) == CURLOPT_WRITEFUNCTION) + +/* evaluates to true if option takes a curl_conv_callback argument */ +#define _curl_is_conv_cb_option(option) \ + ((option) == CURLOPT_CONV_TO_NETWORK_FUNCTION || \ + (option) == CURLOPT_CONV_FROM_NETWORK_FUNCTION || \ + (option) == CURLOPT_CONV_FROM_UTF8_FUNCTION) + +/* evaluates to true if option takes a data argument to pass to a callback */ +#define _curl_is_cb_data_option(option) \ + ((option) == CURLOPT_CHUNK_DATA || \ + (option) == CURLOPT_CLOSESOCKETDATA || \ + (option) == CURLOPT_DEBUGDATA || \ + (option) == CURLOPT_FNMATCH_DATA || \ + (option) == CURLOPT_HEADERDATA || \ + (option) == CURLOPT_INTERLEAVEDATA || \ + (option) == CURLOPT_IOCTLDATA || \ + (option) == CURLOPT_OPENSOCKETDATA || \ + (option) == CURLOPT_PRIVATE || \ + (option) == CURLOPT_PROGRESSDATA || \ + (option) == CURLOPT_READDATA || \ + (option) == CURLOPT_SEEKDATA || \ + (option) == CURLOPT_SOCKOPTDATA || \ + (option) == CURLOPT_SSH_KEYDATA || \ + (option) == CURLOPT_SSL_CTX_DATA || \ + (option) == CURLOPT_WRITEDATA || \ + 0) + +/* evaluates to true if option takes a POST data argument (void* or char*) */ +#define _curl_is_postfields_option(option) \ + ((option) == CURLOPT_POSTFIELDS || \ + (option) == CURLOPT_COPYPOSTFIELDS || \ + 0) + +/* evaluates to true if option takes a struct curl_slist * argument */ +#define _curl_is_slist_option(option) \ + ((option) == CURLOPT_HTTP200ALIASES || \ + (option) == CURLOPT_HTTPHEADER || \ + (option) == CURLOPT_MAIL_RCPT || \ + (option) == CURLOPT_POSTQUOTE || \ + (option) == CURLOPT_PREQUOTE || \ + (option) == CURLOPT_PROXYHEADER || \ + (option) == CURLOPT_QUOTE || \ + (option) == CURLOPT_RESOLVE || \ + (option) == CURLOPT_TELNETOPTIONS || \ + 0) + +/* groups of curl_easy_getinfo infos that take the same type of argument */ + +/* evaluates to true if info expects a pointer to char * argument */ +#define _curl_is_string_info(info) \ + (CURLINFO_STRING < (info) && (info) < CURLINFO_LONG) + +/* evaluates to true if info expects a pointer to long argument */ +#define _curl_is_long_info(info) \ + (CURLINFO_LONG < (info) && (info) < CURLINFO_DOUBLE) + +/* evaluates to true if info expects a pointer to double argument */ +#define _curl_is_double_info(info) \ + (CURLINFO_DOUBLE < (info) && (info) < CURLINFO_SLIST) + +/* true if info expects a pointer to struct curl_slist * argument */ +#define _curl_is_slist_info(info) \ + (CURLINFO_SLIST < (info)) + + +/* typecheck helpers -- check whether given expression has requested type*/ + +/* For pointers, you can use the _curl_is_ptr/_curl_is_arr macros, + * otherwise define a new macro. Search for __builtin_types_compatible_p + * in the GCC manual. + * NOTE: these macros MUST NOT EVALUATE their arguments! The argument is + * the actual expression passed to the curl_easy_setopt macro. This + * means that you can only apply the sizeof and __typeof__ operators, no + * == or whatsoever. + */ + +/* XXX: should evaluate to true iff expr is a pointer */ +#define _curl_is_any_ptr(expr) \ + (sizeof(expr) == sizeof(void *)) + +/* evaluates to true if expr is NULL */ +/* XXX: must not evaluate expr, so this check is not accurate */ +#define _curl_is_NULL(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), __typeof__(NULL))) + +/* evaluates to true if expr is type*, const type* or NULL */ +#define _curl_is_ptr(expr, type) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), type *) || \ + __builtin_types_compatible_p(__typeof__(expr), const type *)) + +/* evaluates to true if expr is one of type[], type*, NULL or const type* */ +#define _curl_is_arr(expr, type) \ + (_curl_is_ptr((expr), type) || \ + __builtin_types_compatible_p(__typeof__(expr), type [])) + +/* evaluates to true if expr is a string */ +#define _curl_is_string(expr) \ + (_curl_is_arr((expr), char) || \ + _curl_is_arr((expr), signed char) || \ + _curl_is_arr((expr), unsigned char)) + +/* evaluates to true if expr is a long (no matter the signedness) + * XXX: for now, int is also accepted (and therefore short and char, which + * are promoted to int when passed to a variadic function) */ +#define _curl_is_long(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), long) || \ + __builtin_types_compatible_p(__typeof__(expr), signed long) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned long) || \ + __builtin_types_compatible_p(__typeof__(expr), int) || \ + __builtin_types_compatible_p(__typeof__(expr), signed int) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned int) || \ + __builtin_types_compatible_p(__typeof__(expr), short) || \ + __builtin_types_compatible_p(__typeof__(expr), signed short) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned short) || \ + __builtin_types_compatible_p(__typeof__(expr), char) || \ + __builtin_types_compatible_p(__typeof__(expr), signed char) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned char)) + +/* evaluates to true if expr is of type curl_off_t */ +#define _curl_is_off_t(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), curl_off_t)) + +/* evaluates to true if expr is abuffer suitable for CURLOPT_ERRORBUFFER */ +/* XXX: also check size of an char[] array? */ +#define _curl_is_error_buffer(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), char *) || \ + __builtin_types_compatible_p(__typeof__(expr), char[])) + +/* evaluates to true if expr is of type (const) void* or (const) FILE* */ +#if 0 +#define _curl_is_cb_data(expr) \ + (_curl_is_ptr((expr), void) || \ + _curl_is_ptr((expr), FILE)) +#else /* be less strict */ +#define _curl_is_cb_data(expr) \ + _curl_is_any_ptr(expr) +#endif + +/* evaluates to true if expr is of type FILE* */ +#define _curl_is_FILE(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), FILE *)) + +/* evaluates to true if expr can be passed as POST data (void* or char*) */ +#define _curl_is_postfields(expr) \ + (_curl_is_ptr((expr), void) || \ + _curl_is_arr((expr), char)) + +/* FIXME: the whole callback checking is messy... + * The idea is to tolerate char vs. void and const vs. not const + * pointers in arguments at least + */ +/* helper: __builtin_types_compatible_p distinguishes between functions and + * function pointers, hide it */ +#define _curl_callback_compatible(func, type) \ + (__builtin_types_compatible_p(__typeof__(func), type) || \ + __builtin_types_compatible_p(__typeof__(func), type*)) + +/* evaluates to true if expr is of type curl_read_callback or "similar" */ +#define _curl_is_read_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), __typeof__(fread)) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_read_callback) || \ + _curl_callback_compatible((expr), _curl_read_callback1) || \ + _curl_callback_compatible((expr), _curl_read_callback2) || \ + _curl_callback_compatible((expr), _curl_read_callback3) || \ + _curl_callback_compatible((expr), _curl_read_callback4) || \ + _curl_callback_compatible((expr), _curl_read_callback5) || \ + _curl_callback_compatible((expr), _curl_read_callback6)) +typedef size_t (_curl_read_callback1)(char *, size_t, size_t, void *); +typedef size_t (_curl_read_callback2)(char *, size_t, size_t, const void *); +typedef size_t (_curl_read_callback3)(char *, size_t, size_t, FILE *); +typedef size_t (_curl_read_callback4)(void *, size_t, size_t, void *); +typedef size_t (_curl_read_callback5)(void *, size_t, size_t, const void *); +typedef size_t (_curl_read_callback6)(void *, size_t, size_t, FILE *); + +/* evaluates to true if expr is of type curl_write_callback or "similar" */ +#define _curl_is_write_cb(expr) \ + (_curl_is_read_cb(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), __typeof__(fwrite)) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_write_callback) || \ + _curl_callback_compatible((expr), _curl_write_callback1) || \ + _curl_callback_compatible((expr), _curl_write_callback2) || \ + _curl_callback_compatible((expr), _curl_write_callback3) || \ + _curl_callback_compatible((expr), _curl_write_callback4) || \ + _curl_callback_compatible((expr), _curl_write_callback5) || \ + _curl_callback_compatible((expr), _curl_write_callback6)) +typedef size_t (_curl_write_callback1)(const char *, size_t, size_t, void *); +typedef size_t (_curl_write_callback2)(const char *, size_t, size_t, + const void *); +typedef size_t (_curl_write_callback3)(const char *, size_t, size_t, FILE *); +typedef size_t (_curl_write_callback4)(const void *, size_t, size_t, void *); +typedef size_t (_curl_write_callback5)(const void *, size_t, size_t, + const void *); +typedef size_t (_curl_write_callback6)(const void *, size_t, size_t, FILE *); + +/* evaluates to true if expr is of type curl_ioctl_callback or "similar" */ +#define _curl_is_ioctl_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_ioctl_callback) || \ + _curl_callback_compatible((expr), _curl_ioctl_callback1) || \ + _curl_callback_compatible((expr), _curl_ioctl_callback2) || \ + _curl_callback_compatible((expr), _curl_ioctl_callback3) || \ + _curl_callback_compatible((expr), _curl_ioctl_callback4)) +typedef curlioerr (_curl_ioctl_callback1)(CURL *, int, void *); +typedef curlioerr (_curl_ioctl_callback2)(CURL *, int, const void *); +typedef curlioerr (_curl_ioctl_callback3)(CURL *, curliocmd, void *); +typedef curlioerr (_curl_ioctl_callback4)(CURL *, curliocmd, const void *); + +/* evaluates to true if expr is of type curl_sockopt_callback or "similar" */ +#define _curl_is_sockopt_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_sockopt_callback) || \ + _curl_callback_compatible((expr), _curl_sockopt_callback1) || \ + _curl_callback_compatible((expr), _curl_sockopt_callback2)) +typedef int (_curl_sockopt_callback1)(void *, curl_socket_t, curlsocktype); +typedef int (_curl_sockopt_callback2)(const void *, curl_socket_t, + curlsocktype); + +/* evaluates to true if expr is of type curl_opensocket_callback or + "similar" */ +#define _curl_is_opensocket_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_opensocket_callback) ||\ + _curl_callback_compatible((expr), _curl_opensocket_callback1) || \ + _curl_callback_compatible((expr), _curl_opensocket_callback2) || \ + _curl_callback_compatible((expr), _curl_opensocket_callback3) || \ + _curl_callback_compatible((expr), _curl_opensocket_callback4)) +typedef curl_socket_t (_curl_opensocket_callback1) + (void *, curlsocktype, struct curl_sockaddr *); +typedef curl_socket_t (_curl_opensocket_callback2) + (void *, curlsocktype, const struct curl_sockaddr *); +typedef curl_socket_t (_curl_opensocket_callback3) + (const void *, curlsocktype, struct curl_sockaddr *); +typedef curl_socket_t (_curl_opensocket_callback4) + (const void *, curlsocktype, const struct curl_sockaddr *); + +/* evaluates to true if expr is of type curl_progress_callback or "similar" */ +#define _curl_is_progress_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_progress_callback) || \ + _curl_callback_compatible((expr), _curl_progress_callback1) || \ + _curl_callback_compatible((expr), _curl_progress_callback2)) +typedef int (_curl_progress_callback1)(void *, + double, double, double, double); +typedef int (_curl_progress_callback2)(const void *, + double, double, double, double); + +/* evaluates to true if expr is of type curl_debug_callback or "similar" */ +#define _curl_is_debug_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_debug_callback) || \ + _curl_callback_compatible((expr), _curl_debug_callback1) || \ + _curl_callback_compatible((expr), _curl_debug_callback2) || \ + _curl_callback_compatible((expr), _curl_debug_callback3) || \ + _curl_callback_compatible((expr), _curl_debug_callback4) || \ + _curl_callback_compatible((expr), _curl_debug_callback5) || \ + _curl_callback_compatible((expr), _curl_debug_callback6) || \ + _curl_callback_compatible((expr), _curl_debug_callback7) || \ + _curl_callback_compatible((expr), _curl_debug_callback8)) +typedef int (_curl_debug_callback1) (CURL *, + curl_infotype, char *, size_t, void *); +typedef int (_curl_debug_callback2) (CURL *, + curl_infotype, char *, size_t, const void *); +typedef int (_curl_debug_callback3) (CURL *, + curl_infotype, const char *, size_t, void *); +typedef int (_curl_debug_callback4) (CURL *, + curl_infotype, const char *, size_t, const void *); +typedef int (_curl_debug_callback5) (CURL *, + curl_infotype, unsigned char *, size_t, void *); +typedef int (_curl_debug_callback6) (CURL *, + curl_infotype, unsigned char *, size_t, const void *); +typedef int (_curl_debug_callback7) (CURL *, + curl_infotype, const unsigned char *, size_t, void *); +typedef int (_curl_debug_callback8) (CURL *, + curl_infotype, const unsigned char *, size_t, const void *); + +/* evaluates to true if expr is of type curl_ssl_ctx_callback or "similar" */ +/* this is getting even messier... */ +#define _curl_is_ssl_ctx_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_ssl_ctx_callback) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback1) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback2) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback3) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback4) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback5) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback6) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback7) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback8)) +typedef CURLcode (_curl_ssl_ctx_callback1)(CURL *, void *, void *); +typedef CURLcode (_curl_ssl_ctx_callback2)(CURL *, void *, const void *); +typedef CURLcode (_curl_ssl_ctx_callback3)(CURL *, const void *, void *); +typedef CURLcode (_curl_ssl_ctx_callback4)(CURL *, const void *, const void *); +#ifdef HEADER_SSL_H +/* hack: if we included OpenSSL's ssl.h, we know about SSL_CTX + * this will of course break if we're included before OpenSSL headers... + */ +typedef CURLcode (_curl_ssl_ctx_callback5)(CURL *, SSL_CTX, void *); +typedef CURLcode (_curl_ssl_ctx_callback6)(CURL *, SSL_CTX, const void *); +typedef CURLcode (_curl_ssl_ctx_callback7)(CURL *, const SSL_CTX, void *); +typedef CURLcode (_curl_ssl_ctx_callback8)(CURL *, const SSL_CTX, + const void *); +#else +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback5; +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback6; +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback7; +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback8; +#endif + +/* evaluates to true if expr is of type curl_conv_callback or "similar" */ +#define _curl_is_conv_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_conv_callback) || \ + _curl_callback_compatible((expr), _curl_conv_callback1) || \ + _curl_callback_compatible((expr), _curl_conv_callback2) || \ + _curl_callback_compatible((expr), _curl_conv_callback3) || \ + _curl_callback_compatible((expr), _curl_conv_callback4)) +typedef CURLcode (*_curl_conv_callback1)(char *, size_t length); +typedef CURLcode (*_curl_conv_callback2)(const char *, size_t length); +typedef CURLcode (*_curl_conv_callback3)(void *, size_t length); +typedef CURLcode (*_curl_conv_callback4)(const void *, size_t length); + +/* evaluates to true if expr is of type curl_seek_callback or "similar" */ +#define _curl_is_seek_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_seek_callback) || \ + _curl_callback_compatible((expr), _curl_seek_callback1) || \ + _curl_callback_compatible((expr), _curl_seek_callback2)) +typedef CURLcode (*_curl_seek_callback1)(void *, curl_off_t, int); +typedef CURLcode (*_curl_seek_callback2)(const void *, curl_off_t, int); + + +#endif /* __CURL_TYPECHECK_GCC_H */ From 630415d0a01877efc6a26d309b190a875f56ad43 Mon Sep 17 00:00:00 2001 From: fadedreamz Date: Wed, 15 Mar 2017 04:53:18 -0500 Subject: [PATCH 479/495] fixed an issue with fixed path location for include and library path in makefile Signed-off-by: fadedreamz --- iguana.vcxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana.vcxproj b/iguana.vcxproj index 16d1eced8..32dc556d7 100644 --- a/iguana.vcxproj +++ b/iguana.vcxproj @@ -81,8 +81,8 @@ false - C:\Users\faded_000\Desktop\needupdate\includes;$(IncludePath) - C:\Users\faded_000\Desktop\needupdate\OSlibs\win;$(LibraryPath) + $(ProjectDir)\includes;$(IncludePath) + $(ProjectDir)\OSlibs\win;$(LibraryPath) false From 0c479bce28499d7f89bef9a50957c061d1153033 Mon Sep 17 00:00:00 2001 From: fadedreamz Date: Wed, 15 Mar 2017 05:10:40 -0500 Subject: [PATCH 480/495] added libcurl, openssl dll for x86, updated makefile and headerfiles Signed-off-by: fadedreamz --- iguana.vcxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana.vcxproj b/iguana.vcxproj index 32dc556d7..ab0c9975d 100644 --- a/iguana.vcxproj +++ b/iguana.vcxproj @@ -73,16 +73,16 @@ true - $(ProjectDir)\includes;$(IncludePath) - $(ProjectDir)\OSlibs\win;$(LibraryPath) + .\includes;$(IncludePath) + .\OSlibs\win;$(LibraryPath) true false - $(ProjectDir)\includes;$(IncludePath) - $(ProjectDir)\OSlibs\win;$(LibraryPath) + .\includes;$(IncludePath) + .\OSlibs\win;$(LibraryPath) false From 667ea67a506667d759a0be758c3ea02b7e753263 Mon Sep 17 00:00:00 2001 From: fadedreamz Date: Wed, 15 Mar 2017 05:15:03 -0500 Subject: [PATCH 481/495] updated makefile for msvs Signed-off-by: fadedreamz --- iguana.vcxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana.vcxproj b/iguana.vcxproj index ab0c9975d..5a0050e59 100644 --- a/iguana.vcxproj +++ b/iguana.vcxproj @@ -73,16 +73,16 @@ true - .\includes;$(IncludePath) - .\OSlibs\win;$(LibraryPath) + $(ProjectDir)\includes;$(ProjectDir)\includes\curl;$(IncludePath) + $(ProjectDir)\OSlibs\win;$(LibraryPath) true false - .\includes;$(IncludePath) - .\OSlibs\win;$(LibraryPath) + $(ProjectDir)\includes;$(ProjectDir)\includes\curl;$(IncludePath) + $(ProjectDir)\OSlibs\win;$(LibraryPath) false From 5d0170cfd4cd9b56e428d3ff64e4821ba7728a14 Mon Sep 17 00:00:00 2001 From: fadedreamz Date: Wed, 15 Mar 2017 05:18:28 -0500 Subject: [PATCH 482/495] added missing header file due to gitignore Signed-off-by: fadedreamz --- includes/curl/curlbuild.h | 586 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 586 insertions(+) create mode 100644 includes/curl/curlbuild.h diff --git a/includes/curl/curlbuild.h b/includes/curl/curlbuild.h new file mode 100644 index 000000000..ae95095fa --- /dev/null +++ b/includes/curl/curlbuild.h @@ -0,0 +1,586 @@ +#ifndef __CURL_CURLBUILD_H +#define __CURL_CURLBUILD_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* ================================================================ */ +/* NOTES FOR CONFIGURE CAPABLE SYSTEMS */ +/* ================================================================ */ + +/* + * NOTE 1: + * ------- + * + * See file include/curl/curlbuild.h.in, run configure, and forget + * that this file exists it is only used for non-configure systems. + * But you can keep reading if you want ;-) + * + */ + +/* ================================================================ */ +/* NOTES FOR NON-CONFIGURE SYSTEMS */ +/* ================================================================ */ + +/* + * NOTE 1: + * ------- + * + * Nothing in this file is intended to be modified or adjusted by the + * curl library user nor by the curl library builder. + * + * If you think that something actually needs to be changed, adjusted + * or fixed in this file, then, report it on the libcurl development + * mailing list: https://cool.haxx.se/mailman/listinfo/curl-library/ + * + * Try to keep one section per platform, compiler and architecture, + * otherwise, if an existing section is reused for a different one and + * later on the original is adjusted, probably the piggybacking one can + * be adversely changed. + * + * In order to differentiate between platforms/compilers/architectures + * use only compiler built in predefined preprocessor symbols. + * + * This header file shall only export symbols which are 'curl' or 'CURL' + * prefixed, otherwise public name space would be polluted. + * + * NOTE 2: + * ------- + * + * For any given platform/compiler curl_off_t must be typedef'ed to a + * 64-bit wide signed integral data type. The width of this data type + * must remain constant and independent of any possible large file + * support settings. + * + * As an exception to the above, curl_off_t shall be typedef'ed to a + * 32-bit wide signed integral data type if there is no 64-bit type. + * + * As a general rule, curl_off_t shall not be mapped to off_t. This + * rule shall only be violated if off_t is the only 64-bit data type + * available and the size of off_t is independent of large file support + * settings. Keep your build on the safe side avoiding an off_t gating. + * If you have a 64-bit off_t then take for sure that another 64-bit + * data type exists, dig deeper and you will find it. + * + * NOTE 3: + * ------- + * + * Right now you might be staring at file include/curl/curlbuild.h.dist or + * at file include/curl/curlbuild.h, this is due to the following reason: + * file include/curl/curlbuild.h.dist is renamed to include/curl/curlbuild.h + * when the libcurl source code distribution archive file is created. + * + * File include/curl/curlbuild.h.dist is not included in the distribution + * archive. File include/curl/curlbuild.h is not present in the git tree. + * + * The distributed include/curl/curlbuild.h file is only intended to be used + * on systems which can not run the also distributed configure script. + * + * On systems capable of running the configure script, the configure process + * will overwrite the distributed include/curl/curlbuild.h file with one that + * is suitable and specific to the library being configured and built, which + * is generated from the include/curl/curlbuild.h.in template file. + * + * If you check out from git on a non-configure platform, you must run the + * appropriate buildconf* script to set up curlbuild.h and other local files. + * + */ + +/* ================================================================ */ +/* DEFINITION OF THESE SYMBOLS SHALL NOT TAKE PLACE ANYWHERE ELSE */ +/* ================================================================ */ + +#ifdef CURL_SIZEOF_LONG +# error "CURL_SIZEOF_LONG shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_LONG_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_SOCKLEN_T +# error "CURL_TYPEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_SOCKLEN_T +# error "CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_OFF_T +# error "CURL_TYPEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_T +# error "CURL_FORMAT_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_TU +# error "CURL_FORMAT_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_already_defined +#endif + +#ifdef CURL_FORMAT_OFF_T +# error "CURL_FORMAT_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_OFF_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_OFF_T +# error "CURL_SIZEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_T +# error "CURL_SUFFIX_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_TU +# error "CURL_SUFFIX_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_already_defined +#endif + +/* ================================================================ */ +/* EXTERNAL INTERFACE SETTINGS FOR NON-CONFIGURE SYSTEMS ONLY */ +/* ================================================================ */ + +#if defined(__DJGPP__) || defined(__GO32__) +# if defined(__DJGPP__) && (__DJGPP__ > 1) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__SALFORDC__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__BORLANDC__) +# if (__BORLANDC__ < 0x520) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__TURBOC__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__WATCOMC__) +# if defined(__386__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__POCC__) +# if (__POCC__ < 280) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# elif defined(_MSC_VER) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__LCC__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__SYMBIAN32__) +# if defined(__EABI__) /* Treat all ARM compilers equally */ +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(__CW32__) +# pragma longlong on +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(__VC32__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__MWERKS__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(_WIN32_WCE) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__MINGW32__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__VMS) +# if defined(__VAX) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__OS400__) +# if defined(__ILEC400__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 +# endif + +#elif defined(__MVS__) +# if defined(__IBMC__) || defined(__IBMCPP__) +# if defined(_ILP32) +# define CURL_SIZEOF_LONG 4 +# elif defined(_LP64) +# define CURL_SIZEOF_LONG 8 +# endif +# if defined(_LONG_LONG) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(_LP64) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 +# endif + +#elif defined(__370__) +# if defined(__IBMC__) || defined(__IBMCPP__) +# if defined(_ILP32) +# define CURL_SIZEOF_LONG 4 +# elif defined(_LP64) +# define CURL_SIZEOF_LONG 8 +# endif +# if defined(_LONG_LONG) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(_LP64) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 +# endif + +#elif defined(TPF) +# define CURL_SIZEOF_LONG 8 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +/* ===================================== */ +/* KEEP MSVC THE PENULTIMATE ENTRY */ +/* ===================================== */ + +#elif defined(_MSC_VER) +# if (_MSC_VER >= 900) && (_INTEGRAL_MAX_BITS >= 64) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +/* ===================================== */ +/* KEEP GENERIC GCC THE LAST ENTRY */ +/* ===================================== */ + +#elif defined(__GNUC__) +# if !defined(__LP64__) && (defined(__ILP32__) || \ + defined(__i386__) || defined(__ppc__) || defined(__arm__) || \ + defined(__sparc__) || defined(__mips__) || defined(__sh__)) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(__LP64__) || \ + defined(__x86_64__) || defined(__ppc64__) || defined(__sparc64__) +# define CURL_SIZEOF_LONG 8 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 + +#else +# error "Unknown non-configure build target!" + Error Compilation_aborted_Unknown_non_configure_build_target +#endif + +/* CURL_PULL_SYS_TYPES_H is defined above when inclusion of header file */ +/* sys/types.h is required here to properly make type definitions below. */ +#ifdef CURL_PULL_SYS_TYPES_H +# include +#endif + +/* CURL_PULL_SYS_SOCKET_H is defined above when inclusion of header file */ +/* sys/socket.h is required here to properly make type definitions below. */ +#ifdef CURL_PULL_SYS_SOCKET_H +# include +#endif + +/* Data type definition of curl_socklen_t. */ + +#ifdef CURL_TYPEOF_CURL_SOCKLEN_T + typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t; +#endif + +/* Data type definition of curl_off_t. */ + +#ifdef CURL_TYPEOF_CURL_OFF_T + typedef CURL_TYPEOF_CURL_OFF_T curl_off_t; +#endif + +#endif /* __CURL_CURLBUILD_H */ From dddccd26fd6dcef53b5cb344e30b1e9f70a11be9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Mar 2017 14:50:51 +0200 Subject: [PATCH 483/495] Support null username in path creation --- basilisk/basilisk_MSG.c | 2 +- iguana/iguana_chains.c | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index 6619c4db0..0fba54c91 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -98,7 +98,7 @@ char *basilisk_iterate_MSG(struct supernet_info *myinfo,uint32_t channel,uint32_ // char str[65],str2[65]; printf("MSGiterate (%s) -> (%s)\n",bits256_str(str,srchash),bits256_str(str2,desthash)); array = cJSON_CreateArray(); portable_mutex_lock(&myinfo->messagemutex); - printf("iterate_MSG width.%d channel.%d msgid.%d src.%llx -> %llx\n",origwidth,channel,msgid,(long long)srchash.txid,(long long)desthash.txid); + //printf("iterate_MSG width.%d channel.%d msgid.%d src.%llx -> %llx\n",origwidth,channel,msgid,(long long)srchash.txid,(long long)desthash.txid); for (i=0; i Date: Wed, 15 Mar 2017 17:29:54 +0200 Subject: [PATCH 484/495] Make windows specific path --- iguana/iguana_chains.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/iguana/iguana_chains.c b/iguana/iguana_chains.c index 7b610fbea..4fc5a0b76 100755 --- a/iguana/iguana_chains.c +++ b/iguana/iguana_chains.c @@ -232,9 +232,12 @@ void set_coinconfname(char *fname,char *coinstr,char *userhome,char *coindir,cha sprintf(confname,"%s.conf",buf); } printf("userhome.(%s) coindir.(%s) confname.(%s)\n",userhome,coindir,confname); - if ( userhome != 0 && userhome[0] != 0 ) +#ifdef WIN32 + if ( userhome == 0 || userhome[0] == 0 ) + sprintf(fname,"%s/%s",coindir,confname); + else +#endif sprintf(fname,"%s/%s/%s",userhome,coindir,confname); - else sprintf(fname,"%s/%s",coindir,confname); } uint16_t extract_userpass(char *serverport,char *userpass,char *coinstr,char *userhome,char *coindir,char *confname) From 4fbdb279cb7c9488d722b9247a167a95a7714f6f Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Mar 2017 19:05:14 +0200 Subject: [PATCH 485/495] Test --- .gitignore | 2 ++ iguana/tests/crash | 6 ++++++ iguana/tests/test | 3 --- 3 files changed, 8 insertions(+), 3 deletions(-) create mode 100755 iguana/tests/crash delete mode 100755 iguana/tests/test diff --git a/.gitignore b/.gitignore index 593be70c7..f3176906f 100755 --- a/.gitignore +++ b/.gitignore @@ -208,3 +208,5 @@ iguana/DB/SWAPS/467927158-3437055573 iguana/DB/SWAPS/270159951-1269722638 iguana/DB/SWAPS/244991424-1008712592 + +iguana/confs/1cc0270abba7f4463a3dcb9908b9d875691a6773fe3cc1b4302233ed76665300 diff --git a/iguana/tests/crash b/iguana/tests/crash new file mode 100755 index 000000000..82a39bd5d --- /dev/null +++ b/iguana/tests/crash @@ -0,0 +1,6 @@ +coins/basilisk/kmd + +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"walletpassphrase\",\"password\":\"amount common obey erupt ensure salon shrug digital phone vacant provide word nurse legend shaft ritual strike black fiscal circle dove tone inmate plunge\",\"timeout\":864445678904}" + +curl --url "http://127.0.0.1:7778" --data "{\"symbol\":\"KMD\",\"agent\":\"basilisk\",\"method\":\"utxorawtx\",\"vals\":{\"timelock\":0,\"changeaddr\":\"RD5Sj6igy53nscMiFS4ECXByfqVeyV9NdG\",\"destaddr\":\"RD5Sj6igy53nscMiFS4ECXByfqVeyV9NdG\",\"txfee\":0,\"amount\":0.0001,\"sendflag\":0},\"utxos\":[{\"bestblock\":\"0000119186ecfaa8d72a7d3c62e78135043db220a6d29a9605f1fbe383bcedfb\",\"confirmations\":65549,\"value\":0.04900000,\"scriptPubKey\":{\"asm\":\"OP_DUP OP_HASH160 29a7bd36e6913b674bb2b5c65e61a6544426ddd7 OP_EQUALVERIFY OP_CHECKSIG\",\"hex\":\"76a91429a7bd36e6913b674bb2b5c65e61a6544426ddd788ac\",\"reqSigs\":1,\"type\":\"pubkeyhash\",\"addresses\":[\"RD5Sj6igy53nscMiFS4ECXByfqVeyV9NdG\"]},\"version\":1,\"coinbase\":false,\"randipbits\":579036043,\"coin\":\"KMD\",\"txid\":\"b32af9977bc8ed0e54631d27f490c79841a03bccce4d6b8181456657b06194ef\",\"vout\":0,\"amount\":0.04900000}, {\"bestblock\":\"0000119186ecfaa8d72a7d3c62e78135043db220a6d29a9605f1fbe383bcedfb\",\"confirmations\":65553,\"value\":1,\"scriptPubKey\":{\"asm\":\"OP_DUP OP_HASH160 29a7bd36e6913b674bb2b5c65e61a6544426ddd7 OP_EQUALVERIFY OP_CHECKSIG\",\"hex\":\"76a91429a7bd36e6913b674bb2b5c65e61a6544426ddd788ac\",\"reqSigs\":1,\"type\":\"pubkeyhash\",\"addresses\":[\"RD5Sj6igy53nscMiFS4ECXByfqVeyV9NdG\"]},\"version\":1,\"coinbase\":false,\"randipbits\":3795805790,\"coin\":\"KMD\",\"txid\":\"84ca2ba7f621c820ab642e358813fcc33171c9999a47bb99dcf3a309dc847419\",\"vout\":1,\"amount\":1}]}" + diff --git a/iguana/tests/test b/iguana/tests/test deleted file mode 100755 index 495928084..000000000 --- a/iguana/tests/test +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -echo "{\"field\":\"requiredvalue\"}" > /tmp/foo -./jsoncmp /tmp/foo {\"fields\":[{\"field\":\"requiredvalue\"}]} From 7c7da1cf897c4084021ff18f76dd70e41c39bc8b Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Mar 2017 19:06:10 +0200 Subject: [PATCH 486/495] test --- iguana/tests/crash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/tests/crash b/iguana/tests/crash index 82a39bd5d..33cf53106 100755 --- a/iguana/tests/crash +++ b/iguana/tests/crash @@ -1,4 +1,4 @@ -coins/basilisk/kmd +../coins/basilisk/kmd curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"walletpassphrase\",\"password\":\"amount common obey erupt ensure salon shrug digital phone vacant provide word nurse legend shaft ritual strike black fiscal circle dove tone inmate plunge\",\"timeout\":864445678904}" From 779732a8bae55cfe066c1e72ad4e84c98dfb2e16 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Mar 2017 20:46:02 +0200 Subject: [PATCH 487/495] support wifstr that encode to less than 38 bytes --- iguana/exchanges/bitcoin.c | 18 +++++++++++++++--- iguana/iguana_sign.c | 2 +- iguana/mini-gmp.c | 2 +- iguana/tests/KMD.batch13 | 1 + iguana/tests/crash | 1 + 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/bitcoin.c b/iguana/exchanges/bitcoin.c index bf37462f0..a40524d11 100755 --- a/iguana/exchanges/bitcoin.c +++ b/iguana/exchanges/bitcoin.c @@ -107,18 +107,30 @@ int32_t base58encode_checkbuf(uint8_t addrtype,uint8_t *data,int32_t data_len) int32_t bitcoin_wif2priv(uint8_t *addrtypep,bits256 *privkeyp,char *wifstr) { - int32_t len = -1; bits256 hash; uint8_t buf[64]; + int32_t len = -1; bits256 hash; uint8_t buf[256]; + memset(buf,0,sizeof(buf)); if ( (len= bitcoin_base58decode(buf,wifstr)) >= 4 ) { // validate with trailing hash, then remove hash + if ( len < 38 ) + len = 38; hash = bits256_doublesha256(0,buf,len - 4); *addrtypep = *buf; memcpy(privkeyp,buf+1,32); - if ( (buf[len - 4]&0xff) == hash.bytes[31] && (buf[len - 3]&0xff) == hash.bytes[30] &&(buf[len - 2]&0xff) == hash.bytes[29] &&(buf[len - 1]&0xff) == hash.bytes[28] ) + if ( (buf[len - 4]&0xff) == hash.bytes[31] && (buf[len - 3]&0xff) == hash.bytes[30] &&(buf[len - 2]&0xff) == hash.bytes[29] && (buf[len - 1]&0xff) == hash.bytes[28] ) { - //printf("coinaddr.(%s) valid checksum\n",coinaddr); + //int32_t i; for (i=0; isuppress_pubkeys)) != 0 ) { //printf("back from bitcoin_hex2json (%s)\n",jprint(vins,0)); diff --git a/iguana/mini-gmp.c b/iguana/mini-gmp.c index ef9e235df..c2c975f12 100644 --- a/iguana/mini-gmp.c +++ b/iguana/mini-gmp.c @@ -4394,7 +4394,7 @@ int32_t bitcoin_base58decode(uint8_t *data,char *coinaddr) //memset(data,0,be_sz); //for (i=0; i Date: Thu, 16 Mar 2017 20:06:18 +0200 Subject: [PATCH 488/495] 300000 planned upgrade Fix interest granularity for long term utxo. 1/10 of a year to 1/9 has same interest result. Change to new calculation of minutes / 3652460 directly instead of via intermediate denominator to eliminate integer clipping Will activate at 300000 planned upgrade, so not urgent to update --- iguana/iguana_payments.c | 10 ++++++++-- iguana/tests/dexgetT | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 0517b94a3..cdb27e36c 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -346,18 +346,24 @@ uint64_t _iguana_interest(uint32_t now,int32_t chainheight,uint32_t txlocktime,u int32_t minutes; uint64_t numerator=0,denominator=0,interest = 0; if ( (minutes= ((uint32_t)time(NULL) - 60 - txlocktime) / 60) >= 60 ) { + if ( minutes > 365 * 24 * 60 ) + minutes = 365 * 24 * 60; denominator = (((uint64_t)365 * 24 * 60) / minutes); if ( denominator == 0 ) denominator = 1; // max KOMODO_INTEREST per transfer, do it at least annually! if ( value > 25000LL*SATOSHIDEN && chainheight > 155949 ) { numerator = (value / 20); // assumes 5%! - interest = (numerator / denominator); + if ( chainheight < 300000 ) + interest = (numerator / denominator); + else interest = (numerator * minutes) / ((uint64_t)365 * 24 * 60); } else if ( value >= 10*SATOSHIDEN ) { numerator = (value * KOMODO_INTEREST); - interest = (numerator / denominator) / SATOSHIDEN; + if ( chainheight < 300000 || numerator * minutes < 365 * 24 * 60 ) + interest = (numerator / denominator) / SATOSHIDEN; + else interest = ((numerator * minutes) / ((uint64_t)365 * 24 * 60)) / SATOSHIDEN; } //fprintf(stderr,"komodo_interest.%d %lld %.8f nLockTime.%u tiptime.%u minutes.%d interest %lld %.8f (%llu / %llu)\n",chainheight,(long long)value,(double)value/SATOSHIDEN,txlocktime,now,minutes,(long long)interest,(double)interest/SATOSHIDEN,(long long)numerator,(long long)denominator); } diff --git a/iguana/tests/dexgetT b/iguana/tests/dexgetT index 7483dbd01..18241a84d 100755 --- a/iguana/tests/dexgetT +++ b/iguana/tests/dexgetT @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettransaction\",\"txid\":\"3c00ee16d12c6aae81863d1da485cdd6cd2b73847f8ab93de3663adf6c285e3b\",\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettransaction\",\"txid\":\"88794bbb699f130951c40dc99a27d2c7c7016e12824fd1040cbedf86980de04d\",\"symbol\":\"REVS\"}" From 1003e5b0d53627a875c1b14ab20c99a66e023e53 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 17 Mar 2017 02:53:55 +0200 Subject: [PATCH 489/495] Print coin name in vin error --- iguana/kmd_lookup.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index f3abf52d2..0d6e2f2f9 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -117,7 +117,7 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi } return(0); } - char str[65]; printf("vin error %s vout.%d of %d vs ptr %p [%d] spent.%p\n",bits256_str(str,txid),vout,ptr!=0?ptr->numvouts:-1,ptr,ptr!=0?ptr->numvouts:-1,spendptr); + char str[65]; printf("%s.vin error %s vout.%d of %d vs ptr %p [%d] spent.%p\n",coin->symbol,bits256_str(str,txid),vout,ptr!=0?ptr->numvouts:-1,ptr,ptr!=0?ptr->numvouts:-1,spendptr); return(-1); } From fe11ff854ff1a7f410035e433f675a9d94b2ac2d Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 17 Mar 2017 06:20:17 +0200 Subject: [PATCH 490/495] Prevent 'A' qpreturn --- iguana/dpow/dpow_tx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_tx.c b/iguana/dpow/dpow_tx.c index 194285053..fac9033af 100755 --- a/iguana/dpow/dpow_tx.c +++ b/iguana/dpow/dpow_tx.c @@ -224,7 +224,7 @@ int32_t dpow_voutstandard(struct dpow_block *bp,uint8_t *serialized,int32_t m,in } printf("numvouts.%d len.%d RATIFY vouts\n",numvouts,len); } - if ( (src_or_dest == 0 || strcmp(bp->destcoin->symbol,"BTC") != 0) && (n= dpow_paxpending(extras,&paxwdcrc)) > 0 ) + if ( 0 && (src_or_dest == 0 || strcmp(bp->destcoin->symbol,"BTC") != 0) && (n= dpow_paxpending(extras,&paxwdcrc)) > 0 ) { for (i=0; i Date: Fri, 17 Mar 2017 10:51:17 +0200 Subject: [PATCH 491/495] Test --- iguana/dpow/dpow_network.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index cadc11faa..91a0d96a9 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -2138,11 +2138,11 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( (flags & 4) == 0 && (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) > 0 ) { num2++; - //printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); + printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); if ( (retstr= dex_response(&broadcastflag,myinfo,dexp)) != 0 ) { signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,retstr,(int32_t)strlen(retstr)+1); - //printf("send back[%ld]\n",strlen(retstr)+1); + printf("send back[%ld]\n",strlen(retstr)+1); free(retstr); if ( broadcastflag != 0 ) { From 42c4174d9e137231b808f73b29ebe5630eeb8a96 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 17 Mar 2017 15:48:37 +0200 Subject: [PATCH 492/495] Test --- crypto777/OS_portable.h | 2 +- iguana/dpow/dpow_network.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crypto777/OS_portable.h b/crypto777/OS_portable.h index 040436d1a..d687df9e0 100755 --- a/crypto777/OS_portable.h +++ b/crypto777/OS_portable.h @@ -18,7 +18,7 @@ // iguana_OS has functions that invoke system calls. Whenever possible stdio and similar functions are use and most functions are fully portable and in this file. For things that require OS specific, the call is routed to iguana_OS_portable_* Usually, all but one OS can be handled with the same code, so iguana_OS_portable.c has most of this shared logic and an #ifdef iguana_OS_nonportable.c #ifdef __APPLE__ -#define LIQUIDITY_PROVIDER 1 +//#define LIQUIDITY_PROVIDER 1 #endif #ifdef NATIVE_WINDOWS diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 91a0d96a9..cadc11faa 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -2138,11 +2138,11 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( (flags & 4) == 0 && (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) > 0 ) { num2++; - printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); + //printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); if ( (retstr= dex_response(&broadcastflag,myinfo,dexp)) != 0 ) { signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,retstr,(int32_t)strlen(retstr)+1); - printf("send back[%ld]\n",strlen(retstr)+1); + //printf("send back[%ld]\n",strlen(retstr)+1); free(retstr); if ( broadcastflag != 0 ) { From 2c551f0deac6fb419dee9a1057a9eb505e603828 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 18 Mar 2017 13:52:52 +0200 Subject: [PATCH 493/495] Test --- iguana/kmd_lookup.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 0d6e2f2f9..a07b5db29 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -694,9 +694,11 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) { bitcoin_addr2rmd160(&type_rmd160[0],&type_rmd160[1],jstri(addresses,0)); kmd_transactionvout(coin,ptr,j,jdouble(vout,"value")*SATOSHIDEN,type_rmd160,zero,-1); + fprintf(stderr,"%.8f ",jdouble(vout,"value")); } // else printf("missing sobj.%p or addresses.%p (%s)\n",sobj,addresses,jprint(vout,0)); //likely OP_RETURN sobj = addresses = 0; } + fprintf(stderr,"numvouts.%d ht.%d %s\n",numvouts,height,coin->symbol); if ( coin->kmd_txidfp != 0 ) { ptr->fpos = ftell(coin->kmd_txidfp); From b3da8ebbf7be8392411cf3aeeefe03870b71c14e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 18 Mar 2017 16:44:24 +0200 Subject: [PATCH 494/495] Test --- iguana/kmd_lookup.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index a07b5db29..f44779156 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -694,11 +694,11 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) { bitcoin_addr2rmd160(&type_rmd160[0],&type_rmd160[1],jstri(addresses,0)); kmd_transactionvout(coin,ptr,j,jdouble(vout,"value")*SATOSHIDEN,type_rmd160,zero,-1); - fprintf(stderr,"%.8f ",jdouble(vout,"value")); + //fprintf(stderr,"%.8f ",jdouble(vout,"value")); } // else printf("missing sobj.%p or addresses.%p (%s)\n",sobj,addresses,jprint(vout,0)); //likely OP_RETURN sobj = addresses = 0; } - fprintf(stderr,"numvouts.%d ht.%d %s\n",numvouts,height,coin->symbol); + //fprintf(stderr,"numvouts.%d ht.%d %s\n",numvouts,height,coin->symbol); if ( coin->kmd_txidfp != 0 ) { ptr->fpos = ftell(coin->kmd_txidfp); From 502492912b704745ebdaf819ead9fb2dd0b1c558 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 21 Mar 2017 21:58:12 +0200 Subject: [PATCH 495/495] Height 250000 update --- .gitignore | 6 ++++++ iguana/iguana_payments.c | 6 ++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index f3176906f..1d70ba0e5 100755 --- a/.gitignore +++ b/.gitignore @@ -210,3 +210,9 @@ iguana/DB/SWAPS/270159951-1269722638 iguana/DB/SWAPS/244991424-1008712592 iguana/confs/1cc0270abba7f4463a3dcb9908b9d875691a6773fe3cc1b4302233ed76665300 + +iguana/autoAPI.md + +iguana/confs/5228bcea7ae2515a29c3844673de6ee2acba53bf45724744a00ff4306f192912 + +iguana/confs/630929d976025fafde221c7358eb5805f4359bad3c6b8bd50ad3f6e0a9b5ce78 diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index cdb27e36c..842dd261c 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -348,20 +348,22 @@ uint64_t _iguana_interest(uint32_t now,int32_t chainheight,uint32_t txlocktime,u { if ( minutes > 365 * 24 * 60 ) minutes = 365 * 24 * 60; + if ( chainheight >= 250000 ) + minutes -= 59; denominator = (((uint64_t)365 * 24 * 60) / minutes); if ( denominator == 0 ) denominator = 1; // max KOMODO_INTEREST per transfer, do it at least annually! if ( value > 25000LL*SATOSHIDEN && chainheight > 155949 ) { numerator = (value / 20); // assumes 5%! - if ( chainheight < 300000 ) + if ( chainheight < 250000 ) interest = (numerator / denominator); else interest = (numerator * minutes) / ((uint64_t)365 * 24 * 60); } else if ( value >= 10*SATOSHIDEN ) { numerator = (value * KOMODO_INTEREST); - if ( chainheight < 300000 || numerator * minutes < 365 * 24 * 60 ) + if ( chainheight < 250000 || numerator * minutes < 365 * 24 * 60 ) interest = (numerator / denominator) / SATOSHIDEN; else interest = ((numerator * minutes) / ((uint64_t)365 * 24 * 60)) / SATOSHIDEN; }

)o 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 Oq5K2eGtF7g8vy|5x#)QS diff --git a/iguana/tests/mm b/iguana/tests/mm index 80d7b728a..6944ffce8 100755 --- a/iguana/tests/mm +++ b/iguana/tests/mm @@ -1 +1 @@ -../marketmaker '{\"blocktrail\":\"",\"passphrase\":\"\",\"base\":\"KMD\",\"rel\":\"BTC\",\"name\":\"komodo\",\"exchange\":\"bittrex\",\"apikey\":\"\",\"apisecret\":\"\",\"profitmargin\":0.001,\"maxexposure\":0.1,\"lotratio\":0.02,\"start_rel\":0.1,\"start_base\":1000}' +../marketmaker '{"blocktrail":"","passphrase":"","base":"KMD","rel":"BTC","name":"komodo","exchange":"bittrex","apikey":"","apisecret":"","profitmargin":0.001,"maxexposure":0.1,"lotratio":0.02,"start_rel":0.1,"start_base":1000}' From 9a195e85116768c3fd5dbd45fbc99497d730231e Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 22 Feb 2017 21:14:38 +0200 Subject: [PATCH 160/495] Test --- iguana/tests/mm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/iguana/tests/mm b/iguana/tests/mm index 6944ffce8..816419047 100755 --- a/iguana/tests/mm +++ b/iguana/tests/mm @@ -1 +1,3 @@ +../../coins/basilisk/btc +../../coins/basilisk/kmd ../marketmaker '{"blocktrail":"","passphrase":"","base":"KMD","rel":"BTC","name":"komodo","exchange":"bittrex","apikey":"","apisecret":"","profitmargin":0.001,"maxexposure":0.1,"lotratio":0.02,"start_rel":0.1,"start_base":1000}' From c95d39e15201b6d6d89b7a8b83e5c1ac5d8106cf Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 23 Feb 2017 08:23:14 +0200 Subject: [PATCH 161/495] Test --- iguana/marketmaker | Bin 354872 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 iguana/marketmaker diff --git a/iguana/marketmaker b/iguana/marketmaker deleted file mode 100755 index bf00a7dee20cedcddef56b9f910aab467344e52b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 354872 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%0DZG$rcGB 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 wIoihCU9|2=mZ~y=R From 60eb446c20917abd36dad4c6c511ddea0dd8e060 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 23 Feb 2017 09:50:04 +0200 Subject: [PATCH 162/495] Switch to DEX explorer based listunspent and list transactions --- iguana/dpow/dpow_network.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 59dd152ae..4331b018e 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -977,7 +977,7 @@ char *_dex_listunspentarg(struct supernet_info *myinfo,char *symbol,char *addres char *_dex_listunspent(struct supernet_info *myinfo,char *symbol,char *address) { - return(_dex_listunspentarg(myinfo,symbol,address,'U')); + return(_dex_listunspentarg(myinfo,symbol,address,'u')); // 'U' old variant } char *_dex_listunspent2(struct supernet_info *myinfo,char *symbol,char *address) @@ -1018,7 +1018,7 @@ char *_dex_listtransactions(struct supernet_info *myinfo,char *symbol,char *addr safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.intarg = skip; dexreq.shortarg = count; - dexreq.func = 'L'; + dexreq.func = '2';//'L'; return(_dex_arrayreturn(_dex_sendrequeststr(myinfo,&dexreq,address,0,1,""))); } From 32f20784fbb9b6db688ab17fb3839688b589f7a5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 24 Feb 2017 16:25:04 +0200 Subject: [PATCH 163/495] batch11 --- iguana/main.c | 4 +- iguana/tests/KMD.batch10.txids | 64 ++++++++ iguana/tests/KMD.batch11 | 190 ++++++++++++++++++++++++ iguana/tests/KMD.batch11.importaddress | 188 +++++++++++++++++++++++ iguana/tests/KMD.batch11.listunspent | 151 +++++++++++++++++++ iguana/tests/REVS.batch10 | 4 + iguana/tests/REVS.batch11 | 9 ++ iguana/tests/REVS.batch11.importaddress | 8 + 8 files changed, 616 insertions(+), 2 deletions(-) create mode 100644 iguana/tests/KMD.batch10.txids create mode 100755 iguana/tests/KMD.batch11 create mode 100755 iguana/tests/KMD.batch11.importaddress create mode 100755 iguana/tests/KMD.batch11.listunspent create mode 100755 iguana/tests/REVS.batch11 create mode 100755 iguana/tests/REVS.batch11.importaddress diff --git a/iguana/main.c b/iguana/main.c index 8a26d800c..be3cebe4a 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1612,7 +1612,7 @@ void komodo_ICO_batch(cJSON *array,int32_t batchid) printf("# %s KMD %.8f\n",coinaddr,dstr(kmdamount)); if ( (iter & 1) == 0 ) { - if ( (1) ) + if ( (0) ) { printf("curl --url \"http://127.0.0.1:7778\" --data \"{\\\"agent\\\":\\\"dex\\\",\\\"method\\\":\\\"importaddress\\\",\\\"address\\\":\\\"%s\\\",\\\"symbol\\\":\\\"KMD\\\"}\" # %.8f\n",coinaddr,dstr(kmdamount)); printf("sleep 3\n"); @@ -1676,7 +1676,7 @@ void iguana_main(void *arg) else printf("ENDIAN ERROR\n"); mycalloc(0,0,0); #ifdef __APPLE__ - char *batchstr,*batchstr2; cJSON *batchjson; long batchsize; char fname[512],fname2[512]; int32_t batchid = 11; + char *batchstr,*batchstr2; cJSON *batchjson; long batchsize; char fname[512],fname2[512]; int32_t batchid = 12; sprintf(fname,"REVS.raw"), sprintf(fname2,"REVS.rawtxids"); if ( (0) && (batchstr= OS_filestr(&batchsize,fname)) != 0 && (batchstr2= OS_filestr(&batchsize,fname2)) != 0 ) { diff --git a/iguana/tests/KMD.batch10.txids b/iguana/tests/KMD.batch10.txids new file mode 100644 index 000000000..d7ae5c94b --- /dev/null +++ b/iguana/tests/KMD.batch10.txids @@ -0,0 +1,64 @@ +8b0336f166b8b6348c7af6b382ba5d5f4aa6e266922b19725e79290ee9839bf2 +6266.43352646 <- expected amount RQC6A3SKtLb2zmqDDwFvRH6Zz4mZufmp3d +f88163328ebfd735ffe40077fadb0fb8b79020943a8e5822b47fba735a4a20a2 +1203.04246569 <- expected amount R9SpRcd2KRD45B7SqzuUFhNnsnx7YqgkN6 +af967b9d98defc983047da835bd783fe66b527292052acf56197456344431826 +9683.15249375 <- expected amount RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j +fedd862fdf4749676410a4b7babf3139c6cf624fd8f6c9620fd95256a7300600 +306877.42641191 <- expected amount RTJXwRhuAH9iyztyuRuGC8G7DamTgSMGvT +97cae9d83eadecc26cacd272880bd5120bb66aa3df3a65f37d53793c9c1d3154 +150.23706901 <- expected amount RQantoJxT8szwfAqUM3enLPe85YiQtwndH +d641a19ecb1f4d0e5938a18e794ab3b3931f12669e952b40ccadad71c29b7f09 +1985.04626121 <- expected amount RLvvwtBUupmGDy81CJNp6RxKbxxbuu3jRY +f14d32323d2f001a2bf6ca8b88c3a15252a71d80174d6390c61902d06d5f4b84 +1664.32251109 <- expected amount RFdRKqe82MmvSxZQjgtLfzdf8mNHztKpPE +fcda442735f5627876d069940adc2448f3ba60024a214f48cbbc88123167961d +5.99800973 <- expected amount RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3 +f13e4009f2c3fa3c4f97a0798f1bf1e3df0a4f8470613a125683bd052b1d94ae +9671.53271075 <- expected amount RNYMy1joru9gFitzokTSi5qFFc5nS4iFxc +edb2103b5a7577241d8d3cc7564426b6230ed9ed6a26b0a43cc8ec09d5a76bf3 +40223.19497203 <- expected amount RF4jZsF5BUckQqX5hsS68kjQMYSba8Fypm +8cdc1454b6f872eac3d95c95295816678f1bcb759bc8a7134399951c2b4d0a2f +72698.53877152 <- expected amount RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB +70ea0803296924e353f9c21a3a24b9167868b84219610f6b0e5544622ade573d +9683.15249375 <- expected amount RVzFdNGRn8Ekr4XaeDSfE9fjqvKdcVicJe +df969fd9a0676e0a51c132432fd67fc1dba5e3fa6049bc1c81a0f3d2d32f1bf6 +3532.13792522 <- expected amount RTbTzn7FGJWwrH1E3fMwuZPs3YVH1MvVoB +1b06ade94bbc568b7fd6d9a5eb786aa05df77956c4dc3012fff2225dc3338b3c +309.69366537 <- expected amount RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ +6356a4dd940d6e859b58fe866eacd8ff58f2d68ae46eec4376e722a26a7fa542 +3873.26099750 <- expected amount RYYgc5UD7X18E6CrDXCs1cts5WDwaWhm1Z +dea38f0d030f416d7030c8531b23fedd559410f82f23d4927e62ec3b987406fe +62053.93460050 <- expected amount RXdBJ5cWDcS38ykuggEQZh3vSztxwmG3ut +f0c32f919b860494e924953cbb8c18b7ebc48579eca47ca1f42212afa8471b89 +6506.14889316 <- expected amount REKnBAyZMnhKzRozzcuv6fKRtoBsKTFYjs +ce24b5ff26df4d10e2a34dfaa00949e6eab54c921d5be815c39b0dec50a7aac1 +812.78437655 <- expected amount RY422uSvkAoZy81uGot5PmXuMrtChhJ3uL +d301f1d220d66363aa9c8a4ce2ae3ff24b7b554577e862a8f4a0fa3650c87591 +1452.47287406 <- expected amount R9o3CQms16CLu63j9WdqsaWB3XsssRXEq8 +50b56b7eaa17403473c107706ca4f7d15dc43907e643ff70b9613476e9a88a1a +867.82549038 <- expected amount RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A +48de26c072cc1792774528721c912b9c88245ecad1e8cc8c0e18d9b030dc483e +693.08132289 <- expected amount RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv +4faf242258a3b3a78f2e4d4217370c5bc1bd836990e4889f74c040cad2aaabfb +8521.17419450 <- expected amount RCfBinKfJ1wGSxXLPNTmC9bohFRoofUiVm +00f9410471f1953fa2379f9add97d377c0618ed03a489fbff2c2b4d2a41e59c3 +5328.53865807 <- expected amount RNEZRHeWE3KgSTUr3qvH7RNvM2JWZZkygM +8cf3efea2f6972a7e04b6d75478e54e6667fe8f88effc8a20b38f9dbbc9b03e7 +29049.45748125 <- expected amount RH7tsX9PaKECxSEALpu5EWdmEKikY7R2n1 +12f13b23bfbb519a7e2c18c7d4826ab702eee8769f4f27914e9d3b6c13b7c315 +4840.60793162 <- expected amount RYHxrTNpqrAHRbULboJVYHWqmnmVhzzrot +62315b5822e8b04541cbb0db97dcd65b93ab3b95c6ef5d6aebf3a8efa4ea55d1 +2420.78812342 <- expected amount RLCEGw7zmAhZQYtP23Z2TD45gAT9ZuZKct +3c45078d8bf67b966d4dd73a12a9963ae0638fae5af4f2a49de6f54bf507d9de +137.73071692 <- expected amount RGQmMzmUfa6R5dZvvL5wvy2vxPLEcgkkyC +5e4daa037126cd384ec76452baa4a8388c468fd6e81d1f72b249b8de922fd403 +9737.34607711 <- expected amount RRdDD2YoR5cfwktePGGFT5cEyRcWkEjzvM +5ab178d63a2d12f5d8c906e9de598708284d0d9e13da61dd5658dc5f5040755b +1903.31162313 <- expected amount RKbb9NGB3pU2BaByoDwyZDH74E7koR2Lga +8ba4ff8dcfda0490c7927afb042768de0ea8d9f8eea89112430bc8363c736703 +99.84182062 <- expected amount RQsSsmpzFagxRaYk6cTMpNHa4eYLihKn8h +7d9c76b94c599a9cb2a0aa5301d722186fc130ac883929ef6952d9cf95e2fbd0 +1167.24851677 <- expected amount RKQPNcePppEkV4CMXZrwqEMAvRHbruKVdF +7e291c577c4695ae3a6363ff9091d3e1f2d61d3038e324c0222677ec8cf27aee +15095.38306803 <- expected amount RHKuiEoakr9yeWQT9UZzCrqPgR8MPBaGvD diff --git a/iguana/tests/KMD.batch11 b/iguana/tests/KMD.batch11 new file mode 100755 index 000000000..0bc901b56 --- /dev/null +++ b/iguana/tests/KMD.batch11 @@ -0,0 +1,190 @@ +# RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A KMD 42.40642295 +./komodo-cli sendtoaddress RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A 42.40642295 +sleep 3 +echo "42.40642295 <- expected amount RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A" + +# RMnuGgpEzWcxYi861E7BjGMURCFX2Szj2v KMD 1248.93505747 +./komodo-cli sendtoaddress RMnuGgpEzWcxYi861E7BjGMURCFX2Szj2v 1248.93505747 +sleep 3 +echo "1248.93505747 <- expected amount RMnuGgpEzWcxYi861E7BjGMURCFX2Szj2v" + +# RC8jWr1QQsRyo1pDkue8AxGs58Wyz4F3wZ KMD 2684.14739323 +./komodo-cli sendtoaddress RC8jWr1QQsRyo1pDkue8AxGs58Wyz4F3wZ 2684.14739323 +sleep 3 +echo "2684.14739323 <- expected amount RC8jWr1QQsRyo1pDkue8AxGs58Wyz4F3wZ" + +# RTUWRmRe543k8vrwuRXQ7BkFhkK4i2dq5A KMD 19366.30498750 +./komodo-cli sendtoaddress RTUWRmRe543k8vrwuRXQ7BkFhkK4i2dq5A 19366.30498750 +sleep 3 +echo "19366.30498750 <- expected amount RTUWRmRe543k8vrwuRXQ7BkFhkK4i2dq5A" + +# RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB KMD 209558.53271075 +./komodo-cli sendtoaddress RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB 209558.53271075 +sleep 3 +echo "209558.53271075 <- expected amount RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB" + +# RNW6Kkcdktbeemd2n8NVPCfgnRirzWoiZY KMD 32675.00548454 +./komodo-cli sendtoaddress RNW6Kkcdktbeemd2n8NVPCfgnRirzWoiZY 32675.00548454 +sleep 3 +echo "32675.00548454 <- expected amount RNW6Kkcdktbeemd2n8NVPCfgnRirzWoiZY" + +# RNUw6ePdaQ4mXSo9koqGtMDzEC43gCvDrK KMD 15037.55193116 +./komodo-cli sendtoaddress RNUw6ePdaQ4mXSo9koqGtMDzEC43gCvDrK 15037.55193116 +sleep 3 +echo "15037.55193116 <- expected amount RNUw6ePdaQ4mXSo9koqGtMDzEC43gCvDrK" + +# RLu6gRHKwXjvv64QZGiLT7uHEVRrH9mHDn KMD 1022.54090334 +./komodo-cli sendtoaddress RLu6gRHKwXjvv64QZGiLT7uHEVRrH9mHDn 1022.54090334 +sleep 3 +echo "1022.54090334 <- expected amount RLu6gRHKwXjvv64QZGiLT7uHEVRrH9mHDn" + +# RTJXwRhuAH9iyztyuRuGC8G7DamTgSMGvT KMD 172688.45447080 +./komodo-cli sendtoaddress RTJXwRhuAH9iyztyuRuGC8G7DamTgSMGvT 172688.45447080 +sleep 3 +echo "172688.45447080 <- expected amount RTJXwRhuAH9iyztyuRuGC8G7DamTgSMGvT" + +# RDKb3QykRJNfLKWLcbbv9z7xqbtxwB54GC KMD 35255.61377633 +./komodo-cli sendtoaddress RDKb3QykRJNfLKWLcbbv9z7xqbtxwB54GC 35255.61377633 +sleep 3 +echo "35255.61377633 <- expected amount RDKb3QykRJNfLKWLcbbv9z7xqbtxwB54GC" + +# RH7cfyUkBwrLbxfWBggcbV3UgzaAHyy3J8 KMD 4509.36353351 +./komodo-cli sendtoaddress RH7cfyUkBwrLbxfWBggcbV3UgzaAHyy3J8 4509.36353351 +sleep 3 +echo "4509.36353351 <- expected amount RH7cfyUkBwrLbxfWBggcbV3UgzaAHyy3J8" + +# RCSH7RtDM51e346niSiUk9HiYDrDiqcyev KMD 8622.26398257 +./komodo-cli sendtoaddress RCSH7RtDM51e346niSiUk9HiYDrDiqcyev 8622.26398257 +sleep 3 +echo "8622.26398257 <- expected amount RCSH7RtDM51e346niSiUk9HiYDrDiqcyev" + +# RBYMsuS89HQKxNCZB3xb1UxRyfLMLvrbmc KMD 1904.65394401, REVS 37.80134078 +# RBYMsuS89HQKxNCZB3xb1UxRyfLMLvrbmc KMD 1904.65394401 +./komodo-cli sendtoaddress RBYMsuS89HQKxNCZB3xb1UxRyfLMLvrbmc 1904.65394401 +sleep 3 +echo "1904.65394401 <- expected amount RBYMsuS89HQKxNCZB3xb1UxRyfLMLvrbmc" + +# RUr4x8gjCU9EmbLWpYBdsJDyt1oye52iog KMD 1894.96063707 +./komodo-cli sendtoaddress RUr4x8gjCU9EmbLWpYBdsJDyt1oye52iog 1894.96063707 +sleep 3 +echo "1894.96063707 <- expected amount RUr4x8gjCU9EmbLWpYBdsJDyt1oye52iog" + +# RBW6wjWoEsu22APzSfJemWi96bQZFJvEGZ KMD 55379.83556127 +./komodo-cli sendtoaddress RBW6wjWoEsu22APzSfJemWi96bQZFJvEGZ 55379.83556127 +sleep 3 +echo "55379.83556127 <- expected amount RBW6wjWoEsu22APzSfJemWi96bQZFJvEGZ" + +# RAMvDwi58oyArqfGseWZsYbR2BN3L7ghVX KMD 109.47952512 +./komodo-cli sendtoaddress RAMvDwi58oyArqfGseWZsYbR2BN3L7ghVX 109.47952512 +sleep 3 +echo "109.47952512 <- expected amount RAMvDwi58oyArqfGseWZsYbR2BN3L7ghVX" + +# RXs11ZkaMLV9ZVAJ93LNjF4TRri2QBHn4J KMD 2903.00911762 +./komodo-cli sendtoaddress RXs11ZkaMLV9ZVAJ93LNjF4TRri2QBHn4J 2903.00911762 +sleep 3 +echo "2903.00911762 <- expected amount RXs11ZkaMLV9ZVAJ93LNjF4TRri2QBHn4J" + +# RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47 KMD 8344.85486318 +./komodo-cli sendtoaddress RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47 8344.85486318 +sleep 3 +echo "8344.85486318 <- expected amount RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47" + +# RQM36oUWQFipUvhPnyoNr8f8CgmJ6W6HR3 KMD 9295.82639400 +./komodo-cli sendtoaddress RQM36oUWQFipUvhPnyoNr8f8CgmJ6W6HR3 9295.82639400 +sleep 3 +echo "9295.82639400 <- expected amount RQM36oUWQFipUvhPnyoNr8f8CgmJ6W6HR3" + +# RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz KMD 5784.90308850 +./komodo-cli sendtoaddress RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz 5784.90308850 +sleep 3 +echo "5784.90308850 <- expected amount RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz" + +# RFkDDs1eZCQmAKknvyrP5XbpyeaihFaFL2 KMD 4345.79883919 +./komodo-cli sendtoaddress RFkDDs1eZCQmAKknvyrP5XbpyeaihFaFL2 4345.79883919 +sleep 3 +echo "4345.79883919 <- expected amount RFkDDs1eZCQmAKknvyrP5XbpyeaihFaFL2" + +# RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut KMD 5743.12343812 +./komodo-cli sendtoaddress RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut 5743.12343812 +sleep 3 +echo "5743.12343812 <- expected amount RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut" + +# RTSn55yrw2xUWM8bxVcG84ga84dofPfsuD KMD 9680.24754799 +./komodo-cli sendtoaddress RTSn55yrw2xUWM8bxVcG84ga84dofPfsuD 9680.24754799 +sleep 3 +echo "9680.24754799 <- expected amount RTSn55yrw2xUWM8bxVcG84ga84dofPfsuD" + +# RBboFD6fhYF11C883DxvLx5dDmbbs73XC3 KMD 1819.54181879 +./komodo-cli sendtoaddress RBboFD6fhYF11C883DxvLx5dDmbbs73XC3 1819.54181879 +sleep 3 +echo "1819.54181879 <- expected amount RBboFD6fhYF11C883DxvLx5dDmbbs73XC3" + +# RCKVUKnC3pjVkjnDfnBj1Eu68yc8ELdMC5 KMD 863.61179282, REVS 0.91962079 +# RCKVUKnC3pjVkjnDfnBj1Eu68yc8ELdMC5 KMD 863.61179282 +./komodo-cli sendtoaddress RCKVUKnC3pjVkjnDfnBj1Eu68yc8ELdMC5 863.61179282 +sleep 3 +echo "863.61179282 <- expected amount RCKVUKnC3pjVkjnDfnBj1Eu68yc8ELdMC5" + +# RU3EDov1PTPAY8WhG5eGUANp2rvtki1yc9 KMD 0.00050130 +./komodo-cli sendtoaddress RU3EDov1PTPAY8WhG5eGUANp2rvtki1yc9 0.00050130 +sleep 3 +echo "0.00050130 <- expected amount RU3EDov1PTPAY8WhG5eGUANp2rvtki1yc9" + +# RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv KMD 693.08132289 +./komodo-cli sendtoaddress RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv 693.08132289 +sleep 3 +echo "693.08132289 <- expected amount RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv" + +# RUrV1qvjBapCDGQnwpdhyneGhX1wiHZwVr KMD 16087.76566759, REVS 319.20361833 +# RUrV1qvjBapCDGQnwpdhyneGhX1wiHZwVr KMD 16087.76566759 +./komodo-cli sendtoaddress RUrV1qvjBapCDGQnwpdhyneGhX1wiHZwVr 16087.76566759 +sleep 3 +echo "16087.76566759 <- expected amount RUrV1qvjBapCDGQnwpdhyneGhX1wiHZwVr" + +# R9V8qEoa5zjgoJ2kDARXTyhjjvkzcTANC5 KMD 5577.49583640 +./komodo-cli sendtoaddress R9V8qEoa5zjgoJ2kDARXTyhjjvkzcTANC5 5577.49583640 +sleep 3 +echo "5577.49583640 <- expected amount R9V8qEoa5zjgoJ2kDARXTyhjjvkzcTANC5" + +# RJJdqon3kYcXtyiTujiHBxAMj9QXrgfUbw KMD 774.65219950 +./komodo-cli sendtoaddress RJJdqon3kYcXtyiTujiHBxAMj9QXrgfUbw 774.65219950 +sleep 3 +echo "774.65219950 <- expected amount RJJdqon3kYcXtyiTujiHBxAMj9QXrgfUbw" + +# RNqJvqLSS9zpCJYFv8gDPgeUBx72Hk4as2 KMD 13362.75044137 +./komodo-cli sendtoaddress RNqJvqLSS9zpCJYFv8gDPgeUBx72Hk4as2 13362.75044137 +sleep 3 +echo "13362.75044137 <- expected amount RNqJvqLSS9zpCJYFv8gDPgeUBx72Hk4as2" + +# RH8i5cGy1QMK2sTehLEAqjX2Ph8FJ94LWJ KMD 8569.02441659 +./komodo-cli sendtoaddress RH8i5cGy1QMK2sTehLEAqjX2Ph8FJ94LWJ 8569.02441659 +sleep 3 +echo "8569.02441659 <- expected amount RH8i5cGy1QMK2sTehLEAqjX2Ph8FJ94LWJ" + +# RCEXKrX2kkQQrFu6arLBLNYYZFtdgHwATt KMD 9683.15249375 +./komodo-cli sendtoaddress RCEXKrX2kkQQrFu6arLBLNYYZFtdgHwATt 9683.15249375 +sleep 3 +echo "9683.15249375 <- expected amount RCEXKrX2kkQQrFu6arLBLNYYZFtdgHwATt" + +# RE3f1f5XQsntqQkwpVZwyzr1YbupdPbjiS KMD 7916.77211172 +./komodo-cli sendtoaddress RE3f1f5XQsntqQkwpVZwyzr1YbupdPbjiS 7916.77211172 +sleep 3 +echo "7916.77211172 <- expected amount RE3f1f5XQsntqQkwpVZwyzr1YbupdPbjiS" + +# RWoKDt8BzEQc3WtYUpXmCxRwB1Tg3AWcPR KMD 722.28571081 +./komodo-cli sendtoaddress RWoKDt8BzEQc3WtYUpXmCxRwB1Tg3AWcPR 722.28571081 +sleep 3 +echo "722.28571081 <- expected amount RWoKDt8BzEQc3WtYUpXmCxRwB1Tg3AWcPR" + +# RNwfApozgMUmKvJCdrJWQZZCw3hEUWaNk1 KMD 709.73247788 +./komodo-cli sendtoaddress RNwfApozgMUmKvJCdrJWQZZCw3hEUWaNk1 709.73247788 +sleep 3 +echo "709.73247788 <- expected amount RNwfApozgMUmKvJCdrJWQZZCw3hEUWaNk1" + +# RKQPNcePppEkV4CMXZrwqEMAvRHbruKVdF KMD 419.36278156 +./komodo-cli sendtoaddress RKQPNcePppEkV4CMXZrwqEMAvRHbruKVdF 419.36278156 +sleep 3 +echo "419.36278156 <- expected amount RKQPNcePppEkV4CMXZrwqEMAvRHbruKVdF" + + +# total KMD 675297.04318319 REVS 0.00000000 diff --git a/iguana/tests/KMD.batch11.importaddress b/iguana/tests/KMD.batch11.importaddress new file mode 100755 index 000000000..572c78113 --- /dev/null +++ b/iguana/tests/KMD.batch11.importaddress @@ -0,0 +1,188 @@ +# RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A KMD 42.40642295 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A\",\"symbol\":\"KMD\"}" # 42.40642295 +sleep 3 +echo "42.40642295 <- expected amount RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A" + +# RMnuGgpEzWcxYi861E7BjGMURCFX2Szj2v KMD 1248.93505747 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RMnuGgpEzWcxYi861E7BjGMURCFX2Szj2v\",\"symbol\":\"KMD\"}" # 1248.93505747 +sleep 3 +echo "1248.93505747 <- expected amount RMnuGgpEzWcxYi861E7BjGMURCFX2Szj2v" + +# RC8jWr1QQsRyo1pDkue8AxGs58Wyz4F3wZ KMD 2684.14739323 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RC8jWr1QQsRyo1pDkue8AxGs58Wyz4F3wZ\",\"symbol\":\"KMD\"}" # 2684.14739323 +sleep 3 +echo "2684.14739323 <- expected amount RC8jWr1QQsRyo1pDkue8AxGs58Wyz4F3wZ" + +# RTUWRmRe543k8vrwuRXQ7BkFhkK4i2dq5A KMD 19366.30498750 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RTUWRmRe543k8vrwuRXQ7BkFhkK4i2dq5A\",\"symbol\":\"KMD\"}" # 19366.30498750 +sleep 3 +echo "19366.30498750 <- expected amount RTUWRmRe543k8vrwuRXQ7BkFhkK4i2dq5A" + +# RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB KMD 209558.53271075 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB\",\"symbol\":\"KMD\"}" # 209558.53271075 +sleep 3 +echo "209558.53271075 <- expected amount RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB" + +# RNW6Kkcdktbeemd2n8NVPCfgnRirzWoiZY KMD 32675.00548454 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RNW6Kkcdktbeemd2n8NVPCfgnRirzWoiZY\",\"symbol\":\"KMD\"}" # 32675.00548454 +sleep 3 +echo "32675.00548454 <- expected amount RNW6Kkcdktbeemd2n8NVPCfgnRirzWoiZY" + +# RNUw6ePdaQ4mXSo9koqGtMDzEC43gCvDrK KMD 15037.55193116 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RNUw6ePdaQ4mXSo9koqGtMDzEC43gCvDrK\",\"symbol\":\"KMD\"}" # 15037.55193116 +sleep 3 +echo "15037.55193116 <- expected amount RNUw6ePdaQ4mXSo9koqGtMDzEC43gCvDrK" + +# RLu6gRHKwXjvv64QZGiLT7uHEVRrH9mHDn KMD 1022.54090334 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RLu6gRHKwXjvv64QZGiLT7uHEVRrH9mHDn\",\"symbol\":\"KMD\"}" # 1022.54090334 +sleep 3 +echo "1022.54090334 <- expected amount RLu6gRHKwXjvv64QZGiLT7uHEVRrH9mHDn" + +# RTJXwRhuAH9iyztyuRuGC8G7DamTgSMGvT KMD 172688.45447080 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RTJXwRhuAH9iyztyuRuGC8G7DamTgSMGvT\",\"symbol\":\"KMD\"}" # 172688.45447080 +sleep 3 +echo "172688.45447080 <- expected amount RTJXwRhuAH9iyztyuRuGC8G7DamTgSMGvT" + +# RDKb3QykRJNfLKWLcbbv9z7xqbtxwB54GC KMD 35255.61377633 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RDKb3QykRJNfLKWLcbbv9z7xqbtxwB54GC\",\"symbol\":\"KMD\"}" # 35255.61377633 +sleep 3 +echo "35255.61377633 <- expected amount RDKb3QykRJNfLKWLcbbv9z7xqbtxwB54GC" + +# RH7cfyUkBwrLbxfWBggcbV3UgzaAHyy3J8 KMD 4509.36353351 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RH7cfyUkBwrLbxfWBggcbV3UgzaAHyy3J8\",\"symbol\":\"KMD\"}" # 4509.36353351 +sleep 3 +echo "4509.36353351 <- expected amount RH7cfyUkBwrLbxfWBggcbV3UgzaAHyy3J8" + +# RCSH7RtDM51e346niSiUk9HiYDrDiqcyev KMD 8622.26398257 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RCSH7RtDM51e346niSiUk9HiYDrDiqcyev\",\"symbol\":\"KMD\"}" # 8622.26398257 +sleep 3 +echo "8622.26398257 <- expected amount RCSH7RtDM51e346niSiUk9HiYDrDiqcyev" + +# RBYMsuS89HQKxNCZB3xb1UxRyfLMLvrbmc KMD 1904.65394401, REVS 37.80134078 +# RBYMsuS89HQKxNCZB3xb1UxRyfLMLvrbmc KMD 1904.65394401 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RBYMsuS89HQKxNCZB3xb1UxRyfLMLvrbmc\",\"symbol\":\"KMD\"}" # 1904.65394401 +sleep 3 +echo "1904.65394401 <- expected amount RBYMsuS89HQKxNCZB3xb1UxRyfLMLvrbmc" + +# RUr4x8gjCU9EmbLWpYBdsJDyt1oye52iog KMD 1894.96063707 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RUr4x8gjCU9EmbLWpYBdsJDyt1oye52iog\",\"symbol\":\"KMD\"}" # 1894.96063707 +sleep 3 +echo "1894.96063707 <- expected amount RUr4x8gjCU9EmbLWpYBdsJDyt1oye52iog" + +# RBW6wjWoEsu22APzSfJemWi96bQZFJvEGZ KMD 55379.83556127 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RBW6wjWoEsu22APzSfJemWi96bQZFJvEGZ\",\"symbol\":\"KMD\"}" # 55379.83556127 +sleep 3 +echo "55379.83556127 <- expected amount RBW6wjWoEsu22APzSfJemWi96bQZFJvEGZ" + +# RAMvDwi58oyArqfGseWZsYbR2BN3L7ghVX KMD 109.47952512 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RAMvDwi58oyArqfGseWZsYbR2BN3L7ghVX\",\"symbol\":\"KMD\"}" # 109.47952512 +sleep 3 +echo "109.47952512 <- expected amount RAMvDwi58oyArqfGseWZsYbR2BN3L7ghVX" + +# RXs11ZkaMLV9ZVAJ93LNjF4TRri2QBHn4J KMD 2903.00911762 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RXs11ZkaMLV9ZVAJ93LNjF4TRri2QBHn4J\",\"symbol\":\"KMD\"}" # 2903.00911762 +sleep 3 +echo "2903.00911762 <- expected amount RXs11ZkaMLV9ZVAJ93LNjF4TRri2QBHn4J" + +# RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47 KMD 8344.85486318 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47\",\"symbol\":\"KMD\"}" # 8344.85486318 +sleep 3 +echo "8344.85486318 <- expected amount RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47" + +# RQM36oUWQFipUvhPnyoNr8f8CgmJ6W6HR3 KMD 9295.82639400 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RQM36oUWQFipUvhPnyoNr8f8CgmJ6W6HR3\",\"symbol\":\"KMD\"}" # 9295.82639400 +sleep 3 +echo "9295.82639400 <- expected amount RQM36oUWQFipUvhPnyoNr8f8CgmJ6W6HR3" + +# RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz KMD 5784.90308850 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz\",\"symbol\":\"KMD\"}" # 5784.90308850 +sleep 3 +echo "5784.90308850 <- expected amount RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz" + +# RFkDDs1eZCQmAKknvyrP5XbpyeaihFaFL2 KMD 4345.79883919 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RFkDDs1eZCQmAKknvyrP5XbpyeaihFaFL2\",\"symbol\":\"KMD\"}" # 4345.79883919 +sleep 3 +echo "4345.79883919 <- expected amount RFkDDs1eZCQmAKknvyrP5XbpyeaihFaFL2" + +# RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut KMD 5743.12343812 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut\",\"symbol\":\"KMD\"}" # 5743.12343812 +sleep 3 +echo "5743.12343812 <- expected amount RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut" + +# RTSn55yrw2xUWM8bxVcG84ga84dofPfsuD KMD 9680.24754799 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RTSn55yrw2xUWM8bxVcG84ga84dofPfsuD\",\"symbol\":\"KMD\"}" # 9680.24754799 +sleep 3 +echo "9680.24754799 <- expected amount RTSn55yrw2xUWM8bxVcG84ga84dofPfsuD" + +# RBboFD6fhYF11C883DxvLx5dDmbbs73XC3 KMD 1819.54181879 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RBboFD6fhYF11C883DxvLx5dDmbbs73XC3\",\"symbol\":\"KMD\"}" # 1819.54181879 +sleep 3 +echo "1819.54181879 <- expected amount RBboFD6fhYF11C883DxvLx5dDmbbs73XC3" + +# RCKVUKnC3pjVkjnDfnBj1Eu68yc8ELdMC5 KMD 863.61179282, REVS 0.91962079 +# RCKVUKnC3pjVkjnDfnBj1Eu68yc8ELdMC5 KMD 863.61179282 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RCKVUKnC3pjVkjnDfnBj1Eu68yc8ELdMC5\",\"symbol\":\"KMD\"}" # 863.61179282 +sleep 3 +echo "863.61179282 <- expected amount RCKVUKnC3pjVkjnDfnBj1Eu68yc8ELdMC5" + +# RU3EDov1PTPAY8WhG5eGUANp2rvtki1yc9 KMD 0.00050130 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RU3EDov1PTPAY8WhG5eGUANp2rvtki1yc9\",\"symbol\":\"KMD\"}" # 0.00050130 +sleep 3 +echo "0.00050130 <- expected amount RU3EDov1PTPAY8WhG5eGUANp2rvtki1yc9" + +# RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv KMD 693.08132289 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv\",\"symbol\":\"KMD\"}" # 693.08132289 +sleep 3 +echo "693.08132289 <- expected amount RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv" + +# RUrV1qvjBapCDGQnwpdhyneGhX1wiHZwVr KMD 16087.76566759, REVS 319.20361833 +# RUrV1qvjBapCDGQnwpdhyneGhX1wiHZwVr KMD 16087.76566759 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RUrV1qvjBapCDGQnwpdhyneGhX1wiHZwVr\",\"symbol\":\"KMD\"}" # 16087.76566759 +sleep 3 +echo "16087.76566759 <- expected amount RUrV1qvjBapCDGQnwpdhyneGhX1wiHZwVr" + +# R9V8qEoa5zjgoJ2kDARXTyhjjvkzcTANC5 KMD 5577.49583640 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"R9V8qEoa5zjgoJ2kDARXTyhjjvkzcTANC5\",\"symbol\":\"KMD\"}" # 5577.49583640 +sleep 3 +echo "5577.49583640 <- expected amount R9V8qEoa5zjgoJ2kDARXTyhjjvkzcTANC5" + +# RJJdqon3kYcXtyiTujiHBxAMj9QXrgfUbw KMD 774.65219950 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RJJdqon3kYcXtyiTujiHBxAMj9QXrgfUbw\",\"symbol\":\"KMD\"}" # 774.65219950 +sleep 3 +echo "774.65219950 <- expected amount RJJdqon3kYcXtyiTujiHBxAMj9QXrgfUbw" + +# RNqJvqLSS9zpCJYFv8gDPgeUBx72Hk4as2 KMD 13362.75044137 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RNqJvqLSS9zpCJYFv8gDPgeUBx72Hk4as2\",\"symbol\":\"KMD\"}" # 13362.75044137 +sleep 3 +echo "13362.75044137 <- expected amount RNqJvqLSS9zpCJYFv8gDPgeUBx72Hk4as2" + +# RH8i5cGy1QMK2sTehLEAqjX2Ph8FJ94LWJ KMD 8569.02441659 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RH8i5cGy1QMK2sTehLEAqjX2Ph8FJ94LWJ\",\"symbol\":\"KMD\"}" # 8569.02441659 +sleep 3 +echo "8569.02441659 <- expected amount RH8i5cGy1QMK2sTehLEAqjX2Ph8FJ94LWJ" + +# RCEXKrX2kkQQrFu6arLBLNYYZFtdgHwATt KMD 9683.15249375 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RCEXKrX2kkQQrFu6arLBLNYYZFtdgHwATt\",\"symbol\":\"KMD\"}" # 9683.15249375 +sleep 3 +echo "9683.15249375 <- expected amount RCEXKrX2kkQQrFu6arLBLNYYZFtdgHwATt" + +# RE3f1f5XQsntqQkwpVZwyzr1YbupdPbjiS KMD 7916.77211172 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RE3f1f5XQsntqQkwpVZwyzr1YbupdPbjiS\",\"symbol\":\"KMD\"}" # 7916.77211172 +sleep 3 +echo "7916.77211172 <- expected amount RE3f1f5XQsntqQkwpVZwyzr1YbupdPbjiS" + +# RWoKDt8BzEQc3WtYUpXmCxRwB1Tg3AWcPR KMD 722.28571081 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RWoKDt8BzEQc3WtYUpXmCxRwB1Tg3AWcPR\",\"symbol\":\"KMD\"}" # 722.28571081 +sleep 3 +echo "722.28571081 <- expected amount RWoKDt8BzEQc3WtYUpXmCxRwB1Tg3AWcPR" + +# RNwfApozgMUmKvJCdrJWQZZCw3hEUWaNk1 KMD 709.73247788 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RNwfApozgMUmKvJCdrJWQZZCw3hEUWaNk1\",\"symbol\":\"KMD\"}" # 709.73247788 +sleep 3 +echo "709.73247788 <- expected amount RNwfApozgMUmKvJCdrJWQZZCw3hEUWaNk1" + +# RKQPNcePppEkV4CMXZrwqEMAvRHbruKVdF KMD 419.36278156 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RKQPNcePppEkV4CMXZrwqEMAvRHbruKVdF\",\"symbol\":\"KMD\"}" # 419.36278156 +sleep 3 +echo "419.36278156 <- expected amount RKQPNcePppEkV4CMXZrwqEMAvRHbruKVdF" + diff --git a/iguana/tests/KMD.batch11.listunspent b/iguana/tests/KMD.batch11.listunspent new file mode 100755 index 000000000..6ac504d86 --- /dev/null +++ b/iguana/tests/KMD.batch11.listunspent @@ -0,0 +1,151 @@ +# RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A KMD 42.40642295 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A\",\"symbol\":\"KMD\"}" +echo "42.40642295 <- expected amount RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A" + +# RMnuGgpEzWcxYi861E7BjGMURCFX2Szj2v KMD 1248.93505747 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RMnuGgpEzWcxYi861E7BjGMURCFX2Szj2v\",\"symbol\":\"KMD\"}" +echo "1248.93505747 <- expected amount RMnuGgpEzWcxYi861E7BjGMURCFX2Szj2v" + +# RC8jWr1QQsRyo1pDkue8AxGs58Wyz4F3wZ KMD 2684.14739323 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RC8jWr1QQsRyo1pDkue8AxGs58Wyz4F3wZ\",\"symbol\":\"KMD\"}" +echo "2684.14739323 <- expected amount RC8jWr1QQsRyo1pDkue8AxGs58Wyz4F3wZ" + +# RTUWRmRe543k8vrwuRXQ7BkFhkK4i2dq5A KMD 19366.30498750 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RTUWRmRe543k8vrwuRXQ7BkFhkK4i2dq5A\",\"symbol\":\"KMD\"}" +echo "19366.30498750 <- expected amount RTUWRmRe543k8vrwuRXQ7BkFhkK4i2dq5A" + +# RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB KMD 209558.53271075 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB\",\"symbol\":\"KMD\"}" +echo "209558.53271075 <- expected amount RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB" + +# RNW6Kkcdktbeemd2n8NVPCfgnRirzWoiZY KMD 32675.00548454 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RNW6Kkcdktbeemd2n8NVPCfgnRirzWoiZY\",\"symbol\":\"KMD\"}" +echo "32675.00548454 <- expected amount RNW6Kkcdktbeemd2n8NVPCfgnRirzWoiZY" + +# RNUw6ePdaQ4mXSo9koqGtMDzEC43gCvDrK KMD 15037.55193116 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RNUw6ePdaQ4mXSo9koqGtMDzEC43gCvDrK\",\"symbol\":\"KMD\"}" +echo "15037.55193116 <- expected amount RNUw6ePdaQ4mXSo9koqGtMDzEC43gCvDrK" + +# RLu6gRHKwXjvv64QZGiLT7uHEVRrH9mHDn KMD 1022.54090334 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RLu6gRHKwXjvv64QZGiLT7uHEVRrH9mHDn\",\"symbol\":\"KMD\"}" +echo "1022.54090334 <- expected amount RLu6gRHKwXjvv64QZGiLT7uHEVRrH9mHDn" + +# RTJXwRhuAH9iyztyuRuGC8G7DamTgSMGvT KMD 172688.45447080 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RTJXwRhuAH9iyztyuRuGC8G7DamTgSMGvT\",\"symbol\":\"KMD\"}" +echo "172688.45447080 <- expected amount RTJXwRhuAH9iyztyuRuGC8G7DamTgSMGvT" + +# RDKb3QykRJNfLKWLcbbv9z7xqbtxwB54GC KMD 35255.61377633 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RDKb3QykRJNfLKWLcbbv9z7xqbtxwB54GC\",\"symbol\":\"KMD\"}" +echo "35255.61377633 <- expected amount RDKb3QykRJNfLKWLcbbv9z7xqbtxwB54GC" + +# RH7cfyUkBwrLbxfWBggcbV3UgzaAHyy3J8 KMD 4509.36353351 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RH7cfyUkBwrLbxfWBggcbV3UgzaAHyy3J8\",\"symbol\":\"KMD\"}" +echo "4509.36353351 <- expected amount RH7cfyUkBwrLbxfWBggcbV3UgzaAHyy3J8" + +# RCSH7RtDM51e346niSiUk9HiYDrDiqcyev KMD 8622.26398257 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RCSH7RtDM51e346niSiUk9HiYDrDiqcyev\",\"symbol\":\"KMD\"}" +echo "8622.26398257 <- expected amount RCSH7RtDM51e346niSiUk9HiYDrDiqcyev" + +# RBYMsuS89HQKxNCZB3xb1UxRyfLMLvrbmc KMD 1904.65394401, REVS 37.80134078 +# RBYMsuS89HQKxNCZB3xb1UxRyfLMLvrbmc KMD 1904.65394401 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RBYMsuS89HQKxNCZB3xb1UxRyfLMLvrbmc\",\"symbol\":\"KMD\"}" +echo "1904.65394401 <- expected amount RBYMsuS89HQKxNCZB3xb1UxRyfLMLvrbmc" + +# RUr4x8gjCU9EmbLWpYBdsJDyt1oye52iog KMD 1894.96063707 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RUr4x8gjCU9EmbLWpYBdsJDyt1oye52iog\",\"symbol\":\"KMD\"}" +echo "1894.96063707 <- expected amount RUr4x8gjCU9EmbLWpYBdsJDyt1oye52iog" + +# RBW6wjWoEsu22APzSfJemWi96bQZFJvEGZ KMD 55379.83556127 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RBW6wjWoEsu22APzSfJemWi96bQZFJvEGZ\",\"symbol\":\"KMD\"}" +echo "55379.83556127 <- expected amount RBW6wjWoEsu22APzSfJemWi96bQZFJvEGZ" + +# RAMvDwi58oyArqfGseWZsYbR2BN3L7ghVX KMD 109.47952512 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RAMvDwi58oyArqfGseWZsYbR2BN3L7ghVX\",\"symbol\":\"KMD\"}" +echo "109.47952512 <- expected amount RAMvDwi58oyArqfGseWZsYbR2BN3L7ghVX" + +# RXs11ZkaMLV9ZVAJ93LNjF4TRri2QBHn4J KMD 2903.00911762 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RXs11ZkaMLV9ZVAJ93LNjF4TRri2QBHn4J\",\"symbol\":\"KMD\"}" +echo "2903.00911762 <- expected amount RXs11ZkaMLV9ZVAJ93LNjF4TRri2QBHn4J" + +# RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47 KMD 8344.85486318 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47\",\"symbol\":\"KMD\"}" +echo "8344.85486318 <- expected amount RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47" + +# RQM36oUWQFipUvhPnyoNr8f8CgmJ6W6HR3 KMD 9295.82639400 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RQM36oUWQFipUvhPnyoNr8f8CgmJ6W6HR3\",\"symbol\":\"KMD\"}" +echo "9295.82639400 <- expected amount RQM36oUWQFipUvhPnyoNr8f8CgmJ6W6HR3" + +# RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz KMD 5784.90308850 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz\",\"symbol\":\"KMD\"}" +echo "5784.90308850 <- expected amount RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz" + +# RFkDDs1eZCQmAKknvyrP5XbpyeaihFaFL2 KMD 4345.79883919 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RFkDDs1eZCQmAKknvyrP5XbpyeaihFaFL2\",\"symbol\":\"KMD\"}" +echo "4345.79883919 <- expected amount RFkDDs1eZCQmAKknvyrP5XbpyeaihFaFL2" + +# RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut KMD 5743.12343812 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut\",\"symbol\":\"KMD\"}" +echo "5743.12343812 <- expected amount RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut" + +# RTSn55yrw2xUWM8bxVcG84ga84dofPfsuD KMD 9680.24754799 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RTSn55yrw2xUWM8bxVcG84ga84dofPfsuD\",\"symbol\":\"KMD\"}" +echo "9680.24754799 <- expected amount RTSn55yrw2xUWM8bxVcG84ga84dofPfsuD" + +# RBboFD6fhYF11C883DxvLx5dDmbbs73XC3 KMD 1819.54181879 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RBboFD6fhYF11C883DxvLx5dDmbbs73XC3\",\"symbol\":\"KMD\"}" +echo "1819.54181879 <- expected amount RBboFD6fhYF11C883DxvLx5dDmbbs73XC3" + +# RCKVUKnC3pjVkjnDfnBj1Eu68yc8ELdMC5 KMD 863.61179282, REVS 0.91962079 +# RCKVUKnC3pjVkjnDfnBj1Eu68yc8ELdMC5 KMD 863.61179282 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RCKVUKnC3pjVkjnDfnBj1Eu68yc8ELdMC5\",\"symbol\":\"KMD\"}" +echo "863.61179282 <- expected amount RCKVUKnC3pjVkjnDfnBj1Eu68yc8ELdMC5" + +# RU3EDov1PTPAY8WhG5eGUANp2rvtki1yc9 KMD 0.00050130 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RU3EDov1PTPAY8WhG5eGUANp2rvtki1yc9\",\"symbol\":\"KMD\"}" +echo "0.00050130 <- expected amount RU3EDov1PTPAY8WhG5eGUANp2rvtki1yc9" + +# RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv KMD 693.08132289 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv\",\"symbol\":\"KMD\"}" +echo "693.08132289 <- expected amount RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv" + +# RUrV1qvjBapCDGQnwpdhyneGhX1wiHZwVr KMD 16087.76566759, REVS 319.20361833 +# RUrV1qvjBapCDGQnwpdhyneGhX1wiHZwVr KMD 16087.76566759 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RUrV1qvjBapCDGQnwpdhyneGhX1wiHZwVr\",\"symbol\":\"KMD\"}" +echo "16087.76566759 <- expected amount RUrV1qvjBapCDGQnwpdhyneGhX1wiHZwVr" + +# R9V8qEoa5zjgoJ2kDARXTyhjjvkzcTANC5 KMD 5577.49583640 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"R9V8qEoa5zjgoJ2kDARXTyhjjvkzcTANC5\",\"symbol\":\"KMD\"}" +echo "5577.49583640 <- expected amount R9V8qEoa5zjgoJ2kDARXTyhjjvkzcTANC5" + +# RJJdqon3kYcXtyiTujiHBxAMj9QXrgfUbw KMD 774.65219950 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RJJdqon3kYcXtyiTujiHBxAMj9QXrgfUbw\",\"symbol\":\"KMD\"}" +echo "774.65219950 <- expected amount RJJdqon3kYcXtyiTujiHBxAMj9QXrgfUbw" + +# RNqJvqLSS9zpCJYFv8gDPgeUBx72Hk4as2 KMD 13362.75044137 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RNqJvqLSS9zpCJYFv8gDPgeUBx72Hk4as2\",\"symbol\":\"KMD\"}" +echo "13362.75044137 <- expected amount RNqJvqLSS9zpCJYFv8gDPgeUBx72Hk4as2" + +# RH8i5cGy1QMK2sTehLEAqjX2Ph8FJ94LWJ KMD 8569.02441659 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RH8i5cGy1QMK2sTehLEAqjX2Ph8FJ94LWJ\",\"symbol\":\"KMD\"}" +echo "8569.02441659 <- expected amount RH8i5cGy1QMK2sTehLEAqjX2Ph8FJ94LWJ" + +# RCEXKrX2kkQQrFu6arLBLNYYZFtdgHwATt KMD 9683.15249375 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RCEXKrX2kkQQrFu6arLBLNYYZFtdgHwATt\",\"symbol\":\"KMD\"}" +echo "9683.15249375 <- expected amount RCEXKrX2kkQQrFu6arLBLNYYZFtdgHwATt" + +# RE3f1f5XQsntqQkwpVZwyzr1YbupdPbjiS KMD 7916.77211172 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RE3f1f5XQsntqQkwpVZwyzr1YbupdPbjiS\",\"symbol\":\"KMD\"}" +echo "7916.77211172 <- expected amount RE3f1f5XQsntqQkwpVZwyzr1YbupdPbjiS" + +# RWoKDt8BzEQc3WtYUpXmCxRwB1Tg3AWcPR KMD 722.28571081 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RWoKDt8BzEQc3WtYUpXmCxRwB1Tg3AWcPR\",\"symbol\":\"KMD\"}" +echo "722.28571081 <- expected amount RWoKDt8BzEQc3WtYUpXmCxRwB1Tg3AWcPR" + +# RNwfApozgMUmKvJCdrJWQZZCw3hEUWaNk1 KMD 709.73247788 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RNwfApozgMUmKvJCdrJWQZZCw3hEUWaNk1\",\"symbol\":\"KMD\"}" +echo "709.73247788 <- expected amount RNwfApozgMUmKvJCdrJWQZZCw3hEUWaNk1" + +# RKQPNcePppEkV4CMXZrwqEMAvRHbruKVdF KMD 419.36278156 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RKQPNcePppEkV4CMXZrwqEMAvRHbruKVdF\",\"symbol\":\"KMD\"}" +echo "419.36278156 <- expected amount RKQPNcePppEkV4CMXZrwqEMAvRHbruKVdF" + diff --git a/iguana/tests/REVS.batch10 b/iguana/tests/REVS.batch10 index 0fa879e14..3f5a20e03 100755 --- a/iguana/tests/REVS.batch10 +++ b/iguana/tests/REVS.batch10 @@ -1,3 +1,4 @@ +sleep 999999 # RF4jZsF5BUckQqX5hsS68kjQMYSba8Fypm KMD 40223.19497203, REVS 101.00000000 sleep 1 fiat/revs sendtoaddress RF4jZsF5BUckQqX5hsS68kjQMYSba8Fypm 101.00000000 @@ -6,3 +7,6 @@ sleep 1 fiat/revs sendtoaddress RGQmMzmUfa6R5dZvvL5wvy2vxPLEcgkkyC 2.73426759 # total KMD 0.00000000 REVS 103.73426759 +64c45de19774850698051651ba5476b0de1f213520366d46459de0eccebdaad7 +17a5af91044e1461ca8fca70ddd900ae9e50acd7af59bf5af1a9c4cccb20b552 + diff --git a/iguana/tests/REVS.batch11 b/iguana/tests/REVS.batch11 new file mode 100755 index 000000000..c62583a3a --- /dev/null +++ b/iguana/tests/REVS.batch11 @@ -0,0 +1,9 @@ +# RBYMsuS89HQKxNCZB3xb1UxRyfLMLvrbmc KMD 1904.65394401, REVS 37.80134078 +sleep 1 +fiat/revs sendtoaddress RBYMsuS89HQKxNCZB3xb1UxRyfLMLvrbmc 37.80134078 +# RCKVUKnC3pjVkjnDfnBj1Eu68yc8ELdMC5 KMD 863.61179282, REVS 0.91962079 +sleep 1 +fiat/revs sendtoaddress RCKVUKnC3pjVkjnDfnBj1Eu68yc8ELdMC5 0.91962079 +# RUrV1qvjBapCDGQnwpdhyneGhX1wiHZwVr KMD 16087.76566759, REVS 319.20361833 +sleep 1 +fiat/revs sendtoaddress RUrV1qvjBapCDGQnwpdhyneGhX1wiHZwVr 319.20361833 diff --git a/iguana/tests/REVS.batch11.importaddress b/iguana/tests/REVS.batch11.importaddress new file mode 100755 index 000000000..569017cbd --- /dev/null +++ b/iguana/tests/REVS.batch11.importaddress @@ -0,0 +1,8 @@ +# RBYMsuS89HQKxNCZB3xb1UxRyfLMLvrbmc KMD 1904.65394401, REVS 37.80134078 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RBYMsuS89HQKxNCZB3xb1UxRyfLMLvrbmc\",\"symbol\":\"REVS\"}" # 37.80134078 +sleep 3 +# RCKVUKnC3pjVkjnDfnBj1Eu68yc8ELdMC5 KMD 863.61179282, REVS 0.91962079 +sleep 1 +# RUrV1qvjBapCDGQnwpdhyneGhX1wiHZwVr KMD 16087.76566759, REVS 319.20361833 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RUrV1qvjBapCDGQnwpdhyneGhX1wiHZwVr\",\"symbol\":\"REVS\"}" # 319.20361833 +sleep 3 From 2d47b8f30ff94602514ffa50eb525e2886063727 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 24 Feb 2017 17:18:37 +0200 Subject: [PATCH 164/495] test --- iguana/dpow/dpow_network.c | 8 ++++---- iguana/tests/REVS.batch11 | 6 ++++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 4331b018e..2239bc977 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1091,7 +1091,7 @@ void dex_updateclient(struct supernet_info *myinfo) int32_t i; if ( myinfo->IAMNOTARY == 0 ) { - for (i=0; i<100; i++) + for (i=0; i<1000; i++) if ( dex_subsock_poll(myinfo) <= 0 ) break; } @@ -1882,7 +1882,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) break; usleep(1000); }*/ - while ( (size= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dpowsock,&np)) >= 0 && num < 100 ) + while ( (size= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dpowsock,&np)) >= 0 && num < 1000 ) { num++; if ( size > 0 ) @@ -1936,10 +1936,10 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) n = 0; if ( myinfo->dexsock >= 0 ) // from servers { - if ( (size= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dexsock,&dexp)) > 0 ) + while ( (size= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dexsock,&dexp)) > 0 && n < 1000 ) { //fprintf(stderr,"%d ",size); - num++; + n++; if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { //printf("FROM BUS.%08x -> pub\n",dexp->crc32); diff --git a/iguana/tests/REVS.batch11 b/iguana/tests/REVS.batch11 index c62583a3a..ae2682ab8 100755 --- a/iguana/tests/REVS.batch11 +++ b/iguana/tests/REVS.batch11 @@ -1,3 +1,4 @@ +sleep 99999 # RBYMsuS89HQKxNCZB3xb1UxRyfLMLvrbmc KMD 1904.65394401, REVS 37.80134078 sleep 1 fiat/revs sendtoaddress RBYMsuS89HQKxNCZB3xb1UxRyfLMLvrbmc 37.80134078 @@ -7,3 +8,8 @@ fiat/revs sendtoaddress RCKVUKnC3pjVkjnDfnBj1Eu68yc8ELdMC5 0.91962079 # RUrV1qvjBapCDGQnwpdhyneGhX1wiHZwVr KMD 16087.76566759, REVS 319.20361833 sleep 1 fiat/revs sendtoaddress RUrV1qvjBapCDGQnwpdhyneGhX1wiHZwVr 319.20361833 + +94940c0e2adc685722b2bf2525515cdab544afc0ad25af1c4cd2cfa5a06a28cd +e17395d17efa9254e06b566a2719c066ddba6c196f34892ec99bd987abc9dc89 +3142dd53cc5a76e6f41b43754e9506d02818571e8d5caed6384fad4f760dc49a + From 08e5e6f72a65d4ca4c367f1f1dc5b99cf7487c39 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 24 Feb 2017 17:32:46 +0200 Subject: [PATCH 165/495] test --- iguana/iguana_notary.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index ff5cba176..a7404948d 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -147,7 +147,7 @@ void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) { int32_t height,num; uint32_t blocktime; bits256 blockhash; struct iguana_info *src,*dest; //fprintf(stderr,"dp.%p dPoWupdate (%s -> %s)\n",dp,dp!=0?dp->symbol:"",dp!=0?dp->dest:""); - if ( strcmp(dp->symbol,"KMD") == 0 ) + //if ( strcmp(dp->symbol,"KMD") == 0 ) { num = dpow_nanomsg_update(myinfo); //fprintf(stderr,"%d ",num); From dbbe7805b836386da7276288a93a401d2c3f1225 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 24 Feb 2017 18:04:15 +0200 Subject: [PATCH 166/495] test --- basilisk/basilisk.c | 2 -- iguana/dpow/dpow_network.c | 12 +++++++++++- iguana/iguana777.h | 2 +- iguana/main.c | 2 ++ iguana/tests/KMD.batch11 | 1 + iguana/tests/dexlistunspent | 2 +- 6 files changed, 16 insertions(+), 5 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 823656011..1ea4ac20d 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -919,8 +919,6 @@ void basilisks_loop(void *arg) endmilli = startmilli + 500; else endmilli = startmilli + 1000; } - if ( myinfo->DEXEXPLORER != 0 ) - kmd_bitcoinscan(); if ( myinfo->expiration != 0 && (myinfo->dexsock >= 0 || myinfo->IAMLP != 0 || myinfo->DEXactive > time(NULL)) ) { //fprintf(stderr,"H "); diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 2239bc977..d9eeb35af 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -399,7 +399,7 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 printf("%d: subscribe connect (%s)\n",myinfo->numdexipbits,str); } } - if ( (rand() % 100) < 40 ) + if ( 0 && (rand() % 100) < 40 ) { nanomsg_tcpname(0,str,ipaddr,REP_SOCK); nn_connect(myinfo->reqsock,str); @@ -882,6 +882,16 @@ char *_dex_getnotaries(struct supernet_info *myinfo,char *symbol) decode_hex(myinfo->notaries[i],33,pubkeystr); } } + else + { + extern const char *Notaries_elected[][2]; + myinfo->numnotaries = 64;//sizeof(Notaries_elected)/sizeof(*Notaries_elected); + for (i=0; inumnotaries; i++) + { + decode_hex(myinfo->notaries[i],33,(char *)Notaries_elected[i][1]); + } + printf("default to elected.%d\n",myinfo->numnotaries); + } free_json(retjson); } } diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 29fa7195c..471fa8187 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -133,7 +133,7 @@ struct supernet_info struct liquidity_info linfos[512]; cJSON *liquidity_currencies; struct pending_trade *trades; portable_mutex_t pending_mutex; struct komodo_notaries NOTARY; char seedipaddr[64]; uint32_t dpowipbits[128]; int32_t numdpowipbits; portable_mutex_t notarymutex,dpowmutex; - char dexseed_ipaddrs[2][64]; uint32_t dexipbits[128]; int32_t numdexipbits; portable_mutex_t dexmutex; + char dexseed_ipaddrs[1][64]; uint32_t dexipbits[128]; int32_t numdexipbits; portable_mutex_t dexmutex; // compatibility bits256 pangea_category,instantdex_category; uint8_t logs[256],exps[510]; diff --git a/iguana/main.c b/iguana/main.c index be3cebe4a..c0d231e3b 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -484,6 +484,8 @@ void mainloop(struct supernet_info *myinfo) } usleep(30000); } + if ( myinfo->DEXEXPLORER != 0 ) + kmd_bitcoinscan(); //pangea_queues(SuperNET_MYINFO(0)); //if ( flag == 0 ) // usleep(100000 + isRT*100000 + (numpeers == 0)*1000000); diff --git a/iguana/tests/KMD.batch11 b/iguana/tests/KMD.batch11 index 0bc901b56..c427e01db 100755 --- a/iguana/tests/KMD.batch11 +++ b/iguana/tests/KMD.batch11 @@ -1,3 +1,4 @@ +sleep 99999 # RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A KMD 42.40642295 ./komodo-cli sendtoaddress RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A 42.40642295 sleep 3 diff --git a/iguana/tests/dexlistunspent b/iguana/tests/dexlistunspent index e262df7f3..5cd82cdaa 100755 --- a/iguana/tests/dexlistunspent +++ b/iguana/tests/dexlistunspent @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"19rjYdJtRN3qoammX3r1gxy9bvh8p8DmRc\",\"symbol\":\"BTC\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent2\",\"address\":\"RDKb3QykRJNfLKWLcbbv9z7xqbtxwB54GC\",\"symbol\":\"KMD\"}" From ba51c9d7d83ed38cec95568d570e8b410cc51fe9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 24 Feb 2017 18:12:26 +0200 Subject: [PATCH 167/495] test --- iguana/dpow/dpow_network.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index d9eeb35af..53ca5e6ef 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1966,11 +1966,11 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) while ( (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) > 0 ) { num++; - //printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); + printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); if ( (retstr= dex_response(&broadcastflag,myinfo,dexp)) != 0 ) { signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,retstr,(int32_t)strlen(retstr)+1); - //printf("send back[%ld]\n",strlen(retstr)+1); + printf("send back[%ld]\n",strlen(retstr)+1); free(retstr); if ( broadcastflag != 0 ) { From af29000c0e0ad1e4cbf039a8982d8dac8a06ef8a Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 24 Feb 2017 18:25:14 +0200 Subject: [PATCH 168/495] test --- iguana/dpow/dpow_network.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 53ca5e6ef..92daf15d6 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -294,8 +294,9 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 timeout = 100; nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); timeout = 3000; - nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); //nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); + timeout = 5000; + nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); if ( myinfo->IAMNOTARY == 0 && subsock < 0 && (subsock= nn_socket(AF_SP,NN_SUB)) >= 0 ) { for (i=0; idexseed_ipaddrs)/sizeof(*myinfo->dexseed_ipaddrs); i++) @@ -1970,7 +1971,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( (retstr= dex_response(&broadcastflag,myinfo,dexp)) != 0 ) { signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,retstr,(int32_t)strlen(retstr)+1); - printf("send back[%ld]\n",strlen(retstr)+1); + printf("send back[%s]\n",retstr);//strlen(retstr)+1); free(retstr); if ( broadcastflag != 0 ) { From 952f3c973f87f3d49ce2e9a5b8fd5ac80dc8fcd3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 24 Feb 2017 19:06:47 +0200 Subject: [PATCH 169/495] test --- iguana/dpow/dpow_network.c | 42 +++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 92daf15d6..9de70df62 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -149,7 +149,7 @@ int32_t signed_nn_recv(void **freeptrp,void *ctx,uint8_t notaries[64][33],int32_ { //for (i=0; ipacketlen == recvbytes-sizeof(*sigpacket)); } if ( sigpacket != 0 && recvbytes > sizeof(*sigpacket) && sigpacket->packetlen == recvbytes-sizeof(*sigpacket) ) { @@ -190,7 +190,8 @@ int32_t signed_nn_recv(void **freeptrp,void *ctx,uint8_t notaries[64][33],int32_ //printf(" invalid pubkey33 n.%d\n",n); } else printf("recoververify error nonce.%u packetlen.%d\n",sigpacket->nonce,sigpacket->packetlen); } else printf("hash mismatch or bad nonce.%u packetlen.%d\n",sigpacket->nonce,sigpacket->packetlen); - } //else printf("recvbytes.%d mismatched packetlen.%d + %ld\n",recvbytes,sigpacket!=0?sigpacket->packetlen:-1,sizeof(*sigpacket)); + } else if ( recvbytes > 0 ) + printf("recvbytes.%d mismatched packetlen.%d + %ld\n",recvbytes,sigpacket!=0?sigpacket->packetlen:-1,sizeof(*sigpacket)); //printf("free sigpacket.%p freeptrp.%p packetp.%p\n",sigpacket,*freeptrp,*(void **)packetp); if ( sigpacket != 0 ) nn_freemsg(sigpacket), sigpacket = 0; @@ -282,21 +283,24 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 reqsock = myinfo->reqsock; if ( reqsock < 0 && (reqsock= nn_socket(AF_SP,NN_REQ)) >= 0 ) { - for (i=0; idexseed_ipaddrs)/sizeof(*myinfo->dexseed_ipaddrs); i++) - if ( nn_connect(reqsock,nanomsg_tcpname(0,str,myinfo->dexseed_ipaddrs[i],REP_SOCK)) < 0 ) - { - nn_close(reqsock); - reqsock = -1; - break; - } + if ( reqsock >= 0 ) + { + timeout = 100; + nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + timeout = 3000; + nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); + timeout = 3000; + nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + for (i=0; idexseed_ipaddrs)/sizeof(*myinfo->dexseed_ipaddrs); i++) + if ( nn_connect(reqsock,nanomsg_tcpname(0,str,myinfo->dexseed_ipaddrs[i],REP_SOCK)) < 0 ) + { + nn_close(reqsock); + reqsock = -1; + break; + } + } if ( reqsock >= 0 ) { - timeout = 100; - nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - timeout = 3000; - //nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); - timeout = 5000; - nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); if ( myinfo->IAMNOTARY == 0 && subsock < 0 && (subsock= nn_socket(AF_SP,NN_SUB)) >= 0 ) { for (i=0; idexseed_ipaddrs)/sizeof(*myinfo->dexseed_ipaddrs); i++) @@ -314,6 +318,10 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 nn_setsockopt(subsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(subsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); printf("CLIENT sockets req.%d sub.%d\n",reqsock,subsock); + timeout = 3000; + nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); + timeout = 3000; + nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); } } } @@ -361,7 +369,7 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 // printf("%02x",((uint8_t *)data)[i]); if ( (recvbytes= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->reqsock,&retptr)) >= 0 ) { - //printf("req returned.[%d]\n",recvbytes); + printf("req returned.[%d]\n",recvbytes); portable_mutex_lock(&myinfo->dexmutex); ipbits = 0; if ( strcmp(handler,"DEX") == 0 ) @@ -1971,7 +1979,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( (retstr= dex_response(&broadcastflag,myinfo,dexp)) != 0 ) { signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,retstr,(int32_t)strlen(retstr)+1); - printf("send back[%s]\n",retstr);//strlen(retstr)+1); + printf("send back[%ld]\n",strlen(retstr)+1); free(retstr); if ( broadcastflag != 0 ) { From 1878d5759b54acd22f214b54d650ef38efb7114e Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 24 Feb 2017 19:20:19 +0200 Subject: [PATCH 170/495] Test --- .gitignore | 2 + crypto777/OS_portable.h | 2 +- crypto777/iguana_utils.c | 3 +- iguana/dpow/dpow_prices.c | 1 + iguana/exchanges/mm.c | 146 ++++++++++++++++++++++++++++++++++---- 5 files changed, 138 insertions(+), 16 deletions(-) diff --git a/.gitignore b/.gitignore index 4f939ad5c..a464d16ff 100755 --- a/.gitignore +++ b/.gitignore @@ -137,3 +137,5 @@ iguana/iguana_tx.o-4b5de8fe iguana/confs/c6faccf6b625bbb826f47b77c3274e985db7b0a47d435f32bea2f7f3724cdd17 iguana/confs/c6faccf6b625bbb826f47b77c3274e985db7b0a47d435f32bea2f7f3724cdd17.old + +iguana/marketmaker diff --git a/crypto777/OS_portable.h b/crypto777/OS_portable.h index b0918adba..040436d1a 100755 --- a/crypto777/OS_portable.h +++ b/crypto777/OS_portable.h @@ -404,7 +404,7 @@ int32_t revsort32(uint32_t *buf,uint32_t num,int32_t size); bits256 bits256_sha256(bits256 data); void bits256_rmd160(uint8_t rmd160[20],bits256 data); void bits256_rmd160_sha256(uint8_t rmd160[20],bits256 data); -double get_theoretical(double *avebidp,double *aveaskp,double *highbidp,double *lowaskp,double *CMC_averagep,double changes[3],char *name,char *base,char *rel); +double get_theoretical(double *avebidp,double *aveaskp,double *highbidp,double *lowaskp,double *CMC_averagep,double changes[3],char *name,char *base,char *rel,double *USD_averagep); extern char *Iguana_validcommands[]; extern bits256 GENESIS_PUBKEY,GENESIS_PRIVKEY; diff --git a/crypto777/iguana_utils.c b/crypto777/iguana_utils.c index ec43cd3c6..e9b8b8a51 100755 --- a/crypto777/iguana_utils.c +++ b/crypto777/iguana_utils.c @@ -1259,7 +1259,7 @@ double weighted_orderbook(double *avebidp,double *aveaskp,double *highbidp,doubl return(weighted); } -double get_theoretical(double *avebidp,double *aveaskp,double *highbidp,double *lowaskp,double *CMC_averagep,double changes[3],char *name,char *base,char *rel) +double get_theoretical(double *avebidp,double *aveaskp,double *highbidp,double *lowaskp,double *CMC_averagep,double changes[3],char *name,char *base,char *rel,double *USD_averagep) { static int32_t counter; char *cmcstr; cJSON *cmcjson,*item; double weighted,theoretical = 0.; @@ -1272,6 +1272,7 @@ double get_theoretical(double *avebidp,double *aveaskp,double *highbidp,double * item = cmcjson; else item = jitem(cmcjson,0); *CMC_averagep = jdouble(item,"price_btc"); + *USD_averagep = jdouble(item,"price_usd"); changes[0] = jdouble(item,"percent_change_1h"); changes[1] = jdouble(item,"percent_change_24h"); changes[2] = jdouble(item,"percent_change_7d"); diff --git a/iguana/dpow/dpow_prices.c b/iguana/dpow/dpow_prices.c index 312911bab..07b286c5e 100755 --- a/iguana/dpow/dpow_prices.c +++ b/iguana/dpow/dpow_prices.c @@ -1154,6 +1154,7 @@ cJSON *url_json2(char *url) double PAX_yahoo(char *metal) { // http://finance.yahoo.com/webservice/v1/symbols/allcurrencies/quote?format=json + // http://finance.yahoo.com/webservice/v1/symbols/EUR=USD/quote?format=json // http://finance.yahoo.com/webservice/v1/symbols/XAU=X/quote?format=json // http://finance.yahoo.com/webservice/v1/symbols/XAG=X/quote?format=json // http://finance.yahoo.com/webservice/v1/symbols/XPT=X/quote?format=json diff --git a/iguana/exchanges/mm.c b/iguana/exchanges/mm.c index 5e640ed5a..2b4dee270 100644 --- a/iguana/exchanges/mm.c +++ b/iguana/exchanges/mm.c @@ -35,6 +35,11 @@ int32_t Num_Pending; #define IGUANA_URL "http://127.0.0.1:7778" +char CURRENCIES[][8] = { "USD", "EUR", "JPY", "GBP", "AUD", "CAD", "CHF", "NZD", // major currencies + "CNY", "RUB", "MXN", "BRL", "INR", "HKD", "TRY", "ZAR", "PLN", "NOK", "SEK", "DKK", "CZK", "HUF", "ILS", "KRW", "MYR", "PHP", "RON", "SGD", "THB", "BGN", "IDR", "HRK", // end of currencies +}; +double PAXPRICES[sizeof(CURRENCIES)/sizeof(*CURRENCIES)]; + char *DEX_amlp(char *blocktrail) { char url[512],postdata[1024]; @@ -162,6 +167,78 @@ double dex_balance(char *base,char *coinaddr) return(balance); } +int32_t komodo_baseid(char *base) +{ + int32_t i; + for (i=0; i 0 ) + { + for (i=0; i SMALLVAL && (name= jstr(item,"name")) != 0 && strncmp(name,"USD/",4) == 0 ) + { + if ( (baseid= komodo_baseid(name+4)) >= 0 && baseid < 32 ) + { + if ( ((1LL << baseid) & mask) == 0 ) + { + _marketmaker_fiatupdate(baseid,price); + mask |= (1LL << baseid); + } else if ( fabs(price*PAXPRICES[0] - PAXPRICES[baseid]) > SMALLVAL ) + printf("DUPLICATE PRICE? %s %.8f vs %.8f\n",name+4,price*PAXPRICES[0],PAXPRICES[baseid]); + } + } + } + } + } + printf("pax mask.%x\n",(uint32_t)mask); + return((uint32_t)mask); +} + void marketmaker_cancel(struct mmpending_order *ptr) { char *retstr; cJSON *retjson; @@ -384,7 +461,7 @@ void marketmaker_volumeset(double *bidincrp,double *askincrp,double incr,double int32_t marketmaker_spread(char *exchange,char *base,char *rel,double bid,double bidvol,double ask,double askvol,double separation) { - int32_t nearflags[2],i,n = 0; struct mmpending_order *ptr; cJSON *retjson,*vals; char *retstr,postdata[1024],url[128]; + int32_t nearflags[2],i,n = 0; struct mmpending_order *ptr; cJSON *retjson,*vals; char *retstr,postdata[1024],url[128]; double vol,spread_ratio; memset(nearflags,0,sizeof(nearflags)); if ( strcmp("DEX",exchange) != 0 ) { @@ -405,7 +482,7 @@ int32_t marketmaker_spread(char *exchange,char *base,char *rel,double bid,double //printf("spread.%s (%.8f %.6f) (%.8f %.6f)\n",exchange,bid,bidvol,ask,askvol); if ( bid > SMALLVAL && bidvol > SMALLVAL && nearflags[0] == 0 ) { - if ( strcmp("DEX",exchange) == 0 ) + if ( strcmp("DEX",exchange) == 0 && strcmp(base,"KMD") == 0 && strcmp(rel,"BTC") == 0 ) { if ( ask > SMALLVAL && askvol > SMALLVAL ) { @@ -422,16 +499,36 @@ int32_t marketmaker_spread(char *exchange,char *base,char *rel,double bid,double jaddstr(vals,"rel","BTC"); jaddnum(vals,"bid",bid); jaddnum(vals,"ask",ask); - jaddnum(vals,"maxvol",bidvol > askvol ? askvol : bidvol); - jaddnum(vals,"minvol",(bidvol > askvol ? askvol : bidvol) * 0.1); + vol = bidvol > askvol ? askvol : bidvol; + jaddnum(vals,"maxvol",vol); + jaddnum(vals,"minvol",vol * 0.1); sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"%s\",\"vals\":%s}",base,jprint(vals,1)); - printf("call liquidity\n"); if ( (retstr= bitcoind_RPC(0,"tradebot",url,0,"liqudity",postdata)) != 0 ) { //printf("(%s) -> (%s)\n",postdata,retstr); free(retstr); } + spread_ratio = (ask - bid) / (bid + ask); + for (i=0; i SMALLVAL ) + { + vals = cJSON_CreateObject(); + jaddstr(vals,"rel",CURRENCIES[i]); + jaddnum(vals,"bid",PAXPRICES[i] * (1. - spread_ratio)); + jaddnum(vals,"ask",PAXPRICES[i] * (1. + spread_ratio)); + jaddnum(vals,"maxvol",vol * PAXPRICES[i]); + jaddnum(vals,"minvol",vol * 0.1 * PAXPRICES[i]); + sprintf(url,"%s/?",IGUANA_URL); + sprintf(postdata,"{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"%s\",\"vals\":%s}","KMD",jprint(vals,1)); + if ( (retstr= bitcoind_RPC(0,"tradebot",url,0,"liqudity",postdata)) != 0 ) + { + //printf("(%s) -> (%s)\n",postdata,retstr); + free(retstr); + } + } + } } else printf("unsupported ask only for DEX %s/%s\n",base,rel); } else if ( (retstr= DEX_trade(exchange,base,rel,1,bid,bidvol)) != 0 ) @@ -461,18 +558,19 @@ int32_t marketmaker_spread(char *exchange,char *base,char *rel,double bid,double return(n); } -void marketmaker(char *baseaddr,char *reladdr,double start_BASE,double start_REL,double profitmargin,double maxexposure,double ratioincr,char *exchange,char *name,char *base,char *rel) +void marketmaker(double minask,double maxbid,char *baseaddr,char *reladdr,double start_BASE,double start_REL,double profitmargin,double maxexposure,double ratioincr,char *exchange,char *name,char *base,char *rel) { - double start_DEXbase,start_DEXrel,DEX_base = 0.,DEX_rel = 0.,balance_base=0.,balance_rel=0.,mmbid,mmask,CMC_average,aveprice,incr,pendingbids,pendingasks,buyvol,sellvol,bidincr,askincr,filledprice,avebid=0.,aveask=0.,val,changes[3],highbid=0.,lowask=0.,theoretical = 0.; uint32_t lasttime = 0; + static uint32_t counter; + cJSON *fiatjson; double start_DEXbase,start_DEXrel,USD_average=0.,DEX_base = 0.,DEX_rel = 0.,balance_base=0.,balance_rel=0.,mmbid,mmask,usdprice=0.,CMC_average=0.,aveprice,incr,pendingbids,pendingasks,buyvol,sellvol,bidincr,askincr,filledprice,avebid=0.,aveask=0.,val,changes[3],highbid=0.,lowask=0.,theoretical = 0.; uint32_t lasttime = 0; incr = maxexposure * ratioincr; buyvol = sellvol = 0.; start_DEXbase = dex_balance(base,baseaddr); start_DEXrel = dex_balance(rel,reladdr); while ( 1 ) { - if ( time(NULL) > lasttime+60 ) + if ( time(NULL) > lasttime+300 ) { - if ( (val= get_theoretical(&avebid,&aveask,&highbid,&lowask,&CMC_average,changes,name,base,rel)) != 0. ) + if ( (val= get_theoretical(&avebid,&aveask,&highbid,&lowask,&CMC_average,changes,name,base,rel,&USD_average)) != 0. ) { if ( theoretical == 0. ) { @@ -485,6 +583,20 @@ void marketmaker(char *baseaddr,char *reladdr,double start_BASE,double start_REL incr += 0.777; } } else theoretical = (theoretical + val) * 0.5; + if ( (counter++ % 12) == 0 ) + { + if ( USD_average > SMALLVAL && CMC_average > SMALLVAL && theoretical > SMALLVAL ) + { + usdprice = USD_average * (theoretical / CMC_average); + printf("USD %.4f <- (%.6f * (%.8f / %.8f))\n",usdprice,USD_average,theoretical,CMC_average); + PAXPRICES[0] = usdprice; + if ( (fiatjson= yahoo_allcurrencies()) != 0 ) + { + marketmaker_fiatupdate(fiatjson); + free_json(fiatjson); + } + } + } } if ( strcmp(exchange,"bittrex") == 0 ) { @@ -518,9 +630,9 @@ void marketmaker(char *baseaddr,char *reladdr,double start_BASE,double start_REL printf("(%.8f %.8f) ",mmbid,mmask); if ( (1) ) { - if ( mmbid >= lowask ) //mmbid < highbid || + if ( mmbid >= lowask || (maxbid > SMALLVAL && mmbid > maxbid) ) //mmbid < highbid || mmbid = 0.; - if ( mmask <= highbid ) // mmask > lowask || + if ( mmask <= highbid || (minask > SMALLVAL && mmask < minask) ) // mmask > lowask || mmask = 0.; } marketmaker_volumeset(&bidincr,&askincr,incr,buyvol,pendingbids,sellvol,pendingasks,maxexposure); @@ -529,15 +641,20 @@ void marketmaker(char *baseaddr,char *reladdr,double start_BASE,double start_REL if ( (pendingbids + buyvol) > (pendingasks + sellvol) ) { bidincr *= (double)(pendingasks + sellvol) / ((pendingbids + buyvol) + (pendingasks + sellvol)); + if ( bidincr < 0.1*incr ) + bidincr = 0.1*incr; if ( bidincr > 1. ) bidincr = (int32_t)bidincr + 0.777; } if ( (pendingbids + buyvol) < (pendingasks + sellvol) ) { askincr *= (double)(pendingbids + buyvol) / ((pendingbids + buyvol) + (pendingasks + sellvol)); + if ( askincr < 0.1*incr ) + askincr = 0.1*incr; if ( askincr > 1. ) askincr = (int32_t)askincr + 0.777; } + //printf("mmbid %.8f %.6f, mmask %.8f %.6f\n",mmbid,bidincr,mmask,askincr); marketmaker_spread(exchange,base,rel,mmbid,bidincr,mmask,askincr,profitmargin*aveprice*0.5); sleep(60); } @@ -547,11 +664,12 @@ void marketmaker(char *baseaddr,char *reladdr,double start_BASE,double start_REL int main(int argc, const char * argv[]) { char *base,*rel,*name,*exchange,*apikey,*apisecret,*blocktrail; - double profitmargin,maxexposure,incrratio,start_rel,start_base; + double profitmargin,maxexposure,incrratio,start_rel,start_base,minask,maxbid; cJSON *retjson,*addrjson; char *retstr,*baseaddr,*reladdr,*passphrase; if ( argc > 1 && (retjson= cJSON_Parse(argv[1])) != 0 ) { -printf("argc.%d (%s)\n",argc,jprint(retjson,0)); + minask = jdouble(retjson,"minask"); + maxbid = jdouble(retjson,"maxbid"); profitmargin = jdouble(retjson,"profitmargin"); maxexposure = jdouble(retjson,"maxexposure"); incrratio = jdouble(retjson,"lotratio"); @@ -586,7 +704,7 @@ printf("argc.%d (%s)\n",argc,jprint(retjson,0)); printf("%s.%s %s\n",base,baseaddr,DEX_balance("DEX",base,baseaddr)); printf("%s.%s %s\n",rel,reladdr,DEX_balance("DEX",rel,reladdr)); // initialize state using DEX_pendingorders, etc. - marketmaker(baseaddr,reladdr,start_base,start_rel,profitmargin,maxexposure,incrratio,exchange,name,base,rel); + marketmaker(minask,maxbid,baseaddr,reladdr,start_base,start_rel,profitmargin,maxexposure,incrratio,exchange,name,base,rel); } free_json(addrjson); } From ab5a8e5398acc7a46fc8c6a67c55d203e007eb88 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 24 Feb 2017 19:34:10 +0200 Subject: [PATCH 171/495] Test --- iguana/dPoW.h | 2 +- iguana/dpow/dpow_prices.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index b9eec13ca..c7934feeb 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -22,7 +22,7 @@ #define DPOW_MINSIGS 13 //#define DPOW_M(bp) ((bp)->minsigs) // (((bp)->numnotaries >> 1) + 1) #define DPOW_MODIND(bp,offset) (((((bp)->height / DPOW_CHECKPOINTFREQ) % (bp)->numnotaries) + (offset)) % (bp)->numnotaries) -#define DPOW_VERSION 0x0782 +#define DPOW_VERSION 0x0781 #define DPOW_UTXOSIZE 10000 #define DPOW_MINOUTPUT 6000 #define DPOW_DURATION 600 diff --git a/iguana/dpow/dpow_prices.c b/iguana/dpow/dpow_prices.c index 07b286c5e..3a8257bb7 100755 --- a/iguana/dpow/dpow_prices.c +++ b/iguana/dpow/dpow_prices.c @@ -1451,7 +1451,7 @@ void PAX_update(struct PAX_data *dp,double *btcusdp,double *kmdbtcp) } if ( 1 ) { - double avebid,aveask,bidvol,askvol,highbid,lowask,CMC_average,changes[3]; //struct exchange_quote sortbuf[512]; struct supernet_info *myinfo = SuperNET_MYINFO(0); cJSON *argjson = cJSON_Parse("{}"); + double USD_average,avebid,aveask,bidvol,askvol,highbid,lowask,CMC_average,changes[3]; //struct exchange_quote sortbuf[512]; struct supernet_info *myinfo = SuperNET_MYINFO(0); cJSON *argjson = cJSON_Parse("{}"); //aveask = instantdex_aveprice(myinfo,sortbuf,(int32_t)(sizeof(sortbuf)/sizeof(*sortbuf)),&askvol,"KMD","BTC",1,argjson); //avebid = instantdex_aveprice(myinfo,sortbuf,(int32_t)(sizeof(sortbuf)/sizeof(*sortbuf)),&bidvol,"KMD","BTC",-1,argjson); if ( 0 && avebid > SMALLVAL && aveask > SMALLVAL ) @@ -1461,7 +1461,7 @@ void PAX_update(struct PAX_data *dp,double *btcusdp,double *kmdbtcp) printf("set KMD price %f\n",price); dp->KMDBTC = price; } - else if ( (dp->KMDBTC= get_theoretical(&avebid,&aveask,&highbid,&lowask,&CMC_average,changes,"komodo","KMD","BTC")) > SMALLVAL ) + else if ( (dp->KMDBTC= get_theoretical(&avebid,&aveask,&highbid,&lowask,&CMC_average,changes,"komodo","KMD","BTC",&USD_average)) > SMALLVAL ) *kmdbtcp = dp->KMDBTC; else { From 3c908fd499dcefc1dccaa3c559e1a5019f55f6bf Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 24 Feb 2017 19:35:49 +0200 Subject: [PATCH 172/495] Test --- iguana/dpow/dpow_network.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 9de70df62..43eccbc21 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -149,7 +149,7 @@ int32_t signed_nn_recv(void **freeptrp,void *ctx,uint8_t notaries[64][33],int32_ { //for (i=0; ipacketlen == recvbytes-sizeof(*sigpacket)); + //printf(" <- RECV.%d crc.%08x cmp.%d\n",recvbytes,calc_crc32(0,(void *)sigpacket,recvbytes),sigpacket->packetlen == recvbytes-sizeof(*sigpacket)); } if ( sigpacket != 0 && recvbytes > sizeof(*sigpacket) && sigpacket->packetlen == recvbytes-sizeof(*sigpacket) ) { @@ -369,7 +369,7 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 // printf("%02x",((uint8_t *)data)[i]); if ( (recvbytes= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->reqsock,&retptr)) >= 0 ) { - printf("req returned.[%d]\n",recvbytes); + //printf("req returned.[%d]\n",recvbytes); portable_mutex_lock(&myinfo->dexmutex); ipbits = 0; if ( strcmp(handler,"DEX") == 0 ) From f09a76eace4c09c34d54c4afe62ccbd2c73bb8fc Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 24 Feb 2017 19:37:47 +0200 Subject: [PATCH 173/495] Test --- .gitignore | 2 ++ iguana/iguana777.h | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index a464d16ff..d4442517d 100755 --- a/.gitignore +++ b/.gitignore @@ -139,3 +139,5 @@ iguana/confs/c6faccf6b625bbb826f47b77c3274e985db7b0a47d435f32bea2f7f3724cdd17 iguana/confs/c6faccf6b625bbb826f47b77c3274e985db7b0a47d435f32bea2f7f3724cdd17.old iguana/marketmaker + +iguana/secp256k1.o-501dfbfe diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 471fa8187..1d4c83d93 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -133,7 +133,7 @@ struct supernet_info struct liquidity_info linfos[512]; cJSON *liquidity_currencies; struct pending_trade *trades; portable_mutex_t pending_mutex; struct komodo_notaries NOTARY; char seedipaddr[64]; uint32_t dpowipbits[128]; int32_t numdpowipbits; portable_mutex_t notarymutex,dpowmutex; - char dexseed_ipaddrs[1][64]; uint32_t dexipbits[128]; int32_t numdexipbits; portable_mutex_t dexmutex; + char dexseed_ipaddrs[4][64]; uint32_t dexipbits[128]; int32_t numdexipbits; portable_mutex_t dexmutex; // compatibility bits256 pangea_category,instantdex_category; uint8_t logs[256],exps[510]; From 850c4d901279d2ef536449068878ee408d493cf4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 24 Feb 2017 19:39:14 +0200 Subject: [PATCH 174/495] Test --- iguana/iguana777.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 1d4c83d93..5ccae82ba 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -133,7 +133,7 @@ struct supernet_info struct liquidity_info linfos[512]; cJSON *liquidity_currencies; struct pending_trade *trades; portable_mutex_t pending_mutex; struct komodo_notaries NOTARY; char seedipaddr[64]; uint32_t dpowipbits[128]; int32_t numdpowipbits; portable_mutex_t notarymutex,dpowmutex; - char dexseed_ipaddrs[4][64]; uint32_t dexipbits[128]; int32_t numdexipbits; portable_mutex_t dexmutex; + char dexseed_ipaddrs[8][64]; uint32_t dexipbits[128]; int32_t numdexipbits; portable_mutex_t dexmutex; // compatibility bits256 pangea_category,instantdex_category; uint8_t logs[256],exps[510]; From 923f523f02f38f036fdb2fbce5898f00421841da Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 25 Feb 2017 08:38:36 +0200 Subject: [PATCH 175/495] test --- iguana/dpow/dpow_network.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 43eccbc21..f4fb236f3 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -408,7 +408,7 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 printf("%d: subscribe connect (%s)\n",myinfo->numdexipbits,str); } } - if ( 0 && (rand() % 100) < 40 ) + if ( (rand() % 100) < 40 ) { nanomsg_tcpname(0,str,ipaddr,REP_SOCK); nn_connect(myinfo->reqsock,str); @@ -1975,11 +1975,11 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) while ( (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) > 0 ) { num++; - printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); + //printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); if ( (retstr= dex_response(&broadcastflag,myinfo,dexp)) != 0 ) { signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,retstr,(int32_t)strlen(retstr)+1); - printf("send back[%ld]\n",strlen(retstr)+1); + //printf("send back[%ld]\n",strlen(retstr)+1); free(retstr); if ( broadcastflag != 0 ) { From 533e9e44113c4588cfd75cd276cf2b1224e1a5e4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 25 Feb 2017 18:40:42 +0200 Subject: [PATCH 176/495] Test --- iguana/kmd_lookup.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index efa2fdaa0..9955ddf28 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -596,7 +596,7 @@ cJSON *kmd_blockjson(int32_t *heightp,char *coinstr,char *serverport,char *userp int32_t _kmd_bitcoinscan(struct iguana_info *coin) { - int32_t h,num=0,loadheight,i,n,j,iter,numtxids,numvins,numvouts,flag=0,height=-1; cJSON *txjson,*vouts,*vins,*blockjson,*txids,*vout,*vin,*sobj,*addresses; bits256 zero,txid; char *curlstr,params[128],str[65]; struct kmd_transactionhh *ptr; struct kmd_transaction *tx; uint8_t type_rmd160[21]; + int32_t h,num=0,loadheight,lag,i,n,j,iter,numtxids,numvins,numvouts,flag=0,height=-1; cJSON *txjson,*vouts,*vins,*blockjson,*txids,*vout,*vin,*sobj,*addresses; bits256 zero,txid; char *curlstr,params[128],str[65]; struct kmd_transactionhh *ptr; struct kmd_transaction *tx; uint8_t type_rmd160[21]; if ( coin->kmd_didinit == 0 ) { if ( (coin->kmd_txidfp= kmd_txidinit(coin)) == 0 ) @@ -607,7 +607,8 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) } height = kmd_height(coin); loadheight = coin->kmd_height+1; - while ( loadheight < height-KMD_EXPLORER_LAG ) + lag = (strcmp(coin->symbol,"KMD") == 0 ? KMD_EXPLORER_LAG : 1); + while ( loadheight < height-lag ) { flag = 0; if ( (loadheight % 10000) == 0 ) From f2a479a9c39ee021141090d45adb19fef03f730d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 25 Feb 2017 21:44:23 +0200 Subject: [PATCH 177/495] Test --- .gitignore | 6 ++++++ basilisk/basilisk_tradebot.c | 6 +++--- basilisk/tradebots_liquidity.c | 4 ++-- iguana/kmd_lookup.h | 19 +++++++++++++++---- 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index d4442517d..3f5723493 100755 --- a/.gitignore +++ b/.gitignore @@ -141,3 +141,9 @@ iguana/confs/c6faccf6b625bbb826f47b77c3274e985db7b0a47d435f32bea2f7f3724cdd17.ol iguana/marketmaker iguana/secp256k1.o-501dfbfe + +iguana/confs/cc577d22ca76351d495f147b470103392b5f2ab0948e45608623a7d9728e2c6f + +iguana/confs/cc577d22ca76351d495f147b470103392b5f2ab0948e45608623a7d9728e2c6f.old + +iguana/DB/DEX.log diff --git a/basilisk/basilisk_tradebot.c b/basilisk/basilisk_tradebot.c index c182df5b4..7940a4e94 100755 --- a/basilisk/basilisk_tradebot.c +++ b/basilisk/basilisk_tradebot.c @@ -330,9 +330,9 @@ double basilisk_request_listprocess(struct supernet_info *myinfo,struct basilisk aveprice = refprice; if ( fabs(aveprice) < SMALLVAL ) return(0); - printf("avebid %f bidvol %f, aveask %f askvol %f\n",retvals[0],retvals[1],retvals[2],retvals[3]); //retvals[0] = avebid, retvals[1] = bidvol, retvals[2] = aveask, retvals[3] = askvol; destamount = (1.0 - profitmargin) * aveprice * list[0].srcamount; + printf("aveprice %f dest %.8f avebid %f bidvol %f, aveask %f askvol %f\n",aveprice,dstr(destamount),retvals[0],retvals[1],retvals[2],retvals[3]); if ( (retstr= InstantDEX_available(myinfo,iguana_coinfind(list[0].dest),0,0,list[0].dest)) != 0 ) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) @@ -343,8 +343,8 @@ double basilisk_request_listprocess(struct supernet_info *myinfo,struct basilisk free(retstr); } // BTC balance 0.00500000 destamount 0.00041951 aveprice 0.00421619 minamount 0.00020000 - printf("%s balance %.8f destamount %.8f aveprice %.8f minamount %.8f\n",list[0].dest,dstr(balance),dstr(destamount),aveprice,dstr(minamount)); - if ( balance > destamount && (int64_t)destamount > 0 && destamount >= maxamount && destamount >= minamount ) + printf("%s balance %.8f destamount %.8f aveprice %.8f maxamount %.8f minamount %.8f\n",list[0].dest,dstr(balance),dstr(destamount),aveprice,dstr(maxamount),dstr(minamount)); + if ( balance > destamount && (int64_t)destamount > 0 && destamount >= minamount ) // max? { metric = 1.; *issueR = list[0]; diff --git a/basilisk/tradebots_liquidity.c b/basilisk/tradebots_liquidity.c index 8ba0b92de..cc38a2369 100755 --- a/basilisk/tradebots_liquidity.c +++ b/basilisk/tradebots_liquidity.c @@ -1010,7 +1010,7 @@ double _default_liquidity_active(struct supernet_info *myinfo,double *refpricep, dir = 1; else if ( strcmp(rel,refli.base) == 0 && strcmp(base,refli.rel) == 0 ) dir = -1; - else dir = 0; + else continue; if ( exchange[0] != 0 && refli.exchange[0] != 0 && strcmp(exchange,refli.exchange) != 0 ) { printf("continue %s %s/%s [%d] dir.%d vs %s %s/%s\n",exchange,base,rel,i,dir,refli.exchange,refli.base,refli.rel); @@ -1164,7 +1164,7 @@ void tradebots_processprices(struct supernet_info *myinfo,struct exchange_info * //printf("reject %s %s/%s\n",exchange,base,rel); return; } - //printf("%s %s/%s bids.%d asks.%d\n",exchange->name,base,rel,numbids,numasks); + printf("%s %s/%s bids.%d asks.%d\n",exchange->name,base,rel,numbids,numasks); if ( numbids > 0 && (volume= bidasks[0].volume) > 0. && (profitmargin= tradebot_liquidity_active(myinfo,&price,exchange->name,base,rel,volume)) > 0. ) { diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 9955ddf28..bce6c3976 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -124,6 +124,7 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi void kmd_transactionvout(struct iguana_info *coin,struct kmd_transactionhh *ptr,int32_t vout,uint64_t amount,uint8_t type_rmd160[21],bits256 spendtxid,int32_t spendvini) { struct kmd_addresshh *addr; struct kmd_transaction *tx = 0; + if ( 0 ) { char coinaddr[64],str[65]; bitcoin_address(coinaddr,type_rmd160[0],&type_rmd160[1],20); @@ -304,9 +305,9 @@ cJSON *kmd_transactionjson(int32_t height,struct kmd_transactionhh *ptr,char *ty return(obj); } -cJSON *kmd_unspentjson(struct iguana_info *coin,int32_t height,struct kmd_transaction *tx,int32_t vout) +cJSON *kmd_unspentjson(struct supernet_info *myinfo,struct iguana_info *coin,int32_t height,struct kmd_transaction *tx,int32_t vout,int32_t is_listunspent) { - cJSON *item = cJSON_CreateObject(); + char *script; cJSON *txout,*item = cJSON_CreateObject(); jaddstr(item,"type","received"); jaddnum(item,"height",tx->height); jaddnum(item,"timestamp",tx->timestamp); @@ -315,6 +316,16 @@ cJSON *kmd_unspentjson(struct iguana_info *coin,int32_t height,struct kmd_transa jaddnum(item,"amount",dstr(tx->vouts[vout].amount)); if ( strcmp(coin->symbol,"KMD") == 0 ) jaddnum(item,"interest",dstr(_iguana_interest((uint32_t)time(NULL),coin->longestchain,tx->timestamp,tx->vouts[vout].amount))); + if ( coin->FULLNODE < 0 && is_listunspent != 0 ) + { + //char str[65]; printf("get spendscriptstr for %s/v%d\n",bits256_str(str,tx->txid),vout); + if ( (txout= dpow_gettxout(myinfo,coin,tx->txid,vout)) != 0 ) + { + if ( (script= jstr(txout,"scriptPubKey")) != 0 ) + jaddstr(item,"scriptPubKey",script); + free_json(txout); + } + } return(item); } @@ -412,14 +423,14 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode,cJSO //if ( fulltx == 0 ) { if ( mode == 0 ) - jaddi(array,kmd_unspentjson(coin,coin->kmd_height,ptr->tx,i)); + jaddi(array,kmd_unspentjson(coin,coin->kmd_height,ptr->tx,i,1)); else if ( mode == 1 ) jaddi(array,kmd_spentjson(coin->kmd_height,ptr->tx,i,spent)); else if ( mode == 2 ) { if ( spent != 0 ) jaddi(array,kmd_spentjson(coin->kmd_height,ptr->tx,i,spent)); - else jaddi(array,kmd_unspentjson(coin,coin->kmd_height,ptr->tx,i)); + else jaddi(array,kmd_unspentjson(coin,coin->kmd_height,ptr->tx,i,0)); } } /*else if ( flag == 0 ) From 3e404c6f883048fd9d8daca49a4e0c4c40292cc5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 25 Feb 2017 21:49:25 +0200 Subject: [PATCH 178/495] Test --- iguana/dPoW.h | 8 ++++---- iguana/dpow/dpow_network.c | 4 ++-- iguana/dpow/dpow_rpc.c | 4 ++-- iguana/iguana_notary.c | 8 ++++---- iguana/kmd_lookup.h | 30 +++++++++++++++--------------- 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index c7934feeb..e6e8f9d80 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -195,11 +195,11 @@ cJSON *dpow_checkaddress(struct supernet_info *myinfo,struct iguana_info *coin,c void dex_channelsend(struct supernet_info *myinfo,bits256 srchash,bits256 desthash,uint32_t channel,uint32_t msgid,uint8_t *data,int32_t datalen); void kmd_bitcoinscan(); -cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr); +cJSON *kmd_getbalance(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr); struct iguana_info *iguana_coinfind(char *symbol); -cJSON *kmd_listtransactions(struct iguana_info *coin,char *coinaddr,int32_t count,int32_t skip); -cJSON *kmd_listunspent(struct iguana_info *coin,char *coinaddr); -cJSON *kmd_listspent(struct iguana_info *coin,char *coinaddr); +cJSON *kmd_listtransactions(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr,int32_t count,int32_t skip); +cJSON *kmd_listunspent(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr); +cJSON *kmd_listspent(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr); cJSON *kmd_gettxin(struct iguana_info *coin,bits256 txid,int32_t vout); cJSON *dpow_listspent(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr); diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index f4fb236f3..a6829e062 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -550,7 +550,7 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d } else if ( dexreq.func == 'u' ) { - if ( (retjson= kmd_listunspent(coin,(char *)&dexp->packet[datalen])) != 0 ) + if ( (retjson= kmd_listunspent(myinfo,coin,(char *)&dexp->packet[datalen])) != 0 ) { dpow_randipbits(myinfo,coin,retjson); retstr = jprint(retjson,1); @@ -590,7 +590,7 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d else if ( dexreq.func == '2' ) { //printf("call list.(%s %d %d)\n",(char *)&dexp->packet[datalen],dexreq.shortarg,dexreq.intarg); - if ( (retjson= kmd_listtransactions(coin,(char *)&dexp->packet[datalen],dexreq.shortarg,dexreq.intarg)) != 0 ) + if ( (retjson= kmd_listtransactions(myinfo,coin,(char *)&dexp->packet[datalen],dexreq.shortarg,dexreq.intarg)) != 0 ) { dpow_randipbits(myinfo,coin,retjson); retstr = jprint(retjson,1); diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index dae988c04..e73e17ee6 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -408,7 +408,7 @@ cJSON *dpow_listunspent(struct supernet_info *myinfo,struct iguana_info *coin,ch cJSON *dpow_listspent(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr) { if ( myinfo->DEXEXPLORER != 0 ) - return(kmd_listspent(coin,coinaddr)); + return(kmd_listspent(myinfo,coin,coinaddr)); else { return(0); @@ -418,7 +418,7 @@ cJSON *dpow_listspent(struct supernet_info *myinfo,struct iguana_info *coin,char cJSON *dpow_getbalance(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr) { if ( myinfo->DEXEXPLORER != 0 ) - return(kmd_getbalance(coin,coinaddr)); + return(kmd_getbalance(myinfo,coin,coinaddr)); else { return(0); diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index a7404948d..c9532e3c0 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -791,7 +791,7 @@ TWO_STRINGS(dex,listunspent2,symbol,address) coin->DEXEXPLORER = myinfo->DEXEXPLORER * myinfo->IAMNOTARY * (iguana_isnotarychain(coin->symbol) >= 0); if ( strcmp(coin->symbol,"BTC") == 0 || coin->DEXEXPLORER == 0 ) return(clonestr("[]")); - if ( (retjson= kmd_listunspent(coin,address)) != 0 ) + if ( (retjson= kmd_listunspent(myinfo,coin,address)) != 0 ) return(jprint(retjson,1)); } } @@ -811,7 +811,7 @@ TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions2,symbol,address,count,skip) coin->DEXEXPLORER = myinfo->DEXEXPLORER * myinfo->IAMNOTARY * (iguana_isnotarychain(coin->symbol) >= 0); if ( strcmp(coin->symbol,"BTC") == 0 || coin->DEXEXPLORER == 0 ) return(clonestr("[]")); - if ( (retjson= kmd_listtransactions(coin,address,count,skip)) != 0 ) + if ( (retjson= kmd_listtransactions(myinfo,coin,address,count,skip)) != 0 ) return(jprint(retjson,1)); } } @@ -839,7 +839,7 @@ TWO_STRINGS(dex,listspent,symbol,address) if ( myinfo->DEXEXPLORER != 0 ) { if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 && coin->DEXEXPLORER != 0 ) - return(jprint(kmd_listspent(coin,address),1)); + return(jprint(kmd_listspent(myinfo,coin,address),1)); if ( coin != 0 ) coin->DEXEXPLORER = myinfo->DEXEXPLORER * myinfo->IAMNOTARY * (iguana_isnotarychain(coin->symbol) >= 0); } @@ -854,7 +854,7 @@ TWO_STRINGS(dex,getbalance,symbol,address) if ( myinfo->DEXEXPLORER != 0 ) { if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 && coin->DEXEXPLORER != 0 ) - return(jprint(kmd_getbalance(coin,address),1)); + return(jprint(kmd_getbalance(myinfo,coin,address),1)); if ( coin != 0 ) coin->DEXEXPLORER = myinfo->DEXEXPLORER * myinfo->IAMNOTARY * (iguana_isnotarychain(coin->symbol) >= 0); } diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index bce6c3976..db3798dfc 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -389,7 +389,7 @@ cJSON *kmd_gettxin(struct iguana_info *coin,bits256 txid,int32_t vout) return(cJSON_Parse("{\"error\":\"txid not found\"}")); } -cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode,cJSON *array) +cJSON *kmd_listaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr,int32_t mode,cJSON *array) { struct kmd_addresshh *addr; struct kmd_transactionhh *ptr=0,*spent,*prev=0; uint8_t type_rmd160[21]; int32_t i; if ( array == 0 ) @@ -423,14 +423,14 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode,cJSO //if ( fulltx == 0 ) { if ( mode == 0 ) - jaddi(array,kmd_unspentjson(coin,coin->kmd_height,ptr->tx,i,1)); + jaddi(array,kmd_unspentjson(myinfo,coin,coin->kmd_height,ptr->tx,i,1)); else if ( mode == 1 ) jaddi(array,kmd_spentjson(coin->kmd_height,ptr->tx,i,spent)); else if ( mode == 2 ) { if ( spent != 0 ) jaddi(array,kmd_spentjson(coin->kmd_height,ptr->tx,i,spent)); - else jaddi(array,kmd_unspentjson(coin,coin->kmd_height,ptr->tx,i,0)); + else jaddi(array,kmd_unspentjson(myinfo,coin,coin->kmd_height,ptr->tx,i,0)); } } /*else if ( flag == 0 ) @@ -466,34 +466,34 @@ cJSON *kmd_listaddress(struct iguana_info *coin,char *coinaddr,int32_t mode,cJSO return(array); } -cJSON *kmd_listunspent(struct iguana_info *coin,char *coinaddr) +cJSON *kmd_listunspent(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr) { - return(kmd_listaddress(coin,coinaddr,0,0)); + return(kmd_listaddress(myinfo,coin,coinaddr,0,0)); } -cJSON *kmd_listspent(struct iguana_info *coin,char *coinaddr) +cJSON *kmd_listspent(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr) { - return(kmd_listaddress(coin,coinaddr,1,0)); + return(kmd_listaddress(myinfo,coin,coinaddr,1,0)); } -cJSON *kmd_listtransactions(struct iguana_info *coin,char *coinaddr,int32_t count,int32_t skip) +cJSON *kmd_listtransactions(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr,int32_t count,int32_t skip) { cJSON *array = cJSON_CreateArray(); //if ( (height= kmd_height(coin)) > coin->kmd_height+KMD_EXPLORER_LAG ) // return(cJSON_Parse("[]")); if ( count == 0 ) count = 100; - array = kmd_listaddress(coin,coinaddr,0,0); - array = kmd_listaddress(coin,coinaddr,1,array); + array = kmd_listaddress(myinfo,coin,coinaddr,0,0); + array = kmd_listaddress(myinfo,coin,coinaddr,1,array); return(array); } -int64_t _kmd_getbalance(struct iguana_info *coin,char *coinaddr,uint64_t *receivedp,uint64_t *sentp,uint64_t *interestp) +int64_t _kmd_getbalance(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr,uint64_t *receivedp,uint64_t *sentp,uint64_t *interestp) { int32_t iter,i,n; cJSON *array,*item; uint64_t value; for (iter=1; iter<=2; iter++) { - if ( (array= kmd_listaddress(coin,coinaddr,iter,0)) != 0 ) + if ( (array= kmd_listaddress(myinfo,coin,coinaddr,iter,0)) != 0 ) { if ( (n= cJSON_GetArraySize(array)) > 0 ) { @@ -516,7 +516,7 @@ int64_t _kmd_getbalance(struct iguana_info *coin,char *coinaddr,uint64_t *receiv return(*receivedp - *sentp); } -cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) +cJSON *kmd_getbalance(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr) { cJSON *retjson; double netbalance=0.,fbalance; uint64_t interest,i,s,r,sent=0,received=0; int64_t balance=0; struct kmd_addresshh *addr,*tmp; char address[64]; int32_t height = coin->kmd_height+1; retjson = cJSON_CreateObject(); @@ -528,7 +528,7 @@ cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) { bitcoin_address(address,addr->type_rmd160[0],&addr->type_rmd160[1],20); s = r = i = 0; - balance += _kmd_getbalance(coin,address,&r,&s,&i); + balance += _kmd_getbalance(myinfo,coin,address,&r,&s,&i); netbalance += dstr(r); netbalance -= dstr(s); if ( (r - s) > 100000*SATOSHIDEN ) @@ -542,7 +542,7 @@ cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) } else { - balance = _kmd_getbalance(coin,coinaddr,&received,&sent,&interest); + balance = _kmd_getbalance(myinfo,coin,coinaddr,&received,&sent,&interest); netbalance = dstr(balance); } jaddstr(retjson,"result","success"); From f0a1e2d3fc1573c0551466311f3697d8448a80c0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 25 Feb 2017 22:05:00 +0200 Subject: [PATCH 179/495] Test --- iguana/dpow/dpow_network.c | 2 ++ iguana/kmd_lookup.h | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index a6829e062..1076919f0 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -408,12 +408,14 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 printf("%d: subscribe connect (%s)\n",myinfo->numdexipbits,str); } } +#ifndef __APPLE__ if ( (rand() % 100) < 40 ) { nanomsg_tcpname(0,str,ipaddr,REP_SOCK); nn_connect(myinfo->reqsock,str); printf("%d: req connect (%s)\n",myinfo->numdexipbits,str); } +#endif } } if ( freeptr != 0 ) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index db3798dfc..ddf8d5acb 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -468,7 +468,10 @@ cJSON *kmd_listaddress(struct supernet_info *myinfo,struct iguana_info *coin,cha cJSON *kmd_listunspent(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr) { - return(kmd_listaddress(myinfo,coin,coinaddr,0,0)); + cJSON *retjson; + retjson = kmd_listaddress(myinfo,coin,coinaddr,0,0); + printf("KMD utxos.(%s)\n",jprint(retjson,0)); + return(retjson); } cJSON *kmd_listspent(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr) From 1c978acca4d8d7935436478f7261313140ce2aee Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 25 Feb 2017 22:09:33 +0200 Subject: [PATCH 180/495] Test --- iguana/kmd_lookup.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index ddf8d5acb..c37798c1e 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -316,9 +316,9 @@ cJSON *kmd_unspentjson(struct supernet_info *myinfo,struct iguana_info *coin,int jaddnum(item,"amount",dstr(tx->vouts[vout].amount)); if ( strcmp(coin->symbol,"KMD") == 0 ) jaddnum(item,"interest",dstr(_iguana_interest((uint32_t)time(NULL),coin->longestchain,tx->timestamp,tx->vouts[vout].amount))); - if ( coin->FULLNODE < 0 && is_listunspent != 0 ) + if ( is_listunspent != 0 ) { - //char str[65]; printf("get spendscriptstr for %s/v%d\n",bits256_str(str,tx->txid),vout); + char str[65]; printf("get spendscriptstr for %s/v%d\n",bits256_str(str,tx->txid),vout); if ( (txout= dpow_gettxout(myinfo,coin,tx->txid,vout)) != 0 ) { if ( (script= jstr(txout,"scriptPubKey")) != 0 ) From 3f2300f76bafe6291f0e1dd9635ce5a13a7921f8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 25 Feb 2017 22:15:08 +0200 Subject: [PATCH 181/495] Test --- iguana/dpow/dpow_rpc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index e73e17ee6..12a4667a9 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -324,6 +324,7 @@ cJSON *dpow_gettxout(struct supernet_info *myinfo,struct iguana_info *coin,bits2 json = cJSON_Parse(retstr); free(retstr); } + printf("dpow_gettxout.(%s)\n",retstr); return(json); } From 79d2982e64c026f9b5259abb8a757bb4810a69d5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 25 Feb 2017 22:19:57 +0200 Subject: [PATCH 182/495] Test --- iguana/iguana_payments.c | 2 +- iguana/kmd_lookup.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index f16e184a8..f593034b4 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -359,7 +359,7 @@ uint64_t _iguana_interest(uint32_t now,int32_t chainheight,uint32_t txlocktime,u numerator = (value * KOMODO_INTEREST); interest = (numerator / denominator) / SATOSHIDEN; } - fprintf(stderr,"komodo_interest.%d %lld %.8f nLockTime.%u tiptime.%u minutes.%d interest %lld %.8f (%llu / %llu)\n",chainheight,(long long)value,(double)value/SATOSHIDEN,txlocktime,now,minutes,(long long)interest,(double)interest/SATOSHIDEN,(long long)numerator,(long long)denominator); + //fprintf(stderr,"komodo_interest.%d %lld %.8f nLockTime.%u tiptime.%u minutes.%d interest %lld %.8f (%llu / %llu)\n",chainheight,(long long)value,(double)value/SATOSHIDEN,txlocktime,now,minutes,(long long)interest,(double)interest/SATOSHIDEN,(long long)numerator,(long long)denominator); } return(interest); } diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index c37798c1e..e47e3965a 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -307,7 +307,7 @@ cJSON *kmd_transactionjson(int32_t height,struct kmd_transactionhh *ptr,char *ty cJSON *kmd_unspentjson(struct supernet_info *myinfo,struct iguana_info *coin,int32_t height,struct kmd_transaction *tx,int32_t vout,int32_t is_listunspent) { - char *script; cJSON *txout,*item = cJSON_CreateObject(); + char *script; cJSON *sobj,*txout,*item = cJSON_CreateObject(); jaddstr(item,"type","received"); jaddnum(item,"height",tx->height); jaddnum(item,"timestamp",tx->timestamp); @@ -321,7 +321,7 @@ cJSON *kmd_unspentjson(struct supernet_info *myinfo,struct iguana_info *coin,int char str[65]; printf("get spendscriptstr for %s/v%d\n",bits256_str(str,tx->txid),vout); if ( (txout= dpow_gettxout(myinfo,coin,tx->txid,vout)) != 0 ) { - if ( (script= jstr(txout,"scriptPubKey")) != 0 ) + if ( (sobj= jobj(txout,"scriptPubKey")) != 0 && (script= jstr(txout,"hex")) != 0 ) jaddstr(item,"scriptPubKey",script); free_json(txout); } From 22ea6f247f806659d192c4b430d685a79080778b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 25 Feb 2017 22:20:57 +0200 Subject: [PATCH 183/495] Test --- iguana/dpow/dpow_rpc.c | 2 +- iguana/kmd_lookup.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 12a4667a9..4f344119c 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -324,7 +324,7 @@ cJSON *dpow_gettxout(struct supernet_info *myinfo,struct iguana_info *coin,bits2 json = cJSON_Parse(retstr); free(retstr); } - printf("dpow_gettxout.(%s)\n",retstr); + //printf("dpow_gettxout.(%s)\n",retstr); return(json); } diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index e47e3965a..8c643b596 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -318,7 +318,7 @@ cJSON *kmd_unspentjson(struct supernet_info *myinfo,struct iguana_info *coin,int jaddnum(item,"interest",dstr(_iguana_interest((uint32_t)time(NULL),coin->longestchain,tx->timestamp,tx->vouts[vout].amount))); if ( is_listunspent != 0 ) { - char str[65]; printf("get spendscriptstr for %s/v%d\n",bits256_str(str,tx->txid),vout); + //char str[65]; printf("get spendscriptstr for %s/v%d\n",bits256_str(str,tx->txid),vout); if ( (txout= dpow_gettxout(myinfo,coin,tx->txid,vout)) != 0 ) { if ( (sobj= jobj(txout,"scriptPubKey")) != 0 && (script= jstr(txout,"hex")) != 0 ) From d91ae332da3deae21116603d72bb0aad8d23be90 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 25 Feb 2017 22:24:36 +0200 Subject: [PATCH 184/495] Test --- iguana/kmd_lookup.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 8c643b596..7854e6481 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -321,7 +321,8 @@ cJSON *kmd_unspentjson(struct supernet_info *myinfo,struct iguana_info *coin,int //char str[65]; printf("get spendscriptstr for %s/v%d\n",bits256_str(str,tx->txid),vout); if ( (txout= dpow_gettxout(myinfo,coin,tx->txid,vout)) != 0 ) { - if ( (sobj= jobj(txout,"scriptPubKey")) != 0 && (script= jstr(txout,"hex")) != 0 ) + //printf("got.(%s)\n",jprint(txout,0)); + if ( (sobj= jobj(txout,"scriptPubKey")) != 0 && (script= jstr(sobj,"hex")) != 0 ) jaddstr(item,"scriptPubKey",script); free_json(txout); } From 97205deed0da674812fd8f427cf5470c9969c04b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 25 Feb 2017 22:28:04 +0200 Subject: [PATCH 185/495] Test --- iguana/kmd_lookup.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 7854e6481..5ed99a79b 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -471,7 +471,7 @@ cJSON *kmd_listunspent(struct supernet_info *myinfo,struct iguana_info *coin,cha { cJSON *retjson; retjson = kmd_listaddress(myinfo,coin,coinaddr,0,0); - printf("KMD utxos.(%s)\n",jprint(retjson,0)); + //printf("KMD utxos.(%s)\n",jprint(retjson,0)); return(retjson); } From b6c279cdf86558bfeee0d48ce1a95b6ab192dc40 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 25 Feb 2017 22:34:53 +0200 Subject: [PATCH 186/495] Test --- iguana/dpow/dpow_network.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 1076919f0..70fd01370 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -991,7 +991,7 @@ char *_dex_listunspentarg(struct supernet_info *myinfo,char *symbol,char *addres dexreq.func = arg; if ( (retstr= _dex_sendrequeststr(myinfo,&dexreq,address,0,1,"")) != 0 ) { - //printf("UNSPENTS.(%s)\n",retstr); + printf("UNSPENTS.(%s)\n",retstr); } return(_dex_arrayreturn(retstr)); } From d2018041a79a4eed46d1c96cec5783f82742b4ba Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 25 Feb 2017 22:50:03 +0200 Subject: [PATCH 187/495] Test --- iguana/dpow/dpow_network.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 70fd01370..3da2d2af4 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -556,6 +556,7 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d { dpow_randipbits(myinfo,coin,retjson); retstr = jprint(retjson,1); + //printf("RETURN.(%s)\n",retstr); } } else if ( dexreq.func == 's' ) @@ -821,7 +822,7 @@ char *_dex_gettxin(struct supernet_info *myinfo,char *symbol,bits256 txid,int32_ dexreq.hash = txid; dexreq.shortarg = vout; dexreq.func = 'x'; - return(_dex_sendrequest(myinfo,&dexreq,3,"value")); + return(_dex_sendrequest(myinfo,&dexreq,1,"")); } char *_dex_kvupdate(struct supernet_info *myinfo,char *symbol,char *key,char *value,int32_t flags) @@ -991,7 +992,7 @@ char *_dex_listunspentarg(struct supernet_info *myinfo,char *symbol,char *addres dexreq.func = arg; if ( (retstr= _dex_sendrequeststr(myinfo,&dexreq,address,0,1,"")) != 0 ) { - printf("UNSPENTS.(%s)\n",retstr); + //printf("UNSPENTS.(%s)\n",retstr); } return(_dex_arrayreturn(retstr)); } From 8a255743a5b2ba0efa8f906168f49b411f828b60 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 26 Feb 2017 16:56:28 +0200 Subject: [PATCH 188/495] Test --- iguana/dpow/dpow_network.c | 4 ++-- iguana/iguana777.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 3da2d2af4..bf2a0441b 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -82,8 +82,8 @@ void dex_init(struct supernet_info *myinfo) while ( 1 ) { j = (rand() % (sizeof(seeds)/sizeof(*seeds))); - if ( i == 0 ) - j = 0; + if ( i < 2 ) + j = i; if ( ((1 << j) & mask) == 0 ) break; } diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 5ccae82ba..aba70cf83 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -133,7 +133,7 @@ struct supernet_info struct liquidity_info linfos[512]; cJSON *liquidity_currencies; struct pending_trade *trades; portable_mutex_t pending_mutex; struct komodo_notaries NOTARY; char seedipaddr[64]; uint32_t dpowipbits[128]; int32_t numdpowipbits; portable_mutex_t notarymutex,dpowmutex; - char dexseed_ipaddrs[8][64]; uint32_t dexipbits[128]; int32_t numdexipbits; portable_mutex_t dexmutex; + char dexseed_ipaddrs[3][64]; uint32_t dexipbits[128]; int32_t numdexipbits; portable_mutex_t dexmutex; // compatibility bits256 pangea_category,instantdex_category; uint8_t logs[256],exps[510]; From d0b62f7ab668e68813bd73822bd7c8ee5cc5f065 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 26 Feb 2017 16:58:29 +0200 Subject: [PATCH 189/495] Test --- iguana/dpow/dpow_network.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index bf2a0441b..477e9a08d 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -287,8 +287,8 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 { timeout = 100; nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - timeout = 3000; - nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); + //timeout = 3000; + //nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); timeout = 3000; nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); for (i=0; idexseed_ipaddrs)/sizeof(*myinfo->dexseed_ipaddrs); i++) @@ -318,8 +318,8 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 nn_setsockopt(subsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(subsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); printf("CLIENT sockets req.%d sub.%d\n",reqsock,subsock); - timeout = 3000; - nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); + //timeout = 3000; + //nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); timeout = 3000; nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); } From d189e2f8b39a3f70cdb22f7a8304570c7c86a5af Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 26 Feb 2017 17:16:37 +0200 Subject: [PATCH 190/495] Test --- iguana/dpow/dpow_network.c | 16 ++++++++-------- iguana/iguana777.h | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 477e9a08d..5df86d21b 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -149,7 +149,7 @@ int32_t signed_nn_recv(void **freeptrp,void *ctx,uint8_t notaries[64][33],int32_ { //for (i=0; ipacketlen == recvbytes-sizeof(*sigpacket)); + printf(" <- RECV.%d crc.%08x cmp.%d\n",recvbytes,calc_crc32(0,(void *)sigpacket,recvbytes),sigpacket->packetlen == recvbytes-sizeof(*sigpacket)); } if ( sigpacket != 0 && recvbytes > sizeof(*sigpacket) && sigpacket->packetlen == recvbytes-sizeof(*sigpacket) ) { @@ -285,11 +285,11 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 { if ( reqsock >= 0 ) { - timeout = 100; + timeout = 1000; nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - //timeout = 3000; - //nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); - timeout = 3000; + timeout = 5000; + nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); + timeout = 10000; nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); for (i=0; idexseed_ipaddrs)/sizeof(*myinfo->dexseed_ipaddrs); i++) if ( nn_connect(reqsock,nanomsg_tcpname(0,str,myinfo->dexseed_ipaddrs[i],REP_SOCK)) < 0 ) @@ -318,9 +318,9 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 nn_setsockopt(subsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(subsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); printf("CLIENT sockets req.%d sub.%d\n",reqsock,subsock); - //timeout = 3000; - //nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); - timeout = 3000; + timeout = 5000; + nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); + timeout = 10000; nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); } } diff --git a/iguana/iguana777.h b/iguana/iguana777.h index aba70cf83..29fa7195c 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -133,7 +133,7 @@ struct supernet_info struct liquidity_info linfos[512]; cJSON *liquidity_currencies; struct pending_trade *trades; portable_mutex_t pending_mutex; struct komodo_notaries NOTARY; char seedipaddr[64]; uint32_t dpowipbits[128]; int32_t numdpowipbits; portable_mutex_t notarymutex,dpowmutex; - char dexseed_ipaddrs[3][64]; uint32_t dexipbits[128]; int32_t numdexipbits; portable_mutex_t dexmutex; + char dexseed_ipaddrs[2][64]; uint32_t dexipbits[128]; int32_t numdexipbits; portable_mutex_t dexmutex; // compatibility bits256 pangea_category,instantdex_category; uint8_t logs[256],exps[510]; From e472a38b10b5870f1df35e25f21363466b5de5c9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 26 Feb 2017 17:17:18 +0200 Subject: [PATCH 191/495] Test --- iguana/dpow/dpow_network.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 5df86d21b..4bb5b6a9d 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -149,7 +149,7 @@ int32_t signed_nn_recv(void **freeptrp,void *ctx,uint8_t notaries[64][33],int32_ { //for (i=0; ipacketlen == recvbytes-sizeof(*sigpacket)); + //printf(" <- RECV.%d crc.%08x cmp.%d\n",recvbytes,calc_crc32(0,(void *)sigpacket,recvbytes),sigpacket->packetlen == recvbytes-sizeof(*sigpacket)); } if ( sigpacket != 0 && recvbytes > sizeof(*sigpacket) && sigpacket->packetlen == recvbytes-sizeof(*sigpacket) ) { From 8f390bf000af12fb7792d3c6ea38ab3628f9ee38 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 26 Feb 2017 17:19:09 +0200 Subject: [PATCH 192/495] Test --- iguana/dpow/dpow_network.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 4bb5b6a9d..c493ef03d 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -408,14 +408,14 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 printf("%d: subscribe connect (%s)\n",myinfo->numdexipbits,str); } } -#ifndef __APPLE__ +//#ifndef __APPLE__ if ( (rand() % 100) < 40 ) { nanomsg_tcpname(0,str,ipaddr,REP_SOCK); nn_connect(myinfo->reqsock,str); printf("%d: req connect (%s)\n",myinfo->numdexipbits,str); } -#endif +//#endif } } if ( freeptr != 0 ) From 9ef676bdbdebe0b390fc054cc40b5bb37b49994d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 26 Feb 2017 17:45:58 +0200 Subject: [PATCH 193/495] Test --- .gitignore | 2 ++ iguana/iguana777.h | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3f5723493..7a7e1c423 100755 --- a/.gitignore +++ b/.gitignore @@ -147,3 +147,5 @@ iguana/confs/cc577d22ca76351d495f147b470103392b5f2ab0948e45608623a7d9728e2c6f iguana/confs/cc577d22ca76351d495f147b470103392b5f2ab0948e45608623a7d9728e2c6f.old iguana/DB/DEX.log + +iguana/iguana_notary.o-54f98cc3 diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 29fa7195c..5ccae82ba 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -133,7 +133,7 @@ struct supernet_info struct liquidity_info linfos[512]; cJSON *liquidity_currencies; struct pending_trade *trades; portable_mutex_t pending_mutex; struct komodo_notaries NOTARY; char seedipaddr[64]; uint32_t dpowipbits[128]; int32_t numdpowipbits; portable_mutex_t notarymutex,dpowmutex; - char dexseed_ipaddrs[2][64]; uint32_t dexipbits[128]; int32_t numdexipbits; portable_mutex_t dexmutex; + char dexseed_ipaddrs[8][64]; uint32_t dexipbits[128]; int32_t numdexipbits; portable_mutex_t dexmutex; // compatibility bits256 pangea_category,instantdex_category; uint8_t logs[256],exps[510]; From 3f60bfa7bad8acff204a066efe4d305d2a4b46c3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 26 Feb 2017 18:40:11 +0200 Subject: [PATCH 194/495] Test --- iguana/iguana_payments.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index f593034b4..82386e4b9 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -366,7 +366,7 @@ uint64_t _iguana_interest(uint32_t now,int32_t chainheight,uint32_t txlocktime,u uint64_t iguana_interest(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t vout,uint64_t value) { - char *retstr; int32_t height; cJSON *retjson; struct iguana_txid T,*tx; uint64_t interest=0; + char *retstr; int32_t height; cJSON *retjson=0; struct iguana_txid T,*tx; uint64_t interest=0; if ( coin->FULLNODE < 0 ) // komodod is running { if ( (retjson= dpow_gettxout(myinfo,coin,txid,vout)) != 0 ) @@ -394,7 +394,7 @@ uint64_t iguana_interest(struct supernet_info *myinfo,struct iguana_info *coin,b interest = _iguana_interest((uint32_t)time(NULL),coin->longestchain,tx->locktime,value); } } - char str[65]; printf("interest for %s.v%d %.8f %.8f\n",bits256_str(str,txid),vout,dstr(value),dstr(interest)); + char str[65]; printf("interest for %s.v%d %.8f %.8f (%s)\n",bits256_str(str,txid),vout,dstr(value),dstr(interest),retjson!=0?jprint(retjson,0):""); return(interest); } From b07fdb9054d814ce4d26f9e3101a17a95725aac5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 26 Feb 2017 20:30:16 +0200 Subject: [PATCH 195/495] Test --- iguana/dpow/dpow_network.c | 4 ++-- iguana/iguana777.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index c493ef03d..4bb5b6a9d 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -408,14 +408,14 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 printf("%d: subscribe connect (%s)\n",myinfo->numdexipbits,str); } } -//#ifndef __APPLE__ +#ifndef __APPLE__ if ( (rand() % 100) < 40 ) { nanomsg_tcpname(0,str,ipaddr,REP_SOCK); nn_connect(myinfo->reqsock,str); printf("%d: req connect (%s)\n",myinfo->numdexipbits,str); } -//#endif +#endif } } if ( freeptr != 0 ) diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 5ccae82ba..471fa8187 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -133,7 +133,7 @@ struct supernet_info struct liquidity_info linfos[512]; cJSON *liquidity_currencies; struct pending_trade *trades; portable_mutex_t pending_mutex; struct komodo_notaries NOTARY; char seedipaddr[64]; uint32_t dpowipbits[128]; int32_t numdpowipbits; portable_mutex_t notarymutex,dpowmutex; - char dexseed_ipaddrs[8][64]; uint32_t dexipbits[128]; int32_t numdexipbits; portable_mutex_t dexmutex; + char dexseed_ipaddrs[1][64]; uint32_t dexipbits[128]; int32_t numdexipbits; portable_mutex_t dexmutex; // compatibility bits256 pangea_category,instantdex_category; uint8_t logs[256],exps[510]; From cabd692e8b26b94e9c6b74fdd5fd8423d95fba00 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 26 Feb 2017 20:36:10 +0200 Subject: [PATCH 196/495] Test --- iguana/dpow/dpow_network.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 4bb5b6a9d..7fe852fa7 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -960,6 +960,7 @@ char *_dex_sendrawtransaction(struct supernet_info *myinfo,char *symbol,char *si char *_dex_importaddress(struct supernet_info *myinfo,char *symbol,char *address) { struct dex_request dexreq; +return(clonestr("{\"error\":\"importaddress deprecated\"}")); memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.func = 'A'; @@ -1262,12 +1263,12 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) } else { - timeout = 500; + timeout = 100; nn_setsockopt(repsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(dexsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); timeout = 10; nn_setsockopt(dexsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - timeout = 500; + timeout = 10; nn_setsockopt(repsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); maxsize = 1024 * 1024; printf("RCVBUF.%d\n",nn_setsockopt(dexsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); @@ -1986,8 +1987,8 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) free(retstr); if ( broadcastflag != 0 ) { - printf("BROADCAST dexp request.[%d]\n",size); - signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->dexsock,dexp,size); + //printf("BROADCAST dexp request.[%d]\n",size); + //signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->dexsock,dexp,size); } } else From 9a193d0a9ddbd9c6613176299544ec38b0764c04 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 26 Feb 2017 20:45:38 +0200 Subject: [PATCH 197/495] Test --- iguana/dpow/dpow_network.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 7fe852fa7..907bae6d7 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -287,9 +287,9 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 { timeout = 1000; nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - timeout = 5000; - nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); - timeout = 10000; + //timeout = 5000; + //nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); + timeout = 1000; nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); for (i=0; idexseed_ipaddrs)/sizeof(*myinfo->dexseed_ipaddrs); i++) if ( nn_connect(reqsock,nanomsg_tcpname(0,str,myinfo->dexseed_ipaddrs[i],REP_SOCK)) < 0 ) @@ -318,8 +318,8 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 nn_setsockopt(subsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(subsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); printf("CLIENT sockets req.%d sub.%d\n",reqsock,subsock); - timeout = 5000; - nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); + //timeout = 5000; + //nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); timeout = 10000; nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); } @@ -1266,6 +1266,7 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) timeout = 100; nn_setsockopt(repsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(dexsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(pubsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); timeout = 10; nn_setsockopt(dexsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); timeout = 10; @@ -1979,11 +1980,11 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) while ( (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) > 0 ) { num++; - //printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); + printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); if ( (retstr= dex_response(&broadcastflag,myinfo,dexp)) != 0 ) { signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,retstr,(int32_t)strlen(retstr)+1); - //printf("send back[%ld]\n",strlen(retstr)+1); + printf("send back[%ld]\n",strlen(retstr)+1); free(retstr); if ( broadcastflag != 0 ) { @@ -1997,13 +1998,13 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) { r = myinfo->dpowipbits[rand() % m]; signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,&r,sizeof(r)); - //printf("REP.%08x <- rand ip m.%d %x\n",dexp->crc32,m,r); + printf("REP.%08x <- rand ip m.%d %x\n",dexp->crc32,m,r); } else printf("illegal state without dpowipbits?\n"); if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->dexsock,dexp,size); signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); - //printf("REP.%08x -> dexbus and pub, t.%d lag.%d\n",dexp->crc32,dexp->timestamp,(int32_t)(time(NULL)-dexp->timestamp)); + printf("REP.%08x -> dexbus and pub, t.%d lag.%d\n",dexp->crc32,dexp->timestamp,(int32_t)(time(NULL)-dexp->timestamp)); dex_packet(myinfo,dexp,size); } else printf("failed dexpacketcheck\n"); } @@ -2015,6 +2016,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( num > 1000 ) break; } + printf("num.%d rep packets\n",num); } portable_mutex_unlock(&myinfo->dpowmutex); return(num); From 0f3522adf3ab2205758ba415f2280239e4e4308c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 26 Feb 2017 20:50:00 +0200 Subject: [PATCH 198/495] Test --- iguana/dpow/dpow_network.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 907bae6d7..70e51cd9f 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1977,6 +1977,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) } if ( myinfo->repsock >= 0 ) // from clients { + num = 0; while ( (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) > 0 ) { num++; From c0ff755abb51f1bd02f72e571e2102b708ae3151 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 26 Feb 2017 21:04:51 +0200 Subject: [PATCH 199/495] Test --- basilisk/basilisk.c | 5 +- iguana/dpow/dpow_network.c | 195 ++++++++++++++++++------------------- 2 files changed, 97 insertions(+), 103 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 1ea4ac20d..4a9a8da34 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -893,7 +893,7 @@ void basilisks_loop(void *arg) basilisk_ping_send(myinfo,relay); } counter++; - //fprintf(stderr,"E "); + fprintf(stderr,"E "); if ( myinfo->numdpows == 1 ) { iguana_dPoWupdate(myinfo,&myinfo->DPOWS[0]); @@ -903,13 +903,14 @@ void basilisks_loop(void *arg) { dp = &myinfo->DPOWS[counter % myinfo->numdpows]; iguana_dPoWupdate(myinfo,dp); - if ( (counter % myinfo->numdpows) != 0 ) + //if ( (counter % myinfo->numdpows) != 0 ) { //fprintf(stderr,"F "); iguana_dPoWupdate(myinfo,&myinfo->DPOWS[0]); } endmilli = startmilli + 30; } + fprintf(stderr,"F "); } else { diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 70e51cd9f..d0c0115a8 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1888,7 +1888,7 @@ void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t * int32_t dpow_nanomsg_update(struct supernet_info *myinfo) { - int32_t i,n=0,num=0,size,broadcastflag,firstz = -1; char *retstr; uint32_t crc32,r,m; struct dpow_nanomsghdr *np=0; struct dpow_info *dp; struct dpow_block *bp; struct dex_nanomsghdr *dexp = 0; void *freeptr; + int32_t i,n,num,num2,flags=0,size,iter,broadcastflag,firstz = -1; char *retstr; uint32_t crc32,r,m; struct dpow_nanomsghdr *np=0; struct dpow_info *dp; struct dpow_block *bp; struct dex_nanomsghdr *dexp = 0; void *freeptr; if ( time(NULL) < myinfo->nanoinit+5 || (myinfo->dpowsock < 0 && myinfo->dexsock < 0 && myinfo->repsock < 0) ) return(-1); if ( myinfo->IAMNOTARY != 0 && myinfo->numnotaries <= 0 ) @@ -1897,127 +1897,120 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) printf("INIT with %d notaries\n",myinfo->numnotaries); } portable_mutex_lock(&myinfo->dpowmutex); - /*for (i=0; i<100; i++) + num = num2 = n = 0; + for (iter=0; iter<1000; iter++) { - struct nn_pollfd pfd; - pfd.fd = myinfo->dpowsock; - pfd.events = NN_POLLIN; - if ( nn_poll(&pfd,1,100) > 0 ) - break; - usleep(1000); - }*/ - while ( (size= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dpowsock,&np)) >= 0 && num < 1000 ) - { - num++; - if ( size > 0 ) + if ( (flags & 1) == 0 && (size= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dpowsock,&np)) >= 0 ) { - //fprintf(stderr,"%d ",size); - if ( np->version0 == (DPOW_VERSION & 0xff) && np->version1 == ((DPOW_VERSION >> 8) & 0xff) ) + num++; + if ( size > 0 ) { - //printf("v.%02x %02x datalen.%d size.%d %d vs %d\n",np->version0,np->version1,np->datalen,size,np->datalen,(int32_t)(size - sizeof(*np))); - if ( np->datalen == (size - sizeof(*np)) ) + //fprintf(stderr,"%d ",size); + if ( np->version0 == (DPOW_VERSION & 0xff) && np->version1 == ((DPOW_VERSION >> 8) & 0xff) ) { - crc32 = calc_crc32(0,np->packet,np->datalen); - dp = 0; - for (i=0; inumdpows; i++) + //printf("v.%02x %02x datalen.%d size.%d %d vs %d\n",np->version0,np->version1,np->datalen,size,np->datalen,(int32_t)(size - sizeof(*np))); + if ( np->datalen == (size - sizeof(*np)) ) { - if ( strcmp(np->symbol,myinfo->DPOWS[i].symbol) == 0 ) + crc32 = calc_crc32(0,np->packet,np->datalen); + dp = 0; + for (i=0; inumdpows; i++) { - dp = &myinfo->DPOWS[i]; - break; + if ( strcmp(np->symbol,myinfo->DPOWS[i].symbol) == 0 ) + { + dp = &myinfo->DPOWS[i]; + break; + } } - } - if ( dp != 0 && crc32 == np->crc32 ) - { - if ( i == myinfo->numdpows ) - printf("received nnpacket for (%s)\n",np->symbol); - else + if ( dp != 0 && crc32 == np->crc32 ) { - dpow_ipbitsadd(myinfo,dp,np->ipbits,np->numipbits,np->senderind,np->myipbits); - if ( (bp= dpow_heightfind(myinfo,dp,np->height)) != 0 && bp->state != 0xffffffff && bp->myind >= 0 ) + if ( i == myinfo->numdpows ) + printf("received nnpacket for (%s)\n",np->symbol); + else { - //char str[65]; printf("%s RECV ht.%d ch.%08x (%d) crc32.%08x:%08x datalen.%d:%d firstz.%d i.%d senderind.%d myind.%d\n",bits256_str(str,np->srchash),np->height,np->channel,size,np->crc32,crc32,np->datalen,(int32_t)(size - sizeof(*np)),firstz,i,np->senderind,bp->myind); - if ( np->senderind >= 0 && np->senderind < bp->numnotaries ) + dpow_ipbitsadd(myinfo,dp,np->ipbits,np->numipbits,np->senderind,np->myipbits); + if ( (bp= dpow_heightfind(myinfo,dp,np->height)) != 0 && bp->state != 0xffffffff && bp->myind >= 0 ) { - if ( memcmp(bp->notaries[np->senderind].pubkey+1,np->srchash.bytes,32) == 0 && bits256_nonz(np->srchash) != 0 ) + //char str[65]; printf("%s RECV ht.%d ch.%08x (%d) crc32.%08x:%08x datalen.%d:%d firstz.%d i.%d senderind.%d myind.%d\n",bits256_str(str,np->srchash),np->height,np->channel,size,np->crc32,crc32,np->datalen,(int32_t)(size - sizeof(*np)),firstz,i,np->senderind,bp->myind); + if ( np->senderind >= 0 && np->senderind < bp->numnotaries ) { - if ( bp->isratify == 0 ) - dpow_nanoutxoget(myinfo,dp,bp,&np->notarize,0,np->senderind,np->channel); - else dpow_nanoutxoget(myinfo,dp,bp,&np->ratify,1,np->senderind,np->channel); - dpow_datahandler(myinfo,dp,bp,np->senderind,np->channel,np->height,np->packet,np->datalen); - } else printf("wrong senderind.%d\n",np->senderind); - } - } //else printf("height.%d bp.%p state.%x senderind.%d\n",np->height,bp,bp!=0?bp->state:0,np->senderind); - //dp->crcs[firstz] = crc32; - } - } //else printf("crc error from.%d %x vs %x or no dp.%p [%s]\n",np->senderind,crc32,np->crc32,dp,np->symbol); - } else printf("ignore.%d np->datalen.%d %d (size %d - %ld) [%s]\n",np->senderind,np->datalen,(int32_t)(size-sizeof(*np)),size,sizeof(*np),np->symbol); - } //else printf("wrong version from.%d %02x %02x size.%d [%s]\n",np->senderind,np->version0,np->version1,size,np->symbol); - } //else printf("illegal size.%d\n",size); - if ( freeptr != 0 ) - nn_freemsg(freeptr), np = 0, freeptr = 0; - } //else printf("no packets\n"); - n = 0; - if ( myinfo->dexsock >= 0 ) // from servers - { - while ( (size= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dexsock,&dexp)) > 0 && n < 1000 ) - { - //fprintf(stderr,"%d ",size); - n++; - if ( dex_packetcheck(myinfo,dexp,size) == 0 ) - { - //printf("FROM BUS.%08x -> pub\n",dexp->crc32); - signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); - dex_packet(myinfo,dexp,size); + if ( memcmp(bp->notaries[np->senderind].pubkey+1,np->srchash.bytes,32) == 0 && bits256_nonz(np->srchash) != 0 ) + { + if ( bp->isratify == 0 ) + dpow_nanoutxoget(myinfo,dp,bp,&np->notarize,0,np->senderind,np->channel); + else dpow_nanoutxoget(myinfo,dp,bp,&np->ratify,1,np->senderind,np->channel); + dpow_datahandler(myinfo,dp,bp,np->senderind,np->channel,np->height,np->packet,np->datalen); + } else printf("wrong senderind.%d\n",np->senderind); + } + } //else printf("height.%d bp.%p state.%x senderind.%d\n",np->height,bp,bp!=0?bp->state:0,np->senderind); + //dp->crcs[firstz] = crc32; + } + } //else printf("crc error from.%d %x vs %x or no dp.%p [%s]\n",np->senderind,crc32,np->crc32,dp,np->symbol); + } else printf("ignore.%d np->datalen.%d %d (size %d - %ld) [%s]\n",np->senderind,np->datalen,(int32_t)(size-sizeof(*np)),size,sizeof(*np),np->symbol); + } //else printf("wrong version from.%d %02x %02x size.%d [%s]\n",np->senderind,np->version0,np->version1,size,np->symbol); } - //printf("GOT DEX bus PACKET.%d\n",size); if ( freeptr != 0 ) - nn_freemsg(freeptr), dexp = 0, freeptr = 0; - } - } - if ( myinfo->repsock >= 0 ) // from clients - { - num = 0; - while ( (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) > 0 ) + nn_freemsg(freeptr), np = 0, freeptr = 0; + } else flag |= 1; + if ( myinfo->dexsock >= 0 ) // from servers { - num++; - printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); - if ( (retstr= dex_response(&broadcastflag,myinfo,dexp)) != 0 ) + if ( (flags & 2) == 0 && (size= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dexsock,&dexp)) > 0 ) { - signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,retstr,(int32_t)strlen(retstr)+1); - printf("send back[%ld]\n",strlen(retstr)+1); - free(retstr); - if ( broadcastflag != 0 ) + //fprintf(stderr,"%d ",size); + n++; + if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { - //printf("BROADCAST dexp request.[%d]\n",size); - //signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->dexsock,dexp,size); + //printf("FROM BUS.%08x -> pub\n",dexp->crc32); + signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); + dex_packet(myinfo,dexp,size); } - } - else + //printf("GOT DEX bus PACKET.%d\n",size); + if ( freeptr != 0 ) + nn_freemsg(freeptr), dexp = 0, freeptr = 0; + } else flags |= 2; + } + if ( myinfo->repsock >= 0 ) // from clients + { + if ( (flags & 4) == 0 && (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) > 0 ) { - if ( (m= myinfo->numdpowipbits) > 0 ) + num2++; + printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); + if ( (retstr= dex_response(&broadcastflag,myinfo,dexp)) != 0 ) { - r = myinfo->dpowipbits[rand() % m]; - signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,&r,sizeof(r)); - printf("REP.%08x <- rand ip m.%d %x\n",dexp->crc32,m,r); - } else printf("illegal state without dpowipbits?\n"); - if ( dex_packetcheck(myinfo,dexp,size) == 0 ) + signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,retstr,(int32_t)strlen(retstr)+1); + printf("send back[%ld]\n",strlen(retstr)+1); + free(retstr); + if ( broadcastflag != 0 ) + { + //printf("BROADCAST dexp request.[%d]\n",size); + //signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->dexsock,dexp,size); + } + } + else { - signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->dexsock,dexp,size); - signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); - printf("REP.%08x -> dexbus and pub, t.%d lag.%d\n",dexp->crc32,dexp->timestamp,(int32_t)(time(NULL)-dexp->timestamp)); - dex_packet(myinfo,dexp,size); - } else printf("failed dexpacketcheck\n"); - } - //printf("GOT DEX rep PACKET.%d\n",size); - //if ( freeptr != 0 ) - // nn_freemsg(freeptr), dexp = 0, freeptr = 0; - if ( dexp != 0 ) - nn_freemsg(dexp), dexp = 0; - if ( num > 1000 ) - break; + if ( (m= myinfo->numdpowipbits) > 0 ) + { + r = myinfo->dpowipbits[rand() % m]; + signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,&r,sizeof(r)); + printf("REP.%08x <- rand ip m.%d %x\n",dexp->crc32,m,r); + } else printf("illegal state without dpowipbits?\n"); + if ( dex_packetcheck(myinfo,dexp,size) == 0 ) + { + signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->dexsock,dexp,size); + signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); + printf("REP.%08x -> dexbus and pub, t.%d lag.%d\n",dexp->crc32,dexp->timestamp,(int32_t)(time(NULL)-dexp->timestamp)); + dex_packet(myinfo,dexp,size); + } else printf("failed dexpacketcheck\n"); + } + //printf("GOT DEX rep PACKET.%d\n",size); + //if ( freeptr != 0 ) + // nn_freemsg(freeptr), dexp = 0, freeptr = 0; + if ( dexp != 0 ) + nn_freemsg(dexp), dexp = 0; + //if ( num > 1000 ) + // break; + } else flags |= 4; + printf("num.%d n.%d num2.%d rep packets\n",num,n,num2); } - printf("num.%d rep packets\n",num); } portable_mutex_unlock(&myinfo->dpowmutex); return(num); From 4da9054842f087b9174d359c4b8158e2a3ea4d01 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 26 Feb 2017 21:06:10 +0200 Subject: [PATCH 200/495] Test --- iguana/dpow/dpow_network.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index d0c0115a8..cf451388b 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1950,7 +1950,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) } if ( freeptr != 0 ) nn_freemsg(freeptr), np = 0, freeptr = 0; - } else flag |= 1; + } else flags |= 1; if ( myinfo->dexsock >= 0 ) // from servers { if ( (flags & 2) == 0 && (size= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dexsock,&dexp)) > 0 ) From 3832c13dc4ba8139597c472c5eef7f0aff5a1caa Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 26 Feb 2017 21:10:49 +0200 Subject: [PATCH 201/495] Test --- basilisk/basilisk.c | 4 ++-- iguana/dpow/dpow_network.c | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 4a9a8da34..3ab1ea6a3 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -893,7 +893,7 @@ void basilisks_loop(void *arg) basilisk_ping_send(myinfo,relay); } counter++; - fprintf(stderr,"E "); + //fprintf(stderr,"E "); if ( myinfo->numdpows == 1 ) { iguana_dPoWupdate(myinfo,&myinfo->DPOWS[0]); @@ -910,7 +910,7 @@ void basilisks_loop(void *arg) } endmilli = startmilli + 30; } - fprintf(stderr,"F "); + //fprintf(stderr,"F "); } else { diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index cf451388b..99d91392b 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1888,7 +1888,7 @@ void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t * int32_t dpow_nanomsg_update(struct supernet_info *myinfo) { - int32_t i,n,num,num2,flags=0,size,iter,broadcastflag,firstz = -1; char *retstr; uint32_t crc32,r,m; struct dpow_nanomsghdr *np=0; struct dpow_info *dp; struct dpow_block *bp; struct dex_nanomsghdr *dexp = 0; void *freeptr; + int32_t i,n,num,num2,flags=0,size,iter,lastval=0,broadcastflag,firstz = -1; char *retstr; uint32_t crc32,r,m; struct dpow_nanomsghdr *np=0; struct dpow_info *dp; struct dpow_block *bp; struct dex_nanomsghdr *dexp = 0; void *freeptr; if ( time(NULL) < myinfo->nanoinit+5 || (myinfo->dpowsock < 0 && myinfo->dexsock < 0 && myinfo->repsock < 0) ) return(-1); if ( myinfo->IAMNOTARY != 0 && myinfo->numnotaries <= 0 ) @@ -2009,8 +2009,12 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) //if ( num > 1000 ) // break; } else flags |= 4; - printf("num.%d n.%d num2.%d rep packets\n",num,n,num2); } + if ( (num + n + num2) != lastval ) + { + printf("lastval.%d: num.%d n.%d num2.%d rep packets\n",num,n,num2); + lastval = (num + n + num2); + } else break; } portable_mutex_unlock(&myinfo->dpowmutex); return(num); From 9b0212e600050b63c64c8fe1ba2789fc6320375d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 26 Feb 2017 21:12:17 +0200 Subject: [PATCH 202/495] Test --- iguana/dpow/dpow_network.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 99d91392b..0e2a5d690 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -2012,7 +2012,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) } if ( (num + n + num2) != lastval ) { - printf("lastval.%d: num.%d n.%d num2.%d rep packets\n",num,n,num2); + printf("lastval.%d: num.%d n.%d num2.%d rep packets\n",lastval,num,n,num2); lastval = (num + n + num2); } else break; } From 740197ef7a738aec1bc1728d9b74d8e24735bc2d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 26 Feb 2017 21:17:08 +0200 Subject: [PATCH 203/495] Test --- iguana/dpow/dpow_network.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 0e2a5d690..d44226d3a 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1900,7 +1900,8 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) num = num2 = n = 0; for (iter=0; iter<1000; iter++) { - if ( (flags & 1) == 0 && (size= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dpowsock,&np)) >= 0 ) + freeptr = 0; + if ( (flags & 1) == 0 && (size= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dpowsock,&np)) > 0 ) { num++; if ( size > 0 ) @@ -1948,11 +1949,12 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) } else printf("ignore.%d np->datalen.%d %d (size %d - %ld) [%s]\n",np->senderind,np->datalen,(int32_t)(size-sizeof(*np)),size,sizeof(*np),np->symbol); } //else printf("wrong version from.%d %02x %02x size.%d [%s]\n",np->senderind,np->version0,np->version1,size,np->symbol); } - if ( freeptr != 0 ) - nn_freemsg(freeptr), np = 0, freeptr = 0; } else flags |= 1; + if ( freeptr != 0 ) + nn_freemsg(freeptr), np = 0, freeptr = 0; if ( myinfo->dexsock >= 0 ) // from servers { + freeptr = 0; if ( (flags & 2) == 0 && (size= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dexsock,&dexp)) > 0 ) { //fprintf(stderr,"%d ",size); @@ -1964,12 +1966,13 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) dex_packet(myinfo,dexp,size); } //printf("GOT DEX bus PACKET.%d\n",size); - if ( freeptr != 0 ) - nn_freemsg(freeptr), dexp = 0, freeptr = 0; } else flags |= 2; + if ( freeptr != 0 ) + nn_freemsg(freeptr), dexp = 0, freeptr = 0; } if ( myinfo->repsock >= 0 ) // from clients { + dexp = 0; if ( (flags & 4) == 0 && (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) > 0 ) { num2++; @@ -2004,11 +2007,11 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) //printf("GOT DEX rep PACKET.%d\n",size); //if ( freeptr != 0 ) // nn_freemsg(freeptr), dexp = 0, freeptr = 0; - if ( dexp != 0 ) - nn_freemsg(dexp), dexp = 0; //if ( num > 1000 ) // break; } else flags |= 4; + if ( dexp != 0 ) + nn_freemsg(dexp), dexp = 0; } if ( (num + n + num2) != lastval ) { From 5b7efc4a49b9984c2e60d8afddde96de83c09192 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 26 Feb 2017 21:21:01 +0200 Subject: [PATCH 204/495] Test --- iguana/dpow/dpow_network.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index d44226d3a..b26c2e72c 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1267,9 +1267,9 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) nn_setsockopt(repsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(dexsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(pubsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - timeout = 10; + timeout = 1; nn_setsockopt(dexsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - timeout = 10; + timeout = 1; nn_setsockopt(repsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); maxsize = 1024 * 1024; printf("RCVBUF.%d\n",nn_setsockopt(dexsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); @@ -1283,7 +1283,7 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) } myinfo->dpowipbits[0] = (uint32_t)calc_ipbits(myinfo->ipaddr); myinfo->numdpowipbits = 1; - timeout = 10; + timeout = 1; nn_setsockopt(dpowsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); maxsize = 1024 * 1024; printf("RCVBUF.%d\n",nn_setsockopt(dpowsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); @@ -1898,7 +1898,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) } portable_mutex_lock(&myinfo->dpowmutex); num = num2 = n = 0; - for (iter=0; iter<1000; iter++) + for (iter=0; iter<100; iter++) { freeptr = 0; if ( (flags & 1) == 0 && (size= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dpowsock,&np)) > 0 ) @@ -1976,16 +1976,16 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( (flags & 4) == 0 && (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) > 0 ) { num2++; - printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); + //printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); if ( (retstr= dex_response(&broadcastflag,myinfo,dexp)) != 0 ) { signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,retstr,(int32_t)strlen(retstr)+1); - printf("send back[%ld]\n",strlen(retstr)+1); + //printf("send back[%ld]\n",strlen(retstr)+1); free(retstr); if ( broadcastflag != 0 ) { //printf("BROADCAST dexp request.[%d]\n",size); - //signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->dexsock,dexp,size); + signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->dexsock,dexp,size); } } else @@ -1994,13 +1994,13 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) { r = myinfo->dpowipbits[rand() % m]; signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,&r,sizeof(r)); - printf("REP.%08x <- rand ip m.%d %x\n",dexp->crc32,m,r); + //printf("REP.%08x <- rand ip m.%d %x\n",dexp->crc32,m,r); } else printf("illegal state without dpowipbits?\n"); if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->dexsock,dexp,size); signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); - printf("REP.%08x -> dexbus and pub, t.%d lag.%d\n",dexp->crc32,dexp->timestamp,(int32_t)(time(NULL)-dexp->timestamp)); + //printf("REP.%08x -> dexbus and pub, t.%d lag.%d\n",dexp->crc32,dexp->timestamp,(int32_t)(time(NULL)-dexp->timestamp)); dex_packet(myinfo,dexp,size); } else printf("failed dexpacketcheck\n"); } From 0d29607fb53c2a898fd7c145f7b4f7e2b58f91ad Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 26 Feb 2017 21:21:44 +0200 Subject: [PATCH 205/495] Test --- iguana/dpow/dpow_network.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index b26c2e72c..ba89d18d4 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -2015,7 +2015,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) } if ( (num + n + num2) != lastval ) { - printf("lastval.%d: num.%d n.%d num2.%d rep packets\n",lastval,num,n,num2); + //printf("lastval.%d: num.%d n.%d num2.%d rep packets\n",lastval,num,n,num2); lastval = (num + n + num2); } else break; } From c84ff5420c73b3c827ba49479e998ea7c0b121de Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 26 Feb 2017 21:25:11 +0200 Subject: [PATCH 206/495] Test --- iguana/iguana777.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 471fa8187..29fa7195c 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -133,7 +133,7 @@ struct supernet_info struct liquidity_info linfos[512]; cJSON *liquidity_currencies; struct pending_trade *trades; portable_mutex_t pending_mutex; struct komodo_notaries NOTARY; char seedipaddr[64]; uint32_t dpowipbits[128]; int32_t numdpowipbits; portable_mutex_t notarymutex,dpowmutex; - char dexseed_ipaddrs[1][64]; uint32_t dexipbits[128]; int32_t numdexipbits; portable_mutex_t dexmutex; + char dexseed_ipaddrs[2][64]; uint32_t dexipbits[128]; int32_t numdexipbits; portable_mutex_t dexmutex; // compatibility bits256 pangea_category,instantdex_category; uint8_t logs[256],exps[510]; From a53883fc0769f766e4ff52e7a677d20262cb370d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 26 Feb 2017 21:30:50 +0200 Subject: [PATCH 207/495] Test --- iguana/dpow/dpow_network.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index ba89d18d4..017d35973 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -408,14 +408,14 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 printf("%d: subscribe connect (%s)\n",myinfo->numdexipbits,str); } } -#ifndef __APPLE__ +//#ifndef __APPLE__ if ( (rand() % 100) < 40 ) { nanomsg_tcpname(0,str,ipaddr,REP_SOCK); nn_connect(myinfo->reqsock,str); printf("%d: req connect (%s)\n",myinfo->numdexipbits,str); } -#endif +//#endif } } if ( freeptr != 0 ) From e05bde41de37eb2a44f627126be881494f67dcd2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 26 Feb 2017 21:41:40 +0200 Subject: [PATCH 208/495] Test --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 3f5723493..22aac4910 100755 --- a/.gitignore +++ b/.gitignore @@ -147,3 +147,7 @@ iguana/confs/cc577d22ca76351d495f147b470103392b5f2ab0948e45608623a7d9728e2c6f iguana/confs/cc577d22ca76351d495f147b470103392b5f2ab0948e45608623a7d9728e2c6f.old iguana/DB/DEX.log + +iguana/iguana_notary.o-54f98cc3 + +iguana/pangea_hand.o-02d25ec3 From 6c0a348ba133ec797daeeca17f46b85b0560aac7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 26 Feb 2017 21:46:17 +0200 Subject: [PATCH 209/495] Merge remote-tracking branch 'origin/beta' into beta --- basilisk/basilisk.c | 3 +- iguana/dpow/dpow_network.c | 210 +++++++++++++++++++------------------ iguana/iguana_payments.c | 4 +- 3 files changed, 111 insertions(+), 106 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 1ea4ac20d..3ab1ea6a3 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -903,13 +903,14 @@ void basilisks_loop(void *arg) { dp = &myinfo->DPOWS[counter % myinfo->numdpows]; iguana_dPoWupdate(myinfo,dp); - if ( (counter % myinfo->numdpows) != 0 ) + //if ( (counter % myinfo->numdpows) != 0 ) { //fprintf(stderr,"F "); iguana_dPoWupdate(myinfo,&myinfo->DPOWS[0]); } endmilli = startmilli + 30; } + //fprintf(stderr,"F "); } else { diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index c493ef03d..017d35973 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -287,9 +287,9 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 { timeout = 1000; nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - timeout = 5000; - nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); - timeout = 10000; + //timeout = 5000; + //nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); + timeout = 1000; nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); for (i=0; idexseed_ipaddrs)/sizeof(*myinfo->dexseed_ipaddrs); i++) if ( nn_connect(reqsock,nanomsg_tcpname(0,str,myinfo->dexseed_ipaddrs[i],REP_SOCK)) < 0 ) @@ -318,8 +318,8 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 nn_setsockopt(subsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(subsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); printf("CLIENT sockets req.%d sub.%d\n",reqsock,subsock); - timeout = 5000; - nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); + //timeout = 5000; + //nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); timeout = 10000; nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); } @@ -960,6 +960,7 @@ char *_dex_sendrawtransaction(struct supernet_info *myinfo,char *symbol,char *si char *_dex_importaddress(struct supernet_info *myinfo,char *symbol,char *address) { struct dex_request dexreq; +return(clonestr("{\"error\":\"importaddress deprecated\"}")); memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.func = 'A'; @@ -1262,12 +1263,13 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) } else { - timeout = 500; + timeout = 100; nn_setsockopt(repsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(dexsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - timeout = 10; + nn_setsockopt(pubsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + timeout = 1; nn_setsockopt(dexsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - timeout = 500; + timeout = 1; nn_setsockopt(repsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); maxsize = 1024 * 1024; printf("RCVBUF.%d\n",nn_setsockopt(dexsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); @@ -1281,7 +1283,7 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) } myinfo->dpowipbits[0] = (uint32_t)calc_ipbits(myinfo->ipaddr); myinfo->numdpowipbits = 1; - timeout = 10; + timeout = 1; nn_setsockopt(dpowsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); maxsize = 1024 * 1024; printf("RCVBUF.%d\n",nn_setsockopt(dpowsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); @@ -1886,7 +1888,7 @@ void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t * int32_t dpow_nanomsg_update(struct supernet_info *myinfo) { - int32_t i,n=0,num=0,size,broadcastflag,firstz = -1; char *retstr; uint32_t crc32,r,m; struct dpow_nanomsghdr *np=0; struct dpow_info *dp; struct dpow_block *bp; struct dex_nanomsghdr *dexp = 0; void *freeptr; + int32_t i,n,num,num2,flags=0,size,iter,lastval=0,broadcastflag,firstz = -1; char *retstr; uint32_t crc32,r,m; struct dpow_nanomsghdr *np=0; struct dpow_info *dp; struct dpow_block *bp; struct dex_nanomsghdr *dexp = 0; void *freeptr; if ( time(NULL) < myinfo->nanoinit+5 || (myinfo->dpowsock < 0 && myinfo->dexsock < 0 && myinfo->repsock < 0) ) return(-1); if ( myinfo->IAMNOTARY != 0 && myinfo->numnotaries <= 0 ) @@ -1895,125 +1897,127 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) printf("INIT with %d notaries\n",myinfo->numnotaries); } portable_mutex_lock(&myinfo->dpowmutex); - /*for (i=0; i<100; i++) + num = num2 = n = 0; + for (iter=0; iter<100; iter++) { - struct nn_pollfd pfd; - pfd.fd = myinfo->dpowsock; - pfd.events = NN_POLLIN; - if ( nn_poll(&pfd,1,100) > 0 ) - break; - usleep(1000); - }*/ - while ( (size= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dpowsock,&np)) >= 0 && num < 1000 ) - { - num++; - if ( size > 0 ) + freeptr = 0; + if ( (flags & 1) == 0 && (size= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dpowsock,&np)) > 0 ) { - //fprintf(stderr,"%d ",size); - if ( np->version0 == (DPOW_VERSION & 0xff) && np->version1 == ((DPOW_VERSION >> 8) & 0xff) ) + num++; + if ( size > 0 ) { - //printf("v.%02x %02x datalen.%d size.%d %d vs %d\n",np->version0,np->version1,np->datalen,size,np->datalen,(int32_t)(size - sizeof(*np))); - if ( np->datalen == (size - sizeof(*np)) ) + //fprintf(stderr,"%d ",size); + if ( np->version0 == (DPOW_VERSION & 0xff) && np->version1 == ((DPOW_VERSION >> 8) & 0xff) ) { - crc32 = calc_crc32(0,np->packet,np->datalen); - dp = 0; - for (i=0; inumdpows; i++) + //printf("v.%02x %02x datalen.%d size.%d %d vs %d\n",np->version0,np->version1,np->datalen,size,np->datalen,(int32_t)(size - sizeof(*np))); + if ( np->datalen == (size - sizeof(*np)) ) { - if ( strcmp(np->symbol,myinfo->DPOWS[i].symbol) == 0 ) + crc32 = calc_crc32(0,np->packet,np->datalen); + dp = 0; + for (i=0; inumdpows; i++) { - dp = &myinfo->DPOWS[i]; - break; + if ( strcmp(np->symbol,myinfo->DPOWS[i].symbol) == 0 ) + { + dp = &myinfo->DPOWS[i]; + break; + } } - } - if ( dp != 0 && crc32 == np->crc32 ) - { - if ( i == myinfo->numdpows ) - printf("received nnpacket for (%s)\n",np->symbol); - else + if ( dp != 0 && crc32 == np->crc32 ) { - dpow_ipbitsadd(myinfo,dp,np->ipbits,np->numipbits,np->senderind,np->myipbits); - if ( (bp= dpow_heightfind(myinfo,dp,np->height)) != 0 && bp->state != 0xffffffff && bp->myind >= 0 ) + if ( i == myinfo->numdpows ) + printf("received nnpacket for (%s)\n",np->symbol); + else { - //char str[65]; printf("%s RECV ht.%d ch.%08x (%d) crc32.%08x:%08x datalen.%d:%d firstz.%d i.%d senderind.%d myind.%d\n",bits256_str(str,np->srchash),np->height,np->channel,size,np->crc32,crc32,np->datalen,(int32_t)(size - sizeof(*np)),firstz,i,np->senderind,bp->myind); - if ( np->senderind >= 0 && np->senderind < bp->numnotaries ) + dpow_ipbitsadd(myinfo,dp,np->ipbits,np->numipbits,np->senderind,np->myipbits); + if ( (bp= dpow_heightfind(myinfo,dp,np->height)) != 0 && bp->state != 0xffffffff && bp->myind >= 0 ) { - if ( memcmp(bp->notaries[np->senderind].pubkey+1,np->srchash.bytes,32) == 0 && bits256_nonz(np->srchash) != 0 ) + //char str[65]; printf("%s RECV ht.%d ch.%08x (%d) crc32.%08x:%08x datalen.%d:%d firstz.%d i.%d senderind.%d myind.%d\n",bits256_str(str,np->srchash),np->height,np->channel,size,np->crc32,crc32,np->datalen,(int32_t)(size - sizeof(*np)),firstz,i,np->senderind,bp->myind); + if ( np->senderind >= 0 && np->senderind < bp->numnotaries ) { - if ( bp->isratify == 0 ) - dpow_nanoutxoget(myinfo,dp,bp,&np->notarize,0,np->senderind,np->channel); - else dpow_nanoutxoget(myinfo,dp,bp,&np->ratify,1,np->senderind,np->channel); - dpow_datahandler(myinfo,dp,bp,np->senderind,np->channel,np->height,np->packet,np->datalen); - } else printf("wrong senderind.%d\n",np->senderind); - } - } //else printf("height.%d bp.%p state.%x senderind.%d\n",np->height,bp,bp!=0?bp->state:0,np->senderind); - //dp->crcs[firstz] = crc32; - } - } //else printf("crc error from.%d %x vs %x or no dp.%p [%s]\n",np->senderind,crc32,np->crc32,dp,np->symbol); - } else printf("ignore.%d np->datalen.%d %d (size %d - %ld) [%s]\n",np->senderind,np->datalen,(int32_t)(size-sizeof(*np)),size,sizeof(*np),np->symbol); - } //else printf("wrong version from.%d %02x %02x size.%d [%s]\n",np->senderind,np->version0,np->version1,size,np->symbol); - } //else printf("illegal size.%d\n",size); + if ( memcmp(bp->notaries[np->senderind].pubkey+1,np->srchash.bytes,32) == 0 && bits256_nonz(np->srchash) != 0 ) + { + if ( bp->isratify == 0 ) + dpow_nanoutxoget(myinfo,dp,bp,&np->notarize,0,np->senderind,np->channel); + else dpow_nanoutxoget(myinfo,dp,bp,&np->ratify,1,np->senderind,np->channel); + dpow_datahandler(myinfo,dp,bp,np->senderind,np->channel,np->height,np->packet,np->datalen); + } else printf("wrong senderind.%d\n",np->senderind); + } + } //else printf("height.%d bp.%p state.%x senderind.%d\n",np->height,bp,bp!=0?bp->state:0,np->senderind); + //dp->crcs[firstz] = crc32; + } + } //else printf("crc error from.%d %x vs %x or no dp.%p [%s]\n",np->senderind,crc32,np->crc32,dp,np->symbol); + } else printf("ignore.%d np->datalen.%d %d (size %d - %ld) [%s]\n",np->senderind,np->datalen,(int32_t)(size-sizeof(*np)),size,sizeof(*np),np->symbol); + } //else printf("wrong version from.%d %02x %02x size.%d [%s]\n",np->senderind,np->version0,np->version1,size,np->symbol); + } + } else flags |= 1; if ( freeptr != 0 ) nn_freemsg(freeptr), np = 0, freeptr = 0; - } //else printf("no packets\n"); - n = 0; - if ( myinfo->dexsock >= 0 ) // from servers - { - while ( (size= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dexsock,&dexp)) > 0 && n < 1000 ) + if ( myinfo->dexsock >= 0 ) // from servers { - //fprintf(stderr,"%d ",size); - n++; - if ( dex_packetcheck(myinfo,dexp,size) == 0 ) + freeptr = 0; + if ( (flags & 2) == 0 && (size= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dexsock,&dexp)) > 0 ) { - //printf("FROM BUS.%08x -> pub\n",dexp->crc32); - signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); - dex_packet(myinfo,dexp,size); - } - //printf("GOT DEX bus PACKET.%d\n",size); + //fprintf(stderr,"%d ",size); + n++; + if ( dex_packetcheck(myinfo,dexp,size) == 0 ) + { + //printf("FROM BUS.%08x -> pub\n",dexp->crc32); + signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); + dex_packet(myinfo,dexp,size); + } + //printf("GOT DEX bus PACKET.%d\n",size); + } else flags |= 2; if ( freeptr != 0 ) nn_freemsg(freeptr), dexp = 0, freeptr = 0; } - } - if ( myinfo->repsock >= 0 ) // from clients - { - while ( (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) > 0 ) + if ( myinfo->repsock >= 0 ) // from clients { - num++; - //printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); - if ( (retstr= dex_response(&broadcastflag,myinfo,dexp)) != 0 ) + dexp = 0; + if ( (flags & 4) == 0 && (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) > 0 ) { - signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,retstr,(int32_t)strlen(retstr)+1); - //printf("send back[%ld]\n",strlen(retstr)+1); - free(retstr); - if ( broadcastflag != 0 ) + num2++; + //printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); + if ( (retstr= dex_response(&broadcastflag,myinfo,dexp)) != 0 ) { - printf("BROADCAST dexp request.[%d]\n",size); - signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->dexsock,dexp,size); + signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,retstr,(int32_t)strlen(retstr)+1); + //printf("send back[%ld]\n",strlen(retstr)+1); + free(retstr); + if ( broadcastflag != 0 ) + { + //printf("BROADCAST dexp request.[%d]\n",size); + signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->dexsock,dexp,size); + } } - } - else - { - if ( (m= myinfo->numdpowipbits) > 0 ) - { - r = myinfo->dpowipbits[rand() % m]; - signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,&r,sizeof(r)); - //printf("REP.%08x <- rand ip m.%d %x\n",dexp->crc32,m,r); - } else printf("illegal state without dpowipbits?\n"); - if ( dex_packetcheck(myinfo,dexp,size) == 0 ) + else { - signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->dexsock,dexp,size); - signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); - //printf("REP.%08x -> dexbus and pub, t.%d lag.%d\n",dexp->crc32,dexp->timestamp,(int32_t)(time(NULL)-dexp->timestamp)); - dex_packet(myinfo,dexp,size); - } else printf("failed dexpacketcheck\n"); - } - //printf("GOT DEX rep PACKET.%d\n",size); - //if ( freeptr != 0 ) - // nn_freemsg(freeptr), dexp = 0, freeptr = 0; + if ( (m= myinfo->numdpowipbits) > 0 ) + { + r = myinfo->dpowipbits[rand() % m]; + signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,&r,sizeof(r)); + //printf("REP.%08x <- rand ip m.%d %x\n",dexp->crc32,m,r); + } else printf("illegal state without dpowipbits?\n"); + if ( dex_packetcheck(myinfo,dexp,size) == 0 ) + { + signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->dexsock,dexp,size); + signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); + //printf("REP.%08x -> dexbus and pub, t.%d lag.%d\n",dexp->crc32,dexp->timestamp,(int32_t)(time(NULL)-dexp->timestamp)); + dex_packet(myinfo,dexp,size); + } else printf("failed dexpacketcheck\n"); + } + //printf("GOT DEX rep PACKET.%d\n",size); + //if ( freeptr != 0 ) + // nn_freemsg(freeptr), dexp = 0, freeptr = 0; + //if ( num > 1000 ) + // break; + } else flags |= 4; if ( dexp != 0 ) nn_freemsg(dexp), dexp = 0; - if ( num > 1000 ) - break; } + if ( (num + n + num2) != lastval ) + { + //printf("lastval.%d: num.%d n.%d num2.%d rep packets\n",lastval,num,n,num2); + lastval = (num + n + num2); + } else break; } portable_mutex_unlock(&myinfo->dpowmutex); return(num); diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index f593034b4..82386e4b9 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -366,7 +366,7 @@ uint64_t _iguana_interest(uint32_t now,int32_t chainheight,uint32_t txlocktime,u uint64_t iguana_interest(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t vout,uint64_t value) { - char *retstr; int32_t height; cJSON *retjson; struct iguana_txid T,*tx; uint64_t interest=0; + char *retstr; int32_t height; cJSON *retjson=0; struct iguana_txid T,*tx; uint64_t interest=0; if ( coin->FULLNODE < 0 ) // komodod is running { if ( (retjson= dpow_gettxout(myinfo,coin,txid,vout)) != 0 ) @@ -394,7 +394,7 @@ uint64_t iguana_interest(struct supernet_info *myinfo,struct iguana_info *coin,b interest = _iguana_interest((uint32_t)time(NULL),coin->longestchain,tx->locktime,value); } } - char str[65]; printf("interest for %s.v%d %.8f %.8f\n",bits256_str(str,txid),vout,dstr(value),dstr(interest)); + char str[65]; printf("interest for %s.v%d %.8f %.8f (%s)\n",bits256_str(str,txid),vout,dstr(value),dstr(interest),retjson!=0?jprint(retjson,0):""); return(interest); } From 7c3e616d6bc181a7557ef7144cf7e4fe178f533a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 26 Feb 2017 22:01:43 +0200 Subject: [PATCH 210/495] Test --- .gitignore | 2 ++ iguana/kmd_lookup.h | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 7a7e1c423..598019140 100755 --- a/.gitignore +++ b/.gitignore @@ -149,3 +149,5 @@ iguana/confs/cc577d22ca76351d495f147b470103392b5f2ab0948e45608623a7d9728e2c6f.ol iguana/DB/DEX.log iguana/iguana_notary.o-54f98cc3 + +iguana/basilisk.o-2ad8cb38 diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 5ed99a79b..5499864f6 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -207,7 +207,7 @@ FILE *kmd_txidinit(struct iguana_info *coin) if ( (ptr= kmd_transactionadd(coin,tx,T.numvouts,T.numvins)) != 0 ) { if ( ptr != kmd_transaction(coin,tx->txid) ) - printf("ERROR: %p != %p for ht.%d\n",ptr,kmd_transaction(coin,tx->txid),tx->height); + printf("%s ERROR: %p != %p for ht.%d\n",coin->symbol,ptr,kmd_transaction(coin,tx->txid),tx->height); ptr->fpos = lastpos; ptr->numvins = T.numvins; ptr->numvouts = T.numvouts; @@ -219,7 +219,7 @@ FILE *kmd_txidinit(struct iguana_info *coin) } else { - printf("error loading vout.%d ht.%d\n",i,T.height); + printf("%s error loading vout.%d ht.%d\n",coin->symbol,i,T.height); break; } } @@ -255,7 +255,7 @@ FILE *kmd_spendinit(struct iguana_info *coin) { if ( kmd_transactionvin(coin,txid,i,spenttxid,spentvout) < 0 ) { - printf("error adding spend %s %d of %d\n",bits256_str(str,txid),i,numvins); + printf("%s error adding spend %s %d of %d\n",coin->symbol,bits256_str(str,txid),i,numvins); //break; } } else break; @@ -277,7 +277,7 @@ FILE *kmd_spendinit(struct iguana_info *coin) { if ( ptr->ptrs[(i<<1) + 1] != kmd_transaction(coin,vptr->spendtxid) ) { - printf("mismatch %s spend.%d %p %p\n",bits256_str(str,vptr->spendtxid),i,ptr->ptrs[(i<<1) + 1],kmd_transaction(coin,vptr->spendtxid)); + printf("%s mismatch %s spend.%d %p %p\n",coin->symbol,bits256_str(str,vptr->spendtxid),i,ptr->ptrs[(i<<1) + 1],kmd_transaction(coin,vptr->spendtxid)); } } } From aa9d2837359e77e5ce63c0bbf4506a9a8e5964b3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 27 Feb 2017 19:31:06 +0200 Subject: [PATCH 211/495] Even faster --- iguana/dpow/dpow_network.c | 16 ++++++++++++---- iguana/tests/loop | 5 ++--- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 017d35973..bdfe03bd3 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -277,7 +277,7 @@ void dex_packet(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp,int32_t char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32_t keylen,uint8_t *data,int32_t datalen) { - struct dex_nanomsghdr *dexp; cJSON *retjson; char ipaddr[64],str[128]; int32_t timeout,i,n,size,recvbytes,sentbytes = 0,reqsock,subsock; uint32_t *retptr,ipbits; void *freeptr; char *retstr = 0; + struct dex_nanomsghdr *dexp; cJSON *retjson; char ipaddr[64],str[128]; int32_t prio,timeout,i,n,size,recvbytes,sentbytes = 0,reqsock,subsock; uint32_t *retptr,ipbits; void *freeptr; char *retstr = 0; portable_mutex_lock(&myinfo->dexmutex); subsock = myinfo->subsock; reqsock = myinfo->reqsock; @@ -287,18 +287,26 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 { timeout = 1000; nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - //timeout = 5000; - //nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); + timeout = 500; + nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); timeout = 1000; nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + prio = 1; + nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDPRIO,&prio,sizeof(prio)); + nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVPRIO,&prio,sizeof(prio)); for (i=0; idexseed_ipaddrs)/sizeof(*myinfo->dexseed_ipaddrs); i++) + { if ( nn_connect(reqsock,nanomsg_tcpname(0,str,myinfo->dexseed_ipaddrs[i],REP_SOCK)) < 0 ) { nn_close(reqsock); reqsock = -1; break; } - } + } + prio = 8; + nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDPRIO,&prio,sizeof(prio)); + nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVPRIO,&prio,sizeof(prio)); + } if ( reqsock >= 0 ) { if ( myinfo->IAMNOTARY == 0 && subsock < 0 && (subsock= nn_socket(AF_SP,NN_SUB)) >= 0 ) diff --git a/iguana/tests/loop b/iguana/tests/loop index 7f1a05445..b7e8cfa16 100755 --- a/iguana/tests/loop +++ b/iguana/tests/loop @@ -1,8 +1,7 @@ #!/bin/bash -pkill iguana while true do -../../agents/iguana -sleep 3 +./dexlistunspent +./dexgetinfo done From a61dc0df730259a4f1cc53ff8ab0a78f87a09dcd Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 27 Feb 2017 21:51:58 +0200 Subject: [PATCH 212/495] Test --- iguana/dpow/dpow_network.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index bdfe03bd3..d826f6424 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -287,13 +287,13 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 { timeout = 1000; nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - timeout = 500; - nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); - timeout = 1000; + //timeout = 1500; + //nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); + timeout = 3000; nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - prio = 1; - nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDPRIO,&prio,sizeof(prio)); - nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVPRIO,&prio,sizeof(prio)); + //prio = 1; + //nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDPRIO,&prio,sizeof(prio)); + //nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVPRIO,&prio,sizeof(prio)); for (i=0; idexseed_ipaddrs)/sizeof(*myinfo->dexseed_ipaddrs); i++) { if ( nn_connect(reqsock,nanomsg_tcpname(0,str,myinfo->dexseed_ipaddrs[i],REP_SOCK)) < 0 ) @@ -303,9 +303,9 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 break; } } - prio = 8; - nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDPRIO,&prio,sizeof(prio)); - nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVPRIO,&prio,sizeof(prio)); + //prio = 8; + //nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDPRIO,&prio,sizeof(prio)); + //nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVPRIO,&prio,sizeof(prio)); } if ( reqsock >= 0 ) { From 7edf59ae1903887901963c4e6c6dd8e6c6ca36fc Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 27 Feb 2017 21:52:23 +0200 Subject: [PATCH 213/495] Test --- iguana/dpow/dpow_network.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index d826f6424..5183ea053 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1984,7 +1984,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( (flags & 4) == 0 && (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) > 0 ) { num2++; - //printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); + printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); if ( (retstr= dex_response(&broadcastflag,myinfo,dexp)) != 0 ) { signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,retstr,(int32_t)strlen(retstr)+1); From a2788be1cd6cb9792c18e14a9faebce68cf6e85f Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 27 Feb 2017 21:54:17 +0200 Subject: [PATCH 214/495] Test --- iguana/main.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/iguana/main.c b/iguana/main.c index c0d231e3b..dbbb18958 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -485,7 +485,10 @@ void mainloop(struct supernet_info *myinfo) usleep(30000); } if ( myinfo->DEXEXPLORER != 0 ) + { kmd_bitcoinscan(); + usleep(100000); + } //pangea_queues(SuperNET_MYINFO(0)); //if ( flag == 0 ) // usleep(100000 + isRT*100000 + (numpeers == 0)*1000000); From 06b115b836dfcf0a2f2ea317f943bd5a6a6e06dc Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 27 Feb 2017 21:59:37 +0200 Subject: [PATCH 215/495] Test --- crypto777/bitcoind_RPC.c | 2 +- iguana/kmd_lookup.h | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/crypto777/bitcoind_RPC.c b/crypto777/bitcoind_RPC.c index 18ebe16cc..66886df69 100755 --- a/crypto777/bitcoind_RPC.c +++ b/crypto777/bitcoind_RPC.c @@ -140,7 +140,7 @@ char *bitcoind_RPC(char **retstrp,char *debugstr,char *url,char *userpass,char * else specialcase = 0; if ( url[0] == 0 ) strcpy(url,"http://127.0.0.1:7776"); - if ( specialcase != 0 && (0) ) + //if ( specialcase != 0 && (0) ) printf("<<<<<<<<<<< bitcoind_RPC: debug.(%s) url.(%s) command.(%s) params.(%s)\n",debugstr,url,command,params); try_again: if ( retstrp != 0 ) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 5499864f6..367b28e2a 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -203,7 +203,7 @@ FILE *kmd_txidinit(struct iguana_info *coin) { if ( (tx= kmd_transactionalloc(T.txid,T.height,T.timestamp,T.numvouts,T.numvins)) != 0 ) { - //printf("INIT %s.[%d] vins.[%d] ht.%d %u\n",bits256_str(str,T.txid),T.numvouts,T.numvins,T.height,T.timestamp); + printf("INIT %s.[%d] vins.[%d] ht.%d %u\n",bits256_str(str,T.txid),T.numvouts,T.numvins,T.height,T.timestamp); if ( (ptr= kmd_transactionadd(coin,tx,T.numvouts,T.numvins)) != 0 ) { if ( ptr != kmd_transaction(coin,tx->txid) ) @@ -748,6 +748,7 @@ void kmd_bitcoinscan() { //if ( strcmp("KMD",coin->symbol) == 0 ) _kmd_bitcoinscan(coin); + usleep(100000); } } } From a68b957d9d502c83f17ffbb8f89767c1a0f7ebfd Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 27 Feb 2017 22:01:17 +0200 Subject: [PATCH 216/495] Test --- iguana/kmd_lookup.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 367b28e2a..c2d987c80 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -203,7 +203,7 @@ FILE *kmd_txidinit(struct iguana_info *coin) { if ( (tx= kmd_transactionalloc(T.txid,T.height,T.timestamp,T.numvouts,T.numvins)) != 0 ) { - printf("INIT %s.[%d] vins.[%d] ht.%d %u\n",bits256_str(str,T.txid),T.numvouts,T.numvins,T.height,T.timestamp); + char str[65]; printf("INIT %s.[%d] vins.[%d] ht.%d %u\n",bits256_str(str,T.txid),T.numvouts,T.numvins,T.height,T.timestamp); if ( (ptr= kmd_transactionadd(coin,tx,T.numvouts,T.numvins)) != 0 ) { if ( ptr != kmd_transaction(coin,tx->txid) ) From 1d94105bbf8e234523a7786bacac4469139c9cf8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 27 Feb 2017 22:09:39 +0200 Subject: [PATCH 217/495] Test --- iguana/kmd_lookup.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index c2d987c80..f3b042dd3 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -203,7 +203,7 @@ FILE *kmd_txidinit(struct iguana_info *coin) { if ( (tx= kmd_transactionalloc(T.txid,T.height,T.timestamp,T.numvouts,T.numvins)) != 0 ) { - char str[65]; printf("INIT %s.[%d] vins.[%d] ht.%d %u\n",bits256_str(str,T.txid),T.numvouts,T.numvins,T.height,T.timestamp); + //char str[65]; printf("INIT %s.[%d] vins.[%d] ht.%d %u\n",bits256_str(str,T.txid),T.numvouts,T.numvins,T.height,T.timestamp); if ( (ptr= kmd_transactionadd(coin,tx,T.numvouts,T.numvins)) != 0 ) { if ( ptr != kmd_transaction(coin,tx->txid) ) @@ -626,8 +626,8 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) while ( loadheight < height-lag ) { flag = 0; - if ( (loadheight % 10000) == 0 ) - printf("loading ht.%d\n",loadheight);//,jprint(kmd_getbalance(coin,"*"),1)); + //if ( (loadheight % 10000) == 0 ) + printf("loading ht.%d vs height.%d - lag.%d kmdheight.%d\n",loadheight,height,lag,coin->kmd_height);//,jprint(kmd_getbalance(coin,"*"),1)); if ( (blockjson= kmd_blockjson(&h,coin->symbol,coin->chain->serverport,coin->chain->userpass,0,loadheight)) != 0 ) { if ( (txids= jarray(&numtxids,blockjson,"tx")) != 0 ) From 09216d299f60fffded5da072b358e4ed4e40fcf2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 27 Feb 2017 22:47:05 +0200 Subject: [PATCH 218/495] Test --- iguana/kmd_lookup.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index f3b042dd3..65f2a9014 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -395,6 +395,7 @@ cJSON *kmd_listaddress(struct supernet_info *myinfo,struct iguana_info *coin,cha struct kmd_addresshh *addr; struct kmd_transactionhh *ptr=0,*spent,*prev=0; uint8_t type_rmd160[21]; int32_t i; if ( array == 0 ) array = cJSON_CreateArray(); + printf("%s listaddress.(%s)\n",coin->symbol,coinaddr); /*if ( time(NULL) > coin->kmd_lasttime+30 ) { coin->kmd_lasttime = (uint32_t)time(NULL); @@ -627,7 +628,7 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) { flag = 0; //if ( (loadheight % 10000) == 0 ) - printf("loading ht.%d vs height.%d - lag.%d kmdheight.%d\n",loadheight,height,lag,coin->kmd_height);//,jprint(kmd_getbalance(coin,"*"),1)); + printf("loading %s ht.%d vs height.%d - lag.%d kmdheight.%d\n",coin->symbol,loadheight,height,lag,coin->kmd_height);//,jprint(kmd_getbalance(coin,"*"),1)); if ( (blockjson= kmd_blockjson(&h,coin->symbol,coin->chain->serverport,coin->chain->userpass,0,loadheight)) != 0 ) { if ( (txids= jarray(&numtxids,blockjson,"tx")) != 0 ) From 17d619343528f5e93fd06192d42d9869b48f91ff Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 27 Feb 2017 22:57:07 +0200 Subject: [PATCH 219/495] Test --- iguana/kmd_lookup.h | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 65f2a9014..c141bf539 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -392,10 +392,20 @@ cJSON *kmd_gettxin(struct iguana_info *coin,bits256 txid,int32_t vout) cJSON *kmd_listaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr,int32_t mode,cJSON *array) { - struct kmd_addresshh *addr; struct kmd_transactionhh *ptr=0,*spent,*prev=0; uint8_t type_rmd160[21]; int32_t i; + struct kmd_addresshh *addr; struct kmd_transactionhh *ptr=0,*spent,*prev=0; uint8_t type_rmd160[21]; int32_t i; char *retstr; cJSON *retjson; if ( array == 0 ) array = cJSON_CreateArray(); printf("%s listaddress.(%s)\n",coin->symbol,coinaddr); + if ( (retstr= bitcoinrpc_validateaddress(myinfo,coin,0,0,coinaddr)) != 0 ) + { + printf("%s\n",retstr); + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + free_json(retjson); + } + if ( (0) ) + return(cJSON_Parse("[{\"error\":\"illegal address\"}]")); + } /*if ( time(NULL) > coin->kmd_lasttime+30 ) { coin->kmd_lasttime = (uint32_t)time(NULL); From 2b37522c8cda2f4919ea6430c272a7881914765d Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 27 Feb 2017 23:04:02 +0200 Subject: [PATCH 220/495] Test --- iguana/kmd_lookup.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index c141bf539..2feabf1cd 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -398,13 +398,17 @@ cJSON *kmd_listaddress(struct supernet_info *myinfo,struct iguana_info *coin,cha printf("%s listaddress.(%s)\n",coin->symbol,coinaddr); if ( (retstr= bitcoinrpc_validateaddress(myinfo,coin,0,0,coinaddr)) != 0 ) { - printf("%s\n",retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { + if ( jobj(retjson,"error") != 0 && is_cJSON_False(jobj(retjson,"error")) == 0 ) + { + printf("%s\n",retstr); + free(retstr); + return(retjson); + } free_json(retjson); } - if ( (0) ) - return(cJSON_Parse("[{\"error\":\"illegal address\"}]")); + free(retstr); } /*if ( time(NULL) > coin->kmd_lasttime+30 ) { @@ -759,7 +763,7 @@ void kmd_bitcoinscan() { //if ( strcmp("KMD",coin->symbol) == 0 ) _kmd_bitcoinscan(coin); - usleep(100000); + usleep(250000); } } } From 5f65344dd45e7e366bfb370712939a8cc1b703cb Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 27 Feb 2017 23:08:01 +0200 Subject: [PATCH 221/495] Test --- crypto777/bitcoind_RPC.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto777/bitcoind_RPC.c b/crypto777/bitcoind_RPC.c index 66886df69..18ebe16cc 100755 --- a/crypto777/bitcoind_RPC.c +++ b/crypto777/bitcoind_RPC.c @@ -140,7 +140,7 @@ char *bitcoind_RPC(char **retstrp,char *debugstr,char *url,char *userpass,char * else specialcase = 0; if ( url[0] == 0 ) strcpy(url,"http://127.0.0.1:7776"); - //if ( specialcase != 0 && (0) ) + if ( specialcase != 0 && (0) ) printf("<<<<<<<<<<< bitcoind_RPC: debug.(%s) url.(%s) command.(%s) params.(%s)\n",debugstr,url,command,params); try_again: if ( retstrp != 0 ) From 908fef6af48564359f8c7ae377efa76b624ea235 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 27 Feb 2017 23:09:15 +0200 Subject: [PATCH 222/495] Test --- iguana/dpow/dpow_network.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 5183ea053..d826f6424 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1984,7 +1984,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( (flags & 4) == 0 && (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) > 0 ) { num2++; - printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); + //printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); if ( (retstr= dex_response(&broadcastflag,myinfo,dexp)) != 0 ) { signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,retstr,(int32_t)strlen(retstr)+1); From 6ac935b5abe079bca164ac0df2cda98e3166d777 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 1 Mar 2017 09:23:48 +0200 Subject: [PATCH 223/495] Test --- iguana/main.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/iguana/main.c b/iguana/main.c index dbbb18958..4619501eb 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -461,10 +461,24 @@ rm BTC.xz; mksquashfs DB/BTC BTC.xz -comp xz -b 1048576 -comp xz -Xdict-size 102 https://github.com/vasi/squashfuse */ +void DEX_explorerloop(void *ptr) +{ + struct supernet_info *myinfo = ptr; + while ( 1 ) + { + if ( myinfo->DEXEXPLORER != 0 ) + { + kmd_bitcoinscan(); + } + usleep(100000); + } +} + void mainloop(struct supernet_info *myinfo) { struct iguana_info *coin; int32_t counter=0,depth; double lastmilli = 0; sleep(3); + iguana_launch(0,"DEX_explorerloop",DEX_explorerloop,myinfo,IGUANA_PERMTHREAD); printf("mainloop\n"); while ( 1 ) { @@ -484,11 +498,6 @@ void mainloop(struct supernet_info *myinfo) } usleep(30000); } - if ( myinfo->DEXEXPLORER != 0 ) - { - kmd_bitcoinscan(); - usleep(100000); - } //pangea_queues(SuperNET_MYINFO(0)); //if ( flag == 0 ) // usleep(100000 + isRT*100000 + (numpeers == 0)*1000000); From b8494fbfc202e7f32a853d5765e2dc03e1bd759f Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 1 Mar 2017 09:27:13 +0200 Subject: [PATCH 224/495] Test --- iguana/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/main.c b/iguana/main.c index 4619501eb..30758a494 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -478,7 +478,6 @@ void mainloop(struct supernet_info *myinfo) { struct iguana_info *coin; int32_t counter=0,depth; double lastmilli = 0; sleep(3); - iguana_launch(0,"DEX_explorerloop",DEX_explorerloop,myinfo,IGUANA_PERMTHREAD); printf("mainloop\n"); while ( 1 ) { @@ -761,6 +760,7 @@ void iguana_launchdaemons(struct supernet_info *myinfo) if ( COMMANDLINE_ARGFILE == 0 ) iguana_launch(0,"rpcloop",iguana_rpcloop,myinfo,IGUANA_PERMTHREAD); // limit to oneprocess printf("launch mainloop\n"); + OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)DEX_explorerloop,(void *)myinfo); mainloop(myinfo); } From a9cf4c6ca4e832ad4874ff238803906338f9d637 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 1 Mar 2017 14:40:59 +0200 Subject: [PATCH 225/495] Fix print crash --- iguana/iguana_payments.c | 1 - 1 file changed, 1 deletion(-) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 82386e4b9..c0be62d4b 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -394,7 +394,6 @@ uint64_t iguana_interest(struct supernet_info *myinfo,struct iguana_info *coin,b interest = _iguana_interest((uint32_t)time(NULL),coin->longestchain,tx->locktime,value); } } - char str[65]; printf("interest for %s.v%d %.8f %.8f (%s)\n",bits256_str(str,txid),vout,dstr(value),dstr(interest),retjson!=0?jprint(retjson,0):""); return(interest); } From 4b7cb0c14f144f7aaef0cac844b64658a04dbac6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 2 Mar 2017 07:31:57 +0200 Subject: [PATCH 226/495] Test --- iguana/dpow/dpow_network.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index d826f6424..7cac5a7ea 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -277,7 +277,7 @@ void dex_packet(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp,int32_t char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32_t keylen,uint8_t *data,int32_t datalen) { - struct dex_nanomsghdr *dexp; cJSON *retjson; char ipaddr[64],str[128]; int32_t prio,timeout,i,n,size,recvbytes,sentbytes = 0,reqsock,subsock; uint32_t *retptr,ipbits; void *freeptr; char *retstr = 0; + struct dex_nanomsghdr *dexp; cJSON *retjson; char ipaddr[64],str[128]; int32_t timeout,i,n,size,recvbytes,sentbytes = 0,reqsock,subsock; uint32_t *retptr,ipbits; void *freeptr; char *retstr = 0; portable_mutex_lock(&myinfo->dexmutex); subsock = myinfo->subsock; reqsock = myinfo->reqsock; From c8fd0de49bdc6947ee4bfc2b17092a9d3b83ac73 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 2 Mar 2017 16:03:59 +0200 Subject: [PATCH 227/495] Fix utxorawtx --- iguana/iguana_payments.c | 9 ++++++++- iguana/tests/dexgetO | 2 +- iguana/tests/dexsendrawtransaction | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index c0be62d4b..a8b45faf2 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -560,7 +560,14 @@ char *iguana_calcutxorawtx(struct supernet_info *myinfo,struct iguana_info *coin printf("insufficient total %.8f vs (%.8f + %.8f)\n",dstr(total),dstr(satoshis),dstr(txfee)); return(0); } - total += interests; + if ( strcmp(coin->symbol,"KMD") == 0 ) + { + if ( (interests= iguana_interests(myinfo,coin,vins)) != 0 ) + { + total += interests; + printf("boost total by interest %.8f\n",dstr(interests)); + } + } if ( (change= (total - (satoshis + txfee))) > 10000 && (changeaddr == 0 || changeaddr[0] == 0) ) { printf("no changeaddr for %.8f\n",dstr(change)); diff --git a/iguana/tests/dexgetO b/iguana/tests/dexgetO index 9c187166b..6f4290b48 100755 --- a/iguana/tests/dexgetO +++ b/iguana/tests/dexgetO @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettxout\",\"vout\":1,\"txid\":\"fa3321ed55e8e96ba7221e9cc4bc54b735616649abcc9734bb73f505ee712884\",\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettxout\",\"vout\":1,\"txid\":\"4a1a2026718ac10bd11ccccbdd85f29faa5f0b7c3ab95a57dcf7040c5ca0420c\",\"symbol\":\"KMD\"}" diff --git a/iguana/tests/dexsendrawtransaction b/iguana/tests/dexsendrawtransaction index d60706f4d..f3796ea37 100755 --- a/iguana/tests/dexsendrawtransaction +++ b/iguana/tests/dexsendrawtransaction @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"sendrawtransaction\",\"signedtx\":\"0100000001372105704c1303f4c928b788becce75b653b5e83d56fc25893f682875f9df00e010000006a47304402203c3e71c309fcf70d1b1b42207824b37cfec918930000b8d812844be9a8d06bae02202eafe0515f6cd775ba06be0fab6cea667a23508e69334310b959ebd7eade38c9012102320228e3f6f9b8db3d905bc21cefde46e72d622021b8fd40344ac2ab8346c287ffffffff02b0e20d000000000017a914077fa9d41d53cc38118b8280e97e4aee576d6e5a87c08c8a00000000001976a914838f4ea2f88f24b87247b72a1d66da225653e39788ac00000000\",\"symbol\":\"USD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"sendrawtransaction\",\"signedtx\":\"01000000010c42a05c0c04f7dc575ab93a7c0b5faa9ff285ddcbcc1cd10bc18a7126201a4a010000006b483045022100814b44c4af1beeb7ab3abdd7dfd95216b48da2f47ded4137f3dca366db4a94bc0220686108f29cc1eea5c845b7571e01412a373e5077d448e021bac7e8a19ec451a20121025879c9eaa100984ee1faaeb55bcbafed5b1f565c35ed7ebaadcce0a8416e6263ffffffff0240420f00000000001976a914c5a58530ee7bec4f5ab9a8c0c63069484273276c88ac34955836020000001976a914971f98b33fb838faee190e2fab799440d8c5170288acf70ab858\",\"symbol\":\"KMD\"}" From 417e9985e9d5636bd5c6c2e0b2c8de62a017d335 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 2 Mar 2017 16:10:29 +0200 Subject: [PATCH 228/495] Test --- iguana/iguana_payments.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index a8b45faf2..6aca69045 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -553,13 +553,6 @@ char *iguana_calcutxorawtx(struct supernet_info *myinfo,struct iguana_info *coin { if ( (vins= iguana_RTinputsjson(myinfo,coin,&total,satoshis + txfee,unspents,num,maxmode)) != 0 ) { - if ( total < (satoshis + txfee) ) - { - free_json(vins); - free(unspents); - printf("insufficient total %.8f vs (%.8f + %.8f)\n",dstr(total),dstr(satoshis),dstr(txfee)); - return(0); - } if ( strcmp(coin->symbol,"KMD") == 0 ) { if ( (interests= iguana_interests(myinfo,coin,vins)) != 0 ) @@ -568,6 +561,13 @@ char *iguana_calcutxorawtx(struct supernet_info *myinfo,struct iguana_info *coin printf("boost total by interest %.8f\n",dstr(interests)); } } + if ( total < (satoshis + txfee) ) + { + free_json(vins); + free(unspents); + printf("insufficient total %.8f vs (%.8f + %.8f)\n",dstr(total),dstr(satoshis),dstr(txfee)); + return(0); + } if ( (change= (total - (satoshis + txfee))) > 10000 && (changeaddr == 0 || changeaddr[0] == 0) ) { printf("no changeaddr for %.8f\n",dstr(change)); From 2c06ac84781bc3d93b86a43ee2b9269cec7c5051 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 2 Mar 2017 18:34:15 +0200 Subject: [PATCH 229/495] Estimatefee for BTC added to dex get info --- iguana/dpow/dpow_rpc.c | 10 ++++++++++ iguana/tests/dexlistunspent | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 4f344119c..f8ffded08 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -36,6 +36,16 @@ cJSON *dpow_getinfo(struct supernet_info *myinfo,struct iguana_info *coin) { json = cJSON_Parse(retstr); free(retstr); + if ( strcmp(coin->symbol,"BTC") == 0 ) + { + sprintf(buf,"[%d]",2); + if ( (retstr= bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"estimatefee",buf)) != 0 ) + { + if ( atof(retstr) > SMALLVAL ) + jaddnum(json,"estimatefee",atof(retstr)); + free(retstr); + } + } } return(json); } diff --git a/iguana/tests/dexlistunspent b/iguana/tests/dexlistunspent index 5cd82cdaa..c6ede1cca 100755 --- a/iguana/tests/dexlistunspent +++ b/iguana/tests/dexlistunspent @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent2\",\"address\":\"RDKb3QykRJNfLKWLcbbv9z7xqbtxwB54GC\",\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent2\",\"address\":\"RCownUMXktAgPvzwpALnGimCA1RDJoTvx1\",\"symbol\":\"KMD\"}" From f4c6d87f518ec6ea093ace34a23c96ae2957bdaf Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 2 Mar 2017 19:46:34 +0200 Subject: [PATCH 230/495] Autocalc txfee for BTC if txfee == 0 --- basilisk/basilisk.c | 3 +- basilisk/basilisk_bitcoin.c | 104 +++++++++++++++++++++++++++++------- iguana/iguana_payments.c | 6 ++- iguana/tests/amlp | 2 +- iguana/tests/dexlistunspent | 2 +- iguana/tests/utxorawtx | 2 +- includes/iguana_structs.h | 1 + 7 files changed, 95 insertions(+), 25 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 3ab1ea6a3..9e717e99e 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -1166,8 +1166,7 @@ STRING_ARRAY_OBJ_STRING(basilisk,utxorawtx,symbol,utxos,vals,ignore) changeaddr = jstr(vals,"changeaddr"); if ( destaddr != 0 && changeaddr != 0 && symbol != 0 && (coin= iguana_coinfind(symbol)) != 0 ) { - if ( (txfee= jdouble(vals,"txfee") * SATOSHIDEN) == 0 ) - txfee = coin->txfee; + txfee = jdouble(vals,"txfee") * SATOSHIDEN; return(iguana_utxorawtx(myinfo,coin,timelock,destaddr,changeaddr,satoshis,txfee,&completed,sendflag,utxos)); } return(clonestr("{\"error\":\"invalid coin or address specified\"}")); diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index c6bdadf34..e42ab5146 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -473,6 +473,23 @@ void *basilisk_getinfo(struct basilisk_item *Lptr,struct supernet_info *myinfo,s return(ptr); } +int64_t iguana_getestimatedfee(struct supernet_info *myinfo,struct iguana_info *coin) +{ + char *retstr; cJSON *retjson; double x; int64_t txfeeperbyte = 200; + if ( (retstr= _dex_getinfo(myinfo,coin->symbol)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( (x= jdouble(retjson,"estimatefee")) > SMALLVAL ) + txfeeperbyte = 1 + (x * SATOSHIDEN) / 1024; + printf("SET txfeeperbyte %lld (%s)\n",(long long)txfeeperbyte,retstr); + free(retjson); + } + free(retstr); + } + return(txfeeperbyte); +} + int32_t basilisk_voutvin_validate(struct iguana_info *coin,char *rawtx,uint64_t inputsum,uint64_t amount,uint64_t txfee) { //static int counter; @@ -543,13 +560,32 @@ int32_t basilisk_vins_validate(struct supernet_info *myinfo,struct iguana_info * return(retval); } +int64_t iguana_esttxfee(struct supernet_info *myinfo,struct iguana_info *coin,char *rawtx,char *signedtx,int32_t numvins) +{ + int64_t txfee = 0; + if ( coin->estimatedfee == 0 ) + coin->estimatedfee = iguana_getestimatedfee(myinfo,coin); + if ( signedtx != 0 ) + { + txfee = coin->estimatedfee * (strlen(signedtx) + numvins); + free(signedtx); + } + else if ( rawtx != 0 ) + { + txfee = coin->estimatedfee * (strlen(rawtx) + numvins * 110); + free(rawtx); + } + return(txfee); +} + char *iguana_utxoduplicates(struct supernet_info *myinfo,struct iguana_info *coin,uint8_t *pubkey33,uint64_t satoshis,int32_t duplicates,int32_t *completedp,bits256 *signedtxidp,int32_t sendflag,cJSON *addresses) { - uint8_t script[35]; int32_t i,spendlen; cJSON *txobj=0,*vins=0; char *rawtx=0,*signedtx,changeaddr[64]; + uint8_t script[35]; int64_t txfee; int32_t i,spendlen; cJSON *txobj=0,*vins=0; char *rawtx=0,*signedtx=0,changeaddr[64]; *completedp = 0; if ( signedtxidp != 0 ) memset(signedtxidp,0,sizeof(*signedtxidp)); bitcoin_address(changeaddr,coin->chain->pubtype,myinfo->persistent_pubkey33,33); + txfee = 10 * (coin->txfee + duplicates*coin->txfee/5); if ( (txobj= bitcoin_txcreate(coin->symbol,coin->chain->isPoS,0,1,0)) != 0 ) { if ( duplicates <= 0 ) @@ -557,19 +593,28 @@ char *iguana_utxoduplicates(struct supernet_info *myinfo,struct iguana_info *coi spendlen = bitcoin_pubkeyspend(script,0,pubkey33); for (i=0; itxfee + duplicates*coin->txfee/5,addresses,0,0,0,0,"127.0.0.1",0,1); + rawtx = iguana_calcrawtx(myinfo,coin,&vins,txobj,satoshis * duplicates,changeaddr,txfee,addresses,0,0,0,0,"127.0.0.1",0,1); + if ( cJSON_GetArraySize(vins) > duplicates/4 ) + { + free(rawtx); + rawtx = 0; + fprintf(stderr,"No point to recycle utxo when trying to create utxo duplicates, numvins.%d vs duplicates.%d\n",cJSON_GetArraySize(vins),duplicates); + free_json(vins); + return(rawtx); + } //printf("duplicatesTX.(%s)\n",rawtx); if ( signedtxidp != 0 ) { if ( (signedtx= iguana_signrawtx(myinfo,coin,0,signedtxidp,completedp,vins,rawtx,0,0)) != 0 ) { - free(rawtx); - if ( *completedp != 0 && sendflag != 0 ) + if ( *completedp != 0 ) { printf("splitfunds signedtx.(%s)\n",signedtx); - iguana_sendrawtransaction(myinfo,coin,signedtx); + if ( sendflag != 0 ) + iguana_sendrawtransaction(myinfo,coin,signedtx); + free(rawtx); + rawtx = signedtx, signedtx = 0; } - rawtx = signedtx; } else printf("error signing raw utxoduplicates tx\n"); } } @@ -615,7 +660,7 @@ int64_t iguana_verifytimelock(struct supernet_info *myinfo,struct iguana_info *c char *iguana_utxorawtx(struct supernet_info *myinfo,struct iguana_info *coin,int32_t timelock,char *destaddr,char *changeaddr,uint64_t satoshis,uint64_t txfee,int32_t *completedp,int32_t sendflag,cJSON *utxos) { - uint8_t script[35],p2shscript[128],rmd160[20],addrtype; bits256 txid; int32_t p2shlen,spendlen; cJSON *retjson,*txobj=0,*vins=0; char *rawtx=0,*signedtx=0; uint32_t timelocked = 0; + uint8_t script[35],p2shscript[128],rmd160[20],addrtype; bits256 txid; int32_t p2shlen,iter,spendlen; cJSON *retjson,*txcopy,*txobj=0,*vins=0; char *rawtx=0,*signedtx=0; uint32_t timelocked = 0; *completedp = 0; if ( iguana_addressvalidate(coin,&addrtype,destaddr) < 0 || iguana_addressvalidate(coin,&addrtype,changeaddr) < 0 ) return(clonestr("{\"error\":\"invalid coin address\"}")); @@ -625,6 +670,8 @@ char *iguana_utxorawtx(struct supernet_info *myinfo,struct iguana_info *coin,int bitcoin_addr2rmd160(&addrtype,rmd160,destaddr); if ( addrtype != coin->chain->pubtype ) return(clonestr("{\"error\":\"invalid dest address type\"}")); + if ( txfee == 0 && strcmp(coin->symbol,"BTC") != 0 && (txfee= coin->txfee) == 0 ) + txfee = coin->chain->txfee; retjson = cJSON_CreateObject(); if ( (txobj= bitcoin_txcreate(coin->symbol,coin->chain->isPoS,0,1,0)) != 0 ) { @@ -641,23 +688,42 @@ char *iguana_utxorawtx(struct supernet_info *myinfo,struct iguana_info *coin,int printf("timelock.%d spend timelocked %u\n",timelock,timelocked); } bitcoin_txoutput(txobj,script,spendlen,satoshis); - if ( (rawtx= iguana_calcutxorawtx(myinfo,coin,&vins,txobj,satoshis,changeaddr,txfee,utxos,"",0,0)) != 0 ) + for (iter=0; iter<2; iter++) { - jaddstr(retjson,"rawtx",rawtx); - if ( (signedtx= iguana_signrawtx(myinfo,coin,0,&txid,completedp,vins,rawtx,0,0)) != 0 ) + txcopy = jduplicate(txobj); + if ( (rawtx= iguana_calcutxorawtx(myinfo,coin,&vins,txobj,satoshis,changeaddr,txfee,utxos,"",0,0)) != 0 ) { - if ( *completedp != 0 ) + if ( iter == 1 || txfee != 0 ) + jaddstr(retjson,"rawtx",rawtx); + if ( (signedtx= iguana_signrawtx(myinfo,coin,0,&txid,completedp,vins,rawtx,0,0)) != 0 ) { - jaddbits256(retjson,"txid",txid); - jaddstr(retjson,"signedtx",signedtx); - if ( sendflag != 0 ) + if ( (iter == 1 || txfee != 0) && *completedp != 0 ) { - //printf("send signedtx.(%s)\n",signedtx); - txid = iguana_sendrawtransaction(myinfo,coin,signedtx); - jaddbits256(retjson,"sent",txid); + jaddbits256(retjson,"txid",txid); + jaddstr(retjson,"signedtx",signedtx); + if ( sendflag != 0 ) + { + //printf("send signedtx.(%s)\n",signedtx); + txid = iguana_sendrawtransaction(myinfo,coin,signedtx); + jaddbits256(retjson,"sent",txid); + } } - } - } else printf("error signing raw utxoduplicates tx\n"); + } else printf("error signing raw utxorawtx tx\n"); + } else printf("null rawtx from calcutxorawtx\n"); + if ( txfee != 0 ) + { + free_json(txcopy); + break; + } + else // must be BTC and txfee == 0 + { + txfee = iguana_esttxfee(myinfo,coin,rawtx,signedtx,cJSON_GetArraySize(vins)); + free_json(vins); + rawtx = signedtx = 0; + vins = 0; + *completedp = 0; + txobj = txcopy; + } } } if ( timelock != 0 ) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 6aca69045..fbe9ba5b5 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -534,7 +534,11 @@ char *iguana_calcutxorawtx(struct supernet_info *myinfo,struct iguana_info *coin for (i=0; i 16 ) + { + + } + else if ( (sobj= jobj(item,"scriptPubKey")) == 0 && (spendscriptstr= jstr(sobj,"hex")) == 0 ) { printf("no spendscript (%s)\n",jprint(item,0)); continue; diff --git a/iguana/tests/amlp b/iguana/tests/amlp index 4a771e030..76856c320 100755 --- a/iguana/tests/amlp +++ b/iguana/tests/amlp @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"amlp\",\"blocktrail\":\"blocktrail_apikey\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"amlp\",\"blocktrail\":\"e5ddfdceb58fa6c1bf9411aaeff4b6ee28cbc370\"}" diff --git a/iguana/tests/dexlistunspent b/iguana/tests/dexlistunspent index c6ede1cca..4e353d69b 100755 --- a/iguana/tests/dexlistunspent +++ b/iguana/tests/dexlistunspent @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent2\",\"address\":\"RCownUMXktAgPvzwpALnGimCA1RDJoTvx1\",\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"1Hgzt5xsnbfc8UTWqWKSTLRm5bEYHYBoCE\",\"symbol\":\"BTC\"}" diff --git a/iguana/tests/utxorawtx b/iguana/tests/utxorawtx index a157a3ee9..57d252129 100755 --- a/iguana/tests/utxorawtx +++ b/iguana/tests/utxorawtx @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"symbol\":\"KMD\",\"agent\":\"basilisk\",\"method\":\"utxorawtx\",\"vals\":{\"timelock\":0,\"changeaddr\":\"RNmvQtThVZAbc1tFEFmKAnJZrc9XqciNog\",\"destaddr\":\"RHfraY22xd9aAuuUJ6Yjb6HFUXh535z6Lg\",\"txfee\":0.00011,\"amount\":0.01,\"sendflag\":0},\"utxos\":[{\"bestblock\":\"000000a7d7b317af7169a156f6b4b9538293da2a3707a69aa3048998a87fbf2c\",\"confirmations\":0,\"value\":0.02,\"scriptPubKey\":{\"asm\":\"OP_DUP OP_HASH160 b7128d2ee837cf03e30a2c0e3e0181f7b9669bb6 OP_EQUALVERIFY OP_CHECKSIG\",\"hex\":\"76a914b7128d2ee837cf03e30a2c0e3e0181f7b9669bb688ac\",\"reqSigs\":1,\"type\":\"pubkeyhash\",\"addresses\":[\"RRyBxbrAPRUBCUpiJgJZYrkxqrh8x5ta9Z\"]},\"version\":1,\"coinbase\":false,\"randipbits\":3350674129,\"coin\":\"KMD\",\"txid\":\"9329814cc4c7a8cabf83627d4228c1a2090e776d669c585d824d912ce2e13b13\",\"vout\":1,\"amount\":0.02}]}" +curl --url "http://127.0.0.1:7778" --data "{\"symbol\":\"BTC\",\"agent\":\"basilisk\",\"method\":\"utxorawtx\",\"vals\":{\"timelock\":0,\"changeaddr\":\"1P3rU1Nk1pmc2BiWC8dEy9bZa1ZbMp5jfg\",\"destaddr\":\"1P3rU1Nk1pmc2BiWC8dEy9bZa1ZbMp5jfg\",\"txfee\":0,\"amount\":0.0001,\"sendflag\":0},\"utxos\":[{\"value\":0.00100000,\"address\":\"1Hgzt5xsnbfc8UTWqWKSTLRm5bEYHYBoCE\",\"scriptPubKey\":\"76a914b7128d2ee837cf03e30a2c0e3e0181f7b9669bb688ac\",\"confirmations\":23351,\"spendable\":true}]}" diff --git a/includes/iguana_structs.h b/includes/iguana_structs.h index ea665ef85..813bd77a7 100755 --- a/includes/iguana_structs.h +++ b/includes/iguana_structs.h @@ -531,6 +531,7 @@ struct iguana_info uint32_t utxoaddrlastcount,*utxoaddroffsets,lastunspentsupdate; uint8_t *utxoaddrtable; bits256 utxoaddrhash; FILE *utxofp; bits256 markedunspents[1024]; + uint64_t estimatedfee; char seedipaddr[64]; uint32_t lastbesthashtime; bits256 lastbesthash; int32_t lastbestheight; struct iguana_block *RTblocks[65536]; uint8_t *RTrawdata[65536]; int32_t RTrecvlens[65536],RTnumtx[65536]; From 34a644cfd7320822fd7736121a26e40a0aa0c792 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 17:50:41 +0200 Subject: [PATCH 231/495] Jumblr initial version --- .gitignore | 8 + basilisk/basilisk.c | 3 +- basilisk/jumblr.c | 369 +++ iguana/SuperNET_keys.c | 2 + iguana/autoAPI.md | 4726 +++++++++++++++++++++++++++++++++ iguana/iguana777.h | 11 +- iguana/main.c | 15 + includes/iguana_apideclares.h | 3 + includes/iguana_funcs.h | 1 + 9 files changed, 5136 insertions(+), 2 deletions(-) create mode 100755 basilisk/jumblr.c create mode 100644 iguana/autoAPI.md diff --git a/.gitignore b/.gitignore index b2923f002..ba6f0a1f2 100755 --- a/.gitignore +++ b/.gitignore @@ -152,3 +152,11 @@ iguana/iguana_notary.o-54f98cc3 iguana/basilisk.o-2ad8cb38 iguana/pangea_hand.o-02d25ec3 + +iguana/confs/4dfa301d0adf61f0ec08e4d4cb4444f4fc377f45f5d6b1da0814033920d72353 + +iguana/help.json + +iguana/index7778.html + +*.json diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 9e717e99e..e4760e040 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -492,6 +492,7 @@ int32_t basilisk_relayid(struct supernet_info *myinfo,uint32_t ipbits) #include "basilisk_ping.c" #include "basilisk_vote.c" #include "basilisk_CMD.c" +#include "jumblr.c" void basilisk_functions(struct iguana_info *coin,int32_t protocol) { @@ -870,7 +871,7 @@ int32_t basilisk_issued_purge(struct supernet_info *myinfo,int32_t timepad) void basilisks_loop(void *arg) { static uint32_t counter; - struct iguana_info *relay; struct supernet_info *myinfo = arg; int32_t iter; double startmilli,endmilli; struct dpow_info *dp; + struct iguana_info *relay; struct supernet_info *myinfo = arg; int32_t iter; double startmilli,endmilli; struct dpow_info *dp; iter = 0; relay = iguana_coinfind("RELAY"); printf("start basilisk loop\n"); diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c new file mode 100755 index 000000000..041bfe1c6 --- /dev/null +++ b/basilisk/jumblr.c @@ -0,0 +1,369 @@ +/****************************************************************************** + * Copyright © 2014-2017 The SuperNET Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * SuperNET software, including this file may be copied, modified, propagated * + * or distributed except according to the terms contained in the LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +// included from basilisk.c +// connect DEX to jumblr-core + +/* + z_exportkey "zaddr" + z_exportwallet "filename" + z_getoperationstatus (["operationid", ... ]) + z_gettotalbalance ( minconf ) + z_importkey "zkey" ( rescan ) + z_importwallet "filename" + z_listaddresses + z_sendmany "fromaddress" [{"address":... ,"amount":..., "memo":""},...] ( minconf ) ( fee ) + */ + +#define JUMBLR_INCR 99 +#define JUMBLR_TXFEE 0.01 +#define JUMBLR_ADDR "RGhxXpXSSBTBm9EvNsXnTQczthMCxHX91t" +#define JUMBLR_BTCADDR "18RmTJe9qMech8siuhYfMtHo8RtcN1obC6" +#define JUMBLR_FEE 0.001 +#define JUMBLR_DEPOSITPREFIX "deposit " + +struct jumblr_item *jumblr_opidfind(struct supernet_info *myinfo,char *opid) +{ + struct jumblr_item *ptr; + HASH_FIND(hh,myinfo->jumblrs,opid,(int32_t)strlen(opid),ptr); + return(ptr); +} + +struct jumblr_item *jumblr_opidadd(struct supernet_info *myinfo,struct iguana_info *coin,char *opid) +{ + struct jumblr_item *ptr; + if ( (ptr= jumblr_opidfind(myinfo,opid)) == 0 ) + { + ptr = calloc(1,sizeof(*ptr)); + safecopy(ptr->opid,opid,sizeof(ptr->opid)); + HASH_ADD_KEYPTR(hh,myinfo->jumblrs,ptr->opid,(int32_t)strlen(ptr->opid),ptr); + if ( ptr != jumblr_opidfind(myinfo,opid) ) + printf("jumblr_opidadd.(%s) ERROR, couldnt find after add\n",opid); + } + return(ptr); +} + +char *jumblr_zgetnewaddress(struct supernet_info *myinfo,struct iguana_info *coin) +{ + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_getnewaddress","")); +} + +char *jumblr_zlistoperationids(struct supernet_info *myinfo,struct iguana_info *coin) +{ + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_listoperationids","")); +} + +char *jumblr_zgetoperationresult(struct supernet_info *myinfo,struct iguana_info *coin,char *opid) +{ + char params[1024]; + sprintf(params,"[\"%s\"]",opid); + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_getoperationresult",params)); +} + +char *jumblr_sendt_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *taddr,char *zaddr,double amount) +{ + char params[1024]; double fee = (amount-3*JUMBLR_TXFEE) * JUMBLR_FEE; + sprintf(params,"[\"%s\", [{\"%s\":%.8f}, {\"%s\":%.8f}]], 1, %.8f",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); +} + +char *jumblr_sendz_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *zaddrS,char *zaddrD,double amount) +{ + char params[1024]; double fee = (amount-2*JUMBLR_TXFEE) * JUMBLR_FEE; + sprintf(params,"[\"%s\", [{\"%s\":%.8f}, {\"%s\":%.8f}], 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); +} + +char *jumblr_sendz_to_t(struct supernet_info *myinfo,struct iguana_info *coin,char *zaddr,char *taddr,double amount) +{ + char params[1024]; double fee = (amount-JUMBLR_TXFEE) * JUMBLR_FEE; + sprintf(params,"[\"%s\", [{\"%s\":%.8f}, {\"%s\":%.8f}], 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); +} + +char *jumblr_zlistreceivedbyaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) +{ + char params[1024]; + sprintf(params,"[\"%s\", 1]",addr); + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_listreceivedbyaddress",params)); +} + +char *jumblr_zgetbalance(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) +{ + char params[1024]; + sprintf(params,"[\"%s\", 1]",addr); + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_getbalance",params)); +} + +int64_t jumblr_receivedby(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) +{ + char *retstr; cJSON *retjson,*item; int32_t i,n; int64_t total = 0; + if ( (retstr= jumblr_zlistreceivedbyaddress(myinfo,coin,addr)) != 0 ) + { + printf("z_listreceivedbyaddress.(%s) -> (%s)\n",addr,retstr); + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( (n= cJSON_GetArraySize(retjson)) > 0 ) + { + for (i=0; i SMALLVAL ) + balance = val * SATOSHIDEN; + free(retstr); + } + return(balance); +} + +void jumblr_itemset(struct jumblr_item *ptr,cJSON *item,char *status) +{ + cJSON *params,*amounts,*dest; char *from,*addr; int32_t i,n; int64_t amount; + /*"params" : { + "fromaddress" : "RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5", + "amounts" : [ + { + "address" : "zc9s3UdkDFTnnwHrMCr1vYy2WmkjhmTxXNiqC42s7BjeKBVUwk766TTSsrRPKfnX31Bbu8wbrTqnjDqskYGwx48FZMPHvft", + "amount" : 3.00000000 + } + ], + "minconf" : 1, + "fee" : 0.00010000 + }*/ + if ( (params= jobj(item,"params")) != 0 ) + { + if ( (from= jstr(params,"fromaddress")) != 0 ) + safecopy(ptr->src,from,sizeof(ptr->src)); + if ( (amounts= jarray(&n,params,"amounts")) != 0 ) + { + for (i=0; i 0 ) + { + if ( strcmp(addr,JUMBLR_ADDR) == 0 ) + ptr->fee = amount; + else + { + ptr->amount = amount; + safecopy(ptr->dest,addr,sizeof(ptr->dest)); + } + } + } + } + ptr->txfee = jdouble(params,"fee") * SATOSHIDEN; + } +} + +void jumblr_opidupdate(struct supernet_info *myinfo,struct iguana_info *coin,struct jumblr_item *ptr) +{ + char *retstr,*status; cJSON *retjson; + if ( ptr->status == 0 ) + { + if ( (retstr= jumblr_zgetoperationresult(myinfo,coin,ptr->opid)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( (status= jstr(retjson,"status")) != 0 && strcmp(status,"pending") != 0 ) + jumblr_itemset(ptr,retjson,status); + free_json(retjson); + } + free(retstr); + } + } +} + +void jumblr_opidsupdate(struct supernet_info *myinfo,struct iguana_info *coin) +{ + char *retstr; cJSON *array; int32_t i,n; struct jumblr_item *ptr; + if ( (retstr= jumblr_zlistoperationids(myinfo,coin)) != 0 ) + { + if ( (array= cJSON_Parse(retstr)) != 0 ) + { + if ( (n= cJSON_GetArraySize(array)) > 0 ) + { + for (i=0; istatus == 0 ) + jumblr_opidupdate(myinfo,coin,ptr); + } + free_json(array); + } + free(retstr); + } +} + +bits256 jumblr_privkey(struct supernet_info *myinfo,char *BTCaddr,char *KMDaddr,char *prefix) +{ + bits256 privkey,pubkey; uint8_t pubkey33[33]; char passphrase[sizeof(myinfo->jumblr_passphrase) + 64]; + sprintf(passphrase,"%s%s",prefix,myinfo->jumblr_passphrase); + conv_NXTpassword(privkey.bytes,pubkey.bytes,(uint8_t *)passphrase,(int32_t)strlen(passphrase)); + bitcoin_pubkey33(myinfo->ctx,pubkey33,privkey); + bitcoin_address(BTCaddr,0,pubkey33,33); + bitcoin_address(KMDaddr,60,pubkey33,33); + return(privkey); +} + +void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval) +{ + char BTCaddr[64],KMDaddr[64],*zaddr,*retstr; bits256 priv0; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r; + // if BTC has arrived in deposit address, invoke DEX -> KMD + // if BTC has arrived in destination address, invoke DEX -> BTC + fee = JUMBLR_INCR * JUMBLR_FEE; + OS_randombytes(&r,sizeof(r)); + if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) + { + switch ( selector ) + { + case 0: // public -> z + priv0 = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + if ( (total= jumblr_balance(myinfo,coin,KMDaddr)) >= (JUMBLR_INCR + 3*(fee+JUMBLR_TXFEE))*SATOSHIDEN ) + { + if ( (r & 7) == 0 ) + { + if ( (zaddr= jumblr_zgetnewaddress(myinfo,coin)) != 0 ) + { + if ( total >= SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*100 + 3*JUMBLR_TXFEE) ) + amount = SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*100 + 3*JUMBLR_TXFEE); + else if ( total >= SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*10 + 3*JUMBLR_TXFEE) ) + amount = SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*10 + 3*JUMBLR_TXFEE); + else amount = SATOSHIDEN * ((JUMBLR_INCR + 3*fee) + 3*JUMBLR_TXFEE); + if ( (retstr= jumblr_sendt_to_z(myinfo,coin,KMDaddr,zaddr,dstr(amount))) != 0 ) + { + printf("sendt_to_z.(%s)\n",retstr); + free(retstr); + } + free(zaddr); + } + } + } + break; + case 1: // z -> z + jumblr_opidsupdate(myinfo,coin); + HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) + { + if ( strlen(ptr->src) < 40 ) + { + if ( (r & 7) == 0 && ptr->spent == 0 && (total= jumblr_balance(myinfo,coin,ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) + { + if ( (zaddr= jumblr_zgetnewaddress(myinfo,coin)) != 0 ) + { + if ( (retstr= jumblr_sendz_to_z(myinfo,coin,ptr->dest,zaddr,dstr(total))) != 0 ) + { + printf("sendz_to_z.(%s)\n",retstr); + free(retstr); + } + ptr->spent = (uint32_t)time(NULL); + free(zaddr); + break; + } + } + } + } + break; + case 2: // z -> public + jumblr_opidsupdate(myinfo,coin); + HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) + { + if ( strlen(ptr->src) >= 40 ) + { + if ( (r & 7) == 0 && ptr->spent == 0 && (total= jumblr_balance(myinfo,coin,ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) + { + priv0 = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); + if ( (retstr= jumblr_sendz_to_t(myinfo,coin,ptr->dest,KMDaddr,dstr(total))) != 0 ) + { + printf("sendz_to_t.(%s)\n",retstr); + free(retstr); + } + ptr->spent = (uint32_t)time(NULL); + break; + } + } + } + break; + } + } +} + +#include "../includes/iguana_apidefs.h" +#include "../includes/iguana_apideclares.h" + +STRING_ARG(jumblr,setpassphrase,passphrase) +{ + cJSON *retjson; char KMDaddr[64],BTCaddr[64]; + if ( passphrase == 0 || passphrase[0] == 0 || (coin= iguana_coinfind("KMD")) == 0 || coin->FULLNODE >= 0 ) + return(clonestr("{\"error\":\"no passphrase or no native komodod\"}")); + else + { + safecopy(myinfo->jumblr_passphrase,passphrase,sizeof(myinfo->jumblr_passphrase)); + retjson = cJSON_CreateObject(); + jaddstr(retjson,"result","success"); + jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + jaddstr(retjson,"BTCdeposit","notyet"); + jaddstr(retjson,"KMDdeposit",KMDaddr); + jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); + jaddstr(retjson,"BTCjumblr","notyet"); + jaddstr(retjson,"KMDjumblr",KMDaddr); + return(clonestr("{\"result\":\"success\"}")); + } +} + +ZERO_ARGS(jumblr,status) +{ + cJSON *retjson; char KMDaddr[64],BTCaddr[64]; struct jumblr_item *ptr,*tmp; int64_t deposited,step_t2z,step_z2z,step_z2t,finished; + if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 ) + { + jumblr_opidsupdate(myinfo,coin); + retjson = cJSON_CreateObject(); + step_t2z = step_z2z = step_z2t = deposited = finished = 0; + jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + deposited = jumblr_receivedby(myinfo,coin,KMDaddr); + jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); + finished = jumblr_receivedby(myinfo,coin,KMDaddr); + HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) + { + if ( strlen(ptr->src) >= 40 ) + { + if ( strlen(ptr->dest) >= 40 ) + step_z2z += ptr->amount; + else step_z2t += ptr->amount; + } + else step_t2z += ptr->amount; + } + jaddstr(retjson,"result","success"); + jaddnum(retjson,"deposited",dstr(deposited)); + jaddnum(retjson,"t_to_z",dstr(step_t2z)); + jaddnum(retjson,"z_to_z",dstr(step_z2z)); + jaddnum(retjson,"z_to_t",dstr(step_z2t)); + jaddnum(retjson,"finished",dstr(finished)); + jaddnum(retjson,"pending",dstr(deposited) - dstr(finished)); + return(jprint(retjson,1)); + } else return(clonestr("{\"error\":\"no passphrase or no native komodod\"}")); +} + +#include "../includes/iguana_apiundefs.h" diff --git a/iguana/SuperNET_keys.c b/iguana/SuperNET_keys.c index 904da0c83..b44fc1b18 100755 --- a/iguana/SuperNET_keys.c +++ b/iguana/SuperNET_keys.c @@ -465,6 +465,8 @@ THREE_STRINGS(SuperNET,encryptjson,password,permanentfile,payload) free_json(argjson); return(jprint(retjson,1)); } + + #include "../includes/iguana_apiundefs.h" diff --git a/iguana/autoAPI.md b/iguana/autoAPI.md new file mode 100644 index 000000000..59a5b17f5 --- /dev/null +++ b/iguana/autoAPI.md @@ -0,0 +1,4726 @@ + + +dpow API +=== +need to create help/dpow.md file + +## method: pending + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"pending\",\"fiat\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dpow/pending?fiat={string} +``` + +field | value type | Description +--------- | ------- | ----------- +fiat | string | no help info + +## method: notarychains + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"notarychains\"}" +``` + +```url +http://127.0.0.1:7778/api/dpow/notarychains +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: active + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"active\",\"maskhex\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dpow/active?maskhex={string} +``` + +field | value type | Description +--------- | ------- | ----------- +maskhex | string | no help info + +## method: ratify + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"ratify\",\"minsigs\":\"{int}\",\"timestamp\":\"{int}\",\"ratified\":\"{array}\"}" +``` + +```url +http://127.0.0.1:7778/api/dpow/ratify?minsigs={int}×tamp={int}&ratified={array} +``` + +field | value type | Description +--------- | ------- | ----------- +minsigs | int | no help info +timestamp | int | no help info +ratified | array | no help info + +## method: cancelratify + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"cancelratify\"}" +``` + +```url +http://127.0.0.1:7778/api/dpow/cancelratify +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: bindaddr + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"bindaddr\",\"ipaddr\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dpow/bindaddr?ipaddr={string} +``` + +field | value type | Description +--------- | ------- | ----------- +ipaddr | string | no help info + +## method: fundnotaries + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"fundnotaries\",\"symbol\":\"{string}\",\"numblocks\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/dpow/fundnotaries?symbol={string}&numblocks={int} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +numblocks | int | no help info + +pax API +=== +need to create help/pax.md file + +## method: start + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"pax\",\"method\":\"start\"}" +``` + +```url +http://127.0.0.1:7778/api/pax/start +``` + +field | value type | Description +--------- | ------- | ----------- + +passthru API +=== +need to create help/passthru.md file + +## method: paxfiats + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"passthru\",\"method\":\"paxfiats\",\"mask\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/passthru/paxfiats?mask={int} +``` + +field | value type | Description +--------- | ------- | ----------- +mask | int | no help info + +zcash API +=== +need to create help/zcash.md file + +## method: passthru + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"zcash\",\"method\":\"passthru\",\"function\":\"{string}\",\"hex\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/zcash/passthru?function={string}&hex={string} +``` + +field | value type | Description +--------- | ------- | ----------- +function | string | no help info +hex | string | no help info + +komodo API +=== +need to create help/komodo.md file + +## method: passthru + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"komodo\",\"method\":\"passthru\",\"function\":\"{string}\",\"hex\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/komodo/passthru?function={string}&hex={string} +``` + +field | value type | Description +--------- | ------- | ----------- +function | string | no help info +hex | string | no help info + +dex API +=== +need to create help/dex.md file + +## method: kvsearch + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"kvsearch\",\"symbol\":\"{string}\",\"key\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/kvsearch?symbol={string}&key={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +key | string | no help info + +## method: kvupdate + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"kvupdate\",\"symbol\":\"{string}\",\"key\":\"{string}\",\"value\":\"{string}\",\"flags\":\"{int}\",\"unused\":\"{int}\",\"unusedb\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/kvupdate?symbol={string}&key={string}&value={string}&flags={int}&unused={int}&unusedb={int} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +key | string | no help info +value | string | no help info +flags | int | no help info +unused | int | no help info +unusedb | int | no help info + +## method: send + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"send\",\"hex\":\"{string}\",\"handler\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/send?hex={string}&handler={string} +``` + +field | value type | Description +--------- | ------- | ----------- +hex | string | no help info +handler | string | no help info + +## method: gettransaction + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettransaction\",\"txid\":\"{hash}\",\"symbol\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/gettransaction?txid={hash}&symbol={str} +``` + +field | value type | Description +--------- | ------- | ----------- +txid | hash | no help info +symbol | str | no help info + +## method: getinfo + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getinfo\",\"symbol\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/getinfo?symbol={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info + +## method: getnotaries + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getnotaries\",\"symbol\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/getnotaries?symbol={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info + +## method: alladdresses + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"alladdresses\",\"symbol\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/alladdresses?symbol={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info + +## method: getbestblockhash + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getbestblockhash\",\"symbol\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/getbestblockhash?symbol={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info + +## method: getblockhash + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getblockhash\",\"symbol\":\"{string}\",\"height\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/getblockhash?symbol={string}&height={int} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +height | int | no help info + +## method: getblock + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getblock\",\"hash\":\"{hash}\",\"symbol\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/getblock?hash={hash}&symbol={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +symbol | str | no help info + +## method: sendrawtransaction + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"sendrawtransaction\",\"symbol\":\"{string}\",\"signedtx\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/sendrawtransaction?symbol={string}&signedtx={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +signedtx | string | no help info + +## method: gettxout + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettxout\",\"txid\":\"{hash}\",\"symbol\":\"{str}\",\"vout\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/gettxout?txid={hash}&symbol={str}&vout={int} +``` + +field | value type | Description +--------- | ------- | ----------- +txid | hash | no help info +symbol | str | no help info +vout | int | no help info + +## method: importaddress + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/importaddress?symbol={string}&address={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +address | string | no help info + +## method: validateaddress + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"validateaddress\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/validateaddress?symbol={string}&address={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +address | string | no help info + +## method: checkaddress + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"checkaddress\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/checkaddress?symbol={string}&address={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +address | string | no help info + +## method: listunspent + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/listunspent?symbol={string}&address={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +address | string | no help info + +## method: listtransactions + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listtransactions\",\"symbol\":\"{string}\",\"address\":\"{string}\",\"count\":\"{float}\",\"skip\":\"{float}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/listtransactions?symbol={string}&address={string}&count={float}&skip={float} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +address | string | no help info +count | float | no help info +skip | float | no help info + +## method: listunspent2 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent2\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/listunspent2?symbol={string}&address={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +address | string | no help info + +## method: listtransactions2 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listtransactions2\",\"symbol\":\"{string}\",\"address\":\"{string}\",\"count\":\"{float}\",\"skip\":\"{float}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/listtransactions2?symbol={string}&address={string}&count={float}&skip={float} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +address | string | no help info +count | float | no help info +skip | float | no help info + +## method: gettxin + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettxin\",\"txid\":\"{hash}\",\"symbol\":\"{str}\",\"vout\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/gettxin?txid={hash}&symbol={str}&vout={int} +``` + +field | value type | Description +--------- | ------- | ----------- +txid | hash | no help info +symbol | str | no help info +vout | int | no help info + +## method: listspent + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listspent\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/listspent?symbol={string}&address={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +address | string | no help info + +## method: getbalance + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getbalance\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/getbalance?symbol={string}&address={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +address | string | no help info + +## method: explorer + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"explorer\",\"symbol\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/explorer?symbol={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info + +basilisk API +=== +need to create help/basilisk.md file + +## method: genesis_opreturn + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"genesis_opreturn\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/genesis_opreturn?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: history + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"history\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/history?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: paxfiats + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"paxfiats\",\"mask\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/paxfiats?mask={int} +``` + +field | value type | Description +--------- | ------- | ----------- +mask | int | no help info + +## method: balances + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"balances\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/balances?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: value + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"value\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/value?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: rawtx + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"rawtx\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/rawtx?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: refresh + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"refresh\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/refresh?symbol={string}&address={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +address | string | no help info + +## method: utxorawtx + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"utxorawtx\",\"symbol\":\"{string}\",\"utxos\":\"{array}\",\"vals\":\"{object}\",\"ignore\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/utxorawtx?symbol={string}&utxos={array}&vals={object}&ignore={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +utxos | array | no help info +vals | object | no help info +ignore | string | no help info + +## method: getmessage + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"getmessage\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/getmessage?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: sendmessage + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"sendmessage\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/sendmessage?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: geckoheaders + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"geckoheaders\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/geckoheaders?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: geckoblock + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"geckoblock\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/geckoblock?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: geckotx + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"geckotx\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/geckotx?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: geckoget + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"geckoget\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/geckoget?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: addrelay + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"addrelay\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/addrelay?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: dispatch + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"dispatch\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/dispatch?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: publish + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"publish\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/publish?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: subscribe + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"subscribe\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/subscribe?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: forward + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"forward\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/forward?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: mailbox + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"mailbox\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/mailbox?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +bitcoinrpc API +=== +need to create help/bitcoinrpc.md file + +## method: getinfo + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getinfo\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getinfo +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: getblockcount + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getblockcount\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getblockcount +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: getdifficulty + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getdifficulty\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getdifficulty +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: getbestblockhash + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getbestblockhash\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getbestblockhash +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: getblockhash + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getblockhash\",\"height\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getblockhash?height={int} +``` + +field | value type | Description +--------- | ------- | ----------- +height | int | no help info + +## method: getblock + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getblock\",\"blockhash\":\"{hash}\",\"verbose\":\"{int}\",\"remoteonly\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getblock?blockhash={hash}&verbose={int}&remoteonly={int} +``` + +field | value type | Description +--------- | ------- | ----------- +blockhash | hash | no help info +verbose | int | no help info +remoteonly | int | no help info + +## method: getrawtransaction + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getrawtransaction\",\"txid\":\"{hash}\",\"verbose\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getrawtransaction?txid={hash}&verbose={int} +``` + +field | value type | Description +--------- | ------- | ----------- +txid | hash | no help info +verbose | int | no help info + +## method: gettransaction + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"gettransaction\",\"txid\":\"{hash}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/gettransaction?txid={hash} +``` + +field | value type | Description +--------- | ------- | ----------- +txid | hash | no help info + +## method: gettxout + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"gettxout\",\"txid\":\"{hash}\",\"vout\":\"{int}\",\"mempool\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/gettxout?txid={hash}&vout={int}&mempool={int} +``` + +field | value type | Description +--------- | ------- | ----------- +txid | hash | no help info +vout | int | no help info +mempool | int | no help info + +## method: listunspent + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listunspent\",\"minconf\":\"{int}\",\"maxconf\":\"{int}\",\"array\":\"{array}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/listunspent?minconf={int}&maxconf={int}&array={array} +``` + +field | value type | Description +--------- | ------- | ----------- +minconf | int | no help info +maxconf | int | no help info +array | array | no help info + +## method: decodescript + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"decodescript\",\"scriptstr\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/decodescript?scriptstr={string} +``` + +field | value type | Description +--------- | ------- | ----------- +scriptstr | string | no help info + +## method: decoderawtransaction + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"decoderawtransaction\",\"rawtx\":\"{string}\",\"suppress\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/decoderawtransaction?rawtx={string}&suppress={int} +``` + +field | value type | Description +--------- | ------- | ----------- +rawtx | string | no help info +suppress | int | no help info + +## method: validaterawtransaction + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"validaterawtransaction\",\"rawtx\":\"{string}\",\"suppress\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/validaterawtransaction?rawtx={string}&suppress={int} +``` + +field | value type | Description +--------- | ------- | ----------- +rawtx | string | no help info +suppress | int | no help info + +## method: createrawtransaction + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"createrawtransaction\",\"vins\":\"{array}\",\"vouts\":\"{object}\",\"locktime\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/createrawtransaction?vins={array}&vouts={object}&locktime={int} +``` + +field | value type | Description +--------- | ------- | ----------- +vins | array | no help info +vouts | object | no help info +locktime | int | no help info + +## method: validatepubkey + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"validatepubkey\",\"pubkey\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/validatepubkey?pubkey={string} +``` + +field | value type | Description +--------- | ------- | ----------- +pubkey | string | no help info + +## method: validateaddress + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"validateaddress\",\"address\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/validateaddress?address={string} +``` + +field | value type | Description +--------- | ------- | ----------- +address | string | no help info + +## method: walletlock + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"walletlock\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/walletlock +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: walletpassphrase + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"walletpassphrase\",\"password\":\"{string}\",\"permanentfile\":\"{string}\",\"timeout\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/walletpassphrase?password={string}&permanentfile={string}&timeout={int} +``` + +field | value type | Description +--------- | ------- | ----------- +password | string | no help info +permanentfile | string | no help info +timeout | int | no help info + +## method: encryptwallet + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"encryptwallet\",\"passphrase\":\"{string}\",\"password\":\"{string}\",\"permanentfile\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/encryptwallet?passphrase={string}&password={string}&permanentfile={string} +``` + +field | value type | Description +--------- | ------- | ----------- +passphrase | string | no help info +password | string | no help info +permanentfile | string | no help info + +## method: walletpassphrasechange + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"walletpassphrasechange\",\"oldpassword\":\"{string}\",\"newpassword\":\"{string}\",\"oldpermanentfile\":\"{string}\",\"permanentfile\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/walletpassphrasechange?oldpassword={string}&newpassword={string}&oldpermanentfile={string}&permanentfile={string} +``` + +field | value type | Description +--------- | ------- | ----------- +oldpassword | string | no help info +newpassword | string | no help info +oldpermanentfile | string | no help info +permanentfile | string | no help info + +## method: dumpwallet + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"dumpwallet\",\"filename\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/dumpwallet?filename={string} +``` + +field | value type | Description +--------- | ------- | ----------- +filename | string | no help info + +## method: backupwallet + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"backupwallet\",\"filename\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/backupwallet?filename={string} +``` + +field | value type | Description +--------- | ------- | ----------- +filename | string | no help info + +## method: importwallet + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"importwallet\",\"filename\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/importwallet?filename={string} +``` + +field | value type | Description +--------- | ------- | ----------- +filename | string | no help info + +## method: getnewaddress + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getnewaddress\",\"account\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getnewaddress?account={string} +``` + +field | value type | Description +--------- | ------- | ----------- +account | string | no help info + +## method: importprivkey + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"importprivkey\",\"wif\":\"{string}\",\"account\":\"{string}\",\"rescan\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/importprivkey?wif={string}&account={string}&rescan={int} +``` + +field | value type | Description +--------- | ------- | ----------- +wif | string | no help info +account | string | no help info +rescan | int | no help info + +## method: importaddress + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"importaddress\",\"address\":\"{string}\",\"account\":\"{string}\",\"rescan\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/importaddress?address={string}&account={string}&rescan={int} +``` + +field | value type | Description +--------- | ------- | ----------- +address | string | no help info +account | string | no help info +rescan | int | no help info + +## method: dumpprivkey + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"dumpprivkey\",\"address\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/dumpprivkey?address={string} +``` + +field | value type | Description +--------- | ------- | ----------- +address | string | no help info + +## method: listtransactions + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listtransactions\",\"account\":\"{string}\",\"count\":\"{int}\",\"skip\":\"{int}\",\"includewatchonly\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/listtransactions?account={string}&count={int}&skip={int}&includewatchonly={int} +``` + +field | value type | Description +--------- | ------- | ----------- +account | string | no help info +count | int | no help info +skip | int | no help info +includewatchonly | int | no help info + +## method: listreceivedbyaddress + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listreceivedbyaddress\",\"minconf\":\"{int}\",\"includeempty\":\"{int}\",\"flag\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/listreceivedbyaddress?minconf={int}&includeempty={int}&flag={int} +``` + +field | value type | Description +--------- | ------- | ----------- +minconf | int | no help info +includeempty | int | no help info +flag | int | no help info + +## method: listreceivedbyaccount + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listreceivedbyaccount\",\"confirmations\":\"{int}\",\"includeempty\":\"{int}\",\"watchonly\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/listreceivedbyaccount?confirmations={int}&includeempty={int}&watchonly={int} +``` + +field | value type | Description +--------- | ------- | ----------- +confirmations | int | no help info +includeempty | int | no help info +watchonly | int | no help info + +## method: listaccounts + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listaccounts\",\"minconf\":\"{int}\",\"includewatchonly\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/listaccounts?minconf={int}&includewatchonly={int} +``` + +field | value type | Description +--------- | ------- | ----------- +minconf | int | no help info +includewatchonly | int | no help info + +## method: listaddressgroupings + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listaddressgroupings\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/listaddressgroupings +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: getreceivedbyaddress + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getreceivedbyaddress\",\"address\":\"{string}\",\"minconf\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getreceivedbyaddress?address={string}&minconf={int} +``` + +field | value type | Description +--------- | ------- | ----------- +address | string | no help info +minconf | int | no help info + +## method: getreceivedbyaccount + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getreceivedbyaccount\",\"account\":\"{string}\",\"includeempty\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getreceivedbyaccount?account={string}&includeempty={int} +``` + +field | value type | Description +--------- | ------- | ----------- +account | string | no help info +includeempty | int | no help info + +## method: getbalance + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getbalance\",\"account\":\"{string}\",\"confirmations\":\"{int}\",\"includeempty\":\"{int}\",\"lastheight\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getbalance?account={string}&confirmations={int}&includeempty={int}&lastheight={int} +``` + +field | value type | Description +--------- | ------- | ----------- +account | string | no help info +confirmations | int | no help info +includeempty | int | no help info +lastheight | int | no help info + +## method: getaddressesbyaccount + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getaddressesbyaccount\",\"account\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getaddressesbyaccount?account={string} +``` + +field | value type | Description +--------- | ------- | ----------- +account | string | no help info + +## method: getaccount + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getaccount\",\"address\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getaccount?address={string} +``` + +field | value type | Description +--------- | ------- | ----------- +address | string | no help info + +## method: getaccountaddress + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getaccountaddress\",\"account\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getaccountaddress?account={string} +``` + +field | value type | Description +--------- | ------- | ----------- +account | string | no help info + +## method: setaccount + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"setaccount\",\"address\":\"{string}\",\"account\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/setaccount?address={string}&account={string} +``` + +field | value type | Description +--------- | ------- | ----------- +address | string | no help info +account | string | no help info + +## method: createmultisig + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"createmultisig\",\"M\":\"{int}\",\"pubkeys\":\"{array}\",\"ignore\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/createmultisig?M={int}&pubkeys={array}&ignore={string} +``` + +field | value type | Description +--------- | ------- | ----------- +M | int | no help info +pubkeys | array | no help info +ignore | string | no help info + +## method: addmultisigaddress + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"addmultisigaddress\",\"M\":\"{int}\",\"pubkeys\":\"{array}\",\"account\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/addmultisigaddress?M={int}&pubkeys={array}&account={string} +``` + +field | value type | Description +--------- | ------- | ----------- +M | int | no help info +pubkeys | array | no help info +account | string | no help info + +## method: settxfee + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"settxfee\",\"amount\":\"{float}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/settxfee?amount={float} +``` + +field | value type | Description +--------- | ------- | ----------- +amount | float | no help info + +## method: checkwallet + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"checkwallet\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/checkwallet +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: repairwallet + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"repairwallet\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/repairwallet +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: signrawtransaction + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"signrawtransaction\",\"rawtx\":\"{string}\",\"vins\":\"{array}\",\"privkeys\":\"{object}\",\"sighash\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/signrawtransaction?rawtx={string}&vins={array}&privkeys={object}&sighash={string} +``` + +field | value type | Description +--------- | ------- | ----------- +rawtx | string | no help info +vins | array | no help info +privkeys | object | no help info +sighash | string | no help info + +## method: signmessage + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"signmessage\",\"address\":\"{string}\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/signmessage?address={string}&message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +address | string | no help info +message | string | no help info + +## method: verifymessage + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"verifymessage\",\"address\":\"{string}\",\"sig\":\"{string}\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/verifymessage?address={string}&sig={string}&message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +address | string | no help info +sig | string | no help info +message | string | no help info + +## method: sendrawtransaction + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"sendrawtransaction\",\"rawtx\":\"{string}\",\"allowhighfees\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/sendrawtransaction?rawtx={string}&allowhighfees={int} +``` + +field | value type | Description +--------- | ------- | ----------- +rawtx | string | no help info +allowhighfees | int | no help info + +## method: sendfrom + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"sendfrom\",\"fromaccount\":\"{string}\",\"toaddress\":\"{string}\",\"amount\":\"{float}\",\"minconf\":\"{int}\",\"comment\":\"{string}\",\"comment2\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/sendfrom?fromaccount={string}&toaddress={string}&amount={float}&minconf={int}&comment={string}&comment2={string} +``` + +field | value type | Description +--------- | ------- | ----------- +fromaccount | string | no help info +toaddress | string | no help info +amount | float | no help info +minconf | int | no help info +comment | string | no help info +comment2 | string | no help info + +## method: sendmany + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"sendmany\",\"fromaccount\":\"{string}\",\"payments\":\"{array}\",\"minconf\":\"{int}\",\"comment\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/sendmany?fromaccount={string}&payments={array}&minconf={int}&comment={string} +``` + +field | value type | Description +--------- | ------- | ----------- +fromaccount | string | no help info +payments | array | no help info +minconf | int | no help info +comment | string | no help info + +## method: sendtoaddress + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"sendtoaddress\",\"address\":\"{string}\",\"amount\":\"{float}\",\"comment\":\"{string}\",\"comment2\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/sendtoaddress?address={string}&amount={float}&comment={string}&comment2={string} +``` + +field | value type | Description +--------- | ------- | ----------- +address | string | no help info +amount | float | no help info +comment | string | no help info +comment2 | string | no help info + +## method: lockunspent + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"lockunspent\",\"flag\":\"{int}\",\"array\":\"{array}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/lockunspent?flag={int}&array={array} +``` + +field | value type | Description +--------- | ------- | ----------- +flag | int | no help info +array | array | no help info + +## method: listlockunspent + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listlockunspent\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/listlockunspent +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: submitblock + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"submitblock\",\"rawbytes\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/submitblock?rawbytes={string} +``` + +field | value type | Description +--------- | ------- | ----------- +rawbytes | string | no help info + +## method: listsinceblock + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listsinceblock\",\"blockhash\":\"{hash}\",\"target\":\"{int}\",\"flag\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/listsinceblock?blockhash={hash}&target={int}&flag={int} +``` + +field | value type | Description +--------- | ------- | ----------- +blockhash | hash | no help info +target | int | no help info +flag | int | no help info + +## method: gettxoutsetinfo + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"gettxoutsetinfo\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/gettxoutsetinfo +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: getrawchangeaddress + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getrawchangeaddress\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getrawchangeaddress +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: move + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"move\",\"fromaccount\":\"{string}\",\"toaccount\":\"{string}\",\"amount\":\"{float}\",\"minconf\":\"{int}\",\"comment\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/move?fromaccount={string}&toaccount={string}&amount={float}&minconf={int}&comment={string} +``` + +field | value type | Description +--------- | ------- | ----------- +fromaccount | string | no help info +toaccount | string | no help info +amount | float | no help info +minconf | int | no help info +comment | string | no help info + +iguana API +=== +need to create help/iguana.md file + +## method: splitfunds + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"splitfunds\",\"satoshis\":\"{int}\",\"duplicates\":\"{int}\",\"sendflag\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/splitfunds?satoshis={int}&duplicates={int}&sendflag={int} +``` + +field | value type | Description +--------- | ------- | ----------- +satoshis | int | no help info +duplicates | int | no help info +sendflag | int | no help info + +## method: makekeypair + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"makekeypair\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/makekeypair +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: rates + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"rates\",\"unused\":\"{int}\",\"quotes\":\"{array}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/rates?unused={int}"es={array} +``` + +field | value type | Description +--------- | ------- | ----------- +unused | int | no help info +quotes | array | no help info + +## method: rate + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"rate\",\"base\":\"{string}\",\"rel\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/rate?base={string}&rel={string} +``` + +field | value type | Description +--------- | ------- | ----------- +base | string | no help info +rel | string | no help info + +## method: prices + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"prices\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"period\":\"{int}\",\"start\":\"{int}\",\"end\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/prices?exchange={string}&base={string}&rel={string}&period={int}&start={int}&end={int} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +base | string | no help info +rel | string | no help info +period | int | no help info +start | int | no help info +end | int | no help info + +## method: snapshot + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"snapshot\",\"symbol\":\"{string}\",\"height\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/snapshot?symbol={string}&height={int} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +height | int | no help info + +## method: dividends + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"dividends\",\"height\":\"{int}\",\"vals\":\"{array}\",\"symbol\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/dividends?height={int}&vals={array}&symbol={string} +``` + +field | value type | Description +--------- | ------- | ----------- +height | int | no help info +vals | array | no help info +symbol | string | no help info + +## method: passthru + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"passthru\",\"asset\":\"{string}\",\"function\":\"{string}\",\"hex\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/passthru?asset={string}&function={string}&hex={string} +``` + +field | value type | Description +--------- | ------- | ----------- +asset | string | no help info +function | string | no help info +hex | string | no help info + +## method: initfastfind + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"initfastfind\",\"activecoin\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/initfastfind?activecoin={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info + +## method: dpow + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"{string}\",\"pubkey\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/dpow?symbol={string}&pubkey={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +pubkey | string | no help info + +## method: peers + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"peers\",\"activecoin\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/peers?activecoin={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info + +## method: maxpeers + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"maxpeers\",\"activecoin\":\"{string}\",\"max\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/maxpeers?activecoin={string}&max={int} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info +max | int | no help info + +## method: getconnectioncount + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"getconnectioncount\",\"activecoin\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/getconnectioncount?activecoin={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info + +## method: addcoin + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"addcoin\",\"newcoin\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/addcoin?newcoin={string} +``` + +field | value type | Description +--------- | ------- | ----------- +newcoin | string | no help info + +## method: validate + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"validate\",\"activecoin\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/validate?activecoin={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info + +## method: removecoin + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"removecoin\",\"activecoin\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/removecoin?activecoin={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info + +## method: startcoin + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"startcoin\",\"activecoin\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/startcoin?activecoin={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info + +## method: pausecoin + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"pausecoin\",\"activecoin\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/pausecoin?activecoin={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info + +## method: stopcoin + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"stopcoin\",\"activecoin\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/stopcoin?activecoin={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info + +## method: addnode + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"addnode\",\"activecoin\":\"{string}\",\"ipaddr\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/addnode?activecoin={string}&ipaddr={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info +ipaddr | string | no help info + +## method: addnotary + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"addnotary\",\"ipaddr\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/addnotary?ipaddr={string} +``` + +field | value type | Description +--------- | ------- | ----------- +ipaddr | string | no help info + +## method: persistent + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"persistent\",\"activecoin\":\"{string}\",\"ipaddr\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/persistent?activecoin={string}&ipaddr={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info +ipaddr | string | no help info + +## method: removenode + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"removenode\",\"activecoin\":\"{string}\",\"ipaddr\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/removenode?activecoin={string}&ipaddr={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info +ipaddr | string | no help info + +## method: oneshot + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"oneshot\",\"activecoin\":\"{string}\",\"ipaddr\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/oneshot?activecoin={string}&ipaddr={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info +ipaddr | string | no help info + +## method: nodestatus + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"nodestatus\",\"activecoin\":\"{string}\",\"ipaddr\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/nodestatus?activecoin={string}&ipaddr={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info +ipaddr | string | no help info + +## method: balance + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"balance\",\"activecoin\":\"{string}\",\"address\":\"{string}\",\"heightd\":\"{float}\",\"minconfd\":\"{float}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/balance?activecoin={string}&address={string}&heightd={float}&minconfd={float} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info +address | string | no help info +heightd | float | no help info +minconfd | float | no help info + +## method: spendmsig + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"spendmsig\",\"activecoin\":\"{string}\",\"vintxid\":\"{hash}\",\"vinvout\":\"{int}\",\"destaddress\":\"{string}\",\"destamount\":\"{float}\",\"destaddress2\":\"{string}\",\"destamount2\":\"{float}\",\"M\":\"{int}\",\"N\":\"{int}\",\"pubA\":\"{string}\",\"wifA\":\"{string}\",\"pubB\":\"{string}\",\"wifB\":\"{string}\",\"pubC\":\"{string}\",\"wifC\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/spendmsig?activecoin={string}&vintxid={hash}&vinvout={int}&destaddress={string}&destamount={float}&destaddress2={string}&destamount2={float}&M={int}&N={int}&pubA={string}&wifA={string}&pubB={string}&wifB={string}&pubC={string}&wifC={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info +vintxid | hash | no help info +vinvout | int | no help info +destaddress | string | no help info +destamount | float | no help info +destaddress2 | string | no help info +destamount2 | float | no help info +M | int | no help info +N | int | no help info +pubA | string | no help info +wifA | string | no help info +pubB | string | no help info +wifB | string | no help info +pubC | string | no help info +wifC | string | no help info + +## method: bundleaddresses + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"bundleaddresses\",\"activecoin\":\"{string}\",\"height\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/bundleaddresses?activecoin={string}&height={int} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info +height | int | no help info + +## method: bundlehashes + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"bundlehashes\",\"activecoin\":\"{string}\",\"height\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/bundlehashes?activecoin={string}&height={int} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info +height | int | no help info + +## method: PoSweights + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"PoSweights\",\"activecoin\":\"{string}\",\"height\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/PoSweights?activecoin={string}&height={int} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info +height | int | no help info + +## method: stakers + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"stakers\",\"activecoin\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/stakers?activecoin={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info + +jumblr API +=== +need to create help/jumblr.md file + +## method: setpassphrase + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"jumblr\",\"method\":\"setpassphrase\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/jumblr/setpassphrase?passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +passphrase | string | no help info + +InstantDEX API +=== +need to create help/InstantDEX.md file + +## method: allcoins + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"allcoins\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/allcoins +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: available + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"available\",\"source\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/available?source={string} +``` + +field | value type | Description +--------- | ------- | ----------- +source | string | no help info + +## method: request + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"request\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/request?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: incoming + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"incoming\",\"requestid\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/incoming?requestid={int} +``` + +field | value type | Description +--------- | ------- | ----------- +requestid | int | no help info + +## method: automatched + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"automatched\",\"requestid\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/automatched?requestid={int} +``` + +field | value type | Description +--------- | ------- | ----------- +requestid | int | no help info + +## method: accept + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"accept\",\"requestid\":\"{int}\",\"quoteid\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/accept?requestid={int}"eid={int} +``` + +field | value type | Description +--------- | ------- | ----------- +requestid | int | no help info +quoteid | int | no help info + +## method: buy + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"buy\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"price\":\"{float}\",\"volume\":\"{float}\",\"dotrade\":\"{float}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/buy?exchange={string}&base={string}&rel={string}&price={float}&volume={float}&dotrade={float} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +base | string | no help info +rel | string | no help info +price | float | no help info +volume | float | no help info +dotrade | float | no help info + +## method: sell + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"sell\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"price\":\"{float}\",\"volume\":\"{float}\",\"dotrade\":\"{float}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/sell?exchange={string}&base={string}&rel={string}&price={float}&volume={float}&dotrade={float} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +base | string | no help info +rel | string | no help info +price | float | no help info +volume | float | no help info +dotrade | float | no help info + +## method: withdraw + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"withdraw\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"destaddr\":\"{string}\",\"amount\":\"{float}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/withdraw?exchange={string}&base={string}&destaddr={string}&amount={float} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +base | string | no help info +destaddr | string | no help info +amount | float | no help info + +## method: apikeypair + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"apikeypair\",\"exchange\":\"{string}\",\"apikey\":\"{string}\",\"apisecret\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/apikeypair?exchange={string}&apikey={string}&apisecret={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +apikey | string | no help info +apisecret | string | no help info + +## method: setuserid + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"setuserid\",\"exchange\":\"{string}\",\"userid\":\"{string}\",\"tradepassword\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/setuserid?exchange={string}&userid={string}&tradepassword={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +userid | string | no help info +tradepassword | string | no help info + +## method: balance + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"balance\",\"exchange\":\"{string}\",\"base\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/balance?exchange={string}&base={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +base | string | no help info + +## method: orderstatus + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"orderstatus\",\"exchange\":\"{string}\",\"orderid\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/orderstatus?exchange={string}&orderid={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +orderid | string | no help info + +## method: cancelorder + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"cancelorder\",\"exchange\":\"{string}\",\"orderid\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/cancelorder?exchange={string}&orderid={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +orderid | string | no help info + +## method: openorders + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"openorders\",\"exchange\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/openorders?exchange={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info + +## method: tradehistory + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"tradehistory\",\"exchange\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/tradehistory?exchange={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info + +## method: orderbook + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"orderbook\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"depth\":\"{int}\",\"allfields\":\"{int}\",\"ignore\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/orderbook?exchange={string}&base={string}&rel={string}&depth={int}&allfields={int}&ignore={int} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +base | string | no help info +rel | string | no help info +depth | int | no help info +allfields | int | no help info +ignore | int | no help info + +## method: pollgap + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"pollgap\",\"exchange\":\"{string}\",\"pollgap\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/pollgap?exchange={string}&pollgap={int} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +pollgap | int | no help info + +## method: allexchanges + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"allexchanges\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/allexchanges +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: allpairs + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"allpairs\",\"exchange\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/allpairs?exchange={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info + +## method: supports + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"supports\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/supports?exchange={string}&base={string}&rel={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +base | string | no help info +rel | string | no help info + +tradebot API +=== +need to create help/tradebot.md file + +## method: liquidity + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"targetcoin\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/liquidity?hash={hash}&vals={array}&targetcoin={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +targetcoin | str | no help info + +## method: amlp + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"amlp\",\"blocktrail\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/amlp?blocktrail={string} +``` + +field | value type | Description +--------- | ------- | ----------- +blocktrail | string | no help info + +## method: notlp + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"notlp\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/notlp +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: gensvm + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"gensvm\",\"base\":\"{string}\",\"rel\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/gensvm?base={string}&rel={string} +``` + +field | value type | Description +--------- | ------- | ----------- +base | string | no help info +rel | string | no help info + +## method: openliquidity + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"openliquidity\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/openliquidity +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: aveprice + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"aveprice\",\"comment\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"basevolume\":\"{float}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/aveprice?comment={string}&base={string}&rel={string}&basevolume={float} +``` + +field | value type | Description +--------- | ------- | ----------- +comment | string | no help info +base | string | no help info +rel | string | no help info +basevolume | float | no help info + +## method: monitor + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"monitor\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"commission\":\"{float}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/monitor?exchange={string}&base={string}&rel={string}&commission={float} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +base | string | no help info +rel | string | no help info +commission | float | no help info + +## method: monitorall + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"monitorall\",\"exchange\":\"{string}\",\"commission\":\"{float}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/monitorall?exchange={string}&commission={float} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +commission | float | no help info + +## method: unmonitor + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"unmonitor\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/unmonitor?exchange={string}&base={string}&rel={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +base | string | no help info +rel | string | no help info + +## method: accumulate + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"accumulate\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"price\":\"{float}\",\"volume\":\"{float}\",\"duration\":\"{float}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/accumulate?exchange={string}&base={string}&rel={string}&price={float}&volume={float}&duration={float} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +base | string | no help info +rel | string | no help info +price | float | no help info +volume | float | no help info +duration | float | no help info + +## method: divest + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"divest\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"price\":\"{float}\",\"volume\":\"{float}\",\"duration\":\"{float}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/divest?exchange={string}&base={string}&rel={string}&price={float}&volume={float}&duration={float} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +base | string | no help info +rel | string | no help info +price | float | no help info +volume | float | no help info +duration | float | no help info + +## method: activebots + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"activebots\",\"exchange\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/activebots?exchange={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info + +## method: status + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"status\",\"exchange\":\"{string}\",\"botid\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/status?exchange={string}&botid={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +botid | string | no help info + +## method: pause + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"pause\",\"exchange\":\"{string}\",\"botid\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/pause?exchange={string}&botid={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +botid | string | no help info + +## method: stop + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"stop\",\"exchange\":\"{string}\",\"botid\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/stop?exchange={string}&botid={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +botid | string | no help info + +## method: resume + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"resume\",\"exchange\":\"{string}\",\"botid\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/resume?exchange={string}&botid={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +botid | string | no help info + +## method: allbalances + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"allbalances\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/allbalances +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: anchor + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"anchor\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/anchor +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: portfolio + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"portfolio\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/portfolio +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: goals + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"goals\",\"currencies\":\"{array}\",\"vals\":\"{object}\",\"targettime\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/goals?currencies={array}&vals={object}&targettime={int} +``` + +field | value type | Description +--------- | ------- | ----------- +currencies | array | no help info +vals | object | no help info +targettime | int | no help info + +SuperNET API +=== +need to create help/SuperNET.md file + +## method: help + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"help\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/help +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: utime2utc + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"utime2utc\",\"utime\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/utime2utc?utime={string} +``` + +field | value type | Description +--------- | ------- | ----------- +utime | string | no help info + +## method: utc2utime + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"utc2utime\",\"utc\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/utc2utime?utc={int} +``` + +field | value type | Description +--------- | ------- | ----------- +utc | int | no help info + +## method: getpeers + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"getpeers\",\"activecoin\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/getpeers?activecoin={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info + +## method: mypeers + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"mypeers\",\"supernet\":\"{array}\",\"rawpeers\":\"{array}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/mypeers?supernet={array}&rawpeers={array} +``` + +field | value type | Description +--------- | ------- | ----------- +supernet | array | no help info +rawpeers | array | no help info + +## method: stop + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"stop\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/stop +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: saveconf + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"saveconf\",\"wallethash\":\"{hash}\",\"confjsonstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/saveconf?wallethash={hash}&confjsonstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +wallethash | hash | no help info +confjsonstr | str | no help info + +## method: layer + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"layer\",\"mypriv\":\"{hash}\",\"otherpubs\":\"{array}\",\"str\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/layer?mypriv={hash}&otherpubs={array}&str={str} +``` + +field | value type | Description +--------- | ------- | ----------- +mypriv | hash | no help info +otherpubs | array | no help info +str | str | no help info + +## method: bitcoinrpc + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"bitcoinrpc\",\"setcoin\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/bitcoinrpc?setcoin={string} +``` + +field | value type | Description +--------- | ------- | ----------- +setcoin | string | no help info + +## method: myipaddr + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"myipaddr\",\"ipaddr\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/myipaddr?ipaddr={string} +``` + +field | value type | Description +--------- | ------- | ----------- +ipaddr | string | no help info + +## method: setmyipaddr + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"setmyipaddr\",\"ipaddr\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/setmyipaddr?ipaddr={string} +``` + +field | value type | Description +--------- | ------- | ----------- +ipaddr | string | no help info + +## method: login + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"login\",\"handle\":\"{string}\",\"password\":\"{string}\",\"permanentfile\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/login?handle={string}&password={string}&permanentfile={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +handle | string | no help info +password | string | no help info +permanentfile | string | no help info +passphrase | string | no help info + +## method: logout + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"logout\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/logout +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: activehandle + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"activehandle\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/activehandle +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: encryptjson + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"encryptjson\",\"password\":\"{string}\",\"permanentfile\":\"{string}\",\"payload\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/encryptjson?password={string}&permanentfile={string}&payload={string} +``` + +field | value type | Description +--------- | ------- | ----------- +password | string | no help info +permanentfile | string | no help info +payload | string | no help info + +## method: decryptjson + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"decryptjson\",\"password\":\"{string}\",\"permanentfile\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/decryptjson?password={string}&permanentfile={string} +``` + +field | value type | Description +--------- | ------- | ----------- +password | string | no help info +permanentfile | string | no help info + +## method: html + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"html\",\"agentform\":\"{string}\",\"htmlfile\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/html?agentform={string}&htmlfile={string} +``` + +field | value type | Description +--------- | ------- | ----------- +agentform | string | no help info +htmlfile | string | no help info + +## method: rosetta + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"rosetta\",\"passphrase\":\"{string}\",\"pin\":\"{string}\",\"showprivkey\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/rosetta?passphrase={string}&pin={string}&showprivkey={string} +``` + +field | value type | Description +--------- | ------- | ----------- +passphrase | string | no help info +pin | string | no help info +showprivkey | string | no help info + +## method: keypair + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"keypair\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/keypair +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: priv2pub + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"priv2pub\",\"privkey\":\"{hash}\",\"addrtype\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/priv2pub?privkey={hash}&addrtype={int} +``` + +field | value type | Description +--------- | ------- | ----------- +privkey | hash | no help info +addrtype | int | no help info + +## method: wif2priv + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"wif2priv\",\"wif\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/wif2priv?wif={string} +``` + +field | value type | Description +--------- | ------- | ----------- +wif | string | no help info + +## method: priv2wif + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"priv2wif\",\"priv\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/priv2wif?priv={string} +``` + +field | value type | Description +--------- | ------- | ----------- +priv | string | no help info + +## method: addr2rmd160 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"addr2rmd160\",\"address\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/addr2rmd160?address={string} +``` + +field | value type | Description +--------- | ------- | ----------- +address | string | no help info + +## method: rmd160conv + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"rmd160conv\",\"rmd160\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/rmd160conv?rmd160={string} +``` + +field | value type | Description +--------- | ------- | ----------- +rmd160 | string | no help info + +## method: cipher + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"cipher\",\"privkey\":\"{hash}\",\"destpubkey\":\"{hash}\",\"message\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/cipher?privkey={hash}&destpubkey={hash}&message={str} +``` + +field | value type | Description +--------- | ------- | ----------- +privkey | hash | no help info +destpubkey | hash | no help info +message | str | no help info + +## method: decipher + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"decipher\",\"privkey\":\"{hash}\",\"srcpubkey\":\"{hash}\",\"cipherstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/decipher?privkey={hash}&srcpubkey={hash}&cipherstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +privkey | hash | no help info +srcpubkey | hash | no help info +cipherstr | str | no help info + +## method: broadcastcipher + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"broadcastcipher\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/broadcastcipher?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: broadcastdecipher + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"broadcastdecipher\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/broadcastdecipher?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: multicastcipher + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"multicastcipher\",\"pubkey\":\"{hash}\",\"message\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/multicastcipher?pubkey={hash}&message={str} +``` + +field | value type | Description +--------- | ------- | ----------- +pubkey | hash | no help info +message | str | no help info + +## method: multicastdecipher + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"multicastdecipher\",\"privkey\":\"{hash}\",\"cipherstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/multicastdecipher?privkey={hash}&cipherstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +privkey | hash | no help info +cipherstr | str | no help info + +mouse API +=== +need to create help/mouse.md file + +## method: image + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"mouse\",\"method\":\"image\",\"name\":\"{string}\",\"x\":\"{int}\",\"y\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/mouse/image?name={string}&x={int}&y={int} +``` + +field | value type | Description +--------- | ------- | ----------- +name | string | no help info +x | int | no help info +y | int | no help info + +## method: change + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"mouse\",\"method\":\"change\",\"name\":\"{string}\",\"x\":\"{int}\",\"y\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/mouse/change?name={string}&x={int}&y={int} +``` + +field | value type | Description +--------- | ------- | ----------- +name | string | no help info +x | int | no help info +y | int | no help info + +## method: click + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"mouse\",\"method\":\"click\",\"name\":\"{string}\",\"x\":\"{int}\",\"y\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/mouse/click?name={string}&x={int}&y={int} +``` + +field | value type | Description +--------- | ------- | ----------- +name | string | no help info +x | int | no help info +y | int | no help info + +## method: close + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"mouse\",\"method\":\"close\",\"name\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/mouse/close?name={string} +``` + +field | value type | Description +--------- | ------- | ----------- +name | string | no help info + +## method: leave + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"mouse\",\"method\":\"leave\",\"name\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/mouse/leave?name={string} +``` + +field | value type | Description +--------- | ------- | ----------- +name | string | no help info + +keyboard API +=== +need to create help/keyboard.md file + +## method: key + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"keyboard\",\"method\":\"key\",\"name\":\"{string}\",\"c\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/keyboard/key?name={string}&c={int} +``` + +field | value type | Description +--------- | ------- | ----------- +name | string | no help info +c | int | no help info + +hash API +=== +need to create help/hash.md file + +## method: hex + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"hex\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/hex?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: unhex + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"unhex\",\"hexmsg\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/unhex?hexmsg={string} +``` + +field | value type | Description +--------- | ------- | ----------- +hexmsg | string | no help info + +## method: curve25519_pair + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"curve25519_pair\",\"element\":\"{hash}\",\"scalar\":\"{hash}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/curve25519_pair?element={hash}&scalar={hash} +``` + +field | value type | Description +--------- | ------- | ----------- +element | hash | no help info +scalar | hash | no help info + +## method: NXT + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"NXT\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/NXT?passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +passphrase | string | no help info + +## method: curve25519 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"curve25519\",\"pubkey\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/curve25519?pubkey={string} +``` + +field | value type | Description +--------- | ------- | ----------- +pubkey | string | no help info + +## method: crc32 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"crc32\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/crc32?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: base64_encode + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"base64_encode\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/base64_encode?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: base64_decode + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"base64_decode\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/base64_decode?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: rmd160_sha256 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"rmd160_sha256\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/rmd160_sha256?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: sha256_sha256 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"sha256_sha256\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/sha256_sha256?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: sha224 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"sha224\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/sha224?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: sha256 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"sha256\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/sha256?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: sha384 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"sha384\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/sha384?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: sha512 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"sha512\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/sha512?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: rmd128 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"rmd128\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/rmd128?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: rmd160 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"rmd160\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/rmd160?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: rmd256 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"rmd256\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/rmd256?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: rmd320 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"rmd320\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/rmd320?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: sha1 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"sha1\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/sha1?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: md2 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"md2\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/md2?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: md4 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"md4\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/md4?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: md5 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"md5\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/md5?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: tiger192_3 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"tiger192_3\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/tiger192_3?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: whirlpool + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"whirlpool\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/whirlpool?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +hmac API +=== +need to create help/hmac.md file + +## method: sha224 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"sha224\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hmac/sha224?message={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info +passphrase | string | no help info + +## method: sha256 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"sha256\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hmac/sha256?message={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info +passphrase | string | no help info + +## method: sha384 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"sha384\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hmac/sha384?message={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info +passphrase | string | no help info + +## method: sha512 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"sha512\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hmac/sha512?message={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info +passphrase | string | no help info + +## method: rmd128 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"rmd128\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hmac/rmd128?message={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info +passphrase | string | no help info + +## method: rmd160 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"rmd160\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hmac/rmd160?message={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info +passphrase | string | no help info + +## method: rmd256 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"rmd256\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hmac/rmd256?message={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info +passphrase | string | no help info + +## method: rmd320 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"rmd320\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hmac/rmd320?message={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info +passphrase | string | no help info + +## method: sha1 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"sha1\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hmac/sha1?message={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info +passphrase | string | no help info + +## method: md2 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"md2\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hmac/md2?message={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info +passphrase | string | no help info + +## method: md4 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"md4\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hmac/md4?message={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info +passphrase | string | no help info + +## method: md5 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"md5\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hmac/md5?message={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info +passphrase | string | no help info + +## method: tiger192_3 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"tiger192_3\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hmac/tiger192_3?message={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info +passphrase | string | no help info + +## method: whirlpool + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"whirlpool\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hmac/whirlpool?message={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info +passphrase | string | no help info + +end of help + diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 29fa7195c..a9b88c7b3 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -90,6 +90,14 @@ struct supernet_address struct pending_trade { UT_hash_handle hh; double basevolume,relvolume,dir; char base[32],rel[32]; }; +struct jumblr_item +{ + UT_hash_handle hh; + int64_t amount,fee,txfee; + uint32_t spent; + char opid[65],src[65],dest[65],status; +}; + struct liquidity_info { char base[16],rel[16],exchange[16]; @@ -104,7 +112,7 @@ struct supernet_info struct supernet_address myaddr; bits256 persistent_priv,privkey; uint8_t persistent_pubkey33[33]; - char ipaddr[64],NXTAPIURL[512],secret[4096],password[4096],rpcsymbol[64],handle[1024],permanentfile[1024]; + char ipaddr[64],NXTAPIURL[512],secret[4096],password[4096],rpcsymbol[64],handle[1024],permanentfile[1024],jumblr_passphrase[1024]; char *decryptstr; void (*liquidity_command)(struct supernet_info *myinfo,char *base,bits256 hash,cJSON *vals); double (*liquidity_active)(struct supernet_info *myinfo,double *refpricep,char *exchange,char *base,char *rel,double volume); @@ -112,6 +120,7 @@ struct supernet_info uint32_t expiration,dirty,DEXactive,DEXpoll,totalcoins,nanoinit,lastdexrequestid,dexcrcs[1024]; uint16_t argport,rpcport; struct basilisk_info basilisks; + struct jumblr_item *jumblrs; struct exchange_info *tradingexchanges[SUPERNET_MAXEXCHANGES]; int32_t numexchanges; struct iguana_waccount *wallet; struct iguana_info *allcoins; int32_t allcoins_being_added,allcoins_numvirts; diff --git a/iguana/main.c b/iguana/main.c index 30758a494..7c6b7b98d 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -745,6 +745,20 @@ void iguana_urlinit(struct supernet_info *myinfo,int32_t ismainnet,int32_t usess else strcat(myinfo->NXTAPIURL,"6876/nxt"); } +void jumblr_loop(void *ptr) +{ + struct iguana_info *coin; uint32_t t; struct supernet_info *myinfo = ptr; + while ( 1 ) + { + t = (uint32_t)time(NULL); + if ( (coin= iguana_coinfind("KMD")) != 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 && (t % 1200) < 60 ) + { + jumblr_iteration(myinfo,coin,(t % 3600) / 1200,t % 1200); + } + sleep(20); + } +} + void iguana_launchdaemons(struct supernet_info *myinfo) { int32_t i; char *helperargs,helperstr[512]; @@ -761,6 +775,7 @@ void iguana_launchdaemons(struct supernet_info *myinfo) iguana_launch(0,"rpcloop",iguana_rpcloop,myinfo,IGUANA_PERMTHREAD); // limit to oneprocess printf("launch mainloop\n"); OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)DEX_explorerloop,(void *)myinfo); + OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)jumblr_loop,(void *)myinfo); mainloop(myinfo); } diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 4a6787406..3f952e15a 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -186,6 +186,9 @@ STRING_AND_INT(iguana,bundlehashes,activecoin,height); STRING_AND_INT(iguana,PoSweights,activecoin,height); STRING_ARG(iguana,stakers,activecoin); +STRING_ARG(jumblr,setpassphrase,passphrase); +ZERO_ARGS(jumblr,status); + ZERO_ARGS(InstantDEX,allcoins); STRING_ARG(InstantDEX,available,source); HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr); diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index 8e048b21f..43f997c75 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -614,6 +614,7 @@ uint64_t *iguana_PoS_weights(struct supernet_info *myinfo,struct iguana_info *co int32_t iguana_staker_sort(struct iguana_info *coin,bits256 *hash2p,uint8_t *refrmd160,struct iguana_pkhash *refP,uint64_t *weights,int32_t numweights,bits256 *sortbuf); bits256 mpz_div64(bits256 hash,uint64_t divval); void iguana_walletinitcheck(struct supernet_info *myinfo,struct iguana_info *coin); +void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval); // ------------------------------------------------------[ Preparation ]---- // Initialise a gfshare context for producing shares From 5e86843e6c50d97b765fff903417f6a31446225d Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 17:56:00 +0200 Subject: [PATCH 232/495] Test --- iguana/autoAPI.md | 4726 --------------------------------------------- 1 file changed, 4726 deletions(-) delete mode 100644 iguana/autoAPI.md diff --git a/iguana/autoAPI.md b/iguana/autoAPI.md deleted file mode 100644 index 59a5b17f5..000000000 --- a/iguana/autoAPI.md +++ /dev/null @@ -1,4726 +0,0 @@ - - -dpow API -=== -need to create help/dpow.md file - -## method: pending - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"pending\",\"fiat\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dpow/pending?fiat={string} -``` - -field | value type | Description ---------- | ------- | ----------- -fiat | string | no help info - -## method: notarychains - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"notarychains\"}" -``` - -```url -http://127.0.0.1:7778/api/dpow/notarychains -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: active - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"active\",\"maskhex\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dpow/active?maskhex={string} -``` - -field | value type | Description ---------- | ------- | ----------- -maskhex | string | no help info - -## method: ratify - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"ratify\",\"minsigs\":\"{int}\",\"timestamp\":\"{int}\",\"ratified\":\"{array}\"}" -``` - -```url -http://127.0.0.1:7778/api/dpow/ratify?minsigs={int}×tamp={int}&ratified={array} -``` - -field | value type | Description ---------- | ------- | ----------- -minsigs | int | no help info -timestamp | int | no help info -ratified | array | no help info - -## method: cancelratify - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"cancelratify\"}" -``` - -```url -http://127.0.0.1:7778/api/dpow/cancelratify -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: bindaddr - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"bindaddr\",\"ipaddr\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dpow/bindaddr?ipaddr={string} -``` - -field | value type | Description ---------- | ------- | ----------- -ipaddr | string | no help info - -## method: fundnotaries - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"fundnotaries\",\"symbol\":\"{string}\",\"numblocks\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/dpow/fundnotaries?symbol={string}&numblocks={int} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -numblocks | int | no help info - -pax API -=== -need to create help/pax.md file - -## method: start - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"pax\",\"method\":\"start\"}" -``` - -```url -http://127.0.0.1:7778/api/pax/start -``` - -field | value type | Description ---------- | ------- | ----------- - -passthru API -=== -need to create help/passthru.md file - -## method: paxfiats - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"passthru\",\"method\":\"paxfiats\",\"mask\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/passthru/paxfiats?mask={int} -``` - -field | value type | Description ---------- | ------- | ----------- -mask | int | no help info - -zcash API -=== -need to create help/zcash.md file - -## method: passthru - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"zcash\",\"method\":\"passthru\",\"function\":\"{string}\",\"hex\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/zcash/passthru?function={string}&hex={string} -``` - -field | value type | Description ---------- | ------- | ----------- -function | string | no help info -hex | string | no help info - -komodo API -=== -need to create help/komodo.md file - -## method: passthru - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"komodo\",\"method\":\"passthru\",\"function\":\"{string}\",\"hex\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/komodo/passthru?function={string}&hex={string} -``` - -field | value type | Description ---------- | ------- | ----------- -function | string | no help info -hex | string | no help info - -dex API -=== -need to create help/dex.md file - -## method: kvsearch - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"kvsearch\",\"symbol\":\"{string}\",\"key\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/kvsearch?symbol={string}&key={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -key | string | no help info - -## method: kvupdate - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"kvupdate\",\"symbol\":\"{string}\",\"key\":\"{string}\",\"value\":\"{string}\",\"flags\":\"{int}\",\"unused\":\"{int}\",\"unusedb\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/kvupdate?symbol={string}&key={string}&value={string}&flags={int}&unused={int}&unusedb={int} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -key | string | no help info -value | string | no help info -flags | int | no help info -unused | int | no help info -unusedb | int | no help info - -## method: send - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"send\",\"hex\":\"{string}\",\"handler\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/send?hex={string}&handler={string} -``` - -field | value type | Description ---------- | ------- | ----------- -hex | string | no help info -handler | string | no help info - -## method: gettransaction - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettransaction\",\"txid\":\"{hash}\",\"symbol\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/gettransaction?txid={hash}&symbol={str} -``` - -field | value type | Description ---------- | ------- | ----------- -txid | hash | no help info -symbol | str | no help info - -## method: getinfo - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getinfo\",\"symbol\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/getinfo?symbol={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info - -## method: getnotaries - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getnotaries\",\"symbol\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/getnotaries?symbol={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info - -## method: alladdresses - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"alladdresses\",\"symbol\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/alladdresses?symbol={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info - -## method: getbestblockhash - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getbestblockhash\",\"symbol\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/getbestblockhash?symbol={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info - -## method: getblockhash - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getblockhash\",\"symbol\":\"{string}\",\"height\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/getblockhash?symbol={string}&height={int} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -height | int | no help info - -## method: getblock - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getblock\",\"hash\":\"{hash}\",\"symbol\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/getblock?hash={hash}&symbol={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -symbol | str | no help info - -## method: sendrawtransaction - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"sendrawtransaction\",\"symbol\":\"{string}\",\"signedtx\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/sendrawtransaction?symbol={string}&signedtx={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -signedtx | string | no help info - -## method: gettxout - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettxout\",\"txid\":\"{hash}\",\"symbol\":\"{str}\",\"vout\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/gettxout?txid={hash}&symbol={str}&vout={int} -``` - -field | value type | Description ---------- | ------- | ----------- -txid | hash | no help info -symbol | str | no help info -vout | int | no help info - -## method: importaddress - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/importaddress?symbol={string}&address={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -address | string | no help info - -## method: validateaddress - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"validateaddress\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/validateaddress?symbol={string}&address={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -address | string | no help info - -## method: checkaddress - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"checkaddress\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/checkaddress?symbol={string}&address={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -address | string | no help info - -## method: listunspent - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/listunspent?symbol={string}&address={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -address | string | no help info - -## method: listtransactions - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listtransactions\",\"symbol\":\"{string}\",\"address\":\"{string}\",\"count\":\"{float}\",\"skip\":\"{float}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/listtransactions?symbol={string}&address={string}&count={float}&skip={float} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -address | string | no help info -count | float | no help info -skip | float | no help info - -## method: listunspent2 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent2\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/listunspent2?symbol={string}&address={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -address | string | no help info - -## method: listtransactions2 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listtransactions2\",\"symbol\":\"{string}\",\"address\":\"{string}\",\"count\":\"{float}\",\"skip\":\"{float}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/listtransactions2?symbol={string}&address={string}&count={float}&skip={float} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -address | string | no help info -count | float | no help info -skip | float | no help info - -## method: gettxin - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettxin\",\"txid\":\"{hash}\",\"symbol\":\"{str}\",\"vout\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/gettxin?txid={hash}&symbol={str}&vout={int} -``` - -field | value type | Description ---------- | ------- | ----------- -txid | hash | no help info -symbol | str | no help info -vout | int | no help info - -## method: listspent - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listspent\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/listspent?symbol={string}&address={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -address | string | no help info - -## method: getbalance - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getbalance\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/getbalance?symbol={string}&address={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -address | string | no help info - -## method: explorer - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"explorer\",\"symbol\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/explorer?symbol={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info - -basilisk API -=== -need to create help/basilisk.md file - -## method: genesis_opreturn - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"genesis_opreturn\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/genesis_opreturn?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: history - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"history\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/history?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: paxfiats - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"paxfiats\",\"mask\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/paxfiats?mask={int} -``` - -field | value type | Description ---------- | ------- | ----------- -mask | int | no help info - -## method: balances - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"balances\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/balances?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: value - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"value\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/value?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: rawtx - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"rawtx\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/rawtx?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: refresh - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"refresh\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/refresh?symbol={string}&address={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -address | string | no help info - -## method: utxorawtx - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"utxorawtx\",\"symbol\":\"{string}\",\"utxos\":\"{array}\",\"vals\":\"{object}\",\"ignore\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/utxorawtx?symbol={string}&utxos={array}&vals={object}&ignore={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -utxos | array | no help info -vals | object | no help info -ignore | string | no help info - -## method: getmessage - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"getmessage\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/getmessage?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: sendmessage - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"sendmessage\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/sendmessage?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: geckoheaders - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"geckoheaders\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/geckoheaders?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: geckoblock - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"geckoblock\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/geckoblock?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: geckotx - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"geckotx\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/geckotx?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: geckoget - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"geckoget\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/geckoget?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: addrelay - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"addrelay\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/addrelay?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: dispatch - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"dispatch\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/dispatch?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: publish - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"publish\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/publish?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: subscribe - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"subscribe\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/subscribe?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: forward - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"forward\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/forward?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: mailbox - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"mailbox\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/mailbox?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -bitcoinrpc API -=== -need to create help/bitcoinrpc.md file - -## method: getinfo - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getinfo\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getinfo -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: getblockcount - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getblockcount\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getblockcount -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: getdifficulty - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getdifficulty\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getdifficulty -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: getbestblockhash - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getbestblockhash\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getbestblockhash -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: getblockhash - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getblockhash\",\"height\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getblockhash?height={int} -``` - -field | value type | Description ---------- | ------- | ----------- -height | int | no help info - -## method: getblock - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getblock\",\"blockhash\":\"{hash}\",\"verbose\":\"{int}\",\"remoteonly\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getblock?blockhash={hash}&verbose={int}&remoteonly={int} -``` - -field | value type | Description ---------- | ------- | ----------- -blockhash | hash | no help info -verbose | int | no help info -remoteonly | int | no help info - -## method: getrawtransaction - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getrawtransaction\",\"txid\":\"{hash}\",\"verbose\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getrawtransaction?txid={hash}&verbose={int} -``` - -field | value type | Description ---------- | ------- | ----------- -txid | hash | no help info -verbose | int | no help info - -## method: gettransaction - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"gettransaction\",\"txid\":\"{hash}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/gettransaction?txid={hash} -``` - -field | value type | Description ---------- | ------- | ----------- -txid | hash | no help info - -## method: gettxout - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"gettxout\",\"txid\":\"{hash}\",\"vout\":\"{int}\",\"mempool\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/gettxout?txid={hash}&vout={int}&mempool={int} -``` - -field | value type | Description ---------- | ------- | ----------- -txid | hash | no help info -vout | int | no help info -mempool | int | no help info - -## method: listunspent - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listunspent\",\"minconf\":\"{int}\",\"maxconf\":\"{int}\",\"array\":\"{array}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/listunspent?minconf={int}&maxconf={int}&array={array} -``` - -field | value type | Description ---------- | ------- | ----------- -minconf | int | no help info -maxconf | int | no help info -array | array | no help info - -## method: decodescript - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"decodescript\",\"scriptstr\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/decodescript?scriptstr={string} -``` - -field | value type | Description ---------- | ------- | ----------- -scriptstr | string | no help info - -## method: decoderawtransaction - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"decoderawtransaction\",\"rawtx\":\"{string}\",\"suppress\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/decoderawtransaction?rawtx={string}&suppress={int} -``` - -field | value type | Description ---------- | ------- | ----------- -rawtx | string | no help info -suppress | int | no help info - -## method: validaterawtransaction - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"validaterawtransaction\",\"rawtx\":\"{string}\",\"suppress\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/validaterawtransaction?rawtx={string}&suppress={int} -``` - -field | value type | Description ---------- | ------- | ----------- -rawtx | string | no help info -suppress | int | no help info - -## method: createrawtransaction - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"createrawtransaction\",\"vins\":\"{array}\",\"vouts\":\"{object}\",\"locktime\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/createrawtransaction?vins={array}&vouts={object}&locktime={int} -``` - -field | value type | Description ---------- | ------- | ----------- -vins | array | no help info -vouts | object | no help info -locktime | int | no help info - -## method: validatepubkey - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"validatepubkey\",\"pubkey\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/validatepubkey?pubkey={string} -``` - -field | value type | Description ---------- | ------- | ----------- -pubkey | string | no help info - -## method: validateaddress - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"validateaddress\",\"address\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/validateaddress?address={string} -``` - -field | value type | Description ---------- | ------- | ----------- -address | string | no help info - -## method: walletlock - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"walletlock\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/walletlock -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: walletpassphrase - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"walletpassphrase\",\"password\":\"{string}\",\"permanentfile\":\"{string}\",\"timeout\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/walletpassphrase?password={string}&permanentfile={string}&timeout={int} -``` - -field | value type | Description ---------- | ------- | ----------- -password | string | no help info -permanentfile | string | no help info -timeout | int | no help info - -## method: encryptwallet - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"encryptwallet\",\"passphrase\":\"{string}\",\"password\":\"{string}\",\"permanentfile\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/encryptwallet?passphrase={string}&password={string}&permanentfile={string} -``` - -field | value type | Description ---------- | ------- | ----------- -passphrase | string | no help info -password | string | no help info -permanentfile | string | no help info - -## method: walletpassphrasechange - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"walletpassphrasechange\",\"oldpassword\":\"{string}\",\"newpassword\":\"{string}\",\"oldpermanentfile\":\"{string}\",\"permanentfile\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/walletpassphrasechange?oldpassword={string}&newpassword={string}&oldpermanentfile={string}&permanentfile={string} -``` - -field | value type | Description ---------- | ------- | ----------- -oldpassword | string | no help info -newpassword | string | no help info -oldpermanentfile | string | no help info -permanentfile | string | no help info - -## method: dumpwallet - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"dumpwallet\",\"filename\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/dumpwallet?filename={string} -``` - -field | value type | Description ---------- | ------- | ----------- -filename | string | no help info - -## method: backupwallet - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"backupwallet\",\"filename\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/backupwallet?filename={string} -``` - -field | value type | Description ---------- | ------- | ----------- -filename | string | no help info - -## method: importwallet - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"importwallet\",\"filename\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/importwallet?filename={string} -``` - -field | value type | Description ---------- | ------- | ----------- -filename | string | no help info - -## method: getnewaddress - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getnewaddress\",\"account\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getnewaddress?account={string} -``` - -field | value type | Description ---------- | ------- | ----------- -account | string | no help info - -## method: importprivkey - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"importprivkey\",\"wif\":\"{string}\",\"account\":\"{string}\",\"rescan\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/importprivkey?wif={string}&account={string}&rescan={int} -``` - -field | value type | Description ---------- | ------- | ----------- -wif | string | no help info -account | string | no help info -rescan | int | no help info - -## method: importaddress - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"importaddress\",\"address\":\"{string}\",\"account\":\"{string}\",\"rescan\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/importaddress?address={string}&account={string}&rescan={int} -``` - -field | value type | Description ---------- | ------- | ----------- -address | string | no help info -account | string | no help info -rescan | int | no help info - -## method: dumpprivkey - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"dumpprivkey\",\"address\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/dumpprivkey?address={string} -``` - -field | value type | Description ---------- | ------- | ----------- -address | string | no help info - -## method: listtransactions - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listtransactions\",\"account\":\"{string}\",\"count\":\"{int}\",\"skip\":\"{int}\",\"includewatchonly\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/listtransactions?account={string}&count={int}&skip={int}&includewatchonly={int} -``` - -field | value type | Description ---------- | ------- | ----------- -account | string | no help info -count | int | no help info -skip | int | no help info -includewatchonly | int | no help info - -## method: listreceivedbyaddress - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listreceivedbyaddress\",\"minconf\":\"{int}\",\"includeempty\":\"{int}\",\"flag\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/listreceivedbyaddress?minconf={int}&includeempty={int}&flag={int} -``` - -field | value type | Description ---------- | ------- | ----------- -minconf | int | no help info -includeempty | int | no help info -flag | int | no help info - -## method: listreceivedbyaccount - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listreceivedbyaccount\",\"confirmations\":\"{int}\",\"includeempty\":\"{int}\",\"watchonly\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/listreceivedbyaccount?confirmations={int}&includeempty={int}&watchonly={int} -``` - -field | value type | Description ---------- | ------- | ----------- -confirmations | int | no help info -includeempty | int | no help info -watchonly | int | no help info - -## method: listaccounts - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listaccounts\",\"minconf\":\"{int}\",\"includewatchonly\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/listaccounts?minconf={int}&includewatchonly={int} -``` - -field | value type | Description ---------- | ------- | ----------- -minconf | int | no help info -includewatchonly | int | no help info - -## method: listaddressgroupings - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listaddressgroupings\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/listaddressgroupings -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: getreceivedbyaddress - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getreceivedbyaddress\",\"address\":\"{string}\",\"minconf\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getreceivedbyaddress?address={string}&minconf={int} -``` - -field | value type | Description ---------- | ------- | ----------- -address | string | no help info -minconf | int | no help info - -## method: getreceivedbyaccount - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getreceivedbyaccount\",\"account\":\"{string}\",\"includeempty\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getreceivedbyaccount?account={string}&includeempty={int} -``` - -field | value type | Description ---------- | ------- | ----------- -account | string | no help info -includeempty | int | no help info - -## method: getbalance - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getbalance\",\"account\":\"{string}\",\"confirmations\":\"{int}\",\"includeempty\":\"{int}\",\"lastheight\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getbalance?account={string}&confirmations={int}&includeempty={int}&lastheight={int} -``` - -field | value type | Description ---------- | ------- | ----------- -account | string | no help info -confirmations | int | no help info -includeempty | int | no help info -lastheight | int | no help info - -## method: getaddressesbyaccount - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getaddressesbyaccount\",\"account\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getaddressesbyaccount?account={string} -``` - -field | value type | Description ---------- | ------- | ----------- -account | string | no help info - -## method: getaccount - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getaccount\",\"address\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getaccount?address={string} -``` - -field | value type | Description ---------- | ------- | ----------- -address | string | no help info - -## method: getaccountaddress - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getaccountaddress\",\"account\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getaccountaddress?account={string} -``` - -field | value type | Description ---------- | ------- | ----------- -account | string | no help info - -## method: setaccount - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"setaccount\",\"address\":\"{string}\",\"account\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/setaccount?address={string}&account={string} -``` - -field | value type | Description ---------- | ------- | ----------- -address | string | no help info -account | string | no help info - -## method: createmultisig - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"createmultisig\",\"M\":\"{int}\",\"pubkeys\":\"{array}\",\"ignore\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/createmultisig?M={int}&pubkeys={array}&ignore={string} -``` - -field | value type | Description ---------- | ------- | ----------- -M | int | no help info -pubkeys | array | no help info -ignore | string | no help info - -## method: addmultisigaddress - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"addmultisigaddress\",\"M\":\"{int}\",\"pubkeys\":\"{array}\",\"account\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/addmultisigaddress?M={int}&pubkeys={array}&account={string} -``` - -field | value type | Description ---------- | ------- | ----------- -M | int | no help info -pubkeys | array | no help info -account | string | no help info - -## method: settxfee - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"settxfee\",\"amount\":\"{float}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/settxfee?amount={float} -``` - -field | value type | Description ---------- | ------- | ----------- -amount | float | no help info - -## method: checkwallet - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"checkwallet\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/checkwallet -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: repairwallet - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"repairwallet\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/repairwallet -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: signrawtransaction - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"signrawtransaction\",\"rawtx\":\"{string}\",\"vins\":\"{array}\",\"privkeys\":\"{object}\",\"sighash\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/signrawtransaction?rawtx={string}&vins={array}&privkeys={object}&sighash={string} -``` - -field | value type | Description ---------- | ------- | ----------- -rawtx | string | no help info -vins | array | no help info -privkeys | object | no help info -sighash | string | no help info - -## method: signmessage - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"signmessage\",\"address\":\"{string}\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/signmessage?address={string}&message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -address | string | no help info -message | string | no help info - -## method: verifymessage - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"verifymessage\",\"address\":\"{string}\",\"sig\":\"{string}\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/verifymessage?address={string}&sig={string}&message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -address | string | no help info -sig | string | no help info -message | string | no help info - -## method: sendrawtransaction - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"sendrawtransaction\",\"rawtx\":\"{string}\",\"allowhighfees\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/sendrawtransaction?rawtx={string}&allowhighfees={int} -``` - -field | value type | Description ---------- | ------- | ----------- -rawtx | string | no help info -allowhighfees | int | no help info - -## method: sendfrom - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"sendfrom\",\"fromaccount\":\"{string}\",\"toaddress\":\"{string}\",\"amount\":\"{float}\",\"minconf\":\"{int}\",\"comment\":\"{string}\",\"comment2\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/sendfrom?fromaccount={string}&toaddress={string}&amount={float}&minconf={int}&comment={string}&comment2={string} -``` - -field | value type | Description ---------- | ------- | ----------- -fromaccount | string | no help info -toaddress | string | no help info -amount | float | no help info -minconf | int | no help info -comment | string | no help info -comment2 | string | no help info - -## method: sendmany - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"sendmany\",\"fromaccount\":\"{string}\",\"payments\":\"{array}\",\"minconf\":\"{int}\",\"comment\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/sendmany?fromaccount={string}&payments={array}&minconf={int}&comment={string} -``` - -field | value type | Description ---------- | ------- | ----------- -fromaccount | string | no help info -payments | array | no help info -minconf | int | no help info -comment | string | no help info - -## method: sendtoaddress - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"sendtoaddress\",\"address\":\"{string}\",\"amount\":\"{float}\",\"comment\":\"{string}\",\"comment2\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/sendtoaddress?address={string}&amount={float}&comment={string}&comment2={string} -``` - -field | value type | Description ---------- | ------- | ----------- -address | string | no help info -amount | float | no help info -comment | string | no help info -comment2 | string | no help info - -## method: lockunspent - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"lockunspent\",\"flag\":\"{int}\",\"array\":\"{array}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/lockunspent?flag={int}&array={array} -``` - -field | value type | Description ---------- | ------- | ----------- -flag | int | no help info -array | array | no help info - -## method: listlockunspent - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listlockunspent\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/listlockunspent -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: submitblock - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"submitblock\",\"rawbytes\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/submitblock?rawbytes={string} -``` - -field | value type | Description ---------- | ------- | ----------- -rawbytes | string | no help info - -## method: listsinceblock - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listsinceblock\",\"blockhash\":\"{hash}\",\"target\":\"{int}\",\"flag\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/listsinceblock?blockhash={hash}&target={int}&flag={int} -``` - -field | value type | Description ---------- | ------- | ----------- -blockhash | hash | no help info -target | int | no help info -flag | int | no help info - -## method: gettxoutsetinfo - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"gettxoutsetinfo\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/gettxoutsetinfo -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: getrawchangeaddress - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getrawchangeaddress\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getrawchangeaddress -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: move - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"move\",\"fromaccount\":\"{string}\",\"toaccount\":\"{string}\",\"amount\":\"{float}\",\"minconf\":\"{int}\",\"comment\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/move?fromaccount={string}&toaccount={string}&amount={float}&minconf={int}&comment={string} -``` - -field | value type | Description ---------- | ------- | ----------- -fromaccount | string | no help info -toaccount | string | no help info -amount | float | no help info -minconf | int | no help info -comment | string | no help info - -iguana API -=== -need to create help/iguana.md file - -## method: splitfunds - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"splitfunds\",\"satoshis\":\"{int}\",\"duplicates\":\"{int}\",\"sendflag\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/splitfunds?satoshis={int}&duplicates={int}&sendflag={int} -``` - -field | value type | Description ---------- | ------- | ----------- -satoshis | int | no help info -duplicates | int | no help info -sendflag | int | no help info - -## method: makekeypair - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"makekeypair\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/makekeypair -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: rates - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"rates\",\"unused\":\"{int}\",\"quotes\":\"{array}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/rates?unused={int}"es={array} -``` - -field | value type | Description ---------- | ------- | ----------- -unused | int | no help info -quotes | array | no help info - -## method: rate - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"rate\",\"base\":\"{string}\",\"rel\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/rate?base={string}&rel={string} -``` - -field | value type | Description ---------- | ------- | ----------- -base | string | no help info -rel | string | no help info - -## method: prices - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"prices\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"period\":\"{int}\",\"start\":\"{int}\",\"end\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/prices?exchange={string}&base={string}&rel={string}&period={int}&start={int}&end={int} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -base | string | no help info -rel | string | no help info -period | int | no help info -start | int | no help info -end | int | no help info - -## method: snapshot - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"snapshot\",\"symbol\":\"{string}\",\"height\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/snapshot?symbol={string}&height={int} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -height | int | no help info - -## method: dividends - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"dividends\",\"height\":\"{int}\",\"vals\":\"{array}\",\"symbol\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/dividends?height={int}&vals={array}&symbol={string} -``` - -field | value type | Description ---------- | ------- | ----------- -height | int | no help info -vals | array | no help info -symbol | string | no help info - -## method: passthru - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"passthru\",\"asset\":\"{string}\",\"function\":\"{string}\",\"hex\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/passthru?asset={string}&function={string}&hex={string} -``` - -field | value type | Description ---------- | ------- | ----------- -asset | string | no help info -function | string | no help info -hex | string | no help info - -## method: initfastfind - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"initfastfind\",\"activecoin\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/initfastfind?activecoin={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info - -## method: dpow - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"{string}\",\"pubkey\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/dpow?symbol={string}&pubkey={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -pubkey | string | no help info - -## method: peers - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"peers\",\"activecoin\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/peers?activecoin={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info - -## method: maxpeers - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"maxpeers\",\"activecoin\":\"{string}\",\"max\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/maxpeers?activecoin={string}&max={int} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info -max | int | no help info - -## method: getconnectioncount - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"getconnectioncount\",\"activecoin\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/getconnectioncount?activecoin={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info - -## method: addcoin - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"addcoin\",\"newcoin\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/addcoin?newcoin={string} -``` - -field | value type | Description ---------- | ------- | ----------- -newcoin | string | no help info - -## method: validate - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"validate\",\"activecoin\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/validate?activecoin={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info - -## method: removecoin - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"removecoin\",\"activecoin\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/removecoin?activecoin={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info - -## method: startcoin - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"startcoin\",\"activecoin\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/startcoin?activecoin={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info - -## method: pausecoin - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"pausecoin\",\"activecoin\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/pausecoin?activecoin={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info - -## method: stopcoin - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"stopcoin\",\"activecoin\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/stopcoin?activecoin={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info - -## method: addnode - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"addnode\",\"activecoin\":\"{string}\",\"ipaddr\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/addnode?activecoin={string}&ipaddr={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info -ipaddr | string | no help info - -## method: addnotary - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"addnotary\",\"ipaddr\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/addnotary?ipaddr={string} -``` - -field | value type | Description ---------- | ------- | ----------- -ipaddr | string | no help info - -## method: persistent - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"persistent\",\"activecoin\":\"{string}\",\"ipaddr\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/persistent?activecoin={string}&ipaddr={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info -ipaddr | string | no help info - -## method: removenode - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"removenode\",\"activecoin\":\"{string}\",\"ipaddr\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/removenode?activecoin={string}&ipaddr={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info -ipaddr | string | no help info - -## method: oneshot - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"oneshot\",\"activecoin\":\"{string}\",\"ipaddr\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/oneshot?activecoin={string}&ipaddr={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info -ipaddr | string | no help info - -## method: nodestatus - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"nodestatus\",\"activecoin\":\"{string}\",\"ipaddr\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/nodestatus?activecoin={string}&ipaddr={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info -ipaddr | string | no help info - -## method: balance - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"balance\",\"activecoin\":\"{string}\",\"address\":\"{string}\",\"heightd\":\"{float}\",\"minconfd\":\"{float}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/balance?activecoin={string}&address={string}&heightd={float}&minconfd={float} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info -address | string | no help info -heightd | float | no help info -minconfd | float | no help info - -## method: spendmsig - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"spendmsig\",\"activecoin\":\"{string}\",\"vintxid\":\"{hash}\",\"vinvout\":\"{int}\",\"destaddress\":\"{string}\",\"destamount\":\"{float}\",\"destaddress2\":\"{string}\",\"destamount2\":\"{float}\",\"M\":\"{int}\",\"N\":\"{int}\",\"pubA\":\"{string}\",\"wifA\":\"{string}\",\"pubB\":\"{string}\",\"wifB\":\"{string}\",\"pubC\":\"{string}\",\"wifC\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/spendmsig?activecoin={string}&vintxid={hash}&vinvout={int}&destaddress={string}&destamount={float}&destaddress2={string}&destamount2={float}&M={int}&N={int}&pubA={string}&wifA={string}&pubB={string}&wifB={string}&pubC={string}&wifC={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info -vintxid | hash | no help info -vinvout | int | no help info -destaddress | string | no help info -destamount | float | no help info -destaddress2 | string | no help info -destamount2 | float | no help info -M | int | no help info -N | int | no help info -pubA | string | no help info -wifA | string | no help info -pubB | string | no help info -wifB | string | no help info -pubC | string | no help info -wifC | string | no help info - -## method: bundleaddresses - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"bundleaddresses\",\"activecoin\":\"{string}\",\"height\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/bundleaddresses?activecoin={string}&height={int} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info -height | int | no help info - -## method: bundlehashes - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"bundlehashes\",\"activecoin\":\"{string}\",\"height\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/bundlehashes?activecoin={string}&height={int} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info -height | int | no help info - -## method: PoSweights - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"PoSweights\",\"activecoin\":\"{string}\",\"height\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/PoSweights?activecoin={string}&height={int} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info -height | int | no help info - -## method: stakers - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"stakers\",\"activecoin\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/stakers?activecoin={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info - -jumblr API -=== -need to create help/jumblr.md file - -## method: setpassphrase - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"jumblr\",\"method\":\"setpassphrase\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/jumblr/setpassphrase?passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -passphrase | string | no help info - -InstantDEX API -=== -need to create help/InstantDEX.md file - -## method: allcoins - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"allcoins\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/allcoins -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: available - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"available\",\"source\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/available?source={string} -``` - -field | value type | Description ---------- | ------- | ----------- -source | string | no help info - -## method: request - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"request\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/request?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: incoming - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"incoming\",\"requestid\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/incoming?requestid={int} -``` - -field | value type | Description ---------- | ------- | ----------- -requestid | int | no help info - -## method: automatched - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"automatched\",\"requestid\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/automatched?requestid={int} -``` - -field | value type | Description ---------- | ------- | ----------- -requestid | int | no help info - -## method: accept - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"accept\",\"requestid\":\"{int}\",\"quoteid\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/accept?requestid={int}"eid={int} -``` - -field | value type | Description ---------- | ------- | ----------- -requestid | int | no help info -quoteid | int | no help info - -## method: buy - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"buy\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"price\":\"{float}\",\"volume\":\"{float}\",\"dotrade\":\"{float}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/buy?exchange={string}&base={string}&rel={string}&price={float}&volume={float}&dotrade={float} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -base | string | no help info -rel | string | no help info -price | float | no help info -volume | float | no help info -dotrade | float | no help info - -## method: sell - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"sell\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"price\":\"{float}\",\"volume\":\"{float}\",\"dotrade\":\"{float}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/sell?exchange={string}&base={string}&rel={string}&price={float}&volume={float}&dotrade={float} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -base | string | no help info -rel | string | no help info -price | float | no help info -volume | float | no help info -dotrade | float | no help info - -## method: withdraw - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"withdraw\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"destaddr\":\"{string}\",\"amount\":\"{float}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/withdraw?exchange={string}&base={string}&destaddr={string}&amount={float} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -base | string | no help info -destaddr | string | no help info -amount | float | no help info - -## method: apikeypair - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"apikeypair\",\"exchange\":\"{string}\",\"apikey\":\"{string}\",\"apisecret\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/apikeypair?exchange={string}&apikey={string}&apisecret={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -apikey | string | no help info -apisecret | string | no help info - -## method: setuserid - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"setuserid\",\"exchange\":\"{string}\",\"userid\":\"{string}\",\"tradepassword\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/setuserid?exchange={string}&userid={string}&tradepassword={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -userid | string | no help info -tradepassword | string | no help info - -## method: balance - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"balance\",\"exchange\":\"{string}\",\"base\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/balance?exchange={string}&base={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -base | string | no help info - -## method: orderstatus - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"orderstatus\",\"exchange\":\"{string}\",\"orderid\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/orderstatus?exchange={string}&orderid={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -orderid | string | no help info - -## method: cancelorder - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"cancelorder\",\"exchange\":\"{string}\",\"orderid\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/cancelorder?exchange={string}&orderid={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -orderid | string | no help info - -## method: openorders - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"openorders\",\"exchange\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/openorders?exchange={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info - -## method: tradehistory - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"tradehistory\",\"exchange\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/tradehistory?exchange={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info - -## method: orderbook - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"orderbook\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"depth\":\"{int}\",\"allfields\":\"{int}\",\"ignore\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/orderbook?exchange={string}&base={string}&rel={string}&depth={int}&allfields={int}&ignore={int} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -base | string | no help info -rel | string | no help info -depth | int | no help info -allfields | int | no help info -ignore | int | no help info - -## method: pollgap - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"pollgap\",\"exchange\":\"{string}\",\"pollgap\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/pollgap?exchange={string}&pollgap={int} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -pollgap | int | no help info - -## method: allexchanges - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"allexchanges\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/allexchanges -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: allpairs - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"allpairs\",\"exchange\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/allpairs?exchange={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info - -## method: supports - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"supports\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/supports?exchange={string}&base={string}&rel={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -base | string | no help info -rel | string | no help info - -tradebot API -=== -need to create help/tradebot.md file - -## method: liquidity - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"targetcoin\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/liquidity?hash={hash}&vals={array}&targetcoin={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -targetcoin | str | no help info - -## method: amlp - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"amlp\",\"blocktrail\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/amlp?blocktrail={string} -``` - -field | value type | Description ---------- | ------- | ----------- -blocktrail | string | no help info - -## method: notlp - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"notlp\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/notlp -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: gensvm - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"gensvm\",\"base\":\"{string}\",\"rel\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/gensvm?base={string}&rel={string} -``` - -field | value type | Description ---------- | ------- | ----------- -base | string | no help info -rel | string | no help info - -## method: openliquidity - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"openliquidity\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/openliquidity -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: aveprice - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"aveprice\",\"comment\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"basevolume\":\"{float}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/aveprice?comment={string}&base={string}&rel={string}&basevolume={float} -``` - -field | value type | Description ---------- | ------- | ----------- -comment | string | no help info -base | string | no help info -rel | string | no help info -basevolume | float | no help info - -## method: monitor - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"monitor\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"commission\":\"{float}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/monitor?exchange={string}&base={string}&rel={string}&commission={float} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -base | string | no help info -rel | string | no help info -commission | float | no help info - -## method: monitorall - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"monitorall\",\"exchange\":\"{string}\",\"commission\":\"{float}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/monitorall?exchange={string}&commission={float} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -commission | float | no help info - -## method: unmonitor - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"unmonitor\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/unmonitor?exchange={string}&base={string}&rel={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -base | string | no help info -rel | string | no help info - -## method: accumulate - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"accumulate\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"price\":\"{float}\",\"volume\":\"{float}\",\"duration\":\"{float}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/accumulate?exchange={string}&base={string}&rel={string}&price={float}&volume={float}&duration={float} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -base | string | no help info -rel | string | no help info -price | float | no help info -volume | float | no help info -duration | float | no help info - -## method: divest - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"divest\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"price\":\"{float}\",\"volume\":\"{float}\",\"duration\":\"{float}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/divest?exchange={string}&base={string}&rel={string}&price={float}&volume={float}&duration={float} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -base | string | no help info -rel | string | no help info -price | float | no help info -volume | float | no help info -duration | float | no help info - -## method: activebots - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"activebots\",\"exchange\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/activebots?exchange={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info - -## method: status - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"status\",\"exchange\":\"{string}\",\"botid\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/status?exchange={string}&botid={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -botid | string | no help info - -## method: pause - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"pause\",\"exchange\":\"{string}\",\"botid\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/pause?exchange={string}&botid={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -botid | string | no help info - -## method: stop - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"stop\",\"exchange\":\"{string}\",\"botid\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/stop?exchange={string}&botid={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -botid | string | no help info - -## method: resume - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"resume\",\"exchange\":\"{string}\",\"botid\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/resume?exchange={string}&botid={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -botid | string | no help info - -## method: allbalances - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"allbalances\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/allbalances -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: anchor - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"anchor\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/anchor -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: portfolio - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"portfolio\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/portfolio -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: goals - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"goals\",\"currencies\":\"{array}\",\"vals\":\"{object}\",\"targettime\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/goals?currencies={array}&vals={object}&targettime={int} -``` - -field | value type | Description ---------- | ------- | ----------- -currencies | array | no help info -vals | object | no help info -targettime | int | no help info - -SuperNET API -=== -need to create help/SuperNET.md file - -## method: help - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"help\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/help -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: utime2utc - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"utime2utc\",\"utime\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/utime2utc?utime={string} -``` - -field | value type | Description ---------- | ------- | ----------- -utime | string | no help info - -## method: utc2utime - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"utc2utime\",\"utc\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/utc2utime?utc={int} -``` - -field | value type | Description ---------- | ------- | ----------- -utc | int | no help info - -## method: getpeers - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"getpeers\",\"activecoin\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/getpeers?activecoin={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info - -## method: mypeers - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"mypeers\",\"supernet\":\"{array}\",\"rawpeers\":\"{array}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/mypeers?supernet={array}&rawpeers={array} -``` - -field | value type | Description ---------- | ------- | ----------- -supernet | array | no help info -rawpeers | array | no help info - -## method: stop - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"stop\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/stop -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: saveconf - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"saveconf\",\"wallethash\":\"{hash}\",\"confjsonstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/saveconf?wallethash={hash}&confjsonstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -wallethash | hash | no help info -confjsonstr | str | no help info - -## method: layer - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"layer\",\"mypriv\":\"{hash}\",\"otherpubs\":\"{array}\",\"str\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/layer?mypriv={hash}&otherpubs={array}&str={str} -``` - -field | value type | Description ---------- | ------- | ----------- -mypriv | hash | no help info -otherpubs | array | no help info -str | str | no help info - -## method: bitcoinrpc - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"bitcoinrpc\",\"setcoin\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/bitcoinrpc?setcoin={string} -``` - -field | value type | Description ---------- | ------- | ----------- -setcoin | string | no help info - -## method: myipaddr - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"myipaddr\",\"ipaddr\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/myipaddr?ipaddr={string} -``` - -field | value type | Description ---------- | ------- | ----------- -ipaddr | string | no help info - -## method: setmyipaddr - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"setmyipaddr\",\"ipaddr\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/setmyipaddr?ipaddr={string} -``` - -field | value type | Description ---------- | ------- | ----------- -ipaddr | string | no help info - -## method: login - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"login\",\"handle\":\"{string}\",\"password\":\"{string}\",\"permanentfile\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/login?handle={string}&password={string}&permanentfile={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -handle | string | no help info -password | string | no help info -permanentfile | string | no help info -passphrase | string | no help info - -## method: logout - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"logout\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/logout -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: activehandle - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"activehandle\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/activehandle -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: encryptjson - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"encryptjson\",\"password\":\"{string}\",\"permanentfile\":\"{string}\",\"payload\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/encryptjson?password={string}&permanentfile={string}&payload={string} -``` - -field | value type | Description ---------- | ------- | ----------- -password | string | no help info -permanentfile | string | no help info -payload | string | no help info - -## method: decryptjson - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"decryptjson\",\"password\":\"{string}\",\"permanentfile\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/decryptjson?password={string}&permanentfile={string} -``` - -field | value type | Description ---------- | ------- | ----------- -password | string | no help info -permanentfile | string | no help info - -## method: html - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"html\",\"agentform\":\"{string}\",\"htmlfile\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/html?agentform={string}&htmlfile={string} -``` - -field | value type | Description ---------- | ------- | ----------- -agentform | string | no help info -htmlfile | string | no help info - -## method: rosetta - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"rosetta\",\"passphrase\":\"{string}\",\"pin\":\"{string}\",\"showprivkey\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/rosetta?passphrase={string}&pin={string}&showprivkey={string} -``` - -field | value type | Description ---------- | ------- | ----------- -passphrase | string | no help info -pin | string | no help info -showprivkey | string | no help info - -## method: keypair - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"keypair\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/keypair -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: priv2pub - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"priv2pub\",\"privkey\":\"{hash}\",\"addrtype\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/priv2pub?privkey={hash}&addrtype={int} -``` - -field | value type | Description ---------- | ------- | ----------- -privkey | hash | no help info -addrtype | int | no help info - -## method: wif2priv - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"wif2priv\",\"wif\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/wif2priv?wif={string} -``` - -field | value type | Description ---------- | ------- | ----------- -wif | string | no help info - -## method: priv2wif - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"priv2wif\",\"priv\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/priv2wif?priv={string} -``` - -field | value type | Description ---------- | ------- | ----------- -priv | string | no help info - -## method: addr2rmd160 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"addr2rmd160\",\"address\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/addr2rmd160?address={string} -``` - -field | value type | Description ---------- | ------- | ----------- -address | string | no help info - -## method: rmd160conv - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"rmd160conv\",\"rmd160\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/rmd160conv?rmd160={string} -``` - -field | value type | Description ---------- | ------- | ----------- -rmd160 | string | no help info - -## method: cipher - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"cipher\",\"privkey\":\"{hash}\",\"destpubkey\":\"{hash}\",\"message\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/cipher?privkey={hash}&destpubkey={hash}&message={str} -``` - -field | value type | Description ---------- | ------- | ----------- -privkey | hash | no help info -destpubkey | hash | no help info -message | str | no help info - -## method: decipher - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"decipher\",\"privkey\":\"{hash}\",\"srcpubkey\":\"{hash}\",\"cipherstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/decipher?privkey={hash}&srcpubkey={hash}&cipherstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -privkey | hash | no help info -srcpubkey | hash | no help info -cipherstr | str | no help info - -## method: broadcastcipher - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"broadcastcipher\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/broadcastcipher?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: broadcastdecipher - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"broadcastdecipher\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/broadcastdecipher?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: multicastcipher - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"multicastcipher\",\"pubkey\":\"{hash}\",\"message\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/multicastcipher?pubkey={hash}&message={str} -``` - -field | value type | Description ---------- | ------- | ----------- -pubkey | hash | no help info -message | str | no help info - -## method: multicastdecipher - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"multicastdecipher\",\"privkey\":\"{hash}\",\"cipherstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/multicastdecipher?privkey={hash}&cipherstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -privkey | hash | no help info -cipherstr | str | no help info - -mouse API -=== -need to create help/mouse.md file - -## method: image - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"mouse\",\"method\":\"image\",\"name\":\"{string}\",\"x\":\"{int}\",\"y\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/mouse/image?name={string}&x={int}&y={int} -``` - -field | value type | Description ---------- | ------- | ----------- -name | string | no help info -x | int | no help info -y | int | no help info - -## method: change - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"mouse\",\"method\":\"change\",\"name\":\"{string}\",\"x\":\"{int}\",\"y\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/mouse/change?name={string}&x={int}&y={int} -``` - -field | value type | Description ---------- | ------- | ----------- -name | string | no help info -x | int | no help info -y | int | no help info - -## method: click - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"mouse\",\"method\":\"click\",\"name\":\"{string}\",\"x\":\"{int}\",\"y\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/mouse/click?name={string}&x={int}&y={int} -``` - -field | value type | Description ---------- | ------- | ----------- -name | string | no help info -x | int | no help info -y | int | no help info - -## method: close - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"mouse\",\"method\":\"close\",\"name\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/mouse/close?name={string} -``` - -field | value type | Description ---------- | ------- | ----------- -name | string | no help info - -## method: leave - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"mouse\",\"method\":\"leave\",\"name\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/mouse/leave?name={string} -``` - -field | value type | Description ---------- | ------- | ----------- -name | string | no help info - -keyboard API -=== -need to create help/keyboard.md file - -## method: key - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"keyboard\",\"method\":\"key\",\"name\":\"{string}\",\"c\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/keyboard/key?name={string}&c={int} -``` - -field | value type | Description ---------- | ------- | ----------- -name | string | no help info -c | int | no help info - -hash API -=== -need to create help/hash.md file - -## method: hex - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"hex\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/hex?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: unhex - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"unhex\",\"hexmsg\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/unhex?hexmsg={string} -``` - -field | value type | Description ---------- | ------- | ----------- -hexmsg | string | no help info - -## method: curve25519_pair - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"curve25519_pair\",\"element\":\"{hash}\",\"scalar\":\"{hash}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/curve25519_pair?element={hash}&scalar={hash} -``` - -field | value type | Description ---------- | ------- | ----------- -element | hash | no help info -scalar | hash | no help info - -## method: NXT - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"NXT\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/NXT?passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -passphrase | string | no help info - -## method: curve25519 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"curve25519\",\"pubkey\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/curve25519?pubkey={string} -``` - -field | value type | Description ---------- | ------- | ----------- -pubkey | string | no help info - -## method: crc32 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"crc32\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/crc32?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: base64_encode - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"base64_encode\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/base64_encode?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: base64_decode - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"base64_decode\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/base64_decode?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: rmd160_sha256 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"rmd160_sha256\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/rmd160_sha256?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: sha256_sha256 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"sha256_sha256\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/sha256_sha256?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: sha224 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"sha224\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/sha224?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: sha256 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"sha256\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/sha256?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: sha384 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"sha384\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/sha384?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: sha512 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"sha512\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/sha512?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: rmd128 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"rmd128\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/rmd128?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: rmd160 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"rmd160\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/rmd160?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: rmd256 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"rmd256\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/rmd256?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: rmd320 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"rmd320\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/rmd320?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: sha1 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"sha1\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/sha1?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: md2 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"md2\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/md2?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: md4 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"md4\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/md4?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: md5 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"md5\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/md5?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: tiger192_3 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"tiger192_3\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/tiger192_3?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: whirlpool - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"whirlpool\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/whirlpool?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -hmac API -=== -need to create help/hmac.md file - -## method: sha224 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"sha224\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hmac/sha224?message={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info -passphrase | string | no help info - -## method: sha256 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"sha256\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hmac/sha256?message={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info -passphrase | string | no help info - -## method: sha384 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"sha384\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hmac/sha384?message={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info -passphrase | string | no help info - -## method: sha512 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"sha512\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hmac/sha512?message={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info -passphrase | string | no help info - -## method: rmd128 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"rmd128\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hmac/rmd128?message={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info -passphrase | string | no help info - -## method: rmd160 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"rmd160\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hmac/rmd160?message={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info -passphrase | string | no help info - -## method: rmd256 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"rmd256\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hmac/rmd256?message={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info -passphrase | string | no help info - -## method: rmd320 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"rmd320\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hmac/rmd320?message={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info -passphrase | string | no help info - -## method: sha1 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"sha1\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hmac/sha1?message={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info -passphrase | string | no help info - -## method: md2 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"md2\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hmac/md2?message={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info -passphrase | string | no help info - -## method: md4 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"md4\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hmac/md4?message={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info -passphrase | string | no help info - -## method: md5 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"md5\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hmac/md5?message={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info -passphrase | string | no help info - -## method: tiger192_3 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"tiger192_3\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hmac/tiger192_3?message={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info -passphrase | string | no help info - -## method: whirlpool - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"whirlpool\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hmac/whirlpool?message={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info -passphrase | string | no help info - -end of help - From 72d55612246f6057b68d6cd3f33591f5ba4b691f Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 17:57:57 +0200 Subject: [PATCH 233/495] Test --- iguana/tests/walletpassphrase | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/tests/walletpassphrase b/iguana/tests/walletpassphrase index 1416189c8..dc5eae04e 100755 --- a/iguana/tests/walletpassphrase +++ b/iguana/tests/walletpassphrase @@ -1,3 +1,4 @@ #!/bin/bash #curl --url "http://127.0.0.1:7778" --data "{\"method\":\"walletpassphrase\",\"params\":[\"test\", 600]}" curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"walletpassphrase\",\"password\":\"test\",\"timeout\":86444}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"jumblr\",\"method\":\"setpassphrase\",\"passphrase\":\"test\"}" From 55ebdcb8242fde2cc2963941b6f45ae5e5f5f17f Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 18:02:45 +0200 Subject: [PATCH 234/495] Test --- basilisk/jumblr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 041bfe1c6..956c27979 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -329,7 +329,7 @@ STRING_ARG(jumblr,setpassphrase,passphrase) jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); jaddstr(retjson,"BTCjumblr","notyet"); jaddstr(retjson,"KMDjumblr",KMDaddr); - return(clonestr("{\"result\":\"success\"}")); + return(jprint(retjson,1)); } } From 2cd1700bbacfa334eb8a4724d972d16fa3706ff1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 18:10:58 +0200 Subject: [PATCH 235/495] Test --- basilisk/jumblr.c | 1 + iguana/main.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 956c27979..680faed18 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -238,6 +238,7 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 OS_randombytes(&r,sizeof(r)); if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) { + printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); switch ( selector ) { case 0: // public -> z diff --git a/iguana/main.c b/iguana/main.c index 7c6b7b98d..7b6dd88c0 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -751,9 +751,9 @@ void jumblr_loop(void *ptr) while ( 1 ) { t = (uint32_t)time(NULL); - if ( (coin= iguana_coinfind("KMD")) != 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 && (t % 1200) < 60 ) + if ( (coin= iguana_coinfind("KMD")) != 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 && (t % 120) < 6 ) { - jumblr_iteration(myinfo,coin,(t % 3600) / 1200,t % 1200); + jumblr_iteration(myinfo,coin,(t % 360) / 120,t % 120); } sleep(20); } From 249f2846a4ccd893534b3e295814d3291fe9512c Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 18:19:27 +0200 Subject: [PATCH 236/495] Test --- basilisk/jumblr.c | 1 + 1 file changed, 1 insertion(+) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 680faed18..5e5c658b6 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -236,6 +236,7 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 // if BTC has arrived in destination address, invoke DEX -> BTC fee = JUMBLR_INCR * JUMBLR_FEE; OS_randombytes(&r,sizeof(r)); +r = 0; if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) { printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); From 5886b37f51b1c8d9e80655a9f8fa5754ce2a5962 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 18:25:47 +0200 Subject: [PATCH 237/495] Test --- basilisk/jumblr.c | 1 + 1 file changed, 1 insertion(+) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 5e5c658b6..ef95a8e64 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -237,6 +237,7 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 fee = JUMBLR_INCR * JUMBLR_FEE; OS_randombytes(&r,sizeof(r)); r = 0; + printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) { printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); From 0634b3edf79ab99981c0473ae5a07a63bb8207d8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 18:28:36 +0200 Subject: [PATCH 238/495] Test --- iguana/main.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/iguana/main.c b/iguana/main.c index 7b6dd88c0..218eac812 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -748,6 +748,7 @@ void iguana_urlinit(struct supernet_info *myinfo,int32_t ismainnet,int32_t usess void jumblr_loop(void *ptr) { struct iguana_info *coin; uint32_t t; struct supernet_info *myinfo = ptr; + printf("JUMBLR loop\n"); while ( 1 ) { t = (uint32_t)time(NULL); @@ -755,6 +756,7 @@ void jumblr_loop(void *ptr) { jumblr_iteration(myinfo,coin,(t % 360) / 120,t % 120); } + printf("t.%u %p\n",t,coin); sleep(20); } } From 574aebdbee0c2b77c06f2fd7e093eeb0aa7f542a Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 18:35:08 +0200 Subject: [PATCH 239/495] Test --- iguana/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/main.c b/iguana/main.c index 218eac812..daf9c52a2 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -752,11 +752,11 @@ void jumblr_loop(void *ptr) while ( 1 ) { t = (uint32_t)time(NULL); - if ( (coin= iguana_coinfind("KMD")) != 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 && (t % 120) < 6 ) + if ( (coin= iguana_coinfind("KMD")) != 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 && (t % 120) < 60 ) { jumblr_iteration(myinfo,coin,(t % 360) / 120,t % 120); } - printf("t.%u %p\n",t,coin); + printf("t.%u %p.%d %s\n",t,coin,coin!=0?coin->FULLNODE:0,myinfo->jumblr_passphrase); sleep(20); } } From 6522e750b86abe7d84fb990200937a2f6833ccca Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 18:37:47 +0200 Subject: [PATCH 240/495] Test --- basilisk/jumblr.c | 2 +- iguana/main.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index ef95a8e64..1c34b3461 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -237,7 +237,7 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 fee = JUMBLR_INCR * JUMBLR_FEE; OS_randombytes(&r,sizeof(r)); r = 0; - printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); + printf("JUMBLR.%s %d selector.%d modval.%d r.%d\n",coin->symbol,coin->FULLNODE,selector,modval,r&7); if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) { printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); diff --git a/iguana/main.c b/iguana/main.c index daf9c52a2..c7e19ec8f 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -756,7 +756,7 @@ void jumblr_loop(void *ptr) { jumblr_iteration(myinfo,coin,(t % 360) / 120,t % 120); } - printf("t.%u %p.%d %s\n",t,coin,coin!=0?coin->FULLNODE:0,myinfo->jumblr_passphrase); + //printf("t.%u %p.%d %s\n",t,coin,coin!=0?coin->FULLNODE:0,myinfo->jumblr_passphrase); sleep(20); } } From a01d0ec247ad584e5513366c60e91347a94c5bb6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 18:49:54 +0200 Subject: [PATCH 241/495] batch12 --- iguana/main.c | 4 +- iguana/tests/KMD.batch12 | 141 ++++++++++++++++++++++++ iguana/tests/KMD.batch12.importaddress | 139 +++++++++++++++++++++++ iguana/tests/KMD.batch12.listunspent | 112 +++++++++++++++++++ iguana/tests/REVS.batch12 | 14 +++ iguana/tests/REVS.batch12.importaddress | 12 ++ iguana/tests/dexgetbalance | 3 +- iguana/tests/request | 2 +- 8 files changed, 423 insertions(+), 4 deletions(-) create mode 100755 iguana/tests/KMD.batch12 create mode 100755 iguana/tests/KMD.batch12.importaddress create mode 100755 iguana/tests/KMD.batch12.listunspent create mode 100755 iguana/tests/REVS.batch12 create mode 100755 iguana/tests/REVS.batch12.importaddress diff --git a/iguana/main.c b/iguana/main.c index c7e19ec8f..dbc632b66 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1643,7 +1643,7 @@ void komodo_ICO_batch(cJSON *array,int32_t batchid) printf("# %s KMD %.8f\n",coinaddr,dstr(kmdamount)); if ( (iter & 1) == 0 ) { - if ( (0) ) + if ( (1) ) { printf("curl --url \"http://127.0.0.1:7778\" --data \"{\\\"agent\\\":\\\"dex\\\",\\\"method\\\":\\\"importaddress\\\",\\\"address\\\":\\\"%s\\\",\\\"symbol\\\":\\\"KMD\\\"}\" # %.8f\n",coinaddr,dstr(kmdamount)); printf("sleep 3\n"); @@ -1707,7 +1707,7 @@ void iguana_main(void *arg) else printf("ENDIAN ERROR\n"); mycalloc(0,0,0); #ifdef __APPLE__ - char *batchstr,*batchstr2; cJSON *batchjson; long batchsize; char fname[512],fname2[512]; int32_t batchid = 12; + char *batchstr,*batchstr2; cJSON *batchjson; long batchsize; char fname[512],fname2[512]; int32_t batchid = 13; sprintf(fname,"REVS.raw"), sprintf(fname2,"REVS.rawtxids"); if ( (0) && (batchstr= OS_filestr(&batchsize,fname)) != 0 && (batchstr2= OS_filestr(&batchsize,fname2)) != 0 ) { diff --git a/iguana/tests/KMD.batch12 b/iguana/tests/KMD.batch12 new file mode 100755 index 000000000..f4b24ca4a --- /dev/null +++ b/iguana/tests/KMD.batch12 @@ -0,0 +1,141 @@ +# RDTjem9CP97XPXvet1sQBb428xrmSZJSsd KMD 1568.45531762, REVS 31.12033224 +# RDTjem9CP97XPXvet1sQBb428xrmSZJSsd KMD 1568.45531762 +./komodo-cli sendtoaddress RDTjem9CP97XPXvet1sQBb428xrmSZJSsd 1568.45531762 +sleep 3 +echo "1568.45531762 <- expected amount RDTjem9CP97XPXvet1sQBb428xrmSZJSsd" + +# RAvtq1kazCRZUvWvPsN7ioY2Vt1EYtgpuz KMD 73430.96919475 +./komodo-cli sendtoaddress RAvtq1kazCRZUvWvPsN7ioY2Vt1EYtgpuz 73430.96919475 +sleep 3 +echo "73430.96919475 <- expected amount RAvtq1kazCRZUvWvPsN7ioY2Vt1EYtgpuz" + +# RWxT4Jfwp1Bv6RYdUMdrQ6oXt6dMsQZ8jE KMD 5689.04575312 +./komodo-cli sendtoaddress RWxT4Jfwp1Bv6RYdUMdrQ6oXt6dMsQZ8jE 5689.04575312 +sleep 3 +echo "5689.04575312 <- expected amount RWxT4Jfwp1Bv6RYdUMdrQ6oXt6dMsQZ8jE" + +# RXQxetCQScefabaJaFyqCJ1FvfNwsKtvMT KMD 17817.00058850 +./komodo-cli sendtoaddress RXQxetCQScefabaJaFyqCJ1FvfNwsKtvMT 17817.00058850 +sleep 3 +echo "17817.00058850 <- expected amount RXQxetCQScefabaJaFyqCJ1FvfNwsKtvMT" + +# RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB KMD 202518.10752377 +./komodo-cli sendtoaddress RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB 202518.10752377 +sleep 3 +echo "202518.10752377 <- expected amount RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB" + +# RH4SXj2zZqfG4TfejyHcVpaoPoDv1Uonnf KMD 6963.60677351 +./komodo-cli sendtoaddress RH4SXj2zZqfG4TfejyHcVpaoPoDv1Uonnf 6963.60677351 +sleep 3 +echo "6963.60677351 <- expected amount RH4SXj2zZqfG4TfejyHcVpaoPoDv1Uonnf" + +# RXyXDkiMmU8jdnCuyCrZHqWthU4kp9PUhv KMD 32042.52085087 +./komodo-cli sendtoaddress RXyXDkiMmU8jdnCuyCrZHqWthU4kp9PUhv 32042.52085087 +sleep 3 +echo "32042.52085087 <- expected amount RXyXDkiMmU8jdnCuyCrZHqWthU4kp9PUhv" + +# RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A KMD 2135.12309659 +./komodo-cli sendtoaddress RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A 2135.12309659 +sleep 3 +echo "2135.12309659 <- expected amount RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A" + +# RAGhCfNvxpL55JFV7h2HQa5dSEK86Jg3ic KMD 5533.00461690 +./komodo-cli sendtoaddress RAGhCfNvxpL55JFV7h2HQa5dSEK86Jg3ic 5533.00461690 +sleep 3 +echo "5533.00461690 <- expected amount RAGhCfNvxpL55JFV7h2HQa5dSEK86Jg3ic" + +# RDoLVY35wbzTXZ9QgFRSAzHfAiYYG7e65i KMD 50.26846585 +./komodo-cli sendtoaddress RDoLVY35wbzTXZ9QgFRSAzHfAiYYG7e65i 50.26846585 +sleep 3 +echo "50.26846585 <- expected amount RDoLVY35wbzTXZ9QgFRSAzHfAiYYG7e65i" + +# RMHZ76hvxs8n2yDnkUa122rs5gubMxhiw7 KMD 1733.05190072 +./komodo-cli sendtoaddress RMHZ76hvxs8n2yDnkUa122rs5gubMxhiw7 1733.05190072 +sleep 3 +echo "1733.05190072 <- expected amount RMHZ76hvxs8n2yDnkUa122rs5gubMxhiw7" + +# RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y KMD 11852.83167290, REVS 139.09398517 +# RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y KMD 11852.83167290 +./komodo-cli sendtoaddress RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y 11852.83167290 +sleep 3 +echo "11852.83167290 <- expected amount RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y" + +# RH9CANWQNvqSktmX39ruDfiNFimcToD2ur KMD 43125.33019700 +./komodo-cli sendtoaddress RH9CANWQNvqSktmX39ruDfiNFimcToD2ur 43125.33019700 +sleep 3 +echo "43125.33019700 <- expected amount RH9CANWQNvqSktmX39ruDfiNFimcToD2ur" + +# RSp4ceoTDQt7fbweFBpEbvbTTH8J9SEp4b KMD 36837.09249870 +./komodo-cli sendtoaddress RSp4ceoTDQt7fbweFBpEbvbTTH8J9SEp4b 36837.09249870 +sleep 3 +echo "36837.09249870 <- expected amount RSp4ceoTDQt7fbweFBpEbvbTTH8J9SEp4b" + +# RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8 KMD 3016.26045526, REVS 59.85500000 +# RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8 KMD 3016.26045526 +./komodo-cli sendtoaddress RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8 3016.26045526 +sleep 3 +echo "3016.26045526 <- expected amount RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8" + +# RLWvbjH97gqjGXsRyPijDmwuKNFqsaaerb KMD 91240.39653929 +./komodo-cli sendtoaddress RLWvbjH97gqjGXsRyPijDmwuKNFqsaaerb 91240.39653929 +sleep 3 +echo "91240.39653929 <- expected amount RLWvbjH97gqjGXsRyPijDmwuKNFqsaaerb" + +# RGoB4uxdk2SDs5yCerizsQ3UFD7NqJjury KMD 2440.00507548 +./komodo-cli sendtoaddress RGoB4uxdk2SDs5yCerizsQ3UFD7NqJjury 2440.00507548 +sleep 3 +echo "2440.00507548 <- expected amount RGoB4uxdk2SDs5yCerizsQ3UFD7NqJjury" + +# RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX KMD 3823.81289934, REVS 75.88015839 +# RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX KMD 3823.81289934 +./komodo-cli sendtoaddress RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX 3823.81289934 +sleep 3 +echo "3823.81289934 <- expected amount RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX" + +# RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz KMD 2772.48246697 +./komodo-cli sendtoaddress RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz 2772.48246697 +sleep 3 +echo "2772.48246697 <- expected amount RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz" + +# RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv KMD 693.08132289 +./komodo-cli sendtoaddress RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv 693.08132289 +sleep 3 +echo "693.08132289 <- expected amount RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv" + +# RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut KMD 10316.17621736 +./komodo-cli sendtoaddress RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut 10316.17621736 +sleep 3 +echo "10316.17621736 <- expected amount RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut" + +# RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW KMD 29566.93551966 +./komodo-cli sendtoaddress RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW 29566.93551966 +sleep 3 +echo "29566.93551966 <- expected amount RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW" + +# RNQzdseaqPikT6Df2ECFQXxW4yUr4fahqX KMD 19365.33667225 +./komodo-cli sendtoaddress RNQzdseaqPikT6Df2ECFQXxW4yUr4fahqX 19365.33667225 +sleep 3 +echo "19365.33667225 <- expected amount RNQzdseaqPikT6Df2ECFQXxW4yUr4fahqX" + +# R9PwsNzuksjJzZUAAX4yfDwdSy5Y4KP25X KMD 55229.13842423 +./komodo-cli sendtoaddress R9PwsNzuksjJzZUAAX4yfDwdSy5Y4KP25X 55229.13842423 +sleep 3 +echo "55229.13842423 <- expected amount R9PwsNzuksjJzZUAAX4yfDwdSy5Y4KP25X" + +# RC3DmLpKZyMD66JnKXVRHT9AVcok9xwGgB KMD 29049.45748125 +./komodo-cli sendtoaddress RC3DmLpKZyMD66JnKXVRHT9AVcok9xwGgB 29049.45748125 +sleep 3 +echo "29049.45748125 <- expected amount RC3DmLpKZyMD66JnKXVRHT9AVcok9xwGgB" + +# RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47 KMD 10066.89321267 +./komodo-cli sendtoaddress RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47 10066.89321267 +sleep 3 +echo "10066.89321267 <- expected amount RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47" + +# RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ KMD 2834.17657315 +./komodo-cli sendtoaddress RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ 2834.17657315 +sleep 3 +echo "2834.17657315 <- expected amount RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ" + + +# total KMD 701710.56131060 REVS 0.00000000 diff --git a/iguana/tests/KMD.batch12.importaddress b/iguana/tests/KMD.batch12.importaddress new file mode 100755 index 000000000..c140a3396 --- /dev/null +++ b/iguana/tests/KMD.batch12.importaddress @@ -0,0 +1,139 @@ +# RDTjem9CP97XPXvet1sQBb428xrmSZJSsd KMD 1568.45531762, REVS 31.12033224 +# RDTjem9CP97XPXvet1sQBb428xrmSZJSsd KMD 1568.45531762 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RDTjem9CP97XPXvet1sQBb428xrmSZJSsd\",\"symbol\":\"KMD\"}" # 1568.45531762 +sleep 3 +echo "1568.45531762 <- expected amount RDTjem9CP97XPXvet1sQBb428xrmSZJSsd" + +# RAvtq1kazCRZUvWvPsN7ioY2Vt1EYtgpuz KMD 73430.96919475 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RAvtq1kazCRZUvWvPsN7ioY2Vt1EYtgpuz\",\"symbol\":\"KMD\"}" # 73430.96919475 +sleep 3 +echo "73430.96919475 <- expected amount RAvtq1kazCRZUvWvPsN7ioY2Vt1EYtgpuz" + +# RWxT4Jfwp1Bv6RYdUMdrQ6oXt6dMsQZ8jE KMD 5689.04575312 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RWxT4Jfwp1Bv6RYdUMdrQ6oXt6dMsQZ8jE\",\"symbol\":\"KMD\"}" # 5689.04575312 +sleep 3 +echo "5689.04575312 <- expected amount RWxT4Jfwp1Bv6RYdUMdrQ6oXt6dMsQZ8jE" + +# RXQxetCQScefabaJaFyqCJ1FvfNwsKtvMT KMD 17817.00058850 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RXQxetCQScefabaJaFyqCJ1FvfNwsKtvMT\",\"symbol\":\"KMD\"}" # 17817.00058850 +sleep 3 +echo "17817.00058850 <- expected amount RXQxetCQScefabaJaFyqCJ1FvfNwsKtvMT" + +# RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB KMD 202518.10752377 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB\",\"symbol\":\"KMD\"}" # 202518.10752377 +sleep 3 +echo "202518.10752377 <- expected amount RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB" + +# RH4SXj2zZqfG4TfejyHcVpaoPoDv1Uonnf KMD 6963.60677351 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RH4SXj2zZqfG4TfejyHcVpaoPoDv1Uonnf\",\"symbol\":\"KMD\"}" # 6963.60677351 +sleep 3 +echo "6963.60677351 <- expected amount RH4SXj2zZqfG4TfejyHcVpaoPoDv1Uonnf" + +# RXyXDkiMmU8jdnCuyCrZHqWthU4kp9PUhv KMD 32042.52085087 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RXyXDkiMmU8jdnCuyCrZHqWthU4kp9PUhv\",\"symbol\":\"KMD\"}" # 32042.52085087 +sleep 3 +echo "32042.52085087 <- expected amount RXyXDkiMmU8jdnCuyCrZHqWthU4kp9PUhv" + +# RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A KMD 2135.12309659 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A\",\"symbol\":\"KMD\"}" # 2135.12309659 +sleep 3 +echo "2135.12309659 <- expected amount RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A" + +# RAGhCfNvxpL55JFV7h2HQa5dSEK86Jg3ic KMD 5533.00461690 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RAGhCfNvxpL55JFV7h2HQa5dSEK86Jg3ic\",\"symbol\":\"KMD\"}" # 5533.00461690 +sleep 3 +echo "5533.00461690 <- expected amount RAGhCfNvxpL55JFV7h2HQa5dSEK86Jg3ic" + +# RDoLVY35wbzTXZ9QgFRSAzHfAiYYG7e65i KMD 50.26846585 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RDoLVY35wbzTXZ9QgFRSAzHfAiYYG7e65i\",\"symbol\":\"KMD\"}" # 50.26846585 +sleep 3 +echo "50.26846585 <- expected amount RDoLVY35wbzTXZ9QgFRSAzHfAiYYG7e65i" + +# RMHZ76hvxs8n2yDnkUa122rs5gubMxhiw7 KMD 1733.05190072 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RMHZ76hvxs8n2yDnkUa122rs5gubMxhiw7\",\"symbol\":\"KMD\"}" # 1733.05190072 +sleep 3 +echo "1733.05190072 <- expected amount RMHZ76hvxs8n2yDnkUa122rs5gubMxhiw7" + +# RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y KMD 11852.83167290, REVS 139.09398517 +# RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y KMD 11852.83167290 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y\",\"symbol\":\"KMD\"}" # 11852.83167290 +sleep 3 +echo "11852.83167290 <- expected amount RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y" + +# RH9CANWQNvqSktmX39ruDfiNFimcToD2ur KMD 43125.33019700 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RH9CANWQNvqSktmX39ruDfiNFimcToD2ur\",\"symbol\":\"KMD\"}" # 43125.33019700 +sleep 3 +echo "43125.33019700 <- expected amount RH9CANWQNvqSktmX39ruDfiNFimcToD2ur" + +# RSp4ceoTDQt7fbweFBpEbvbTTH8J9SEp4b KMD 36837.09249870 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RSp4ceoTDQt7fbweFBpEbvbTTH8J9SEp4b\",\"symbol\":\"KMD\"}" # 36837.09249870 +sleep 3 +echo "36837.09249870 <- expected amount RSp4ceoTDQt7fbweFBpEbvbTTH8J9SEp4b" + +# RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8 KMD 3016.26045526, REVS 59.85500000 +# RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8 KMD 3016.26045526 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8\",\"symbol\":\"KMD\"}" # 3016.26045526 +sleep 3 +echo "3016.26045526 <- expected amount RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8" + +# RLWvbjH97gqjGXsRyPijDmwuKNFqsaaerb KMD 91240.39653929 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RLWvbjH97gqjGXsRyPijDmwuKNFqsaaerb\",\"symbol\":\"KMD\"}" # 91240.39653929 +sleep 3 +echo "91240.39653929 <- expected amount RLWvbjH97gqjGXsRyPijDmwuKNFqsaaerb" + +# RGoB4uxdk2SDs5yCerizsQ3UFD7NqJjury KMD 2440.00507548 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RGoB4uxdk2SDs5yCerizsQ3UFD7NqJjury\",\"symbol\":\"KMD\"}" # 2440.00507548 +sleep 3 +echo "2440.00507548 <- expected amount RGoB4uxdk2SDs5yCerizsQ3UFD7NqJjury" + +# RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX KMD 3823.81289934, REVS 75.88015839 +# RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX KMD 3823.81289934 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX\",\"symbol\":\"KMD\"}" # 3823.81289934 +sleep 3 +echo "3823.81289934 <- expected amount RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX" + +# RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz KMD 2772.48246697 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz\",\"symbol\":\"KMD\"}" # 2772.48246697 +sleep 3 +echo "2772.48246697 <- expected amount RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz" + +# RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv KMD 693.08132289 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv\",\"symbol\":\"KMD\"}" # 693.08132289 +sleep 3 +echo "693.08132289 <- expected amount RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv" + +# RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut KMD 10316.17621736 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut\",\"symbol\":\"KMD\"}" # 10316.17621736 +sleep 3 +echo "10316.17621736 <- expected amount RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut" + +# RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW KMD 29566.93551966 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW\",\"symbol\":\"KMD\"}" # 29566.93551966 +sleep 3 +echo "29566.93551966 <- expected amount RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW" + +# RNQzdseaqPikT6Df2ECFQXxW4yUr4fahqX KMD 19365.33667225 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RNQzdseaqPikT6Df2ECFQXxW4yUr4fahqX\",\"symbol\":\"KMD\"}" # 19365.33667225 +sleep 3 +echo "19365.33667225 <- expected amount RNQzdseaqPikT6Df2ECFQXxW4yUr4fahqX" + +# R9PwsNzuksjJzZUAAX4yfDwdSy5Y4KP25X KMD 55229.13842423 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"R9PwsNzuksjJzZUAAX4yfDwdSy5Y4KP25X\",\"symbol\":\"KMD\"}" # 55229.13842423 +sleep 3 +echo "55229.13842423 <- expected amount R9PwsNzuksjJzZUAAX4yfDwdSy5Y4KP25X" + +# RC3DmLpKZyMD66JnKXVRHT9AVcok9xwGgB KMD 29049.45748125 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RC3DmLpKZyMD66JnKXVRHT9AVcok9xwGgB\",\"symbol\":\"KMD\"}" # 29049.45748125 +sleep 3 +echo "29049.45748125 <- expected amount RC3DmLpKZyMD66JnKXVRHT9AVcok9xwGgB" + +# RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47 KMD 10066.89321267 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47\",\"symbol\":\"KMD\"}" # 10066.89321267 +sleep 3 +echo "10066.89321267 <- expected amount RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47" + +# RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ KMD 2834.17657315 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ\",\"symbol\":\"KMD\"}" # 2834.17657315 +sleep 3 +echo "2834.17657315 <- expected amount RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ" + diff --git a/iguana/tests/KMD.batch12.listunspent b/iguana/tests/KMD.batch12.listunspent new file mode 100755 index 000000000..b54d4d79c --- /dev/null +++ b/iguana/tests/KMD.batch12.listunspent @@ -0,0 +1,112 @@ +# RDTjem9CP97XPXvet1sQBb428xrmSZJSsd KMD 1568.45531762, REVS 31.12033224 +# RDTjem9CP97XPXvet1sQBb428xrmSZJSsd KMD 1568.45531762 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RDTjem9CP97XPXvet1sQBb428xrmSZJSsd\",\"symbol\":\"KMD\"}" +echo "1568.45531762 <- expected amount RDTjem9CP97XPXvet1sQBb428xrmSZJSsd" + +# RAvtq1kazCRZUvWvPsN7ioY2Vt1EYtgpuz KMD 73430.96919475 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RAvtq1kazCRZUvWvPsN7ioY2Vt1EYtgpuz\",\"symbol\":\"KMD\"}" +echo "73430.96919475 <- expected amount RAvtq1kazCRZUvWvPsN7ioY2Vt1EYtgpuz" + +# RWxT4Jfwp1Bv6RYdUMdrQ6oXt6dMsQZ8jE KMD 5689.04575312 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RWxT4Jfwp1Bv6RYdUMdrQ6oXt6dMsQZ8jE\",\"symbol\":\"KMD\"}" +echo "5689.04575312 <- expected amount RWxT4Jfwp1Bv6RYdUMdrQ6oXt6dMsQZ8jE" + +# RXQxetCQScefabaJaFyqCJ1FvfNwsKtvMT KMD 17817.00058850 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RXQxetCQScefabaJaFyqCJ1FvfNwsKtvMT\",\"symbol\":\"KMD\"}" +echo "17817.00058850 <- expected amount RXQxetCQScefabaJaFyqCJ1FvfNwsKtvMT" + +# RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB KMD 202518.10752377 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB\",\"symbol\":\"KMD\"}" +echo "202518.10752377 <- expected amount RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB" + +# RH4SXj2zZqfG4TfejyHcVpaoPoDv1Uonnf KMD 6963.60677351 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RH4SXj2zZqfG4TfejyHcVpaoPoDv1Uonnf\",\"symbol\":\"KMD\"}" +echo "6963.60677351 <- expected amount RH4SXj2zZqfG4TfejyHcVpaoPoDv1Uonnf" + +# RXyXDkiMmU8jdnCuyCrZHqWthU4kp9PUhv KMD 32042.52085087 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RXyXDkiMmU8jdnCuyCrZHqWthU4kp9PUhv\",\"symbol\":\"KMD\"}" +echo "32042.52085087 <- expected amount RXyXDkiMmU8jdnCuyCrZHqWthU4kp9PUhv" + +# RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A KMD 2135.12309659 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A\",\"symbol\":\"KMD\"}" +echo "2135.12309659 <- expected amount RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A" + +# RAGhCfNvxpL55JFV7h2HQa5dSEK86Jg3ic KMD 5533.00461690 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RAGhCfNvxpL55JFV7h2HQa5dSEK86Jg3ic\",\"symbol\":\"KMD\"}" +echo "5533.00461690 <- expected amount RAGhCfNvxpL55JFV7h2HQa5dSEK86Jg3ic" + +# RDoLVY35wbzTXZ9QgFRSAzHfAiYYG7e65i KMD 50.26846585 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RDoLVY35wbzTXZ9QgFRSAzHfAiYYG7e65i\",\"symbol\":\"KMD\"}" +echo "50.26846585 <- expected amount RDoLVY35wbzTXZ9QgFRSAzHfAiYYG7e65i" + +# RMHZ76hvxs8n2yDnkUa122rs5gubMxhiw7 KMD 1733.05190072 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RMHZ76hvxs8n2yDnkUa122rs5gubMxhiw7\",\"symbol\":\"KMD\"}" +echo "1733.05190072 <- expected amount RMHZ76hvxs8n2yDnkUa122rs5gubMxhiw7" + +# RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y KMD 11852.83167290, REVS 139.09398517 +# RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y KMD 11852.83167290 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y\",\"symbol\":\"KMD\"}" +echo "11852.83167290 <- expected amount RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y" + +# RH9CANWQNvqSktmX39ruDfiNFimcToD2ur KMD 43125.33019700 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RH9CANWQNvqSktmX39ruDfiNFimcToD2ur\",\"symbol\":\"KMD\"}" +echo "43125.33019700 <- expected amount RH9CANWQNvqSktmX39ruDfiNFimcToD2ur" + +# RSp4ceoTDQt7fbweFBpEbvbTTH8J9SEp4b KMD 36837.09249870 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RSp4ceoTDQt7fbweFBpEbvbTTH8J9SEp4b\",\"symbol\":\"KMD\"}" +echo "36837.09249870 <- expected amount RSp4ceoTDQt7fbweFBpEbvbTTH8J9SEp4b" + +# RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8 KMD 3016.26045526, REVS 59.85500000 +# RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8 KMD 3016.26045526 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8\",\"symbol\":\"KMD\"}" +echo "3016.26045526 <- expected amount RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8" + +# RLWvbjH97gqjGXsRyPijDmwuKNFqsaaerb KMD 91240.39653929 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RLWvbjH97gqjGXsRyPijDmwuKNFqsaaerb\",\"symbol\":\"KMD\"}" +echo "91240.39653929 <- expected amount RLWvbjH97gqjGXsRyPijDmwuKNFqsaaerb" + +# RGoB4uxdk2SDs5yCerizsQ3UFD7NqJjury KMD 2440.00507548 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RGoB4uxdk2SDs5yCerizsQ3UFD7NqJjury\",\"symbol\":\"KMD\"}" +echo "2440.00507548 <- expected amount RGoB4uxdk2SDs5yCerizsQ3UFD7NqJjury" + +# RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX KMD 3823.81289934, REVS 75.88015839 +# RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX KMD 3823.81289934 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX\",\"symbol\":\"KMD\"}" +echo "3823.81289934 <- expected amount RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX" + +# RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz KMD 2772.48246697 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz\",\"symbol\":\"KMD\"}" +echo "2772.48246697 <- expected amount RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz" + +# RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv KMD 693.08132289 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv\",\"symbol\":\"KMD\"}" +echo "693.08132289 <- expected amount RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv" + +# RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut KMD 10316.17621736 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut\",\"symbol\":\"KMD\"}" +echo "10316.17621736 <- expected amount RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut" + +# RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW KMD 29566.93551966 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW\",\"symbol\":\"KMD\"}" +echo "29566.93551966 <- expected amount RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW" + +# RNQzdseaqPikT6Df2ECFQXxW4yUr4fahqX KMD 19365.33667225 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RNQzdseaqPikT6Df2ECFQXxW4yUr4fahqX\",\"symbol\":\"KMD\"}" +echo "19365.33667225 <- expected amount RNQzdseaqPikT6Df2ECFQXxW4yUr4fahqX" + +# R9PwsNzuksjJzZUAAX4yfDwdSy5Y4KP25X KMD 55229.13842423 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"R9PwsNzuksjJzZUAAX4yfDwdSy5Y4KP25X\",\"symbol\":\"KMD\"}" +echo "55229.13842423 <- expected amount R9PwsNzuksjJzZUAAX4yfDwdSy5Y4KP25X" + +# RC3DmLpKZyMD66JnKXVRHT9AVcok9xwGgB KMD 29049.45748125 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RC3DmLpKZyMD66JnKXVRHT9AVcok9xwGgB\",\"symbol\":\"KMD\"}" +echo "29049.45748125 <- expected amount RC3DmLpKZyMD66JnKXVRHT9AVcok9xwGgB" + +# RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47 KMD 10066.89321267 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47\",\"symbol\":\"KMD\"}" +echo "10066.89321267 <- expected amount RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47" + +# RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ KMD 2834.17657315 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ\",\"symbol\":\"KMD\"}" +echo "2834.17657315 <- expected amount RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ" + diff --git a/iguana/tests/REVS.batch12 b/iguana/tests/REVS.batch12 new file mode 100755 index 000000000..78ad38586 --- /dev/null +++ b/iguana/tests/REVS.batch12 @@ -0,0 +1,14 @@ +# RDTjem9CP97XPXvet1sQBb428xrmSZJSsd KMD 1568.45531762, REVS 31.12033224 +sleep 1 +fiat/revs sendtoaddress RDTjem9CP97XPXvet1sQBb428xrmSZJSsd 31.12033224 +# RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y KMD 11852.83167290, REVS 139.09398517 +sleep 1 +fiat/revs sendtoaddress RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y 139.09398517 +# RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8 KMD 3016.26045526, REVS 59.85500000 +sleep 1 +fiat/revs sendtoaddress RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8 59.85500000 +# RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX KMD 3823.81289934, REVS 75.88015839 +sleep 1 +fiat/revs sendtoaddress RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX 75.88015839 + +# total KMD 0.00000000 REVS 305.94947580 diff --git a/iguana/tests/REVS.batch12.importaddress b/iguana/tests/REVS.batch12.importaddress new file mode 100755 index 000000000..53ae5be86 --- /dev/null +++ b/iguana/tests/REVS.batch12.importaddress @@ -0,0 +1,12 @@ +# RDTjem9CP97XPXvet1sQBb428xrmSZJSsd KMD 1568.45531762, REVS 31.12033224 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RDTjem9CP97XPXvet1sQBb428xrmSZJSsd\",\"symbol\":\"REVS\"}" # 31.12033224 +sleep 3 +# RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y KMD 11852.83167290, REVS 139.09398517 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y\",\"symbol\":\"REVS\"}" # 139.09398517 +sleep 3 +# RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8 KMD 3016.26045526, REVS 59.85500000 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8\",\"symbol\":\"REVS\"}" # 59.85500000 +sleep 3 +# RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX KMD 3823.81289934, REVS 75.88015839 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX\",\"symbol\":\"REVS\"}" # 75.88015839 +sleep 3 diff --git a/iguana/tests/dexgetbalance b/iguana/tests/dexgetbalance index d0f90e62b..0e91dac58 100755 --- a/iguana/tests/dexgetbalance +++ b/iguana/tests/dexgetbalance @@ -1,2 +1,3 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getbalance\",\"address\":\"RU58D7nNLXwD29hgC2MPgtAF458gGxnPYS\",\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getbalance\",\"address\":\"RRyBxbrAPRUBCUpiJgJZYrkxqrh8x5ta9Z\",\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getbalance\",\"address\":\"RRyBxbrAPRUBCUpiJgJZYrkxqrh8x5ta9Z\",\"symbol\":\"USD\"}" diff --git a/iguana/tests/request b/iguana/tests/request index 58ccace04..ac3337301 100755 --- a/iguana/tests/request +++ b/iguana/tests/request @@ -1,3 +1,3 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"request\",\"vals\":{\"source\":\"BTCD\",\"amount\":0.03,\"dest\":\"BTC\",\"minprice\":0.002}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"request\",\"vals\":{\"source\":\"KMD\",\"amount\":20,\"dest\":\"USD\",\"minprice\":0.08}}" From 70401e923cab79fc2f3c228f97b188dcd1c2a26d Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 19:12:50 +0200 Subject: [PATCH 242/495] Test --- basilisk/jumblr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 1c34b3461..6e82caa2c 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -262,9 +262,9 @@ r = 0; free(retstr); } free(zaddr); - } + } else printf("no zaddr from jumblr_zgetnewaddress\n"); } - } + } else printf("%s total %.8f vs %.8f\n",KMDaddr,dstr(total),(JUMBLR_INCR + 3*(fee+JUMBLR_TXFEE))); break; case 1: // z -> z jumblr_opidsupdate(myinfo,coin); From 247e7c95c418f9af7370dc2b4129827529e0d47d Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 19:42:52 +0200 Subject: [PATCH 243/495] Test --- basilisk/jumblr.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 6e82caa2c..90636c492 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -132,8 +132,20 @@ int64_t jumblr_receivedby(struct supernet_info *myinfo,struct iguana_info *coin, int64_t jumblr_balance(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { - char *retstr; double val; int64_t balance = 0; - if ( (retstr= jumblr_zgetbalance(myinfo,coin,addr)) != 0 ) + char *retstr; double val; cJSON *retjson; int64_t balance = 0; + if ( strlen(addr) < 40 ) + { + if ( (retstr= _dex_getbalance(myinfo,coin->symbol,addr)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + balance = jdouble(retjson,"balance") * SATOSHIDEN; + free_json(retjson); + } + free(retstr); + } + } + else if ( (retstr= jumblr_zgetbalance(myinfo,coin,addr)) != 0 ) { if ( (val= atof(retstr)) > SMALLVAL ) balance = val * SATOSHIDEN; From a6e2e55e8136d8055fa326d923c7f2def0948e65 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 19:49:19 +0200 Subject: [PATCH 244/495] Test --- basilisk/jumblr.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 90636c492..921f7360e 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -75,21 +75,21 @@ char *jumblr_zgetoperationresult(struct supernet_info *myinfo,struct iguana_info char *jumblr_sendt_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *taddr,char *zaddr,double amount) { char params[1024]; double fee = (amount-3*JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", [{\"%s\":%.8f}, {\"%s\":%.8f}]], 1, %.8f",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", \"[{\"%s\":%.8f}, {\"%s\":%.8f}]]\", 1, %.8f",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } char *jumblr_sendz_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *zaddrS,char *zaddrD,double amount) { char params[1024]; double fee = (amount-2*JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", [{\"%s\":%.8f}, {\"%s\":%.8f}], 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", \"[{\"%s\":%.8f}, {\"%s\":%.8f}]\", 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } char *jumblr_sendz_to_t(struct supernet_info *myinfo,struct iguana_info *coin,char *zaddr,char *taddr,double amount) { char params[1024]; double fee = (amount-JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", [{\"%s\":%.8f}, {\"%s\":%.8f}], 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", \"[{\"%s\":%.8f}, {\"%s\":%.8f}]\", 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } @@ -249,7 +249,6 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 fee = JUMBLR_INCR * JUMBLR_FEE; OS_randombytes(&r,sizeof(r)); r = 0; - printf("JUMBLR.%s %d selector.%d modval.%d r.%d\n",coin->symbol,coin->FULLNODE,selector,modval,r&7); if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) { printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); From c1497141c3ba7514cf2db3c00919a2f508b84621 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 19:55:15 +0200 Subject: [PATCH 245/495] Test --- basilisk/jumblr.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 921f7360e..93a5cb11f 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -75,21 +75,21 @@ char *jumblr_zgetoperationresult(struct supernet_info *myinfo,struct iguana_info char *jumblr_sendt_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *taddr,char *zaddr,double amount) { char params[1024]; double fee = (amount-3*JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", \"[{\"%s\":%.8f}, {\"%s\":%.8f}]]\", 1, %.8f",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", \"[{\\\"%s\\\":%.8f}, {\\\"%s\\\":%.8f}]]\", 1, %.8f",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } char *jumblr_sendz_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *zaddrS,char *zaddrD,double amount) { char params[1024]; double fee = (amount-2*JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", \"[{\"%s\":%.8f}, {\"%s\":%.8f}]\", 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", \"[{\\\"%s\\\":%.8f}, {\\\"%s\\\":%.8f}]\", 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } char *jumblr_sendz_to_t(struct supernet_info *myinfo,struct iguana_info *coin,char *zaddr,char *taddr,double amount) { char params[1024]; double fee = (amount-JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", \"[{\"%s\":%.8f}, {\"%s\":%.8f}]\", 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", \"[{\\\"%s\\\":%.8f}, {\\\"%s\\\":%.8f}]\", 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } From 846b13cac3d4e6816c8daf5474de08cd4dc72824 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 20:04:03 +0200 Subject: [PATCH 246/495] Test --- basilisk/jumblr.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 93a5cb11f..35b96646b 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -75,21 +75,21 @@ char *jumblr_zgetoperationresult(struct supernet_info *myinfo,struct iguana_info char *jumblr_sendt_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *taddr,char *zaddr,double amount) { char params[1024]; double fee = (amount-3*JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", \"[{\\\"%s\\\":%.8f}, {\\\"%s\\\":%.8f}]]\", 1, %.8f",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", \"[{\"%s\":%.8f}, {\"%s\":%.8f}]\", 1, %.8f]",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } char *jumblr_sendz_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *zaddrS,char *zaddrD,double amount) { char params[1024]; double fee = (amount-2*JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", \"[{\\\"%s\\\":%.8f}, {\\\"%s\\\":%.8f}]\", 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", \"[{\"%s\":%.8f}, {\"%s\":%.8f}]\", 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } char *jumblr_sendz_to_t(struct supernet_info *myinfo,struct iguana_info *coin,char *zaddr,char *taddr,double amount) { char params[1024]; double fee = (amount-JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", \"[{\\\"%s\\\":%.8f}, {\\\"%s\\\":%.8f}]\", 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", \"[{\"%s\":%.8f}, {\"%s\":%.8f}]\", 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } From d71be23c8019b873a063555ab5bf74ff604a4fa9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 20:07:07 +0200 Subject: [PATCH 247/495] Test --- basilisk/jumblr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 35b96646b..e26fd3b14 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -75,7 +75,7 @@ char *jumblr_zgetoperationresult(struct supernet_info *myinfo,struct iguana_info char *jumblr_sendt_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *taddr,char *zaddr,double amount) { char params[1024]; double fee = (amount-3*JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", \"[{\"%s\":%.8f}, {\"%s\":%.8f}]\", 1, %.8f]",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", \"[{\\\"%s\\\":%.8f}, {\\\"%s\\\":%.8f}]\", 1, %.8f]",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } From c7be132fd1b1c446a733d1f22f8069f3f988cf96 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 20:12:51 +0200 Subject: [PATCH 248/495] Test --- basilisk/jumblr.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index e26fd3b14..804660308 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -75,21 +75,21 @@ char *jumblr_zgetoperationresult(struct supernet_info *myinfo,struct iguana_info char *jumblr_sendt_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *taddr,char *zaddr,double amount) { char params[1024]; double fee = (amount-3*JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", \"[{\\\"%s\\\":%.8f}, {\\\"%s\\\":%.8f}]\", 1, %.8f]",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", [{\"%s\":%.8f}, {\"%s\":%.8f}], 1, %.8f]",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } char *jumblr_sendz_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *zaddrS,char *zaddrD,double amount) { char params[1024]; double fee = (amount-2*JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", \"[{\"%s\":%.8f}, {\"%s\":%.8f}]\", 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", [{\"%s\":%.8f}, {\"%s\":%.8f}], 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } char *jumblr_sendz_to_t(struct supernet_info *myinfo,struct iguana_info *coin,char *zaddr,char *taddr,double amount) { char params[1024]; double fee = (amount-JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", \"[{\"%s\":%.8f}, {\"%s\":%.8f}]\", 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", [{\"%s\":%.8f}, {\"%s\":%.8f}], 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } From e6745ea2c32328700abf8d70f4880399b422278e Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 20:19:52 +0200 Subject: [PATCH 249/495] Test --- basilisk/jumblr.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 804660308..50c279d2e 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -75,21 +75,21 @@ char *jumblr_zgetoperationresult(struct supernet_info *myinfo,struct iguana_info char *jumblr_sendt_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *taddr,char *zaddr,double amount) { char params[1024]; double fee = (amount-3*JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", [{\"%s\":%.8f}, {\"%s\":%.8f}], 1, %.8f]",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } char *jumblr_sendz_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *zaddrS,char *zaddrD,double amount) { char params[1024]; double fee = (amount-2*JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", [{\"%s\":%.8f}, {\"%s\":%.8f}], 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } char *jumblr_sendz_to_t(struct supernet_info *myinfo,struct iguana_info *coin,char *zaddr,char *taddr,double amount) { char params[1024]; double fee = (amount-JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", [{\"%s\":%.8f}, {\"%s\":%.8f}], 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } From 8bb5475544de599c661f51bf20abfaa4ac99526a Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 20:28:50 +0200 Subject: [PATCH 250/495] Test --- iguana/iguana_payments.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index fbe9ba5b5..86f22cb3c 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -538,7 +538,7 @@ char *iguana_calcutxorawtx(struct supernet_info *myinfo,struct iguana_info *coin { } - else if ( (sobj= jobj(item,"scriptPubKey")) == 0 && (spendscriptstr= jstr(sobj,"hex")) == 0 ) + else if ( (sobj= jobj(item,"scriptPubKey")) == 0 || (spendscriptstr= jstr(sobj,"hex")) == 0 ) { printf("no spendscript (%s)\n",jprint(item,0)); continue; From 8e74fb503f1fb20cf57542e654d6673ea2f5c924 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 20:59:08 +0200 Subject: [PATCH 251/495] Test --- basilisk/jumblr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 50c279d2e..afc5a0a2d 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -68,7 +68,7 @@ char *jumblr_zlistoperationids(struct supernet_info *myinfo,struct iguana_info * char *jumblr_zgetoperationresult(struct supernet_info *myinfo,struct iguana_info *coin,char *opid) { char params[1024]; - sprintf(params,"[\"%s\"]",opid); + sprintf(params,"[[\"%s\"]]",opid); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_getoperationresult",params)); } From d668d423cf501c529627e164fff93073a7c12b26 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 00:41:27 +0200 Subject: [PATCH 252/495] Active handle with jumble --- basilisk/jumblr.c | 7 +++++-- iguana/iguana777.h | 1 + iguana/main.c | 11 ++++++++++- includes/iguana_funcs.h | 1 + 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index afc5a0a2d..f2a7c59df 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -32,7 +32,6 @@ #define JUMBLR_ADDR "RGhxXpXSSBTBm9EvNsXnTQczthMCxHX91t" #define JUMBLR_BTCADDR "18RmTJe9qMech8siuhYfMtHo8RtcN1obC6" #define JUMBLR_FEE 0.001 -#define JUMBLR_DEPOSITPREFIX "deposit " struct jumblr_item *jumblr_opidfind(struct supernet_info *myinfo,char *opid) { @@ -254,7 +253,7 @@ r = 0; printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); switch ( selector ) { - case 0: // public -> z + case 0: // public -> z, need to importprivkey priv0 = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); if ( (total= jumblr_balance(myinfo,coin,KMDaddr)) >= (JUMBLR_INCR + 3*(fee+JUMBLR_TXFEE))*SATOSHIDEN ) { @@ -356,8 +355,12 @@ ZERO_ARGS(jumblr,status) retjson = cJSON_CreateObject(); step_t2z = step_z2z = step_z2t = deposited = finished = 0; jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + jaddstr(retjson,"BTCdeposit","notyet"); + jaddstr(retjson,"KMDdeposit",KMDaddr); deposited = jumblr_receivedby(myinfo,coin,KMDaddr); jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); + jaddstr(retjson,"BTCjumblr","notyet"); + jaddstr(retjson,"KMDjumblr",KMDaddr); finished = jumblr_receivedby(myinfo,coin,KMDaddr); HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) { diff --git a/iguana/iguana777.h b/iguana/iguana777.h index a9b88c7b3..8e33594a5 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -90,6 +90,7 @@ struct supernet_address struct pending_trade { UT_hash_handle hh; double basevolume,relvolume,dir; char base[32],rel[32]; }; +#define JUMBLR_DEPOSITPREFIX "deposit " struct jumblr_item { UT_hash_handle hh; diff --git a/iguana/main.c b/iguana/main.c index dbc632b66..304b32ecb 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1452,7 +1452,7 @@ ZERO_ARGS(SuperNET,logout) ZERO_ARGS(SuperNET,activehandle) { - cJSON *retjson; + cJSON *retjson; char BTCaddr[64],KMDaddr[64]; if ( remoteaddr != 0 ) return(clonestr("{\"error\":\"no remote\"}")); retjson = SuperNET_rosettajson(myinfo,myinfo->persistent_priv,0); @@ -1468,6 +1468,15 @@ ZERO_ARGS(SuperNET,activehandle) jaddstr(retjson,"status","unlocked"); jaddnum(retjson,"duration",myinfo->expiration - time(NULL)); } else jaddstr(retjson,"status","locked"); + if ( myinfo->jumblr_passphrase[0] != 0 ) + { + jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + jaddstr(retjson,"BTCdeposit","notyet"); + jaddstr(retjson,"KMDdeposit",KMDaddr); + jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); + jaddstr(retjson,"BTCjumblr","notyet"); + jaddstr(retjson,"KMDjumblr",KMDaddr); + } SuperNET_MYINFOadd(myinfo); return(jprint(retjson,1)); } diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index 43f997c75..e82603144 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -615,6 +615,7 @@ int32_t iguana_staker_sort(struct iguana_info *coin,bits256 *hash2p,uint8_t *ref bits256 mpz_div64(bits256 hash,uint64_t divval); void iguana_walletinitcheck(struct supernet_info *myinfo,struct iguana_info *coin); void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval); +bits256 jumblr_privkey(struct supernet_info *myinfo,char *BTCaddr,char *KMDaddr,char *prefix); // ------------------------------------------------------[ Preparation ]---- // Initialise a gfshare context for producing shares From 44b53704a03f7f413a66186dbddbc8005d6dd4ff Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 00:46:14 +0200 Subject: [PATCH 253/495] Test --- iguana/tests/jumblrstatus | 2 ++ 1 file changed, 2 insertions(+) create mode 100755 iguana/tests/jumblrstatus diff --git a/iguana/tests/jumblrstatus b/iguana/tests/jumblrstatus new file mode 100755 index 000000000..6c1824244 --- /dev/null +++ b/iguana/tests/jumblrstatus @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"jumblr\",\"method\":\"status\"}" From 12fe3efcce70db604ce071a23cfa9516886ceaf3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 00:50:37 +0200 Subject: [PATCH 254/495] Test --- basilisk/jumblr.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index f2a7c59df..1cf3d87ae 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -99,6 +99,13 @@ char *jumblr_zlistreceivedbyaddress(struct supernet_info *myinfo,struct iguana_i return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_listreceivedbyaddress",params)); } +char *jumblr_listreceivedbyaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) +{ + char params[1024]; + sprintf(params,"[\"%s\", 1]",addr); + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"listreceivedbyaddress",params)); +} + char *jumblr_zgetbalance(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char params[1024]; @@ -109,9 +116,9 @@ char *jumblr_zgetbalance(struct supernet_info *myinfo,struct iguana_info *coin,c int64_t jumblr_receivedby(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char *retstr; cJSON *retjson,*item; int32_t i,n; int64_t total = 0; - if ( (retstr= jumblr_zlistreceivedbyaddress(myinfo,coin,addr)) != 0 ) + if ( (retstr= jumblr_listreceivedbyaddress(myinfo,coin,addr)) != 0 ) { - printf("z_listreceivedbyaddress.(%s) -> (%s)\n",addr,retstr); + printf("listreceivedbyaddress.(%s) -> (%s)\n",addr,retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { if ( (n= cJSON_GetArraySize(retjson)) > 0 ) From 3e7aa0bcab15e9c72db43e9e9b0e7b0d41d03584 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 00:54:08 +0200 Subject: [PATCH 255/495] Test --- basilisk/jumblr.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 1cf3d87ae..7b957e07e 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -99,11 +99,11 @@ char *jumblr_zlistreceivedbyaddress(struct supernet_info *myinfo,struct iguana_i return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_listreceivedbyaddress",params)); } -char *jumblr_listreceivedbyaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) +char *jumblr_getreceivedbyaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char params[1024]; sprintf(params,"[\"%s\", 1]",addr); - return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"listreceivedbyaddress",params)); + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getreceivedbyaddress",params)); } char *jumblr_zgetbalance(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) @@ -116,9 +116,9 @@ char *jumblr_zgetbalance(struct supernet_info *myinfo,struct iguana_info *coin,c int64_t jumblr_receivedby(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char *retstr; cJSON *retjson,*item; int32_t i,n; int64_t total = 0; - if ( (retstr= jumblr_listreceivedbyaddress(myinfo,coin,addr)) != 0 ) + if ( (retstr= jumblr_getreceivedbyaddress(myinfo,coin,addr)) != 0 ) { - printf("listreceivedbyaddress.(%s) -> (%s)\n",addr,retstr); + printf("jumblr_getreceivedbyaddress.(%s) -> (%s)\n",addr,retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { if ( (n= cJSON_GetArraySize(retjson)) > 0 ) From 77339abe8be532fb18e4c1b9e88b8431d7a76b70 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 00:58:24 +0200 Subject: [PATCH 256/495] Test --- basilisk/jumblr.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 7b957e07e..ca146101a 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -106,6 +106,13 @@ char *jumblr_getreceivedbyaddress(struct supernet_info *myinfo,struct iguana_inf return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getreceivedbyaddress",params)); } +char *jumblr_importprivkey(struct supernet_info *myinfo,struct iguana_info *coin,char *wifstr) +{ + char params[1024]; + sprintf(params,"[\"%s\", 0]",wifstr); + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"importprivkey",params)); +} + char *jumblr_zgetbalance(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char params[1024]; @@ -115,11 +122,11 @@ char *jumblr_zgetbalance(struct supernet_info *myinfo,struct iguana_info *coin,c int64_t jumblr_receivedby(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { - char *retstr; cJSON *retjson,*item; int32_t i,n; int64_t total = 0; + char *retstr; int64_t total = 0; //cJSON *retjson,*item; int32_t i,n; if ( (retstr= jumblr_getreceivedbyaddress(myinfo,coin,addr)) != 0 ) { printf("jumblr_getreceivedbyaddress.(%s) -> (%s)\n",addr,retstr); - if ( (retjson= cJSON_Parse(retstr)) != 0 ) + /*if ( (retjson= cJSON_Parse(retstr)) != 0 ) { if ( (n= cJSON_GetArraySize(retjson)) > 0 ) { @@ -130,7 +137,8 @@ int64_t jumblr_receivedby(struct supernet_info *myinfo,struct iguana_info *coin, } } free_json(retjson); - } + }*/ + total = atof(retstr) * SATOSHIDEN; free(retstr); } return(total); @@ -335,7 +343,7 @@ r = 0; STRING_ARG(jumblr,setpassphrase,passphrase) { - cJSON *retjson; char KMDaddr[64],BTCaddr[64]; + cJSON *retjson; char KMDaddr[64],BTCaddr[64],wifstr[64]; bits256 privkey; if ( passphrase == 0 || passphrase[0] == 0 || (coin= iguana_coinfind("KMD")) == 0 || coin->FULLNODE >= 0 ) return(clonestr("{\"error\":\"no passphrase or no native komodod\"}")); else @@ -343,10 +351,14 @@ STRING_ARG(jumblr,setpassphrase,passphrase) safecopy(myinfo->jumblr_passphrase,passphrase,sizeof(myinfo->jumblr_passphrase)); retjson = cJSON_CreateObject(); jaddstr(retjson,"result","success"); - jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); + jumblr_importprivkey(myinfo,coin,wifstr); jaddstr(retjson,"BTCdeposit","notyet"); jaddstr(retjson,"KMDdeposit",KMDaddr); - jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); + privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); + bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); + jumblr_importprivkey(myinfo,coin,wifstr); jaddstr(retjson,"BTCjumblr","notyet"); jaddstr(retjson,"KMDjumblr",KMDaddr); return(jprint(retjson,1)); From 6905f3303a81e4dc8ce158b8266bcbd6df7ac8f0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 01:00:41 +0200 Subject: [PATCH 257/495] Test --- basilisk/jumblr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index ca146101a..88a9460bd 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -109,7 +109,7 @@ char *jumblr_getreceivedbyaddress(struct supernet_info *myinfo,struct iguana_inf char *jumblr_importprivkey(struct supernet_info *myinfo,struct iguana_info *coin,char *wifstr) { char params[1024]; - sprintf(params,"[\"%s\", 0]",wifstr); + sprintf(params,"[\"%s\", false]",wifstr); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"importprivkey",params)); } From 9a554e11f19c10c8075f141d56903ef77854b3f9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 01:03:28 +0200 Subject: [PATCH 258/495] Test --- basilisk/jumblr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 88a9460bd..b2ae526e4 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -109,7 +109,7 @@ char *jumblr_getreceivedbyaddress(struct supernet_info *myinfo,struct iguana_inf char *jumblr_importprivkey(struct supernet_info *myinfo,struct iguana_info *coin,char *wifstr) { char params[1024]; - sprintf(params,"[\"%s\", false]",wifstr); + sprintf(params,"[\"%s\", \"\", false]",wifstr); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"importprivkey",params)); } From d73346719c75686a3319b8b13fb19190ca598c75 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 01:06:24 +0200 Subject: [PATCH 259/495] Test --- iguana/tests/walletpassphrase | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/tests/walletpassphrase b/iguana/tests/walletpassphrase index dc5eae04e..94d46e776 100755 --- a/iguana/tests/walletpassphrase +++ b/iguana/tests/walletpassphrase @@ -1,4 +1,4 @@ #!/bin/bash #curl --url "http://127.0.0.1:7778" --data "{\"method\":\"walletpassphrase\",\"params\":[\"test\", 600]}" curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"walletpassphrase\",\"password\":\"test\",\"timeout\":86444}" -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"jumblr\",\"method\":\"setpassphrase\",\"passphrase\":\"test\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"jumblr\",\"method\":\"setpassphrase\",\"passphrase\":\"jumblr test\"}" From fdc0ae60f5ae8b9c854d57875923cd923c88612b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 01:09:46 +0200 Subject: [PATCH 260/495] Test --- iguana/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/main.c b/iguana/main.c index 304b32ecb..fc9ed1609 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -752,9 +752,9 @@ void jumblr_loop(void *ptr) while ( 1 ) { t = (uint32_t)time(NULL); - if ( (coin= iguana_coinfind("KMD")) != 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 && (t % 120) < 60 ) + if ( (coin= iguana_coinfind("KMD")) != 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 && (t % 1200) < 60 ) { - jumblr_iteration(myinfo,coin,(t % 360) / 120,t % 120); + jumblr_iteration(myinfo,coin,(t % 3600) / 1200,t % 1200); } //printf("t.%u %p.%d %s\n",t,coin,coin!=0?coin->FULLNODE:0,myinfo->jumblr_passphrase); sleep(20); From e725ba05186a0bf2e311b95975708e4a2cba734e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 01:21:18 +0200 Subject: [PATCH 261/495] Importprivkey if native --- iguana/iguana_wallet.c | 6 ++++++ includes/iguana_funcs.h | 1 + 2 files changed, 7 insertions(+) diff --git a/iguana/iguana_wallet.c b/iguana/iguana_wallet.c index 11d631d2b..65f5c0d56 100755 --- a/iguana/iguana_wallet.c +++ b/iguana/iguana_wallet.c @@ -1360,6 +1360,12 @@ TWOSTRINGS_AND_INT(bitcoinrpc,walletpassphrase,password,permanentfile,timeout) if ( coin != 0 ) { bitcoin_address(coin->changeaddr,coin->chain->pubtype,myinfo->persistent_pubkey33,33); + if ( coin->FULLNODE < 0 ) + { + char wifstr[64]; + bitcoin_priv2wif(wifstr,myinfo->persistent_priv,coin->chain->wiftype); + jumblr_importprivkey(myinfo,coin,wifstr); + } } //basilisk_unspents_update(myinfo,coin); return(retstr); diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index e82603144..c6a2e3a3f 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -616,6 +616,7 @@ bits256 mpz_div64(bits256 hash,uint64_t divval); void iguana_walletinitcheck(struct supernet_info *myinfo,struct iguana_info *coin); void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval); bits256 jumblr_privkey(struct supernet_info *myinfo,char *BTCaddr,char *KMDaddr,char *prefix); +char *jumblr_importprivkey(struct supernet_info *myinfo,struct iguana_info *coin,char *wifstr); // ------------------------------------------------------[ Preparation ]---- // Initialise a gfshare context for producing shares From ba9a75d779291a53505dde5d8cc51424f5d7ffdc Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 01:46:02 +0200 Subject: [PATCH 262/495] Test --- basilisk/jumblr.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index b2ae526e4..1b59067a4 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -71,6 +71,13 @@ char *jumblr_zgetoperationresult(struct supernet_info *myinfo,struct iguana_info return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_getoperationresult",params)); } +char *jumblr_zgetoperationstatus(struct supernet_info *myinfo,struct iguana_info *coin,char *opid) +{ + char params[1024]; + sprintf(params,"[[\"%s\"]]",opid); + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_getoperationstatus",params)); +} + char *jumblr_sendt_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *taddr,char *zaddr,double amount) { char params[1024]; double fee = (amount-3*JUMBLR_TXFEE) * JUMBLR_FEE; @@ -212,7 +219,7 @@ void jumblr_opidupdate(struct supernet_info *myinfo,struct iguana_info *coin,str char *retstr,*status; cJSON *retjson; if ( ptr->status == 0 ) { - if ( (retstr= jumblr_zgetoperationresult(myinfo,coin,ptr->opid)) != 0 ) + if ( (retstr= jumblr_zgetoperationstatus(myinfo,coin,ptr->opid)) != 0 ) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) { From 390ff2af7be584811f5e86d7ccaf9a113571a215 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 02:02:28 +0200 Subject: [PATCH 263/495] Test --- basilisk/jumblr.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 1b59067a4..f4126d628 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -374,7 +374,7 @@ STRING_ARG(jumblr,setpassphrase,passphrase) ZERO_ARGS(jumblr,status) { - cJSON *retjson; char KMDaddr[64],BTCaddr[64]; struct jumblr_item *ptr,*tmp; int64_t deposited,step_t2z,step_z2z,step_z2t,finished; + cJSON *retjson; char KMDaddr[64],BTCaddr[64]; struct jumblr_item *ptr,*tmp; int64_t received,deposited,jumblred,step_t2z,step_z2z,step_z2t,finished; if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 ) { jumblr_opidsupdate(myinfo,coin); @@ -383,11 +383,13 @@ ZERO_ARGS(jumblr,status) jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); jaddstr(retjson,"BTCdeposit","notyet"); jaddstr(retjson,"KMDdeposit",KMDaddr); - deposited = jumblr_receivedby(myinfo,coin,KMDaddr); + received = jumblr_receivedby(myinfo,coin,KMDaddr); + deposited = SATOSHIDEN * jumblr_balance(myinfo,coin,KMDaddr); jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); jaddstr(retjson,"BTCjumblr","notyet"); jaddstr(retjson,"KMDjumblr",KMDaddr); finished = jumblr_receivedby(myinfo,coin,KMDaddr); + jumblred = SATOSHIDEN * jumblr_balance(myinfo,coin,KMDaddr); HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) { if ( strlen(ptr->src) >= 40 ) @@ -404,7 +406,9 @@ ZERO_ARGS(jumblr,status) jaddnum(retjson,"z_to_z",dstr(step_z2z)); jaddnum(retjson,"z_to_t",dstr(step_z2t)); jaddnum(retjson,"finished",dstr(finished)); - jaddnum(retjson,"pending",dstr(deposited) - dstr(finished)); + jaddnum(retjson,"received",dstr(received)); + jaddnum(retjson,"pending",dstr(received) - dstr(finished)); + jaddnum(retjson,"jumblred",dstr(jumblred)); return(jprint(retjson,1)); } else return(clonestr("{\"error\":\"no passphrase or no native komodod\"}")); } From e3c6793ef1564dab84425fc20ac1d6bf0b1829b1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 02:09:21 +0200 Subject: [PATCH 264/495] Test --- basilisk/jumblr.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index f4126d628..8ab873903 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -102,14 +102,14 @@ char *jumblr_sendz_to_t(struct supernet_info *myinfo,struct iguana_info *coin,ch char *jumblr_zlistreceivedbyaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char params[1024]; - sprintf(params,"[\"%s\", 1]",addr); + sprintf(params,"[\"%s\", 3]",addr); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_listreceivedbyaddress",params)); } char *jumblr_getreceivedbyaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char params[1024]; - sprintf(params,"[\"%s\", 1]",addr); + sprintf(params,"[\"%s\", 3]",addr); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getreceivedbyaddress",params)); } @@ -123,10 +123,17 @@ char *jumblr_importprivkey(struct supernet_info *myinfo,struct iguana_info *coin char *jumblr_zgetbalance(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char params[1024]; - sprintf(params,"[\"%s\", 1]",addr); + sprintf(params,"[\"%s\", 3]",addr); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_getbalance",params)); } +char *jumblr_getbalance(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) +{ + char params[1024]; + sprintf(params,"[\"%s\", 3]",addr); + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getbalance",params)); +} + int64_t jumblr_receivedby(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char *retstr; int64_t total = 0; //cJSON *retjson,*item; int32_t i,n; @@ -153,16 +160,13 @@ int64_t jumblr_receivedby(struct supernet_info *myinfo,struct iguana_info *coin, int64_t jumblr_balance(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { - char *retstr; double val; cJSON *retjson; int64_t balance = 0; + char *retstr; double val; int64_t balance = 0; if ( strlen(addr) < 40 ) { - if ( (retstr= _dex_getbalance(myinfo,coin->symbol,addr)) != 0 ) + if ( (retstr= jumblr_getbalance(myinfo,coin,addr)) != 0 ) { - if ( (retjson= cJSON_Parse(retstr)) != 0 ) - { - balance = jdouble(retjson,"balance") * SATOSHIDEN; - free_json(retjson); - } + if ( (val= atof(retstr)) > SMALLVAL ) + balance = val * SATOSHIDEN; free(retstr); } } From f6960cbb8880eaebbc6a2aa9eac516ed263f0d5e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 02:13:35 +0200 Subject: [PATCH 265/495] Test --- basilisk/jumblr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 8ab873903..b3f0dc3ca 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -131,7 +131,7 @@ char *jumblr_getbalance(struct supernet_info *myinfo,struct iguana_info *coin,ch { char params[1024]; sprintf(params,"[\"%s\", 3]",addr); - return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getbalance",params)); + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getreceivedbyaddress",params)); } int64_t jumblr_receivedby(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) From fcc956f79b6fa9b8de6dac4d649e36c195d442be Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 02:18:40 +0200 Subject: [PATCH 266/495] Test --- basilisk/jumblr.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index b3f0dc3ca..b40be9279 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -127,11 +127,11 @@ char *jumblr_zgetbalance(struct supernet_info *myinfo,struct iguana_info *coin,c return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_getbalance",params)); } -char *jumblr_getbalance(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) +char *jumblr_listunspent(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char params[1024]; - sprintf(params,"[\"%s\", 3]",addr); - return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getreceivedbyaddress",params)); + sprintf(params,"[3, 99999999, \"%s\"]",addr); + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"listunspent",params)); } int64_t jumblr_receivedby(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) @@ -160,13 +160,18 @@ int64_t jumblr_receivedby(struct supernet_info *myinfo,struct iguana_info *coin, int64_t jumblr_balance(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { - char *retstr; double val; int64_t balance = 0; + char *retstr; double val; cJSON *retjson; int32_t i,n; int64_t balance = 0; if ( strlen(addr) < 40 ) { - if ( (retstr= jumblr_getbalance(myinfo,coin,addr)) != 0 ) + if ( (retstr= jumblr_listunspent(myinfo,coin,addr)) != 0 ) { - if ( (val= atof(retstr)) > SMALLVAL ) - balance = val * SATOSHIDEN; + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( (n= cJSON_GetArraySize(retjson)) > 0 ) + for (i=0; ijumblrs,ptr,tmp) { if ( strlen(ptr->src) >= 40 ) From dcc6d75d09a53a9a7def8ac237d85a95a0628ee8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 02:20:24 +0200 Subject: [PATCH 267/495] Test --- basilisk/jumblr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index b40be9279..46a1bf979 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -130,7 +130,7 @@ char *jumblr_zgetbalance(struct supernet_info *myinfo,struct iguana_info *coin,c char *jumblr_listunspent(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char params[1024]; - sprintf(params,"[3, 99999999, \"%s\"]",addr); + sprintf(params,"[3, 99999999, [\"%s\"]]",addr); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"listunspent",params)); } From 2c4081bc578ffba67da7d7ec2ed7ca82249ca63c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 02:21:20 +0200 Subject: [PATCH 268/495] Test --- basilisk/jumblr.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 46a1bf979..4cfd89367 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -102,14 +102,14 @@ char *jumblr_sendz_to_t(struct supernet_info *myinfo,struct iguana_info *coin,ch char *jumblr_zlistreceivedbyaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char params[1024]; - sprintf(params,"[\"%s\", 3]",addr); + sprintf(params,"[\"%s\", 1]",addr); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_listreceivedbyaddress",params)); } char *jumblr_getreceivedbyaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char params[1024]; - sprintf(params,"[\"%s\", 3]",addr); + sprintf(params,"[\"%s\", 1]",addr); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getreceivedbyaddress",params)); } @@ -123,14 +123,14 @@ char *jumblr_importprivkey(struct supernet_info *myinfo,struct iguana_info *coin char *jumblr_zgetbalance(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char params[1024]; - sprintf(params,"[\"%s\", 3]",addr); + sprintf(params,"[\"%s\", 1]",addr); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_getbalance",params)); } char *jumblr_listunspent(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char params[1024]; - sprintf(params,"[3, 99999999, [\"%s\"]]",addr); + sprintf(params,"[1, 99999999, [\"%s\"]]",addr); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"listunspent",params)); } From 9763b00743378783d5311d59cbea75c899218289 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 09:33:27 +0200 Subject: [PATCH 269/495] Test --- basilisk/jumblr.c | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 4cfd89367..d5b26f1f2 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -136,22 +136,9 @@ char *jumblr_listunspent(struct supernet_info *myinfo,struct iguana_info *coin,c int64_t jumblr_receivedby(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { - char *retstr; int64_t total = 0; //cJSON *retjson,*item; int32_t i,n; + char *retstr; int64_t total = 0; if ( (retstr= jumblr_getreceivedbyaddress(myinfo,coin,addr)) != 0 ) { - printf("jumblr_getreceivedbyaddress.(%s) -> (%s)\n",addr,retstr); - /*if ( (retjson= cJSON_Parse(retstr)) != 0 ) - { - if ( (n= cJSON_GetArraySize(retjson)) > 0 ) - { - for (i=0; isrc,from,sizeof(ptr->src)); if ( (amounts= jarray(&n,params,"amounts")) != 0 ) @@ -207,6 +197,7 @@ void jumblr_itemset(struct jumblr_item *ptr,cJSON *item,char *status) for (i=0; i 0 ) { if ( strcmp(addr,JUMBLR_ADDR) == 0 ) @@ -246,6 +237,7 @@ void jumblr_opidsupdate(struct supernet_info *myinfo,struct iguana_info *coin) char *retstr; cJSON *array; int32_t i,n; struct jumblr_item *ptr; if ( (retstr= jumblr_zlistoperationids(myinfo,coin)) != 0 ) { + printf("%s\n",retstr); if ( (array= cJSON_Parse(retstr)) != 0 ) { if ( (n= cJSON_GetArraySize(array)) > 0 ) From bfd38344436dd9a083de756e809508c7ccf5b8d8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 09:53:10 +0200 Subject: [PATCH 270/495] Test --- basilisk/jumblr.c | 1 + 1 file changed, 1 insertion(+) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index d5b26f1f2..6b57481a6 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -221,6 +221,7 @@ void jumblr_opidupdate(struct supernet_info *myinfo,struct iguana_info *coin,str { if ( (retstr= jumblr_zgetoperationstatus(myinfo,coin,ptr->opid)) != 0 ) { + printf("%s\n",retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { if ( (status= jstr(retjson,"status")) != 0 && strcmp(status,"pending") != 0 ) From a19417c6c8c4d39bae4945f0ddf68159925f61b7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 09:55:54 +0200 Subject: [PATCH 271/495] Test --- basilisk/jumblr.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 6b57481a6..6bd80bab7 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -221,10 +221,9 @@ void jumblr_opidupdate(struct supernet_info *myinfo,struct iguana_info *coin,str { if ( (retstr= jumblr_zgetoperationstatus(myinfo,coin,ptr->opid)) != 0 ) { - printf("%s\n",retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { - if ( (status= jstr(retjson,"status")) != 0 && strcmp(status,"pending") != 0 ) + if ( (status= jstr(retjson,"status")) != 0 && strcmp(status,"success") == 0 ) jumblr_itemset(ptr,retjson,status); free_json(retjson); } From 9574d0d83d2a1484d095311875c0727cb9bf66ae Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 09:58:07 +0200 Subject: [PATCH 272/495] Test --- basilisk/jumblr.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 6bd80bab7..45e3d8cdd 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -173,7 +173,7 @@ int64_t jumblr_balance(struct supernet_info *myinfo,struct iguana_info *coin,cha return(balance); } -void jumblr_itemset(struct jumblr_item *ptr,cJSON *item,char *status) +int32_t jumblr_itemset(struct jumblr_item *ptr,cJSON *item,char *status) { cJSON *params,*amounts,*dest; char *from,*addr; int32_t i,n; int64_t amount; /*"params" : { @@ -212,6 +212,7 @@ void jumblr_itemset(struct jumblr_item *ptr,cJSON *item,char *status) } ptr->txfee = jdouble(params,"fee") * SATOSHIDEN; } + return(1); } void jumblr_opidupdate(struct supernet_info *myinfo,struct iguana_info *coin,struct jumblr_item *ptr) @@ -223,8 +224,17 @@ void jumblr_opidupdate(struct supernet_info *myinfo,struct iguana_info *coin,str { if ( (retjson= cJSON_Parse(retstr)) != 0 ) { - if ( (status= jstr(retjson,"status")) != 0 && strcmp(status,"success") == 0 ) - jumblr_itemset(ptr,retjson,status); + if ( (status= jstr(retjson,"status")) != 0 ) + { + if ( strcmp(status,"success") == 0 ) + ptr->status = jumblr_itemset(ptr,retjson,status); + else if ( strcmp(status,"failure") == 0 ) + { + printf("%s failed\n",ptr->opid); + free(jumblr_zgetoperationresult(myinfo,coin,ptr->opid)); + ptr->status = -1; + } + } free_json(retjson); } free(retstr); From 0fc2622ce6f3c20b3ba1be88945d30da6f923dea Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 10:01:03 +0200 Subject: [PATCH 273/495] Test --- basilisk/jumblr.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 45e3d8cdd..835840b6d 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -217,22 +217,28 @@ int32_t jumblr_itemset(struct jumblr_item *ptr,cJSON *item,char *status) void jumblr_opidupdate(struct supernet_info *myinfo,struct iguana_info *coin,struct jumblr_item *ptr) { - char *retstr,*status; cJSON *retjson; + char *retstr,*status; cJSON *retjson,*item; if ( ptr->status == 0 ) { if ( (retstr= jumblr_zgetoperationstatus(myinfo,coin,ptr->opid)) != 0 ) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) { - if ( (status= jstr(retjson,"status")) != 0 ) + if ( cJSON_GetArraySize(retjson) == 1 ) { - if ( strcmp(status,"success") == 0 ) - ptr->status = jumblr_itemset(ptr,retjson,status); - else if ( strcmp(status,"failure") == 0 ) + item = jitem(retjson,0); + if ( (status= jstr(item,"status")) != 0 ) { - printf("%s failed\n",ptr->opid); - free(jumblr_zgetoperationresult(myinfo,coin,ptr->opid)); - ptr->status = -1; + if ( strcmp(status,"success") == 0 ) + { + ptr->status = jumblr_itemset(ptr,item,status); + } + else if ( strcmp(status,"failure") == 0 ) + { + printf("%s failed\n",ptr->opid); + free(jumblr_zgetoperationresult(myinfo,coin,ptr->opid)); + ptr->status = -1; + } } } free_json(retjson); From 65e2efa1bb3bcfce67e2ea723d99771851633b67 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 10:03:49 +0200 Subject: [PATCH 274/495] Test --- iguana/iguana777.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 8e33594a5..aa85d607c 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -96,7 +96,7 @@ struct jumblr_item UT_hash_handle hh; int64_t amount,fee,txfee; uint32_t spent; - char opid[65],src[65],dest[65],status; + char opid[66],src[66],dest[66],status; }; struct liquidity_info From c7a42536e55b144858cc7bb3733198a4912a0494 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 10:05:51 +0200 Subject: [PATCH 275/495] Test --- iguana/iguana777.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/iguana777.h b/iguana/iguana777.h index aa85d607c..89d25f734 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -95,8 +95,8 @@ struct jumblr_item { UT_hash_handle hh; int64_t amount,fee,txfee; - uint32_t spent; - char opid[66],src[66],dest[66],status; + uint32_t spent,pad; + char opid[64],src[128],dest[128],status; }; struct liquidity_info From b91196347b40e87aadaa28e31c0b98e43bacecce Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 10:08:29 +0200 Subject: [PATCH 276/495] Test --- basilisk/jumblr.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 835840b6d..bb28fa0a4 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -27,7 +27,7 @@ z_sendmany "fromaddress" [{"address":... ,"amount":..., "memo":""},...] ( minconf ) ( fee ) */ -#define JUMBLR_INCR 99 +#define JUMBLR_INCR 99.5 #define JUMBLR_TXFEE 0.01 #define JUMBLR_ADDR "RGhxXpXSSBTBm9EvNsXnTQczthMCxHX91t" #define JUMBLR_BTCADDR "18RmTJe9qMech8siuhYfMtHo8RtcN1obC6" @@ -159,8 +159,8 @@ int64_t jumblr_balance(struct supernet_info *myinfo,struct iguana_info *coin,cha balance += SATOSHIDEN * jdouble(jitem(retjson,i),"amount"); free_json(retjson); } - if ( balance == 0 ) - printf("listunspent.(%s)\n",addr); + //if ( balance == 0 ) + // printf("listunspent.(%s)\n",addr); free(retstr); } } @@ -189,7 +189,7 @@ int32_t jumblr_itemset(struct jumblr_item *ptr,cJSON *item,char *status) }*/ if ( (params= jobj(item,"params")) != 0 ) { - printf("params.(%s)\n",jprint(params,0)); + //printf("params.(%s)\n",jprint(params,0)); if ( (from= jstr(params,"fromaddress")) != 0 ) safecopy(ptr->src,from,sizeof(ptr->src)); if ( (amounts= jarray(&n,params,"amounts")) != 0 ) @@ -227,6 +227,7 @@ void jumblr_opidupdate(struct supernet_info *myinfo,struct iguana_info *coin,str if ( cJSON_GetArraySize(retjson) == 1 ) { item = jitem(retjson,0); + printf("%s\n",jprint(item,0)); if ( (status= jstr(item,"status")) != 0 ) { if ( strcmp(status,"success") == 0 ) From ed6b926d5649950987a21d83a10a77f9b1bae552 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 10:12:32 +0200 Subject: [PATCH 277/495] Test --- basilisk/jumblr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index bb28fa0a4..ccb90f81d 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -227,14 +227,14 @@ void jumblr_opidupdate(struct supernet_info *myinfo,struct iguana_info *coin,str if ( cJSON_GetArraySize(retjson) == 1 ) { item = jitem(retjson,0); - printf("%s\n",jprint(item,0)); + //printf("%s\n",jprint(item,0)); if ( (status= jstr(item,"status")) != 0 ) { if ( strcmp(status,"success") == 0 ) { ptr->status = jumblr_itemset(ptr,item,status); } - else if ( strcmp(status,"failure") == 0 ) + else if ( strcmp(status,"failed") == 0 ) { printf("%s failed\n",ptr->opid); free(jumblr_zgetoperationresult(myinfo,coin,ptr->opid)); From 80d74e755b893d2898ad6465dbd39537af54e373 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 10:21:28 +0200 Subject: [PATCH 278/495] Test --- basilisk/jumblr.c | 8 +++++--- iguana/main.c | 8 ++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index ccb90f81d..13ab787e9 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -322,6 +322,7 @@ r = 0; { if ( strlen(ptr->src) < 40 ) { + printf("%s -> %s check for z to z\n",ptr->src,ptr->dest); if ( (r & 7) == 0 && ptr->spent == 0 && (total= jumblr_balance(myinfo,coin,ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) { if ( (zaddr= jumblr_zgetnewaddress(myinfo,coin)) != 0 ) @@ -345,6 +346,7 @@ r = 0; { if ( strlen(ptr->src) >= 40 ) { + printf("%s -> %s check for z to t\n",ptr->src,ptr->dest); if ( (r & 7) == 0 && ptr->spent == 0 && (total= jumblr_balance(myinfo,coin,ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) { priv0 = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); @@ -423,10 +425,10 @@ ZERO_ARGS(jumblr,status) jaddnum(retjson,"t_to_z",dstr(step_t2z)); jaddnum(retjson,"z_to_z",dstr(step_z2z)); jaddnum(retjson,"z_to_t",dstr(step_z2t)); - jaddnum(retjson,"finished",dstr(finished)); - jaddnum(retjson,"received",dstr(received)); - jaddnum(retjson,"pending",dstr(received) - dstr(finished)); + jaddnum(retjson,"pending",dstr(deposited) + dstr(step_t2z) + dstr(step_z2z) + dstr(step_z2t)); jaddnum(retjson,"jumblred",dstr(jumblred)); + jaddnum(retjson,"received",dstr(received)); + jaddnum(retjson,"finished",dstr(finished)); return(jprint(retjson,1)); } else return(clonestr("{\"error\":\"no passphrase or no native komodod\"}")); } diff --git a/iguana/main.c b/iguana/main.c index fc9ed1609..86742ee04 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -747,17 +747,17 @@ void iguana_urlinit(struct supernet_info *myinfo,int32_t ismainnet,int32_t usess void jumblr_loop(void *ptr) { - struct iguana_info *coin; uint32_t t; struct supernet_info *myinfo = ptr; + struct iguana_info *coin; uint32_t t; struct supernet_info *myinfo = ptr; int32_t mult = 1; printf("JUMBLR loop\n"); while ( 1 ) { t = (uint32_t)time(NULL); - if ( (coin= iguana_coinfind("KMD")) != 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 && (t % 1200) < 60 ) + if ( (coin= iguana_coinfind("KMD")) != 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 && (t % (120 * mult)) < 60 ) { - jumblr_iteration(myinfo,coin,(t % 3600) / 1200,t % 1200); + jumblr_iteration(myinfo,coin,(t % (360 * mult)) / (120 * mult),t % (120 * mult)); } //printf("t.%u %p.%d %s\n",t,coin,coin!=0?coin->FULLNODE:0,myinfo->jumblr_passphrase); - sleep(20); + sleep(40); } } From bb745350f86419b6c4bc8f58c19043b6b3246f52 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 10:22:30 +0200 Subject: [PATCH 279/495] Test --- basilisk/jumblr.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 13ab787e9..f1a84ff43 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -159,8 +159,8 @@ int64_t jumblr_balance(struct supernet_info *myinfo,struct iguana_info *coin,cha balance += SATOSHIDEN * jdouble(jitem(retjson,i),"amount"); free_json(retjson); } - //if ( balance == 0 ) - // printf("listunspent.(%s)\n",addr); + if ( balance == 0 ) + printf("listunspent.(%s)\n",addr); free(retstr); } } @@ -197,7 +197,7 @@ int32_t jumblr_itemset(struct jumblr_item *ptr,cJSON *item,char *status) for (i=0; i 0 ) { if ( strcmp(addr,JUMBLR_ADDR) == 0 ) @@ -254,7 +254,6 @@ void jumblr_opidsupdate(struct supernet_info *myinfo,struct iguana_info *coin) char *retstr; cJSON *array; int32_t i,n; struct jumblr_item *ptr; if ( (retstr= jumblr_zlistoperationids(myinfo,coin)) != 0 ) { - printf("%s\n",retstr); if ( (array= cJSON_Parse(retstr)) != 0 ) { if ( (n= cJSON_GetArraySize(array)) > 0 ) From cd433621215d2be1de5c9536d2fe1e83d0deb25e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 10:30:47 +0200 Subject: [PATCH 280/495] Test --- basilisk/jumblr.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index f1a84ff43..560fa8552 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -393,12 +393,12 @@ STRING_ARG(jumblr,setpassphrase,passphrase) ZERO_ARGS(jumblr,status) { - cJSON *retjson; char KMDaddr[64],BTCaddr[64]; struct jumblr_item *ptr,*tmp; int64_t received,deposited,jumblred,step_t2z,step_z2z,step_z2t,finished; + cJSON *retjson; char KMDaddr[64],BTCaddr[64]; struct jumblr_item *ptr,*tmp; int64_t pending,received,deposited,jumblred,step_t2z,step_z2z,step_z2t,finished; if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 ) { jumblr_opidsupdate(myinfo,coin); retjson = cJSON_CreateObject(); - step_t2z = step_z2z = step_z2t = deposited = finished = 0; + step_t2z = step_z2z = step_z2t = deposited = finished = pending = 0; jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); jaddstr(retjson,"BTCdeposit","notyet"); jaddstr(retjson,"KMDdeposit",KMDaddr); @@ -416,15 +416,16 @@ ZERO_ARGS(jumblr,status) if ( strlen(ptr->dest) >= 40 ) step_z2z += ptr->amount; else step_z2t += ptr->amount; - } - else step_t2z += ptr->amount; + } else step_t2z += ptr->amount; + if ( ptr->spent == 0 ) + pending += ptr->amount; } jaddstr(retjson,"result","success"); jaddnum(retjson,"deposited",dstr(deposited)); jaddnum(retjson,"t_to_z",dstr(step_t2z)); jaddnum(retjson,"z_to_z",dstr(step_z2z)); jaddnum(retjson,"z_to_t",dstr(step_z2t)); - jaddnum(retjson,"pending",dstr(deposited) + dstr(step_t2z) + dstr(step_z2z) + dstr(step_z2t)); + jaddnum(retjson,"pending",dstr(pending)); jaddnum(retjson,"jumblred",dstr(jumblred)); jaddnum(retjson,"received",dstr(received)); jaddnum(retjson,"finished",dstr(finished)); From cad9d1b0d638f0f06ecb42fe77e0694601dd4115 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 10:53:31 +0200 Subject: [PATCH 281/495] Test --- basilisk/jumblr.c | 50 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 7 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 560fa8552..05151401f 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -33,6 +33,15 @@ #define JUMBLR_BTCADDR "18RmTJe9qMech8siuhYfMtHo8RtcN1obC6" #define JUMBLR_FEE 0.001 +int32_t jumblr_addresstype(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) +{ + if ( addr[0] == 'z' && addr[1] == 'c' && strlen(addr) >= 40 ) + return('z'); + else if ( strlen(addr) < 40 ) + return('t'); + else return(-1); +} + struct jumblr_item *jumblr_opidfind(struct supernet_info *myinfo,char *opid) { struct jumblr_item *ptr; @@ -81,6 +90,8 @@ char *jumblr_zgetoperationstatus(struct supernet_info *myinfo,struct iguana_info char *jumblr_sendt_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *taddr,char *zaddr,double amount) { char params[1024]; double fee = (amount-3*JUMBLR_TXFEE) * JUMBLR_FEE; + if ( jumblr_addresstype(myinfo,coin,zaddr) != 'z' || jumblr_addresstype(myinfo,coin,taddr) != 't' ) + return(clonestr("{\"error\":\"illegal address in t to z\"}")); sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } @@ -88,6 +99,8 @@ char *jumblr_sendt_to_z(struct supernet_info *myinfo,struct iguana_info *coin,ch char *jumblr_sendz_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *zaddrS,char *zaddrD,double amount) { char params[1024]; double fee = (amount-2*JUMBLR_TXFEE) * JUMBLR_FEE; + if ( jumblr_addresstype(myinfo,coin,zaddrS) != 'z' || jumblr_addresstype(myinfo,coin,zaddrD) != 'z' ) + return(clonestr("{\"error\":\"illegal address in z to z\"}")); sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } @@ -95,6 +108,8 @@ char *jumblr_sendz_to_z(struct supernet_info *myinfo,struct iguana_info *coin,ch char *jumblr_sendz_to_t(struct supernet_info *myinfo,struct iguana_info *coin,char *zaddr,char *taddr,double amount) { char params[1024]; double fee = (amount-JUMBLR_TXFEE) * JUMBLR_FEE; + if ( jumblr_addresstype(myinfo,coin,zaddr) != 'z' || jumblr_addresstype(myinfo,coin,taddr) != 't' ) + return(clonestr("{\"error\":\"illegal address in z to t\"}")); sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } @@ -148,7 +163,7 @@ int64_t jumblr_receivedby(struct supernet_info *myinfo,struct iguana_info *coin, int64_t jumblr_balance(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char *retstr; double val; cJSON *retjson; int32_t i,n; int64_t balance = 0; - if ( strlen(addr) < 40 ) + if ( jumblr_addresstype(myinfo,coin,addr) == 't' ) { if ( (retstr= jumblr_listunspent(myinfo,coin,addr)) != 0 ) { @@ -259,8 +274,14 @@ void jumblr_opidsupdate(struct supernet_info *myinfo,struct iguana_info *coin) if ( (n= cJSON_GetArraySize(array)) > 0 ) { for (i=0; istatus == 0 ) - jumblr_opidupdate(myinfo,coin,ptr); + { + if ( (ptr= jumblr_opidadd(myinfo,coin,jstri(array,i))) != 0 ) + { + if ( ptr->status == 0 ) + jumblr_opidupdate(myinfo,coin,ptr); + printf("%d: %s -> %s %.8f\n",ptr->status,ptr->src,ptr->dest,dstr(ptr->amount)); + } + } } free_json(array); } @@ -279,6 +300,22 @@ bits256 jumblr_privkey(struct supernet_info *myinfo,char *BTCaddr,char *KMDaddr, return(privkey); } +void jumblr_prune(struct supernet_info *myinfo,struct iguana_info *coin,struct jumblr_item *ptr) +{ + struct jumblr_item *tmp; char oldsrc[128]; + strcpy(oldsrc,ptr->src); + free(jumblr_zgetoperationresult(myinfo,coin,ptr->opid)); + HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) + { + if ( strcmp(oldsrc,ptr->dest) == 0 ) + { + printf("%s (%s -> %s) matched oldsrc\n",ptr->opid,ptr->src,ptr->dest); + free(jumblr_zgetoperationresult(myinfo,coin,ptr->opid)); + strcpy(oldsrc,ptr->src); + } + } +} + void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval) { char BTCaddr[64],KMDaddr[64],*zaddr,*retstr; bits256 priv0; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r; @@ -319,9 +356,8 @@ r = 0; jumblr_opidsupdate(myinfo,coin); HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) { - if ( strlen(ptr->src) < 40 ) + if ( jumblr_addresstype(myinfo,coin,ptr->src) == 't' && jumblr_addresstype(myinfo,coin,ptr->dest) == 'z' ) { - printf("%s -> %s check for z to z\n",ptr->src,ptr->dest); if ( (r & 7) == 0 && ptr->spent == 0 && (total= jumblr_balance(myinfo,coin,ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) { if ( (zaddr= jumblr_zgetnewaddress(myinfo,coin)) != 0 ) @@ -343,9 +379,8 @@ r = 0; jumblr_opidsupdate(myinfo,coin); HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) { - if ( strlen(ptr->src) >= 40 ) + if ( jumblr_addresstype(myinfo,coin,ptr->src) == 'z' && jumblr_addresstype(myinfo,coin,ptr->dest) == 'z' ) { - printf("%s -> %s check for z to t\n",ptr->src,ptr->dest); if ( (r & 7) == 0 && ptr->spent == 0 && (total= jumblr_balance(myinfo,coin,ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) { priv0 = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); @@ -353,6 +388,7 @@ r = 0; { printf("sendz_to_t.(%s)\n",retstr); free(retstr); + jumblr_prune(myinfo,coin,ptr); } ptr->spent = (uint32_t)time(NULL); break; From 18100ada9ed7f00997533bbcd9f6cf169d223abe Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 11:05:23 +0200 Subject: [PATCH 282/495] Test --- basilisk/jumblr.c | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 05151401f..f66fa2a0e 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -27,7 +27,7 @@ z_sendmany "fromaddress" [{"address":... ,"amount":..., "memo":""},...] ( minconf ) ( fee ) */ -#define JUMBLR_INCR 99.5 +#define JUMBLR_INCR 99.65 #define JUMBLR_TXFEE 0.01 #define JUMBLR_ADDR "RGhxXpXSSBTBm9EvNsXnTQczthMCxHX91t" #define JUMBLR_BTCADDR "18RmTJe9qMech8siuhYfMtHo8RtcN1obC6" @@ -264,6 +264,22 @@ void jumblr_opidupdate(struct supernet_info *myinfo,struct iguana_info *coin,str } } +void jumblr_prune(struct supernet_info *myinfo,struct iguana_info *coin,struct jumblr_item *ptr) +{ + struct jumblr_item *tmp; char oldsrc[128]; + strcpy(oldsrc,ptr->src); + free(jumblr_zgetoperationresult(myinfo,coin,ptr->opid)); + HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) + { + if ( strcmp(oldsrc,ptr->dest) == 0 ) + { + printf("prune %s (%s -> %s) matched oldsrc\n",ptr->opid,ptr->src,ptr->dest); + free(jumblr_zgetoperationresult(myinfo,coin,ptr->opid)); + strcpy(oldsrc,ptr->src); + } + } +} + void jumblr_opidsupdate(struct supernet_info *myinfo,struct iguana_info *coin) { char *retstr; cJSON *array; int32_t i,n; struct jumblr_item *ptr; @@ -280,6 +296,8 @@ void jumblr_opidsupdate(struct supernet_info *myinfo,struct iguana_info *coin) if ( ptr->status == 0 ) jumblr_opidupdate(myinfo,coin,ptr); printf("%d: %s -> %s %.8f\n",ptr->status,ptr->src,ptr->dest,dstr(ptr->amount)); + if ( jumblr_addresstype(myinfo,coin,ptr->src) == 'z' && strcmp(ptr->dest,JUMBLR_ADDR) == 0 ) + jumblr_prune(myinfo,coin,ptr); } } } @@ -300,22 +318,6 @@ bits256 jumblr_privkey(struct supernet_info *myinfo,char *BTCaddr,char *KMDaddr, return(privkey); } -void jumblr_prune(struct supernet_info *myinfo,struct iguana_info *coin,struct jumblr_item *ptr) -{ - struct jumblr_item *tmp; char oldsrc[128]; - strcpy(oldsrc,ptr->src); - free(jumblr_zgetoperationresult(myinfo,coin,ptr->opid)); - HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) - { - if ( strcmp(oldsrc,ptr->dest) == 0 ) - { - printf("%s (%s -> %s) matched oldsrc\n",ptr->opid,ptr->src,ptr->dest); - free(jumblr_zgetoperationresult(myinfo,coin,ptr->opid)); - strcpy(oldsrc,ptr->src); - } - } -} - void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval) { char BTCaddr[64],KMDaddr[64],*zaddr,*retstr; bits256 priv0; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r; @@ -388,7 +390,6 @@ r = 0; { printf("sendz_to_t.(%s)\n",retstr); free(retstr); - jumblr_prune(myinfo,coin,ptr); } ptr->spent = (uint32_t)time(NULL); break; From 66f24aea41bc5f8f94167c8f918acd3517e04c25 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 11:07:10 +0200 Subject: [PATCH 283/495] Test --- basilisk/jumblr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index f66fa2a0e..87ee3ed71 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -296,7 +296,7 @@ void jumblr_opidsupdate(struct supernet_info *myinfo,struct iguana_info *coin) if ( ptr->status == 0 ) jumblr_opidupdate(myinfo,coin,ptr); printf("%d: %s -> %s %.8f\n",ptr->status,ptr->src,ptr->dest,dstr(ptr->amount)); - if ( jumblr_addresstype(myinfo,coin,ptr->src) == 'z' && strcmp(ptr->dest,JUMBLR_ADDR) == 0 ) + if ( jumblr_addresstype(myinfo,coin,ptr->src) == 'z' && jumblr_addresstype(myinfo,coin,ptr->dest) == 't' ) jumblr_prune(myinfo,coin,ptr); } } From 8289832e696b3cef5b198dad11dc3a5c26cfbcb2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 11:36:53 +0200 Subject: [PATCH 284/495] Test --- basilisk/jumblr.c | 36 ++++++++++++++++++++---------------- iguana/main.c | 2 +- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 87ee3ed71..739f249c6 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -266,16 +266,23 @@ void jumblr_opidupdate(struct supernet_info *myinfo,struct iguana_info *coin,str void jumblr_prune(struct supernet_info *myinfo,struct iguana_info *coin,struct jumblr_item *ptr) { - struct jumblr_item *tmp; char oldsrc[128]; + struct jumblr_item *tmp; char oldsrc[128]; int32_t flag = 1; + printf("PRUNE %s\n",ptr->opid); strcpy(oldsrc,ptr->src); free(jumblr_zgetoperationresult(myinfo,coin,ptr->opid)); - HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) + while ( flag != 0 ) { - if ( strcmp(oldsrc,ptr->dest) == 0 ) + flag = 0; + HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) { - printf("prune %s (%s -> %s) matched oldsrc\n",ptr->opid,ptr->src,ptr->dest); - free(jumblr_zgetoperationresult(myinfo,coin,ptr->opid)); - strcpy(oldsrc,ptr->src); + if ( strcmp(oldsrc,ptr->dest) == 0 ) + { + printf("prune %s (%s -> %s) matched oldsrc\n",ptr->opid,ptr->src,ptr->dest); + free(jumblr_zgetoperationresult(myinfo,coin,ptr->opid)); + strcpy(oldsrc,ptr->src); + flag = 1; + break; + } } } } @@ -335,7 +342,7 @@ r = 0; priv0 = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); if ( (total= jumblr_balance(myinfo,coin,KMDaddr)) >= (JUMBLR_INCR + 3*(fee+JUMBLR_TXFEE))*SATOSHIDEN ) { - if ( (r & 7) == 0 ) + if ( (r & 1) == 0 ) { if ( (zaddr= jumblr_zgetnewaddress(myinfo,coin)) != 0 ) { @@ -352,7 +359,7 @@ r = 0; free(zaddr); } else printf("no zaddr from jumblr_zgetnewaddress\n"); } - } else printf("%s total %.8f vs %.8f\n",KMDaddr,dstr(total),(JUMBLR_INCR + 3*(fee+JUMBLR_TXFEE))); + } //else printf("%s total %.8f vs %.8f\n",KMDaddr,dstr(total),(JUMBLR_INCR + 3*(fee+JUMBLR_TXFEE))); break; case 1: // z -> z jumblr_opidsupdate(myinfo,coin); @@ -360,7 +367,7 @@ r = 0; { if ( jumblr_addresstype(myinfo,coin,ptr->src) == 't' && jumblr_addresstype(myinfo,coin,ptr->dest) == 'z' ) { - if ( (r & 7) == 0 && ptr->spent == 0 && (total= jumblr_balance(myinfo,coin,ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) + if ( (r & 1) == 0 && ptr->spent == 0 && (total= jumblr_balance(myinfo,coin,ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) { if ( (zaddr= jumblr_zgetnewaddress(myinfo,coin)) != 0 ) { @@ -383,7 +390,7 @@ r = 0; { if ( jumblr_addresstype(myinfo,coin,ptr->src) == 'z' && jumblr_addresstype(myinfo,coin,ptr->dest) == 'z' ) { - if ( (r & 7) == 0 && ptr->spent == 0 && (total= jumblr_balance(myinfo,coin,ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) + if ( (r & 1) == 0 && ptr->spent == 0 && (total= jumblr_balance(myinfo,coin,ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) { priv0 = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); if ( (retstr= jumblr_sendz_to_t(myinfo,coin,ptr->dest,KMDaddr,dstr(total))) != 0 ) @@ -430,12 +437,12 @@ STRING_ARG(jumblr,setpassphrase,passphrase) ZERO_ARGS(jumblr,status) { - cJSON *retjson; char KMDaddr[64],BTCaddr[64]; struct jumblr_item *ptr,*tmp; int64_t pending,received,deposited,jumblred,step_t2z,step_z2z,step_z2t,finished; + cJSON *retjson; char KMDaddr[64],BTCaddr[64]; struct jumblr_item *ptr,*tmp; int64_t received,deposited,jumblred,step_t2z,step_z2z,step_z2t,finished; if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 ) { jumblr_opidsupdate(myinfo,coin); retjson = cJSON_CreateObject(); - step_t2z = step_z2z = step_z2t = deposited = finished = pending = 0; + step_t2z = step_z2z = step_z2t = deposited = finished = 0; jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); jaddstr(retjson,"BTCdeposit","notyet"); jaddstr(retjson,"KMDdeposit",KMDaddr); @@ -454,15 +461,12 @@ ZERO_ARGS(jumblr,status) step_z2z += ptr->amount; else step_z2t += ptr->amount; } else step_t2z += ptr->amount; - if ( ptr->spent == 0 ) - pending += ptr->amount; } jaddstr(retjson,"result","success"); - jaddnum(retjson,"deposited",dstr(deposited)); + jaddnum(retjson,"deposits",dstr(deposited)); jaddnum(retjson,"t_to_z",dstr(step_t2z)); jaddnum(retjson,"z_to_z",dstr(step_z2z)); jaddnum(retjson,"z_to_t",dstr(step_z2t)); - jaddnum(retjson,"pending",dstr(pending)); jaddnum(retjson,"jumblred",dstr(jumblred)); jaddnum(retjson,"received",dstr(received)); jaddnum(retjson,"finished",dstr(finished)); diff --git a/iguana/main.c b/iguana/main.c index 86742ee04..55ca8824c 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -757,7 +757,7 @@ void jumblr_loop(void *ptr) jumblr_iteration(myinfo,coin,(t % (360 * mult)) / (120 * mult),t % (120 * mult)); } //printf("t.%u %p.%d %s\n",t,coin,coin!=0?coin->FULLNODE:0,myinfo->jumblr_passphrase); - sleep(40); + sleep(55); } } From e04f8891e47407b33ed6cb72139c0cefc1c48927 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 11:37:16 +0200 Subject: [PATCH 285/495] Test --- basilisk/jumblr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 739f249c6..ab01e1637 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -174,8 +174,8 @@ int64_t jumblr_balance(struct supernet_info *myinfo,struct iguana_info *coin,cha balance += SATOSHIDEN * jdouble(jitem(retjson,i),"amount"); free_json(retjson); } - if ( balance == 0 ) - printf("listunspent.(%s)\n",addr); + //if ( balance == 0 ) + // printf("listunspent.(%s)\n",addr); free(retstr); } } From 79a4714c7e89fe35826a7995d4d267c6c9e21ed7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 11:55:54 +0200 Subject: [PATCH 286/495] Test --- basilisk/jumblr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index ab01e1637..f22d14e7b 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -302,7 +302,7 @@ void jumblr_opidsupdate(struct supernet_info *myinfo,struct iguana_info *coin) { if ( ptr->status == 0 ) jumblr_opidupdate(myinfo,coin,ptr); - printf("%d: %s -> %s %.8f\n",ptr->status,ptr->src,ptr->dest,dstr(ptr->amount)); + //printf("%d: %s -> %s %.8f\n",ptr->status,ptr->src,ptr->dest,dstr(ptr->amount)); if ( jumblr_addresstype(myinfo,coin,ptr->src) == 'z' && jumblr_addresstype(myinfo,coin,ptr->dest) == 't' ) jumblr_prune(myinfo,coin,ptr); } From 6b26261d96758d5f91bf6d0ff4232db0381a22c7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 11:56:13 +0200 Subject: [PATCH 287/495] Test --- iguana/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/main.c b/iguana/main.c index 55ca8824c..986764423 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -747,7 +747,7 @@ void iguana_urlinit(struct supernet_info *myinfo,int32_t ismainnet,int32_t usess void jumblr_loop(void *ptr) { - struct iguana_info *coin; uint32_t t; struct supernet_info *myinfo = ptr; int32_t mult = 1; + struct iguana_info *coin; uint32_t t; struct supernet_info *myinfo = ptr; int32_t mult = 10; printf("JUMBLR loop\n"); while ( 1 ) { From 3ca5e80423fda8db245cf573500ff09ef941a1d5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 11:57:29 +0200 Subject: [PATCH 288/495] Test --- basilisk/jumblr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index f22d14e7b..9e2568f75 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -332,10 +332,10 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 // if BTC has arrived in destination address, invoke DEX -> BTC fee = JUMBLR_INCR * JUMBLR_FEE; OS_randombytes(&r,sizeof(r)); -r = 0; +//r = 0; if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) { - printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); + //printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); switch ( selector ) { case 0: // public -> z, need to importprivkey From fa25754e68f75a616a9c36a448e40941b1509b63 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 12:21:38 +0200 Subject: [PATCH 289/495] Test --- basilisk/jumblr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 9e2568f75..cd47d8814 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -335,7 +335,7 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 //r = 0; if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) { - //printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); + printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); switch ( selector ) { case 0: // public -> z, need to importprivkey @@ -428,7 +428,7 @@ STRING_ARG(jumblr,setpassphrase,passphrase) jaddstr(retjson,"KMDdeposit",KMDaddr); privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); - jumblr_importprivkey(myinfo,coin,wifstr); + // jumblr_importprivkey(myinfo,coin,wifstr); dont mix jumbled funds with normal! jaddstr(retjson,"BTCjumblr","notyet"); jaddstr(retjson,"KMDjumblr",KMDaddr); return(jprint(retjson,1)); From 648e3935817f683b3ffd4d563372411d9318ecee Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 12:53:09 +0200 Subject: [PATCH 290/495] Test --- basilisk/jumblr.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index cd47d8814..f61e07090 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -335,7 +335,7 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 //r = 0; if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) { - printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); + //printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); switch ( selector ) { case 0: // public -> z, need to importprivkey @@ -437,12 +437,12 @@ STRING_ARG(jumblr,setpassphrase,passphrase) ZERO_ARGS(jumblr,status) { - cJSON *retjson; char KMDaddr[64],BTCaddr[64]; struct jumblr_item *ptr,*tmp; int64_t received,deposited,jumblred,step_t2z,step_z2z,step_z2t,finished; + cJSON *retjson; char KMDaddr[64],BTCaddr[64]; struct jumblr_item *ptr,*tmp; int64_t received,deposited,jumblred,step_t2z,step_z2z,step_z2t,finished,pending,maxval,minval; if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 ) { jumblr_opidsupdate(myinfo,coin); retjson = cJSON_CreateObject(); - step_t2z = step_z2z = step_z2t = deposited = finished = 0; + step_t2z = step_z2z = step_z2t = deposited = finished = pending = 0; jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); jaddstr(retjson,"BTCdeposit","notyet"); jaddstr(retjson,"KMDdeposit",KMDaddr); @@ -467,7 +467,12 @@ ZERO_ARGS(jumblr,status) jaddnum(retjson,"t_to_z",dstr(step_t2z)); jaddnum(retjson,"z_to_z",dstr(step_z2z)); jaddnum(retjson,"z_to_t",dstr(step_z2t)); - jaddnum(retjson,"jumblred",dstr(jumblred)); + maxval = MAX(step_t2z,MAX(step_z2z,step_z2t)); + minval = MIN(step_t2z,MIN(step_z2z,step_z2t)); + if ( maxval > minval ) + pending = (maxval - minval); + jaddnum(retjson,"pending",dstr(pending)); + jaddnum(retjson,"jumbled",dstr(jumblred)); jaddnum(retjson,"received",dstr(received)); jaddnum(retjson,"finished",dstr(finished)); return(jprint(retjson,1)); From 4df6716b14c2c2c30d49fe7273b3a7adea9b1557 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 13:19:45 +0200 Subject: [PATCH 291/495] Test --- basilisk/jumblr.c | 68 ++++++++++++++++++++++++++++++++++++++++------- iguana/main.c | 2 +- 2 files changed, 59 insertions(+), 11 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index f61e07090..c7679b234 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -63,6 +63,34 @@ struct jumblr_item *jumblr_opidadd(struct supernet_info *myinfo,struct iguana_in return(ptr); } +char *jumblr_validateaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) +{ + char params[1024]; + if ( coin->FULLNODE < 0 ) + { + sprintf(params,"[\"%s\"]",addr); + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"validateaddress",params)); + } else return(_dex_validateaddress(myinfo,coin->symbol,addr)); +} + +int32_t jumblr_ismine(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) +{ + char params[1024],*retstr; cJSON *retjson,*obj; int32_t retval = -1; + sprintf(params,"[\"%s\"]",addr); + if ( (retstr= jumblr_validateaddress(myinfo,coin,addr)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( (obj= jobj(retjson,"ismine")) != 0 && is_cJSON_True(obj) != 0 ) + retval = 1; + else retval = 0; + free_json(retjson); + } + free(retstr); + } + return(retval); +} + char *jumblr_zgetnewaddress(struct supernet_info *myinfo,struct iguana_info *coin) { return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_getnewaddress","")); @@ -165,17 +193,27 @@ int64_t jumblr_balance(struct supernet_info *myinfo,struct iguana_info *coin,cha char *retstr; double val; cJSON *retjson; int32_t i,n; int64_t balance = 0; if ( jumblr_addresstype(myinfo,coin,addr) == 't' ) { - if ( (retstr= jumblr_listunspent(myinfo,coin,addr)) != 0 ) + if ( jumblr_ismine(myinfo,coin,addr) > 0 ) + { + if ( (retstr= jumblr_listunspent(myinfo,coin,addr)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( (n= cJSON_GetArraySize(retjson)) > 0 ) + for (i=0; isymbol,addr)) != 0 ) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) { - if ( (n= cJSON_GetArraySize(retjson)) > 0 ) - for (i=0; i minbtc ) + { + + } +} + void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval) { - char BTCaddr[64],KMDaddr[64],*zaddr,*retstr; bits256 priv0; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r; + char BTCaddr[64],KMDaddr[64],*zaddr,*retstr; bits256 privkey; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r; // if BTC has arrived in deposit address, invoke DEX -> KMD // if BTC has arrived in destination address, invoke DEX -> BTC + privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + jumblr_DEXcheck(myinfo,coin,BTCaddr,KMDaddr,privkey); fee = JUMBLR_INCR * JUMBLR_FEE; OS_randombytes(&r,sizeof(r)); -//r = 0; +r = 0; if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) { - //printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); + printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); switch ( selector ) { case 0: // public -> z, need to importprivkey - priv0 = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); if ( (total= jumblr_balance(myinfo,coin,KMDaddr)) >= (JUMBLR_INCR + 3*(fee+JUMBLR_TXFEE))*SATOSHIDEN ) { if ( (r & 1) == 0 ) diff --git a/iguana/main.c b/iguana/main.c index 986764423..55ca8824c 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -747,7 +747,7 @@ void iguana_urlinit(struct supernet_info *myinfo,int32_t ismainnet,int32_t usess void jumblr_loop(void *ptr) { - struct iguana_info *coin; uint32_t t; struct supernet_info *myinfo = ptr; int32_t mult = 10; + struct iguana_info *coin; uint32_t t; struct supernet_info *myinfo = ptr; int32_t mult = 1; printf("JUMBLR loop\n"); while ( 1 ) { From 7c1344254f87d787f198edfbc003d026ae387540 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 13:30:01 +0200 Subject: [PATCH 292/495] Test --- basilisk/jumblr.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index c7679b234..702061a24 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -365,10 +365,14 @@ bits256 jumblr_privkey(struct supernet_info *myinfo,char *BTCaddr,char *KMDaddr, void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,char *BTCaddr,char *KMDaddr,bits256 privkey) { - double btcavail,minbtc; struct iguana_info *coinbtc = iguana_coinfind("BTC"); - if ( coinbtc != 0 && (btcavail= jumblr_balance(myinfo,coinbtc,BTCaddr)) > minbtc ) + double btcavail,minbtc,kmdprice,avebid,aveask,highbid,lowask,CMC_average,USD_average,changes[3]; struct iguana_info *coinbtc = iguana_coinfind("BTC"); + if ( (kmdprice= get_theoretical(&avebid,&aveask,&highbid,&lowask,&CMC_average,changes,"komodo","KMD","BTC",&USD_average)) != 0. ) { - + minbtc = (kmdprice * 1.1) * (JUMBLR_INCR + 3*(JUMBLR_INCR * JUMBLR_FEE + JUMBLR_TXFEE)); + if ( coinbtc != 0 && (btcavail= jumblr_balance(myinfo,coinbtc,BTCaddr)) > minbtc ) + { + printf("BTC deposits %.8f, min %.8f\n",btcavail,minbtc); + } } } @@ -440,7 +444,7 @@ r = 0; { if ( (r & 1) == 0 && ptr->spent == 0 && (total= jumblr_balance(myinfo,coin,ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) { - priv0 = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); + privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); if ( (retstr= jumblr_sendz_to_t(myinfo,coin,ptr->dest,KMDaddr,dstr(total))) != 0 ) { printf("sendz_to_t.(%s)\n",retstr); @@ -461,7 +465,7 @@ r = 0; STRING_ARG(jumblr,setpassphrase,passphrase) { - cJSON *retjson; char KMDaddr[64],BTCaddr[64],wifstr[64]; bits256 privkey; + cJSON *retjson; char KMDaddr[64],BTCaddr[64],wifstr[64]; bits256 privkey; struct iguana_info *coinbtc; if ( passphrase == 0 || passphrase[0] == 0 || (coin= iguana_coinfind("KMD")) == 0 || coin->FULLNODE >= 0 ) return(clonestr("{\"error\":\"no passphrase or no native komodod\"}")); else @@ -472,13 +476,19 @@ STRING_ARG(jumblr,setpassphrase,passphrase) privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); jumblr_importprivkey(myinfo,coin,wifstr); - jaddstr(retjson,"BTCdeposit","notyet"); jaddstr(retjson,"KMDdeposit",KMDaddr); - privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); - bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); - // jumblr_importprivkey(myinfo,coin,wifstr); dont mix jumbled funds with normal! - jaddstr(retjson,"BTCjumblr","notyet"); + jaddstr(retjson,"BTCdeposit",BTCaddr); + if ( (coinbtc= iguana_coinfind("BTC")) != 0 ) + { + bitcoin_priv2wif(wifstr,privkey,coinbtc->chain->wiftype); + jumblr_importprivkey(myinfo,coinbtc,wifstr); + jaddnum(retjson,"BTCdeposits",jumblr_balance(myinfo,coinbtc,BTCaddr)); + } + jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); jaddstr(retjson,"KMDjumblr",KMDaddr); + jaddstr(retjson,"BTCjumblr",BTCaddr); + if ( (coinbtc= iguana_coinfind("BTC")) != 0 ) + jaddnum(retjson,"BTCjumbled",jumblr_balance(myinfo,coinbtc,BTCaddr)); return(jprint(retjson,1)); } } From 23ab04f414c9a203c2ba5804a82211cd52e26d61 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 13:50:45 +0200 Subject: [PATCH 293/495] Test --- basilisk/jumblr.c | 4 ++++ crypto777/iguana_utils.c | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 702061a24..57d3a12cd 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -528,7 +528,11 @@ ZERO_ARGS(jumblr,status) maxval = MAX(step_t2z,MAX(step_z2z,step_z2t)); minval = MIN(step_t2z,MIN(step_z2z,step_z2t)); if ( maxval > minval ) + { pending = (maxval - minval); + if ( pending < finished*.1 ) + pending = 0; + } jaddnum(retjson,"pending",dstr(pending)); jaddnum(retjson,"jumbled",dstr(jumblred)); jaddnum(retjson,"received",dstr(received)); diff --git a/crypto777/iguana_utils.c b/crypto777/iguana_utils.c index e9b8b8a51..80988fa5f 100755 --- a/crypto777/iguana_utils.c +++ b/crypto777/iguana_utils.c @@ -1164,7 +1164,7 @@ char *bittrex_orderbook(char *base,char *rel,int32_t maxdepth) double calc_theoretical(double weighted,double CMC_average,double changes[3]) { - double adjusted = 0.,theoretical = 0.; + double theoretical = 0.; //adjusted = 0., if ( weighted > SMALLVAL && CMC_average > SMALLVAL ) { theoretical = (weighted + CMC_average) * 0.5; @@ -1185,7 +1185,7 @@ double calc_theoretical(double weighted,double CMC_average,double changes[3]) if ( adjusted != 0. && theoretical != 0. ) theoretical = (theoretical + adjusted) * 0.5;*/ } - printf("adjusted %.8f theoretical %.8f (%.8f + wt %.8f)\n",adjusted,theoretical,CMC_average,weighted); + //printf("adjusted %.8f theoretical %.8f (%.8f + wt %.8f)\n",adjusted,theoretical,CMC_average,weighted); return(theoretical); } From 847010bd9e91101bc8632c7deebffc1b6b294891 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 13:54:11 +0200 Subject: [PATCH 294/495] Test --- basilisk/jumblr.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 57d3a12cd..463d71397 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -487,7 +487,7 @@ STRING_ARG(jumblr,setpassphrase,passphrase) jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); jaddstr(retjson,"KMDjumblr",KMDaddr); jaddstr(retjson,"BTCjumblr",BTCaddr); - if ( (coinbtc= iguana_coinfind("BTC")) != 0 ) + if ( coinbtc != 0 ) jaddnum(retjson,"BTCjumbled",jumblr_balance(myinfo,coinbtc,BTCaddr)); return(jprint(retjson,1)); } @@ -495,20 +495,24 @@ STRING_ARG(jumblr,setpassphrase,passphrase) ZERO_ARGS(jumblr,status) { - cJSON *retjson; char KMDaddr[64],BTCaddr[64]; struct jumblr_item *ptr,*tmp; int64_t received,deposited,jumblred,step_t2z,step_z2z,step_z2t,finished,pending,maxval,minval; + cJSON *retjson; char KMDaddr[64],BTCaddr[64]; struct jumblr_item *ptr,*tmp; struct iguana_info *coinbtc; int64_t received,deposited,jumblred,step_t2z,step_z2z,step_z2t,finished,pending,maxval,minval; if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 ) { jumblr_opidsupdate(myinfo,coin); retjson = cJSON_CreateObject(); step_t2z = step_z2z = step_z2t = deposited = finished = pending = 0; jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); - jaddstr(retjson,"BTCdeposit","notyet"); jaddstr(retjson,"KMDdeposit",KMDaddr); + jaddstr(retjson,"BTCdeposit",BTCaddr); + if ( (coinbtc= iguana_coinfind("BTC")) != 0 ) + jaddnum(retjson,"BTCdeposits",jumblr_balance(myinfo,coinbtc,BTCaddr)); received = jumblr_receivedby(myinfo,coin,KMDaddr); deposited = jumblr_balance(myinfo,coin,KMDaddr); jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); - jaddstr(retjson,"BTCjumblr","notyet"); jaddstr(retjson,"KMDjumblr",KMDaddr); + jaddstr(retjson,"BTCjumblr",BTCaddr); + if ( coinbtc != 0 ) + jaddnum(retjson,"BTCjumbled",jumblr_balance(myinfo,coinbtc,BTCaddr)); finished = jumblr_receivedby(myinfo,coin,KMDaddr); jumblred = jumblr_balance(myinfo,coin,KMDaddr); HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) From 6a6b4b05434068cc70aabe208de9f1be1ea310d5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 15:00:15 +0200 Subject: [PATCH 295/495] Test --- basilisk/jumblr.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 463d71397..126df93c0 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -193,7 +193,7 @@ int64_t jumblr_balance(struct supernet_info *myinfo,struct iguana_info *coin,cha char *retstr; double val; cJSON *retjson; int32_t i,n; int64_t balance = 0; if ( jumblr_addresstype(myinfo,coin,addr) == 't' ) { - if ( jumblr_ismine(myinfo,coin,addr) > 0 ) + if ( coin->FULLNODE < 0 && jumblr_ismine(myinfo,coin,addr) > 0 ) { if ( (retstr= jumblr_listunspent(myinfo,coin,addr)) != 0 ) { @@ -209,6 +209,7 @@ int64_t jumblr_balance(struct supernet_info *myinfo,struct iguana_info *coin,cha } else if ( (retstr= _dex_getbalance(myinfo,coin->symbol,addr)) != 0 ) { + printf("retstr.(%s)\n",retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { balance = jdouble(retjson,"balance") * SATOSHIDEN; From b3b7c10ebcc69cee8c3fc29b6838feba62c9bf8b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 15:07:49 +0200 Subject: [PATCH 296/495] Test --- basilisk/jumblr.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 126df93c0..d9d4ef517 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -207,7 +207,7 @@ int64_t jumblr_balance(struct supernet_info *myinfo,struct iguana_info *coin,cha free(retstr); } } - else if ( (retstr= _dex_getbalance(myinfo,coin->symbol,addr)) != 0 ) + else if ( (retstr= dex_getbalance(myinfo,coin,0,0,coin->symbol,addr)) != 0 ) { printf("retstr.(%s)\n",retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) @@ -476,13 +476,15 @@ STRING_ARG(jumblr,setpassphrase,passphrase) jaddstr(retjson,"result","success"); privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); - jumblr_importprivkey(myinfo,coin,wifstr); + if ( coin->FULLNODE < 0 ) + jumblr_importprivkey(myinfo,coin,wifstr); jaddstr(retjson,"KMDdeposit",KMDaddr); jaddstr(retjson,"BTCdeposit",BTCaddr); if ( (coinbtc= iguana_coinfind("BTC")) != 0 ) { bitcoin_priv2wif(wifstr,privkey,coinbtc->chain->wiftype); - jumblr_importprivkey(myinfo,coinbtc,wifstr); + if ( coinbtc->FULLNODE < 0 ) + jumblr_importprivkey(myinfo,coinbtc,wifstr); jaddnum(retjson,"BTCdeposits",jumblr_balance(myinfo,coinbtc,BTCaddr)); } jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); From 01afe01a1c244e1917ab5ad79fb3c194334769e0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 15:11:28 +0200 Subject: [PATCH 297/495] Test --- basilisk/jumblr.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index d9d4ef517..6756fe0d3 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -370,7 +370,7 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch if ( (kmdprice= get_theoretical(&avebid,&aveask,&highbid,&lowask,&CMC_average,changes,"komodo","KMD","BTC",&USD_average)) != 0. ) { minbtc = (kmdprice * 1.1) * (JUMBLR_INCR + 3*(JUMBLR_INCR * JUMBLR_FEE + JUMBLR_TXFEE)); - if ( coinbtc != 0 && (btcavail= jumblr_balance(myinfo,coinbtc,BTCaddr)) > minbtc ) + if ( coinbtc != 0 && (btcavail= dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))) > minbtc ) { printf("BTC deposits %.8f, min %.8f\n",btcavail,minbtc); } @@ -389,7 +389,7 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 r = 0; if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) { - printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); + //printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); switch ( selector ) { case 0: // public -> z, need to importprivkey @@ -485,13 +485,13 @@ STRING_ARG(jumblr,setpassphrase,passphrase) bitcoin_priv2wif(wifstr,privkey,coinbtc->chain->wiftype); if ( coinbtc->FULLNODE < 0 ) jumblr_importprivkey(myinfo,coinbtc,wifstr); - jaddnum(retjson,"BTCdeposits",jumblr_balance(myinfo,coinbtc,BTCaddr)); + jaddnum(retjson,"BTCdeposits",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); } jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); jaddstr(retjson,"KMDjumblr",KMDaddr); jaddstr(retjson,"BTCjumblr",BTCaddr); if ( coinbtc != 0 ) - jaddnum(retjson,"BTCjumbled",jumblr_balance(myinfo,coinbtc,BTCaddr)); + jaddnum(retjson,"BTCjumbled",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); return(jprint(retjson,1)); } } @@ -508,14 +508,14 @@ ZERO_ARGS(jumblr,status) jaddstr(retjson,"KMDdeposit",KMDaddr); jaddstr(retjson,"BTCdeposit",BTCaddr); if ( (coinbtc= iguana_coinfind("BTC")) != 0 ) - jaddnum(retjson,"BTCdeposits",jumblr_balance(myinfo,coinbtc,BTCaddr)); + jaddnum(retjson,"BTCdeposits",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); received = jumblr_receivedby(myinfo,coin,KMDaddr); deposited = jumblr_balance(myinfo,coin,KMDaddr); jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); jaddstr(retjson,"KMDjumblr",KMDaddr); jaddstr(retjson,"BTCjumblr",BTCaddr); if ( coinbtc != 0 ) - jaddnum(retjson,"BTCjumbled",jumblr_balance(myinfo,coinbtc,BTCaddr)); + jaddnum(retjson,"BTCjumbled",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); finished = jumblr_receivedby(myinfo,coin,KMDaddr); jumblred = jumblr_balance(myinfo,coin,KMDaddr); HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) From b71ba733d6fa91e00dbf30d2d7dedcfad683e8dd Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 15:15:04 +0200 Subject: [PATCH 298/495] Test --- basilisk/jumblr.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 6756fe0d3..5212c20db 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -209,7 +209,7 @@ int64_t jumblr_balance(struct supernet_info *myinfo,struct iguana_info *coin,cha } else if ( (retstr= dex_getbalance(myinfo,coin,0,0,coin->symbol,addr)) != 0 ) { - printf("retstr.(%s)\n",retstr); + //printf("retstr.(%s)\n",retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { balance = jdouble(retjson,"balance") * SATOSHIDEN; @@ -366,8 +366,14 @@ bits256 jumblr_privkey(struct supernet_info *myinfo,char *BTCaddr,char *KMDaddr, void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,char *BTCaddr,char *KMDaddr,bits256 privkey) { - double btcavail,minbtc,kmdprice,avebid,aveask,highbid,lowask,CMC_average,USD_average,changes[3]; struct iguana_info *coinbtc = iguana_coinfind("BTC"); - if ( (kmdprice= get_theoretical(&avebid,&aveask,&highbid,&lowask,&CMC_average,changes,"komodo","KMD","BTC",&USD_average)) != 0. ) + static double kmdprice; static uint32_t lasttime; + double btcavail,minbtc,avebid,aveask,highbid,lowask,CMC_average,USD_average,changes[3]; struct iguana_info *coinbtc = iguana_coinfind("BTC"); + if ( kmdprice == 0. || time(NULL) > lasttime+600 ) + { + kmdprice = get_theoretical(&avebid,&aveask,&highbid,&lowask,&CMC_average,changes,"komodo","KMD","BTC",&USD_average); + lasttime = (uint32_t)time(NULL); + } + if ( kmdprice > SMALLVAL ) { minbtc = (kmdprice * 1.1) * (JUMBLR_INCR + 3*(JUMBLR_INCR * JUMBLR_FEE + JUMBLR_TXFEE)); if ( coinbtc != 0 && (btcavail= dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))) > minbtc ) @@ -379,11 +385,16 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval) { + static uint32_t lasttime; char BTCaddr[64],KMDaddr[64],*zaddr,*retstr; bits256 privkey; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r; // if BTC has arrived in deposit address, invoke DEX -> KMD // if BTC has arrived in destination address, invoke DEX -> BTC privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); - jumblr_DEXcheck(myinfo,coin,BTCaddr,KMDaddr,privkey); + if ( time(NULL) > lasttime+60 ) + { + jumblr_DEXcheck(myinfo,coin,BTCaddr,KMDaddr,privkey); + lasttime = (uint32_t)time(NULL); + } fee = JUMBLR_INCR * JUMBLR_FEE; OS_randombytes(&r,sizeof(r)); r = 0; From d25a887d1973681fe1e14bcfc9358da233c620ea Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 15:18:29 +0200 Subject: [PATCH 299/495] Test --- basilisk/jumblr.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 5212c20db..841fc3432 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -367,11 +367,13 @@ bits256 jumblr_privkey(struct supernet_info *myinfo,char *BTCaddr,char *KMDaddr, void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,char *BTCaddr,char *KMDaddr,bits256 privkey) { static double kmdprice; static uint32_t lasttime; - double btcavail,minbtc,avebid,aveask,highbid,lowask,CMC_average,USD_average,changes[3]; struct iguana_info *coinbtc = iguana_coinfind("BTC"); + double btcavail=0,minbtc,avebid,aveask,highbid,lowask,CMC_average,USD_average,changes[3]; struct iguana_info *coinbtc = iguana_coinfind("BTC"); + printf("DEXcheck %p\n",coinbtc); if ( kmdprice == 0. || time(NULL) > lasttime+600 ) { kmdprice = get_theoretical(&avebid,&aveask,&highbid,&lowask,&CMC_average,changes,"komodo","KMD","BTC",&USD_average); lasttime = (uint32_t)time(NULL); + printf("KMD %.8f\n",kmdprice); } if ( kmdprice > SMALLVAL ) { @@ -379,7 +381,7 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch if ( coinbtc != 0 && (btcavail= dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))) > minbtc ) { printf("BTC deposits %.8f, min %.8f\n",btcavail,minbtc); - } + } else printf("btcavail %.8f\n",btcavail); } } From 298978957695b366a8685a910201c0df9207fea1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 16:09:17 +0200 Subject: [PATCH 300/495] Test --- basilisk/basilisk_DEX.c | 6 +++--- basilisk/basilisk_MSG.c | 4 ++-- basilisk/basilisk_bitcoin.c | 14 ++++++++++---- basilisk/jumblr.c | 25 +++++++++++++++++++------ includes/iguana_funcs.h | 1 + 5 files changed, 35 insertions(+), 15 deletions(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 607d32099..bc8b69ed5 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -681,19 +681,19 @@ HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr) } else printf("error creating request\n"); if ( datalen > 0 ) { - uint32_t msgid,crc=0,crcs[2],numiters = 0; uint8_t buf[4096]; + uint32_t msgid,crc=0;//,crcs[2],numiters = 0; uint8_t buf[4096]; memset(hash.bytes,0,sizeof(hash)); msgid = (uint32_t)time(NULL); DEX_channel = 'D' + ((uint32_t)'E' << 8) + ((uint32_t)'X' << 16); basilisk_channelsend(myinfo,myinfo->myaddr.persistent,hash,DEX_channel,msgid,serialized,datalen,60); sleep(3); - while ( numiters < 10 && (crc= basilisk_crcsend(myinfo,0,buf,sizeof(buf),hash,myinfo->myaddr.persistent,DEX_channel,msgid,serialized,datalen,crcs)) == 0 ) + /*while ( numiters < 10 && (crc= basilisk_crcsend(myinfo,0,buf,sizeof(buf),hash,myinfo->myaddr.persistent,DEX_channel,msgid,serialized,datalen,crcs)) == 0 ) { //printf("didnt get back what was sent\n"); sleep(3); basilisk_channelsend(myinfo,myinfo->myaddr.persistent,hash,DEX_channel,msgid,serialized,datalen,60); numiters++; - } + }*/ if ( crc != 0 )//basilisk_channelsend(myinfo,R.srchash,R.desthash,DEX_channel,(uint32_t)time(NULL),serialized,datalen,30) == 0 ) return(clonestr("{\"result\":\"DEX message sent\"}")); else return(clonestr("{\"error\":\"DEX message couldnt be sent\"}")); diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index e80e37f73..12f3367dd 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -335,7 +335,7 @@ int32_t basilisk_channelsend(struct supernet_info *myinfo,bits256 srchash,bits25 jaddnum(valsobj,"timeout",1000); jaddbits256(valsobj,"srchash",srchash); jaddbits256(valsobj,"desthash",desthash); - //char str[65]; printf("sendmessage.[%d] channel.%u msgid.%x -> %s numrelays.%d\n",datalen,channel,msgid,bits256_str(str,desthash),myinfo->NOTARY.NUMRELAYS); + char str[65]; printf("sendmessage.[%d] channel.%u msgid.%x -> %s numrelays.%d\n",datalen,channel,msgid,bits256_str(str,desthash),myinfo->NOTARY.NUMRELAYS); if ( (retstr= basilisk_sendmessage(myinfo,0,0,0,desthash,valsobj,hexstr)) != 0 ) free(retstr); free_json(valsobj); @@ -386,7 +386,7 @@ cJSON *basilisk_channelget(struct supernet_info *myinfo,bits256 srchash,bits256 jaddbits256(valsobj,"desthash",desthash); if ( (retstr= basilisk_getmessage(myinfo,0,0,0,desthash,valsobj,0)) != 0 ) { - //printf("channel.%u msgid.%u gotmessage.(%d)\n",channel,msgid,(int32_t)strlen(retstr)); + printf("channel.%u msgid.%u gotmessage.(%d)\n",channel,msgid,(int32_t)strlen(retstr)); if ( (retarray= cJSON_Parse(retstr)) != 0 ) { if ( is_cJSON_Array(retarray) == 0 ) diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index e42ab5146..ea1574e31 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -567,12 +567,12 @@ int64_t iguana_esttxfee(struct supernet_info *myinfo,struct iguana_info *coin,ch coin->estimatedfee = iguana_getestimatedfee(myinfo,coin); if ( signedtx != 0 ) { - txfee = coin->estimatedfee * (strlen(signedtx) + numvins); + txfee = coin->estimatedfee * (strlen(signedtx)/2 + numvins); free(signedtx); } else if ( rawtx != 0 ) { - txfee = coin->estimatedfee * (strlen(rawtx) + numvins * 110); + txfee = coin->estimatedfee * (strlen(rawtx)/2 + numvins * 110); free(rawtx); } return(txfee); @@ -748,7 +748,7 @@ char *iguana_utxorawtx(struct supernet_info *myinfo,struct iguana_info *coin,int char *basilisk_bitcoinrawtx(struct supernet_info *myinfo,struct iguana_info *coin,char *remoteaddr,uint32_t basilisktag,int32_t timeoutmillis,cJSON *valsobj,struct vin_info *V) { - uint8_t buf[4096]; int32_t oplen,offset,minconf,spendlen; cJSON *vins,*addresses,*txobj = 0; uint32_t locktime; char *opreturn,*spendscriptstr,*changeaddr,*rawtx = 0; int64_t amount,txfee,burnamount; + uint8_t buf[4096]; int32_t oplen,len,offset,minconf,spendlen; cJSON *vins,*addresses,*txobj = 0; uint32_t locktime; char *opreturn,*spendscriptstr,*changeaddr,*rawtx = 0; int64_t amount,txfee,burnamount; if ( valsobj == 0 ) return(clonestr("{\"error\":\"null valsobj\"}")); //if ( myinfo->IAMNOTARY != 0 || myinfo->NOTARY.RELAYID >= 0 ) @@ -798,7 +798,13 @@ char *basilisk_bitcoinrawtx(struct supernet_info *myinfo,struct iguana_info *coi } else oplen = datachain_opreturnscript(coin,buf,opreturn,oplen); } rawtx = iguana_calcrawtx(myinfo,coin,&vins,txobj,amount,changeaddr,txfee,addresses,minconf,oplen!=0?buf:0,oplen+offset,burnamount,remoteaddr,V,0); - //printf("generated.(%s) vins.(%s)\n",rawtx!=0?rawtx:"",vins!=0?jprint(vins,0):""); + if ( txfee == 0 ) + { + txfee = iguana_esttxfee(myinfo,coin,rawtx,0,vins != 0 ? cJSON_GetArraySize(vins): 0); + rawtx = iguana_calcrawtx(myinfo,coin,&vins,txobj,amount,changeaddr,txfee,addresses,minconf,oplen!=0?buf:0,oplen+offset,burnamount,remoteaddr,V,0); + printf("new txfee %.8f\n",dstr(txfee)); + } + printf("generated.(%s) vins.(%s)\n",rawtx!=0?rawtx:"",vins!=0?jprint(vins,0):""); } if ( rawtx != 0 ) { diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 841fc3432..9f7e972c1 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -366,9 +366,9 @@ bits256 jumblr_privkey(struct supernet_info *myinfo,char *BTCaddr,char *KMDaddr, void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,char *BTCaddr,char *KMDaddr,bits256 privkey) { - static double kmdprice; static uint32_t lasttime; - double btcavail=0,minbtc,avebid,aveask,highbid,lowask,CMC_average,USD_average,changes[3]; struct iguana_info *coinbtc = iguana_coinfind("BTC"); - printf("DEXcheck %p\n",coinbtc); + static double kmdprice,pending; static uint32_t lasttime; + double btcavail=0,minbtc,avebid,aveask,highbid,lowask,CMC_average,USD_average,changes[3]; struct iguana_info *coinbtc; cJSON *vals; bits256 hash; char *retstr; + coinbtc = iguana_coinfind("BTC"); if ( kmdprice == 0. || time(NULL) > lasttime+600 ) { kmdprice = get_theoretical(&avebid,&aveask,&highbid,&lowask,&CMC_average,changes,"komodo","KMD","BTC",&USD_average); @@ -378,9 +378,22 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch if ( kmdprice > SMALLVAL ) { minbtc = (kmdprice * 1.1) * (JUMBLR_INCR + 3*(JUMBLR_INCR * JUMBLR_FEE + JUMBLR_TXFEE)); - if ( coinbtc != 0 && (btcavail= dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))) > minbtc ) + if ( coinbtc != 0 && (btcavail= dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))) > minbtc+pending ) { printf("BTC deposits %.8f, min %.8f\n",btcavail,minbtc); + vals = cJSON_CreateObject(); + jaddstr(vals,"source","BTC"); + jaddstr(vals,"dest","KMD"); + jaddnum(vals,"amount",btcavail*.95); + jaddnum(vals,"minprice",kmdprice*.95); + memset(hash.bytes,0,sizeof(hash)); + pending = btcavail; + if ( (retstr= InstantDEX_request(myinfo,coinbtc,0,0,hash,vals,"")) != 0 ) + { + printf("request.(%s) -> (%s)\n",jprint(vals,0),retstr); + free(retstr); + } + // curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"request\",\"vals\":{\"source\":\"KMD\",\"amount\":20,\"dest\":\"USD\",\"minprice\":0.08}}" } else printf("btcavail %.8f\n",btcavail); } } @@ -389,11 +402,11 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 { static uint32_t lasttime; char BTCaddr[64],KMDaddr[64],*zaddr,*retstr; bits256 privkey; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r; - // if BTC has arrived in deposit address, invoke DEX -> KMD - // if BTC has arrived in destination address, invoke DEX -> BTC privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); if ( time(NULL) > lasttime+60 ) { + // if BTC has arrived in deposit address, invoke DEX -> KMD + // if BTC has arrived in destination address, invoke DEX -> BTC jumblr_DEXcheck(myinfo,coin,BTCaddr,KMDaddr,privkey); lasttime = (uint32_t)time(NULL); } diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index c6a2e3a3f..7d8e3b679 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -617,6 +617,7 @@ void iguana_walletinitcheck(struct supernet_info *myinfo,struct iguana_info *coi void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval); bits256 jumblr_privkey(struct supernet_info *myinfo,char *BTCaddr,char *KMDaddr,char *prefix); char *jumblr_importprivkey(struct supernet_info *myinfo,struct iguana_info *coin,char *wifstr); +int64_t iguana_esttxfee(struct supernet_info *myinfo,struct iguana_info *coin,char *rawtx,char *signedtx,int32_t numvins); // ------------------------------------------------------[ Preparation ]---- // Initialise a gfshare context for producing shares From 348e68f3988b6327f128f96b8891c0a76abf6ba5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 16:19:22 +0200 Subject: [PATCH 301/495] Test --- basilisk/basilisk_DEX.c | 4 ++-- basilisk/basilisk_MSG.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index bc8b69ed5..25614a23c 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -694,9 +694,9 @@ HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr) basilisk_channelsend(myinfo,myinfo->myaddr.persistent,hash,DEX_channel,msgid,serialized,datalen,60); numiters++; }*/ - if ( crc != 0 )//basilisk_channelsend(myinfo,R.srchash,R.desthash,DEX_channel,(uint32_t)time(NULL),serialized,datalen,30) == 0 ) + //if ( crc != 0 )//basilisk_channelsend(myinfo,R.srchash,R.desthash,DEX_channel,(uint32_t)time(NULL),serialized,datalen,30) == 0 ) return(clonestr("{\"result\":\"DEX message sent\"}")); - else return(clonestr("{\"error\":\"DEX message couldnt be sent\"}")); + //else return(clonestr("{\"error\":\"DEX message couldnt be sent\"}")); } return(clonestr("{\"error\":\"DEX message not sent\"}")); } diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index 12f3367dd..fc2200360 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -386,7 +386,7 @@ cJSON *basilisk_channelget(struct supernet_info *myinfo,bits256 srchash,bits256 jaddbits256(valsobj,"desthash",desthash); if ( (retstr= basilisk_getmessage(myinfo,0,0,0,desthash,valsobj,0)) != 0 ) { - printf("channel.%u msgid.%u gotmessage.(%d)\n",channel,msgid,(int32_t)strlen(retstr)); + printf("channel.%u msgid.%u gotmessage.(%d) %s\n",channel,msgid,(int32_t)strlen(retstr),strlen(retstr) < 100 ? retstr : "(too long)"); if ( (retarray= cJSON_Parse(retstr)) != 0 ) { if ( is_cJSON_Array(retarray) == 0 ) From ae2595361c63d83dc3a7ac6c0aa4c604d882692d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 16:42:37 +0200 Subject: [PATCH 302/495] Test --- basilisk/basilisk_DEX.c | 2 +- basilisk/tradebots_liquidity.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 25614a23c..5379c271a 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -639,7 +639,7 @@ HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr) { uint8_t serialized[512]; char buf[512]; struct basilisk_request R; int32_t iambob,optionhours; cJSON *reqjson; uint32_t datalen=0,DEX_channel; struct iguana_info *bobcoin,*alicecoin; myinfo->DEXactive = (uint32_t)time(NULL) + 3*BASILISK_TIMEOUT + 60; - jadd64bits(vals,"minamount",jdouble(vals,"minprice") * jdouble(vals,"amount") * SATOSHIDEN); + jadd64bits(vals,"minamount",jdouble(vals,"minprice") * jdouble(vals,"amount") * SATOSHIDEN * SATOSHIDEN); if ( jobj(vals,"srchash") == 0 ) jaddbits256(vals,"srchash",myinfo->myaddr.persistent); if ( jobj(vals,"desthash") == 0 ) diff --git a/basilisk/tradebots_liquidity.c b/basilisk/tradebots_liquidity.c index cc38a2369..3cc4e7617 100755 --- a/basilisk/tradebots_liquidity.c +++ b/basilisk/tradebots_liquidity.c @@ -932,6 +932,8 @@ void _default_liquidity_command(struct supernet_info *myinfo,char *base,bits256 li.ask = jdouble(vals,"ask"); if ( (li.minvol= jdouble(vals,"minvol")) <= 0. ) li.minvol = (strcmp("BTC",base) == 0) ? 0.0001 : 0.001; + if ( strcmp(li.base,"KMD") == 0 && strcmp(li.rel,"BTC") == 0 && li.minvol > 100. ) + li.minvol = 100.; if ( (li.maxvol= jdouble(vals,"maxvol")) < li.minvol ) li.maxvol = li.minvol; if ( (li.totalvol= jdouble(vals,"total")) < li.maxvol ) From 68dcf9b9973b50efeaf2420a0ee1fac3117add03 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 16:49:55 +0200 Subject: [PATCH 303/495] Test --- basilisk/basilisk_tradebot.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk_tradebot.c b/basilisk/basilisk_tradebot.c index 7940a4e94..4ae47f069 100755 --- a/basilisk/basilisk_tradebot.c +++ b/basilisk/basilisk_tradebot.c @@ -331,7 +331,7 @@ double basilisk_request_listprocess(struct supernet_info *myinfo,struct basilisk if ( fabs(aveprice) < SMALLVAL ) return(0); //retvals[0] = avebid, retvals[1] = bidvol, retvals[2] = aveask, retvals[3] = askvol; - destamount = (1.0 - profitmargin) * aveprice * list[0].srcamount; + destamount = (1.0 - profitmargin) * aveprice * list[0].srcamount * SATOSHIDEN; printf("aveprice %f dest %.8f avebid %f bidvol %f, aveask %f askvol %f\n",aveprice,dstr(destamount),retvals[0],retvals[1],retvals[2],retvals[3]); if ( (retstr= InstantDEX_available(myinfo,iguana_coinfind(list[0].dest),0,0,list[0].dest)) != 0 ) { From 1c3ed5a4e86ebde0581ac08be2ee7f9723f3576d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 17:59:37 +0200 Subject: [PATCH 304/495] Test --- .gitignore | 2 ++ basilisk/basilisk_DEX.c | 4 ++-- basilisk/basilisk_MSG.c | 2 +- basilisk/basilisk_bitcoin.c | 2 +- basilisk/basilisk_tradebot.c | 2 +- iguana/iguana_payments.c | 2 +- 6 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index ba6f0a1f2..04fc232c4 100755 --- a/.gitignore +++ b/.gitignore @@ -160,3 +160,5 @@ iguana/help.json iguana/index7778.html *.json + +iguana/DB/KMD/utxo.dat diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 5379c271a..85b9c5376 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -276,7 +276,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo) { static uint32_t lastpoll; char *retstr; uint8_t data[32768]; cJSON *outerarray,*retjson; uint32_t msgid,channel; int32_t datalen,i,n; struct basilisk_request issueR; double hwm = 0.; - if ( time(NULL) < lastpoll+3 ) + if ( time(NULL) < lastpoll+13 ) return; lastpoll = (uint32_t)time(NULL); memset(&issueR,0,sizeof(issueR)); @@ -570,7 +570,7 @@ cJSON *basilisk_unspents(struct supernet_info *myinfo,struct iguana_info *coin,c } else if ( coin->FULLNODE == 0 ) { - if ( (retstr= _dex_listunspent(myinfo,coin->symbol,coinaddr)) != 0 ) + if ( (retstr= dex_listunspent(myinfo,coin,0,0,coin->symbol,coinaddr)) != 0 ) { unspents = cJSON_Parse(retstr); free(retstr); diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index fc2200360..4cf5b5f49 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -217,7 +217,7 @@ char *basilisk_respond_addmessage(struct supernet_info *myinfo,uint8_t *key,int3 HASH_ADD_KEYPTR(hh,myinfo->messagetable,msg->key,msg->keylen,msg); QUEUEITEMS++; portable_mutex_unlock(&myinfo->messagemutex); -//printf("add message keylen.%d [%d]\n",msg->keylen,datalen); +printf("add message keylen.%d [%d]\n",msg->keylen,datalen); //if ( myinfo->NOTARY.RELAYID >= 0 ) // dpow_handler(myinfo,msg); if ( sendping != 0 ) diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index ea1574e31..5864db483 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -769,7 +769,7 @@ char *basilisk_bitcoinrawtx(struct supernet_info *myinfo,struct iguana_info *coi addresses = iguana_getaddressesbyaccount(myinfo,coin,"*"); jadd(valsobj,"addresses",addresses); } - //printf("use addresses.(%s)\n",jprint(addresses,0)); + printf("use addresses.(%s)\n",jprint(addresses,0)); //printf("(%s) vals.(%s) change.(%s) spend.%s\n",coin->symbol,jprint(valsobj,0),changeaddr,spendscriptstr); if ( changeaddr == 0 || changeaddr[0] == 0 || spendscriptstr == 0 || spendscriptstr[0] == 0 ) return(clonestr("{\"error\":\"invalid changeaddr or spendscript or addresses\"}")); diff --git a/basilisk/basilisk_tradebot.c b/basilisk/basilisk_tradebot.c index 4ae47f069..d98bc1200 100755 --- a/basilisk/basilisk_tradebot.c +++ b/basilisk/basilisk_tradebot.c @@ -104,7 +104,7 @@ int32_t basilisk_swapconv(struct supernet_info *myinfo,struct basilisk_swap *swa if ( juint(obj,"requestid") == swap->I.req.requestid && juint(obj,"quoteid") == swap->I.req.quoteid ) return(0); printf("swapconv mismatched req/quote %d %d, %d %d\n",juint(obj,"requestid"),swap->I.req.requestid,juint(obj,"quoteid"),swap->I.req.quoteid); - } else printf("no info field in swap obj\n"); + } else printf("no info field in swap obj.(%s)\n",jprint(obj,0)); return(-1); } diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 86f22cb3c..73b11d919 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -426,7 +426,7 @@ char *iguana_calcrawtx(struct supernet_info *myinfo,struct iguana_info *coin,cJS coinaddr = jstri(addresses,i); if ( (array= basilisk_unspents(myinfo,coin,coinaddr)) != 0 ) { - //printf("unspents.(%s) %s\n",coinaddr,jprint(array,0)); + printf("unspents.(%s) %s\n",coinaddr,jprint(array,0)); if ( (m= cJSON_GetArraySize(array)) > 0 ) { for (j=0; j Date: Sat, 4 Mar 2017 18:12:17 +0200 Subject: [PATCH 305/495] Test --- iguana/iguana_payments.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 73b11d919..86f22cb3c 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -426,7 +426,7 @@ char *iguana_calcrawtx(struct supernet_info *myinfo,struct iguana_info *coin,cJS coinaddr = jstri(addresses,i); if ( (array= basilisk_unspents(myinfo,coin,coinaddr)) != 0 ) { - printf("unspents.(%s) %s\n",coinaddr,jprint(array,0)); + //printf("unspents.(%s) %s\n",coinaddr,jprint(array,0)); if ( (m= cJSON_GetArraySize(array)) > 0 ) { for (j=0; j Date: Sat, 4 Mar 2017 18:59:34 +0200 Subject: [PATCH 306/495] Test --- basilisk/basilisk.c | 2 +- basilisk/basilisk.h | 15 ++------ basilisk/basilisk_DEX.c | 30 +++++++++------- basilisk/basilisk_bitcoin.c | 2 +- basilisk/basilisk_swap.c | 72 ++++++++++++++++++++----------------- basilisk/jumblr.c | 1 + iguana/iguana777.h | 11 ++++++ includes/iguana_funcs.h | 2 +- 8 files changed, 74 insertions(+), 61 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index e4760e040..fe2150489 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -924,7 +924,7 @@ void basilisks_loop(void *arg) if ( myinfo->expiration != 0 && (myinfo->dexsock >= 0 || myinfo->IAMLP != 0 || myinfo->DEXactive > time(NULL)) ) { //fprintf(stderr,"H "); - basilisk_requests_poll(myinfo); + basilisk_requests_poll(myinfo,myinfo->persistent_priv); } //printf("RELAYID.%d endmilli %f vs now %f\n",myinfo->NOTARY.RELAYID,endmilli,startmilli); while ( OS_milliseconds() < endmilli ) diff --git a/basilisk/basilisk.h b/basilisk/basilisk.h index 45bbdd6b2..7ca809600 100755 --- a/basilisk/basilisk.h +++ b/basilisk/basilisk.h @@ -41,6 +41,8 @@ #define INSTANTDEX_BTC "1KRhTPvoxyJmVALwHFXZdeeWFbcJSbkFPu" #define INSTANTDEX_BTCD "RThtXup6Zo7LZAi8kRWgjAyi1s4u6U9Cpf" +struct basilisk_swap; + struct basilisk_rawtxinfo { char destaddr[64]; @@ -77,17 +79,6 @@ struct basilisk_swapinfo uint8_t secretAm256[32],secretBn256[32]; }; -struct basilisk_swap -{ - struct supernet_info *myinfo; struct iguana_info *bobcoin,*alicecoin; - void (*balancingtrade)(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t iambob); - struct basilisk_swapinfo I; - struct basilisk_rawtx bobdeposit,bobpayment,alicepayment,myfee,otherfee,aliceclaim,alicespend,bobreclaim,bobspend,bobrefund,alicereclaim; - bits256 privkeys[INSTANTDEX_DECKSIZE]; - uint64_t otherdeck[INSTANTDEX_DECKSIZE][2],deck[INSTANTDEX_DECKSIZE][2]; - uint8_t verifybuf[65536]; -}; - struct basilisk_value { bits256 txid; int64_t value; int32_t height; int16_t vout; char coinaddr[64]; }; struct basilisk_item @@ -135,7 +126,7 @@ int32_t basilisk_update(char *symbol,uint32_t reftimestamp); void basilisk_seqresult(struct supernet_info *myinfo,char *retstr); struct iguana_info *basilisk_geckochain(struct supernet_info *myinfo,char *symbol,char *chainname,cJSON *valsobj); void basilisk_alicepayment(struct supernet_info *myinfo,struct basilisk_swap *swap,struct iguana_info *coin,struct basilisk_rawtx *alicepayment,bits256 pubAm,bits256 pubBn); -void basilisk_rawtx_setparms(char *name,struct supernet_info *myinfo,struct basilisk_swap *swap,struct basilisk_rawtx *rawtx,struct iguana_info *coin,int32_t numconfirms,int32_t vintype,uint64_t satoshis,int32_t vouttype,uint8_t *pubkey33); +void basilisk_rawtx_setparms(char *name,struct basilisk_swap *swap,struct basilisk_rawtx *rawtx,struct iguana_info *coin,int32_t numconfirms,int32_t vintype,uint64_t satoshis,int32_t vouttype,uint8_t *pubkey33); void basilisk_setmyid(struct supernet_info *myinfo); int32_t basilisk_rwDEXquote(int32_t rwflag,uint8_t *serialized,struct basilisk_request *rp); cJSON *basilisk_requestjson(struct basilisk_request *rp); diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 85b9c5376..7d0aafeb2 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -229,7 +229,7 @@ int32_t basilisk_request_create(struct basilisk_request *rp,cJSON *valsobj,bits2 return(-1); } -char *basilisk_start(struct supernet_info *myinfo,struct basilisk_request *_rp,uint32_t statebits,int32_t optionduration) +char *basilisk_start(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *_rp,uint32_t statebits,int32_t optionduration) { cJSON *retjson; struct basilisk_request *rp=0; int32_t i; if ( _rp->requestid == myinfo->lastdexrequestid ) @@ -251,7 +251,7 @@ char *basilisk_start(struct supernet_info *myinfo,struct basilisk_request *_rp,u *rp = *_rp; printf("START thread to complete %u/%u for (%s %.8f) <-> (%s %.8f) q.%u\n",rp->requestid,rp->quoteid,rp->src,dstr(rp->srcamount),rp->dest,dstr(rp->destamount),rp->quoteid); myinfo->lastdexrequestid = rp->requestid; - if ( basilisk_thread_start(myinfo,rp,statebits,optionduration) != 0 ) + if ( basilisk_thread_start(myinfo,privkey,rp,statebits,optionduration) != 0 ) { basilisk_request_enqueue(myinfo,rp); return(clonestr("{\"result\":\"started atomic swap thread\"}")); @@ -272,7 +272,7 @@ char *basilisk_start(struct supernet_info *myinfo,struct basilisk_request *_rp,u } else return(clonestr("{\"error\":\"unexpected basilisk_start not mine and amrelay\"}")); } -void basilisk_requests_poll(struct supernet_info *myinfo) +void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) { static uint32_t lastpoll; char *retstr; uint8_t data[32768]; cJSON *outerarray,*retjson; uint32_t msgid,channel; int32_t datalen,i,n; struct basilisk_request issueR; double hwm = 0.; @@ -315,7 +315,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo) dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 dpow_nanomsg_update(myinfo); dex_updateclient(myinfo); - if ( (retstr= basilisk_start(myinfo,&issueR,1,issueR.optionhours * 3600)) != 0 ) + if ( (retstr= basilisk_start(myinfo,myinfo->persistent_priv,&issueR,1,issueR.optionhours * 3600)) != 0 ) free(retstr); /*if ( (retstr= InstantDEX_accept(myinfo,0,0,0,issueR.requestid,issueR.quoteid)) != 0 ) free(retstr); @@ -346,7 +346,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo) dex_channelsend(myinfo,issueR.desthash,issueR.srchash,channel,msgid,data,datalen); //INSTANTDEX_LOCKTIME*2 dpow_nanomsg_update(myinfo); dex_updateclient(myinfo); - if ( (retstr= basilisk_start(myinfo,&issueR,0,issueR.optionhours * 3600)) != 0 ) + if ( (retstr= basilisk_start(myinfo,myinfo->persistent_priv,&issueR,0,issueR.optionhours * 3600)) != 0 ) free(retstr); /*crcs[0] = crcs[1] = 0; numiters = 0; @@ -489,7 +489,7 @@ char *basilisk_respond_requests(struct supernet_info *myinfo,bits256 hash,uint32 return(jprint(retjson,1)); } -char *basilisk_respond_accept(struct supernet_info *myinfo,uint32_t requestid,uint32_t quoteid,struct basilisk_request *refrp) +char *basilisk_respond_accept(struct supernet_info *myinfo,bits256 privkey,uint32_t requestid,uint32_t quoteid,struct basilisk_request *refrp) { int32_t i,num=0; char *retstr=0; struct basilisk_request *requests,*rp; uint8_t space[4096]; portable_mutex_lock(&myinfo->DEX_reqmutex); @@ -501,7 +501,7 @@ char *basilisk_respond_accept(struct supernet_info *myinfo,uint32_t requestid,ui if ( rp->requestid == requestid && rp->quoteid == quoteid ) { printf("start from accept\n"); - retstr = basilisk_start(myinfo,rp,1,0); + retstr = basilisk_start(myinfo,privkey,rp,1,0); break; } } @@ -637,7 +637,7 @@ STRING_ARG(InstantDEX,available,source) HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr) { - uint8_t serialized[512]; char buf[512]; struct basilisk_request R; int32_t iambob,optionhours; cJSON *reqjson; uint32_t datalen=0,DEX_channel; struct iguana_info *bobcoin,*alicecoin; + uint8_t serialized[512]; bits256 privkey; char buf[512],BTCaddr[64],KMDaddr[64]; struct basilisk_request R; int32_t iambob,optionhours; cJSON *reqjson; uint32_t datalen=0,DEX_channel; struct iguana_info *bobcoin,*alicecoin; myinfo->DEXactive = (uint32_t)time(NULL) + 3*BASILISK_TIMEOUT + 60; jadd64bits(vals,"minamount",jdouble(vals,"minprice") * jdouble(vals,"amount") * SATOSHIDEN * SATOSHIDEN); if ( jobj(vals,"srchash") == 0 ) @@ -647,12 +647,16 @@ HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr) jadd64bits(vals,"satoshis",jdouble(vals,"amount") * SATOSHIDEN); jadd64bits(vals,"destsatoshis",jdouble(vals,"destamount") * SATOSHIDEN); jaddnum(vals,"timestamp",time(NULL)); - hash = myinfo->myaddr.persistent; + if ( jint(vals,"usejumblr") != 0 ) + privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + else privkey = myinfo->persistent_priv; + hash = curve25519(privkey,curve25519_basepoint9()); + //hash = myinfo->myaddr.persistent; printf("service.(%s)\n",jprint(vals,0)); memset(&R,0,sizeof(R)); if ( basilisk_request_create(&R,vals,hash,juint(vals,"timestamp")) == 0 ) { - iambob = bitcoin_coinptrs(myinfo,&bobcoin,&alicecoin,R.src,R.dest,myinfo->myaddr.persistent,GENESIS_PUBKEY); + iambob = bitcoin_coinptrs(hash,&bobcoin,&alicecoin,R.src,R.dest,privkey,GENESIS_PUBKEY); if ( (optionhours= jint(vals,"optionhours")) != 0 ) { printf("iambob.%d optionhours.%d R.requestid.%u vs calc %u, q.%u\n",iambob,R.optionhours,R.requestid,basilisk_requestid(&R),R.quoteid); @@ -681,11 +685,11 @@ HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr) } else printf("error creating request\n"); if ( datalen > 0 ) { - uint32_t msgid,crc=0;//,crcs[2],numiters = 0; uint8_t buf[4096]; + uint32_t msgid;//,crc=0,crcs[2],numiters = 0; uint8_t buf[4096]; memset(hash.bytes,0,sizeof(hash)); msgid = (uint32_t)time(NULL); DEX_channel = 'D' + ((uint32_t)'E' << 8) + ((uint32_t)'X' << 16); - basilisk_channelsend(myinfo,myinfo->myaddr.persistent,hash,DEX_channel,msgid,serialized,datalen,60); + basilisk_channelsend(myinfo,hash,hash,DEX_channel,msgid,serialized,datalen,60); sleep(3); /*while ( numiters < 10 && (crc= basilisk_crcsend(myinfo,0,buf,sizeof(buf),hash,myinfo->myaddr.persistent,DEX_channel,msgid,serialized,datalen,crcs)) == 0 ) { @@ -776,7 +780,7 @@ TWO_INTS(InstantDEX,accept,requestid,quoteid) cJSON *vals; char *retstr; myinfo->DEXactive = (uint32_t)time(NULL) + INSTANTDEX_LOCKTIME; if ( myinfo->IAMLP != 0 || myinfo->dexsock >= 0 || myinfo->subsock >= 0 ) - return(basilisk_respond_accept(myinfo,requestid,quoteid,&myinfo->DEXaccept)); + return(basilisk_respond_accept(myinfo,myinfo->persistent_priv,requestid,quoteid,&myinfo->DEXaccept)); else { vals = cJSON_CreateObject(); diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index 5864db483..e601c1e64 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -748,7 +748,7 @@ char *iguana_utxorawtx(struct supernet_info *myinfo,struct iguana_info *coin,int char *basilisk_bitcoinrawtx(struct supernet_info *myinfo,struct iguana_info *coin,char *remoteaddr,uint32_t basilisktag,int32_t timeoutmillis,cJSON *valsobj,struct vin_info *V) { - uint8_t buf[4096]; int32_t oplen,len,offset,minconf,spendlen; cJSON *vins,*addresses,*txobj = 0; uint32_t locktime; char *opreturn,*spendscriptstr,*changeaddr,*rawtx = 0; int64_t amount,txfee,burnamount; + uint8_t buf[4096]; int32_t oplen,offset,minconf,spendlen; cJSON *vins,*addresses,*txobj = 0; uint32_t locktime; char *opreturn,*spendscriptstr,*changeaddr,*rawtx = 0; int64_t amount,txfee,burnamount; if ( valsobj == 0 ) return(clonestr("{\"error\":\"null valsobj\"}")); //if ( myinfo->IAMNOTARY != 0 || myinfo->NOTARY.RELAYID >= 0 ) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 2b0c72d91..b9f785887 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -956,15 +956,15 @@ int32_t basilisk_privAm_extract(struct supernet_info *myinfo,struct basilisk_swa return(-1); } -bits256 instantdex_derivekeypair(struct supernet_info *myinfo,bits256 *newprivp,uint8_t pubkey[33],bits256 privkey,bits256 orderhash) +bits256 instantdex_derivekeypair(void *ctx,bits256 *newprivp,uint8_t pubkey[33],bits256 privkey,bits256 orderhash) { bits256 sharedsecret; sharedsecret = curve25519_shared(privkey,orderhash); vcalc_sha256cat(newprivp->bytes,orderhash.bytes,sizeof(orderhash),sharedsecret.bytes,sizeof(sharedsecret)); - return(bitcoin_pubkey33(myinfo->ctx,pubkey,*newprivp)); + return(bitcoin_pubkey33(ctx,pubkey,*newprivp)); } -int32_t instantdex_pubkeyargs(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t numpubs,bits256 privkey,bits256 hash,int32_t firstbyte) +int32_t instantdex_pubkeyargs(void *ctx,struct basilisk_swap *swap,int32_t numpubs,bits256 privkey,bits256 hash,int32_t firstbyte) { char buf[3]; int32_t i,n,m,len=0; bits256 pubi,reveal; uint64_t txid; uint8_t secret160[20],pubkey[33]; sprintf(buf,"%c0",'A' - 0x02 + firstbyte); @@ -976,7 +976,7 @@ int32_t instantdex_pubkeyargs(struct supernet_info *myinfo,struct basilisk_swap } for (i=n=m=0; iname,name); rawtx->coin = coin; @@ -1050,7 +1050,7 @@ void basilisk_rawtx_setparms(char *name,struct supernet_info *myinfo,struct basi } else printf("%s vouttype.%d destaddr.(%s)\n",name,rawtx->I.vouttype,rawtx->I.destaddr); } -int32_t bitcoin_coinptrs(struct supernet_info *myinfo,struct iguana_info **bobcoinp,struct iguana_info **alicecoinp,char *src,char *dest,bits256 srchash,bits256 desthash) +int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct iguana_info **alicecoinp,char *src,char *dest,bits256 srchash,bits256 desthash) { struct iguana_info *coin = iguana_coinfind(src); if ( coin == 0 || iguana_coinfind(dest) == 0 ) @@ -1077,7 +1077,7 @@ int32_t bitcoin_coinptrs(struct supernet_info *myinfo,struct iguana_info **bobco *alicecoinp = iguana_coinfind(src); } else return(0); - if ( bits256_cmp(myinfo->myaddr.persistent,srchash) == 0 ) + if ( bits256_cmp(pubkey,srchash) == 0 ) { if ( strcmp(src,(*bobcoinp)->symbol) == 0 ) return(1); @@ -1085,7 +1085,7 @@ int32_t bitcoin_coinptrs(struct supernet_info *myinfo,struct iguana_info **bobco return(-1); else return(0); } - else if ( bits256_cmp(myinfo->myaddr.persistent,desthash) == 0 ) + else if ( bits256_cmp(pubkey,desthash) == 0 ) { if ( strcmp(src,(*bobcoinp)->symbol) == 0 ) return(-1); @@ -1096,7 +1096,7 @@ int32_t bitcoin_coinptrs(struct supernet_info *myinfo,struct iguana_info **bobco return(0); } -struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t optionduration) +struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey33,bits256 pubkey25519,struct basilisk_swap *swap,int32_t optionduration) { struct iguana_info *coin,*bobcoin,*alicecoin; uint8_t *alicepub33=0,*bobpub33=0; int32_t x = -1; swap->I.putduration = swap->I.callduration = INSTANTDEX_LOCKTIME; @@ -1168,7 +1168,7 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,struct basil swap->I.choosei = -swap->I.choosei; swap->I.choosei %= INSTANTDEX_DECKSIZE; swap->I.otherchoosei = -1; - swap->I.myhash = myinfo->myaddr.persistent; + swap->I.myhash = pubkey25519; if ( bits256_cmp(swap->I.myhash,swap->I.req.srchash) == 0 ) { swap->I.otherhash = swap->I.req.desthash; @@ -1186,46 +1186,46 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,struct basil printf("neither src nor dest error\n"); return(0); } - if ( (bitcoin_coinptrs(myinfo,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash)+1)/2 != swap->I.iambob ) + if ( (bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash)+1)/2 != swap->I.iambob ) { - printf("error iambob.%d != %d\n",swap->I.iambob,bitcoin_coinptrs(myinfo,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash)); + printf("error iambob.%d != %d\n",swap->I.iambob,bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash)); return(0); } - if ( bits256_nonz(myinfo->persistent_priv) == 0 || (x= instantdex_pubkeyargs(myinfo,swap,2 + INSTANTDEX_DECKSIZE,myinfo->persistent_priv,swap->I.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) + if ( bits256_nonz(privkey) == 0 || (x= instantdex_pubkeyargs(ctx,swap,2 + INSTANTDEX_DECKSIZE,privkey,swap->I.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) { printf("couldnt generate privkeys %d\n",x); return(0); } if ( swap->I.iambob != 0 ) { - basilisk_rawtx_setparms("myfee",myinfo,swap,&swap->myfee,swap->bobcoin,0,0,swap->I.bobsatoshis/INSTANTDEX_DECKSIZE,0,0); - basilisk_rawtx_setparms("otherfee",myinfo,swap,&swap->otherfee,swap->alicecoin,0,0,swap->I.alicesatoshis/INSTANTDEX_DECKSIZE,0,0); - bobpub33 = myinfo->persistent_pubkey33; + basilisk_rawtx_setparms("myfee",swap,&swap->myfee,swap->bobcoin,0,0,swap->I.bobsatoshis/INSTANTDEX_DECKSIZE,0,0); + basilisk_rawtx_setparms("otherfee",swap,&swap->otherfee,swap->alicecoin,0,0,swap->I.alicesatoshis/INSTANTDEX_DECKSIZE,0,0); + bobpub33 = pubkey33; } else { - basilisk_rawtx_setparms("otherfee",myinfo,swap,&swap->otherfee,swap->bobcoin,0,0,swap->I.bobsatoshis/INSTANTDEX_DECKSIZE,0,0); - basilisk_rawtx_setparms("myfee",myinfo,swap,&swap->myfee,swap->alicecoin,0,0,swap->I.alicesatoshis/INSTANTDEX_DECKSIZE,0,0); - alicepub33 = myinfo->persistent_pubkey33; + basilisk_rawtx_setparms("otherfee",swap,&swap->otherfee,swap->bobcoin,0,0,swap->I.bobsatoshis/INSTANTDEX_DECKSIZE,0,0); + basilisk_rawtx_setparms("myfee",swap,&swap->myfee,swap->alicecoin,0,0,swap->I.alicesatoshis/INSTANTDEX_DECKSIZE,0,0); + alicepub33 = pubkey33; } - basilisk_rawtx_setparms("bobdeposit",myinfo,swap,&swap->bobdeposit,swap->bobcoin,swap->I.bobconfirms,0,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3) + swap->bobcoin->txfee,4,0); - basilisk_rawtx_setparms("bobrefund",myinfo,swap,&swap->bobrefund,swap->bobcoin,1,4,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3),1,bobpub33); + basilisk_rawtx_setparms("bobdeposit",swap,&swap->bobdeposit,swap->bobcoin,swap->I.bobconfirms,0,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3) + swap->bobcoin->txfee,4,0); + basilisk_rawtx_setparms("bobrefund",swap,&swap->bobrefund,swap->bobcoin,1,4,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3),1,bobpub33); swap->bobrefund.I.suppress_pubkeys = 1; - basilisk_rawtx_setparms("aliceclaim",myinfo,swap,&swap->aliceclaim,swap->bobcoin,1,4,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3),1,alicepub33); + basilisk_rawtx_setparms("aliceclaim",swap,&swap->aliceclaim,swap->bobcoin,1,4,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3),1,alicepub33); swap->aliceclaim.I.suppress_pubkeys = 1; swap->aliceclaim.I.locktime = swap->I.started + swap->I.putduration+swap->I.callduration + 1; - basilisk_rawtx_setparms("bobpayment",myinfo,swap,&swap->bobpayment,swap->bobcoin,swap->I.bobconfirms,0,swap->I.bobsatoshis + swap->bobcoin->txfee,3,0); - basilisk_rawtx_setparms("alicespend",myinfo,swap,&swap->alicespend,swap->bobcoin,swap->I.bobconfirms,3,swap->I.bobsatoshis,1,alicepub33); + basilisk_rawtx_setparms("bobpayment",swap,&swap->bobpayment,swap->bobcoin,swap->I.bobconfirms,0,swap->I.bobsatoshis + swap->bobcoin->txfee,3,0); + basilisk_rawtx_setparms("alicespend",swap,&swap->alicespend,swap->bobcoin,swap->I.bobconfirms,3,swap->I.bobsatoshis,1,alicepub33); swap->alicespend.I.suppress_pubkeys = 1; - basilisk_rawtx_setparms("bobreclaim",myinfo,swap,&swap->bobreclaim,swap->bobcoin,swap->I.bobconfirms,3,swap->I.bobsatoshis,1,bobpub33); + basilisk_rawtx_setparms("bobreclaim",swap,&swap->bobreclaim,swap->bobcoin,swap->I.bobconfirms,3,swap->I.bobsatoshis,1,bobpub33); swap->bobreclaim.I.suppress_pubkeys = 1; swap->bobreclaim.I.locktime = swap->I.started + swap->I.putduration + 1; - basilisk_rawtx_setparms("alicepayment",myinfo,swap,&swap->alicepayment,swap->alicecoin,swap->I.aliceconfirms,0,swap->I.alicesatoshis+swap->alicecoin->txfee,2,0); - basilisk_rawtx_setparms("bobspend",myinfo,swap,&swap->bobspend,swap->alicecoin,swap->I.aliceconfirms,2,swap->I.alicesatoshis,1,bobpub33); + basilisk_rawtx_setparms("alicepayment",swap,&swap->alicepayment,swap->alicecoin,swap->I.aliceconfirms,0,swap->I.alicesatoshis+swap->alicecoin->txfee,2,0); + basilisk_rawtx_setparms("bobspend",swap,&swap->bobspend,swap->alicecoin,swap->I.aliceconfirms,2,swap->I.alicesatoshis,1,bobpub33); swap->bobspend.I.suppress_pubkeys = 1; - basilisk_rawtx_setparms("alicereclaim",myinfo,swap,&swap->alicereclaim,swap->alicecoin,swap->I.aliceconfirms,2,swap->I.alicesatoshis,1,alicepub33); + basilisk_rawtx_setparms("alicereclaim",swap,&swap->alicereclaim,swap->alicecoin,swap->I.aliceconfirms,2,swap->I.alicesatoshis,1,alicepub33); swap->alicereclaim.I.suppress_pubkeys = 1; printf("IAMBOB.%d\n",swap->I.iambob); return(swap); @@ -1756,7 +1756,7 @@ cJSON *swapjson(struct supernet_info *myinfo,struct basilisk_swap *swap) void basilisk_swaploop(void *_swap) { uint8_t *data; uint32_t expiration; uint32_t channel; int32_t retval=0,i,j,datalen,maxlen; struct supernet_info *myinfo; struct basilisk_swap *swap = _swap; - myinfo = swap->myinfo; + myinfo = &swap->myinfo; fprintf(stderr,"start swap\n"); maxlen = 1024*1024 + sizeof(*swap); data = malloc(maxlen); @@ -1933,9 +1933,9 @@ void basilisk_swaploop(void *_swap) free(data); } -struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,struct basilisk_request *rp,uint32_t statebits,int32_t optionduration) +struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *rp,uint32_t statebits,int32_t optionduration) { - int32_t i,m,n; uint32_t channel,starttime; cJSON *retarray,*item,*msgobj; struct basilisk_swap *swap = 0; + int32_t i,m,n; uint8_t pubkey33[33]; bits256 pubkey25519; uint32_t channel,starttime; cJSON *retarray,*item,*msgobj; struct basilisk_swap *swap = 0; portable_mutex_lock(&myinfo->DEX_swapmutex); for (i=0; inumswaps; i++) if ( myinfo->swaps[i]->I.req.requestid == rp->requestid ) @@ -1949,9 +1949,15 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,struct swap = calloc(1,sizeof(*swap)); vcalc_sha256(0,swap->I.orderhash.bytes,(uint8_t *)rp,sizeof(*rp)); swap->I.req = *rp; - swap->myinfo = myinfo; + //swap->myinfo = myinfo; + swap->myinfo.ctx = myinfo->ctx; + bitcoin_pubkey33(myinfo->ctx,pubkey33,privkey); + pubkey25519 = curve25519(privkey,curve25519_basepoint9()); + swap->myinfo.persistent_priv = privkey; + swap->myinfo.myaddr.persistent = pubkey25519; + memcpy(swap->myinfo.persistent_pubkey33,pubkey33,33); m = n = 0; - if ( bitcoin_swapinit(myinfo,swap,optionduration) != 0 ) + if ( bitcoin_swapinit(myinfo->ctx,privkey,pubkey33,pubkey25519,swap,optionduration) != 0 ) { starttime = (uint32_t)time(NULL); printf("statebits.%x m.%d n.%d\n",statebits,m,n); diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 9f7e972c1..c09076a46 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -386,6 +386,7 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch jaddstr(vals,"dest","KMD"); jaddnum(vals,"amount",btcavail*.95); jaddnum(vals,"minprice",kmdprice*.95); + jaddnum(vals,"usejumblr",1); memset(hash.bytes,0,sizeof(hash)); pending = btcavail; if ( (retstr= InstantDEX_request(myinfo,coinbtc,0,0,hash,vals,"")) != 0 ) diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 89d25f734..e724e828b 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -152,6 +152,17 @@ struct supernet_info uint8_t notaries[64][33]; int32_t numnotaries,DEXEXPLORER; }; +struct basilisk_swap +{ + struct supernet_info myinfo; struct iguana_info *bobcoin,*alicecoin; + void (*balancingtrade)(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t iambob); + struct basilisk_swapinfo I; + struct basilisk_rawtx bobdeposit,bobpayment,alicepayment,myfee,otherfee,aliceclaim,alicespend,bobreclaim,bobspend,bobrefund,alicereclaim; + bits256 privkeys[INSTANTDEX_DECKSIZE]; + uint64_t otherdeck[INSTANTDEX_DECKSIZE][2],deck[INSTANTDEX_DECKSIZE][2]; + uint8_t verifybuf[65536]; +}; + #include "../includes/iguana_funcs.h" #include "../includes/iguana_globals.h" #include "../gecko/gecko.h" diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index 7d8e3b679..dffa53ed0 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -595,7 +595,7 @@ int32_t iguana_scriptdata(struct iguana_info *coin,uint8_t *scriptspace,long fil void basilisk_ensurerelay(struct supernet_info *myinfo,struct iguana_info *notaries,uint32_t ipbits); void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr); int32_t iguana_datachain_scan(struct supernet_info *myinfo,struct iguana_info *coin,uint8_t rmd160[20]); -void basilisk_requests_poll(struct supernet_info *myinfo); +void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey); void iguana_RTreset(struct iguana_info *coin); void iguana_RTpurge(struct iguana_info *coin,int32_t lastheight); From 59fa0eabf596cfbb1016cfa620e152cc00406f95 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 19:16:42 +0200 Subject: [PATCH 307/495] Test --- basilisk/basilisk_swap.c | 246 +++++++++++++++++++-------------------- basilisk/jumblr.c | 2 +- 2 files changed, 124 insertions(+), 124 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index b9f785887..67bd43ae6 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -291,7 +291,7 @@ bits256 basilisk_swap_broadcast(char *name,struct supernet_info *myinfo,struct b #endif signedtx = malloc(datalen*2 + 1); init_hexbytes_noT(signedtx,data,datalen); - if ( (retstr= basilisk_sendrawtransaction(myinfo,coin,signedtx)) != 0 ) + if ( (retstr= basilisk_sendrawtransaction(&swap->myinfo,coin,signedtx)) != 0 ) { if ( is_hexstr(retstr,0) == 64 ) { @@ -371,11 +371,11 @@ int32_t basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,struct b jadd(txobj,"vin",vins); //printf("basilisk_rawtx_sign locktime.%u/%u for %s spendscript.%s -> %s, suppress.%d\n",rawtx->locktime,dest->locktime,rawtx->name,hexstr,dest->name,dest->suppress_pubkeys); txobj = bitcoin_txoutput(txobj,dest->spendscript,dest->I.spendlen,dest->I.amount); - if ( (rawtxbytes= bitcoin_json2hex(myinfo,rawtx->coin,&dest->I.txid,txobj,V)) != 0 ) + if ( (rawtxbytes= bitcoin_json2hex(&swap->myinfo,rawtx->coin,&dest->I.txid,txobj,V)) != 0 ) { if ( needsig == 0 ) signedtx = rawtxbytes; - if ( signedtx != 0 || (signedtx= iguana_signrawtx(myinfo,rawtx->coin,height,&dest->I.signedtxid,&dest->I.completed,vins,rawtxbytes,privkeys,V)) != 0 ) + if ( signedtx != 0 || (signedtx= iguana_signrawtx(&swap->myinfo,rawtx->coin,height,&dest->I.signedtxid,&dest->I.completed,vins,rawtxbytes,privkeys,V)) != 0 ) { dest->I.datalen = (int32_t)strlen(signedtx) >> 1; dest->txbytes = calloc(1,dest->I.datalen); @@ -410,7 +410,7 @@ int32_t basilisk_verify_otherfee(struct supernet_info *myinfo,void *ptr,uint8_t swap->otherfee.txbytes = calloc(1,datalen); memcpy(swap->otherfee.txbytes,data,datalen); swap->otherfee.I.actualtxid = swap->otherfee.I.signedtxid = bits256_doublesha256(0,data,datalen); - basilisk_txlog(myinfo,swap,&swap->otherfee,-1); + basilisk_txlog(&swap->myinfo,swap,&swap->otherfee,-1); return(0); } @@ -457,7 +457,7 @@ int32_t basilisk_rawtx_spendscript(struct supernet_info *myinfo,struct basilisk_ { decode_hex(rawtx->spendscript,hexlen,hexstr); rawtx->I.spendlen = hexlen; - basilisk_txlog(myinfo,swap,rawtx,-1); // bobdeposit, bobpayment or alicepayment + basilisk_txlog(&swap->myinfo,swap,rawtx,-1); // bobdeposit, bobpayment or alicepayment retval = 0; } } else printf("%s ERROR.(%s)\n",rawtx->name,jprint(txobj,0)); @@ -495,10 +495,10 @@ int32_t basilisk_swapuserdata(struct basilisk_swap *swap,uint8_t *userdata,bits2 int32_t basilisk_verify_bobdeposit(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) { uint8_t userdata[512]; int32_t i,retval,len = 0; static bits256 zero; struct basilisk_swap *swap = ptr; - if ( basilisk_rawtx_spendscript(myinfo,swap,swap->bobcoin->blocks.hwmchain.height,&swap->bobdeposit,0,data,datalen,0) == 0 ) + if ( basilisk_rawtx_spendscript(&swap->myinfo,swap,swap->bobcoin->blocks.hwmchain.height,&swap->bobdeposit,0,data,datalen,0) == 0 ) { len = basilisk_swapuserdata(swap,userdata,zero,1,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); - if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->aliceclaim,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) + if ( (retval= basilisk_rawtx_sign(&swap->myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->aliceclaim,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) { for (i=0; ibobdeposit.I.datalen; i++) printf("%02x",swap->bobdeposit.txbytes[i]); @@ -506,7 +506,7 @@ int32_t basilisk_verify_bobdeposit(struct supernet_info *myinfo,void *ptr,uint8_ for (i=0; ialiceclaim.I.datalen; i++) printf("%02x",swap->aliceclaim.txbytes[i]); printf(" <- aliceclaim\n"); - basilisk_txlog(myinfo,swap,&swap->aliceclaim,swap->I.putduration+swap->I.callduration); + basilisk_txlog(&swap->myinfo,swap,&swap->aliceclaim,swap->I.putduration+swap->I.callduration); return(retval); } } @@ -518,12 +518,12 @@ int32_t basilisk_bobdeposit_refund(struct supernet_info *myinfo,struct basilisk_ { uint8_t userdata[512]; int32_t i,retval,len = 0; char str[65]; len = basilisk_swapuserdata(swap,userdata,swap->I.privBn,0,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); - if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->bobrefund,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,0)) == 0 ) + if ( (retval= basilisk_rawtx_sign(&swap->myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->bobrefund,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,0)) == 0 ) { for (i=0; ibobrefund.I.datalen; i++) printf("%02x",swap->bobrefund.txbytes[i]); printf(" <- bobrefund.(%s)\n",bits256_str(str,swap->bobrefund.I.txid)); - basilisk_txlog(myinfo,swap,&swap->bobrefund,delay); + basilisk_txlog(&swap->myinfo,swap,&swap->bobrefund,delay); return(retval); } return(-1); @@ -541,12 +541,12 @@ int32_t basilisk_bobpayment_reclaim(struct supernet_info *myinfo,struct basilisk uint8_t userdata[512]; int32_t i,retval,len = 0; static bits256 zero; printf("basilisk_bobpayment_reclaim\n"); len = basilisk_swapuserdata(swap,userdata,zero,1,swap->I.myprivs[1],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); - if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->bobreclaim,&swap->bobpayment,swap->I.myprivs[1],0,userdata,len,1)) == 0 ) + if ( (retval= basilisk_rawtx_sign(&swap->myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->bobreclaim,&swap->bobpayment,swap->I.myprivs[1],0,userdata,len,1)) == 0 ) { for (i=0; ibobreclaim.I.datalen; i++) printf("%02x",swap->bobreclaim.txbytes[i]); printf(" <- bobreclaim\n"); - basilisk_txlog(myinfo,swap,&swap->bobreclaim,delay); + basilisk_txlog(&swap->myinfo,swap,&swap->bobreclaim,delay); return(retval); } return(-1); @@ -556,13 +556,13 @@ int32_t basilisk_verify_bobpaid(struct supernet_info *myinfo,void *ptr,uint8_t * { uint8_t userdata[512]; int32_t i,retval,len = 0; bits256 revAm; struct basilisk_swap *swap = ptr; memset(revAm.bytes,0,sizeof(revAm)); - if ( basilisk_rawtx_spendscript(myinfo,swap,swap->bobcoin->blocks.hwmchain.height,&swap->bobpayment,0,data,datalen,0) == 0 ) + if ( basilisk_rawtx_spendscript(&swap->myinfo,swap,swap->bobcoin->blocks.hwmchain.height,&swap->bobpayment,0,data,datalen,0) == 0 ) { for (i=0; i<32; i++) revAm.bytes[i] = swap->I.privAm.bytes[31-i]; len = basilisk_swapuserdata(swap,userdata,revAm,0,swap->I.myprivs[0],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); char str[65]; printf("bobpaid.(%s)\n",bits256_str(str,swap->I.privAm)); - if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->alicespend,&swap->bobpayment,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) + if ( (retval= basilisk_rawtx_sign(&swap->myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->alicespend,&swap->bobpayment,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) { for (i=0; ibobpayment.I.datalen; i++) printf("%02x",swap->bobpayment.txbytes[i]); @@ -571,7 +571,7 @@ int32_t basilisk_verify_bobpaid(struct supernet_info *myinfo,void *ptr,uint8_t * printf("%02x",swap->alicespend.txbytes[i]); printf(" <- alicespend\n\n"); swap->I.alicespent = 1; - basilisk_txlog(myinfo,swap,&swap->alicespend,-1); + basilisk_txlog(&swap->myinfo,swap,&swap->alicespend,-1); return(retval); } } @@ -583,13 +583,13 @@ int32_t basilisk_alicepayment_spend(struct supernet_info *myinfo,struct basilisk int32_t i,retval; //printf("alicepayment_spend\n"); swap->alicepayment.I.spendlen = basilisk_alicescript(swap->alicepayment.redeemscript,&swap->alicepayment.I.redeemlen,swap->alicepayment.spendscript,0,swap->alicepayment.I.destaddr,swap->alicecoin->chain->p2shtype,swap->I.pubAm,swap->I.pubBn); - if ( (retval= basilisk_rawtx_sign(myinfo,swap->alicecoin->blocks.hwmchain.height,swap,dest,&swap->alicepayment,swap->I.privAm,&swap->I.privBn,0,0,1)) == 0 ) + if ( (retval= basilisk_rawtx_sign(&swap->myinfo,swap->alicecoin->blocks.hwmchain.height,swap,dest,&swap->alicepayment,swap->I.privAm,&swap->I.privBn,0,0,1)) == 0 ) { for (i=0; iI.datalen; i++) printf("%02x",dest->txbytes[i]); printf(" <- msigspend\n\n"); swap->I.bobspent = 1; - basilisk_txlog(myinfo,swap,dest,0); // bobspend or alicereclaim + basilisk_txlog(&swap->myinfo,swap,dest,0); // bobspend or alicereclaim return(retval); } return(-1); @@ -598,7 +598,7 @@ int32_t basilisk_alicepayment_spend(struct supernet_info *myinfo,struct basilisk int32_t basilisk_verify_alicepaid(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) { struct basilisk_swap *swap = ptr; - if ( basilisk_rawtx_spendscript(myinfo,swap,swap->alicecoin->blocks.hwmchain.height,&swap->alicepayment,0,data,datalen,0) == 0 ) + if ( basilisk_rawtx_spendscript(&swap->myinfo,swap,swap->alicecoin->blocks.hwmchain.height,&swap->alicepayment,0,data,datalen,0) == 0 ) return(0); else return(-1); } @@ -726,7 +726,7 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,struct basilis rawtx->I.locktime = locktime; //printf("%s locktime.%u\n",rawtx->name,locktime); V = calloc(256,sizeof(*V)); - if ( (retstr= basilisk_bitcoinrawtx(myinfo,rawtx->coin,"",basilisktag,jint(valsobj,"timeout"),valsobj,V)) != 0 ) + if ( (retstr= basilisk_bitcoinrawtx(&swap->myinfo,rawtx->coin,"",basilisktag,jint(valsobj,"timeout"),valsobj,V)) != 0 ) { //printf("%s %s basilisk_bitcoinrawtx.(%s)\n",rawtx->name,str,retstr); flag = 0; @@ -737,7 +737,7 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,struct basilis n = cJSON_GetArraySize(retarray); for (i=0; icoin->blocks.hwmchain.height,rawtx,jitem(retarray,i),lockinputs,V)) == 0 ) + if ( (retval= basilisk_rawtx_return(&swap->myinfo,rawtx->coin->blocks.hwmchain.height,rawtx,jitem(retarray,i),lockinputs,V)) == 0 ) { rawtx->vins = jobj(jitem(retarray,i),"vins"); break; @@ -746,7 +746,7 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,struct basilis } else { - retval = basilisk_rawtx_return(myinfo,rawtx->coin->blocks.hwmchain.height,rawtx,retarray,lockinputs,V); + retval = basilisk_rawtx_return(&swap->myinfo,rawtx->coin->blocks.hwmchain.height,rawtx,retarray,lockinputs,V); rawtx->vins = jobj(retarray,"vins"); } free(retarray); @@ -790,8 +790,8 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa // printf("%02x",swap->bobpayment.redeemscript[j]); //printf(" <- redeem.%d\n",swap->bobpayment.redeemlen); printf(" <- GENERATED BOB PAYMENT.%d\n",swap->bobpayment.I.datalen); - iguana_unspents_mark(myinfo,swap->bobcoin,swap->bobpayment.vins); - basilisk_bobpayment_reclaim(myinfo,swap,swap->I.callduration); + iguana_unspents_mark(&swap->myinfo,swap->bobcoin,swap->bobpayment.vins); + basilisk_bobpayment_reclaim(&swap->myinfo,swap,swap->I.callduration); printf("bobscripts set completed\n"); return(0); } @@ -823,8 +823,8 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa // printf("%02x",swap->bobdeposit.redeemscript[j]); //printf(" <- redeem.%d\n",swap->bobdeposit.redeemlen); //printf("GENERATED BOB DEPOSIT\n"); - iguana_unspents_mark(myinfo,swap->bobcoin,swap->bobdeposit.vins); - basilisk_bobdeposit_refund(myinfo,swap,swap->I.putduration); + iguana_unspents_mark(&swap->myinfo,swap->bobcoin,swap->bobdeposit.vins); + basilisk_bobdeposit_refund(&swap->myinfo,swap,swap->I.putduration); printf("bobscripts set completed\n"); return(0); } @@ -856,7 +856,7 @@ int32_t basilisk_verify_privi(struct supernet_info *myinfo,void *ptr,uint8_t *da swap->I.privAm = privkey; vcalc_sha256(0,swap->I.secretAm256,privkey.bytes,sizeof(privkey)); printf("set privAm.%s %s\n",bits256_str(str,swap->I.privAm),bits256_str(str2,*(bits256 *)swap->I.secretAm256)); - basilisk_bobscripts_set(myinfo,swap,0,1); + basilisk_bobscripts_set(&swap->myinfo,swap,0,1); } else { @@ -875,19 +875,19 @@ int32_t basilisk_process_swapverify(struct supernet_info *myinfo,void *ptr,int32 { struct basilisk_swap *swap = ptr; if ( internal_func != 0 ) - return((*internal_func)(myinfo,swap,data,datalen)); + return((*internal_func)(&swap->myinfo,swap,data,datalen)); else return(0); } int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,int32_t (*basilisk_verify_func)(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen)) { int32_t datalen; uint32_t crc; - if ( (crc= basilisk_crcrecv(myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),&datalen,swap->I.otherhash,swap->I.myhash,swap->I.req.quoteid,msgbits)) != 0 ) + if ( (crc= basilisk_crcrecv(&swap->myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),&datalen,swap->I.otherhash,swap->I.myhash,swap->I.req.quoteid,msgbits)) != 0 ) { if ( datalen > 0 && datalen < maxlen ) { memcpy(data,swap->verifybuf,datalen); - return((*basilisk_verify_func)(myinfo,swap,data,datalen)); + return((*basilisk_verify_func)(&swap->myinfo,swap,data,datalen)); } } return(-1); @@ -896,10 +896,10 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t datalen,uint32_t nextbits,uint32_t crcs[2]) { //if ( (rand() % 10) == 0 ) - // basilisk_channelsend(myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,INSTANTDEX_LOCKTIME*2); - //if ( basilisk_crcsend(myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,crcs) != 0 ) + // basilisk_channelsend(&swap->myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,INSTANTDEX_LOCKTIME*2); + //if ( basilisk_crcsend(&swap->myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,crcs) != 0 ) //return(nextbits); - dex_channelsend(myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen); //INSTANTDEX_LOCKTIME*2 + dex_channelsend(&swap->myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen); //INSTANTDEX_LOCKTIME*2 return(0); } @@ -927,16 +927,16 @@ int32_t basilisk_priviextract(struct supernet_info *myinfo,struct iguana_info *c int32_t basilisk_privBn_extract(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { - if ( basilisk_priviextract(myinfo,swap->bobcoin,"privBn",&swap->I.privBn,swap->I.secretBn,swap->bobrefund.I.actualtxid,0) == 0 ) + if ( basilisk_priviextract(&swap->myinfo,swap->bobcoin,"privBn",&swap->I.privBn,swap->I.secretBn,swap->bobrefund.I.actualtxid,0) == 0 ) { } - if ( basilisk_swapget(myinfo,swap,0x40000000,data,maxlen,basilisk_verify_privi) == 0 ) + if ( basilisk_swapget(&swap->myinfo,swap,0x40000000,data,maxlen,basilisk_verify_privi) == 0 ) { if ( bits256_nonz(swap->I.privBn) != 0 && swap->alicereclaim.txbytes == 0 ) { char str[65]; printf("have privBn.%s\n",bits256_str(str,swap->I.privBn)); - return(basilisk_alicepayment_spend(myinfo,swap,&swap->alicereclaim)); + return(basilisk_alicepayment_spend(&swap->myinfo,swap,&swap->alicereclaim)); } } return(-1); @@ -944,14 +944,14 @@ int32_t basilisk_privBn_extract(struct supernet_info *myinfo,struct basilisk_swa int32_t basilisk_privAm_extract(struct supernet_info *myinfo,struct basilisk_swap *swap) { - if ( basilisk_priviextract(myinfo,swap->bobcoin,"privAm",&swap->I.privAm,swap->I.secretAm,swap->bobpayment.I.actualtxid,0) == 0 ) + if ( basilisk_priviextract(&swap->myinfo,swap->bobcoin,"privAm",&swap->I.privAm,swap->I.secretAm,swap->bobpayment.I.actualtxid,0) == 0 ) { } if ( bits256_nonz(swap->I.privAm) != 0 && swap->bobspend.txbytes == 0 ) { char str[65]; printf("have privAm.%s\n",bits256_str(str,swap->I.privAm)); - return(basilisk_alicepayment_spend(myinfo,swap,&swap->bobspend)); + return(basilisk_alicepayment_spend(&swap->myinfo,swap,&swap->bobspend)); } return(-1); } @@ -1266,7 +1266,7 @@ void basilisk_swap_purge(struct supernet_info *myinfo,struct basilisk_swap *swap { myinfo->swaps[i] = myinfo->swaps[--myinfo->numswaps]; myinfo->swaps[myinfo->numswaps] = 0; - basilisk_swap_finished(myinfo,swap); + basilisk_swap_finished(&swap->myinfo,swap); break; } portable_mutex_unlock(&myinfo->DEX_swapmutex); @@ -1358,7 +1358,7 @@ int32_t basilisk_verify_privkeys(struct supernet_info *myinfo,void *ptr,uint8_t swap->I.secretAm[i] = data[len++]; for (i=0; i<32; i++) swap->I.secretAm256[i] = data[len++]; - basilisk_bobscripts_set(myinfo,swap,1,1); + basilisk_bobscripts_set(&swap->myinfo,swap,1,1); } else { @@ -1368,7 +1368,7 @@ int32_t basilisk_verify_privkeys(struct supernet_info *myinfo,void *ptr,uint8_t swap->I.secretBn[i] = data[len++]; for (i=0; i<32; i++) swap->I.secretBn256[i] = data[len++]; - //basilisk_bobscripts_set(myinfo,swap,0); + //basilisk_bobscripts_set(&swap->myinfo,swap,0); } } else printf("failed verification: wrong firstbyte.%d errs.%d\n",wrongfirstbyte,errs); } @@ -1379,7 +1379,7 @@ int32_t basilisk_verify_privkeys(struct supernet_info *myinfo,void *ptr,uint8_t uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,struct basilisk_rawtx *rawtx,uint32_t nextbits) { uint8_t sendbuf[32768]; int32_t sendlen; - if ( basilisk_swapdata_rawtx(myinfo,swap,data,maxlen,rawtx) != 0 ) + if ( basilisk_swapdata_rawtx(&swap->myinfo,swap,data,maxlen,rawtx) != 0 ) { if ( bits256_nonz(rawtx->I.signedtxid) != 0 && bits256_nonz(rawtx->I.actualtxid) == 0 ) { @@ -1400,7 +1400,7 @@ uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilis sendlen += rawtx->I.redeemlen; } //printf("sendlen.%d datalen.%d redeemlen.%d\n",sendlen,rawtx->datalen,rawtx->redeemlen); - return(basilisk_swapsend(myinfo,swap,msgbits,sendbuf,sendlen,nextbits,rawtx->I.crcs)); + return(basilisk_swapsend(&swap->myinfo,swap,msgbits,sendbuf,sendlen,nextbits,rawtx->I.crcs)); } } return(nextbits); @@ -1411,9 +1411,9 @@ uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilis void basilisk_sendpubkeys(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { int32_t datalen; - datalen = basilisk_swapdata_deck(myinfo,swap,data,maxlen); + datalen = basilisk_swapdata_deck(&swap->myinfo,swap,data,maxlen); //printf("send deck.%d\n",datalen); - swap->I.statebits |= basilisk_swapsend(myinfo,swap,0x02,data,datalen,0x01,swap->I.crcs_mypub); + swap->I.statebits |= basilisk_swapsend(&swap->myinfo,swap,0x02,data,datalen,0x01,swap->I.crcs_mypub); } int32_t basilisk_checkdeck(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) @@ -1421,7 +1421,7 @@ int32_t basilisk_checkdeck(struct supernet_info *myinfo,struct basilisk_swap *sw if ( (swap->I.statebits & 0x02) == 0 ) { //printf("check for other deck\n"); - if ( basilisk_swapget(myinfo,swap,0x02,data,maxlen,basilisk_verify_otherdeck) == 0 ) + if ( basilisk_swapget(&swap->myinfo,swap,0x02,data,maxlen,basilisk_verify_otherdeck) == 0 ) swap->I.statebits |= 0x02; else return(-1); } @@ -1432,7 +1432,7 @@ void basilisk_sendstate(struct supernet_info *myinfo,struct basilisk_swap *swap, { int32_t datalen; datalen = iguana_rwnum(1,data,sizeof(swap->I.statebits),&swap->I.statebits); - basilisk_swapsend(myinfo,swap,0x80000000,data,datalen,0,0); + basilisk_swapsend(&swap->myinfo,swap,0x80000000,data,datalen,0,0); } void basilisk_sendchoosei(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) @@ -1455,14 +1455,14 @@ void basilisk_sendchoosei(struct supernet_info *myinfo,struct basilisk_swap *swa data[datalen++] = swap->I.pubA1.bytes[i]; printf("SEND pubA0/1 %s\n",bits256_str(str,swap->I.pubA0)); } - swap->I.statebits |= basilisk_swapsend(myinfo,swap,0x08,data,datalen,0x04,swap->I.crcs_mychoosei); + swap->I.statebits |= basilisk_swapsend(&swap->myinfo,swap,0x08,data,datalen,0x04,swap->I.crcs_mychoosei); } void basilisk_waitchoosei(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { uint8_t pubkey33[33]; //char str[65],str2[65]; //printf("check otherchoosei\n"); - if ( basilisk_swapget(myinfo,swap,0x08,data,maxlen,basilisk_verify_choosei) == 0 ) + if ( basilisk_swapget(&swap->myinfo,swap,0x08,data,maxlen,basilisk_verify_choosei) == 0 ) { if ( swap->I.iambob != 0 ) { @@ -1474,7 +1474,7 @@ void basilisk_waitchoosei(struct supernet_info *myinfo,struct basilisk_swap *swa vcalc_sha256(0,swap->I.secretBn256,swap->I.privBn.bytes,sizeof(swap->I.privBn)); swap->I.pubBn = bitcoin_pubkey33(myinfo->ctx,pubkey33,swap->I.privBn); //printf("set privBn.%s %s\n",bits256_str(str,swap->privBn),bits256_str(str2,*(bits256 *)swap->secretBn256)); - basilisk_bobscripts_set(myinfo,swap,1,1); + basilisk_bobscripts_set(&swap->myinfo,swap,1,1); } } else @@ -1487,7 +1487,7 @@ void basilisk_waitchoosei(struct supernet_info *myinfo,struct basilisk_swap *swa vcalc_sha256(0,swap->I.secretAm256,swap->I.privAm.bytes,sizeof(swap->I.privAm)); swap->I.pubAm = bitcoin_pubkey33(myinfo->ctx,pubkey33,swap->I.privAm); //printf("set privAm.%s %s\n",bits256_str(str,swap->privAm),bits256_str(str2,*(bits256 *)swap->secretAm256)); - //basilisk_bobscripts_set(myinfo,swap,0); + //basilisk_bobscripts_set(&swap->myinfo,swap,0); } } swap->I.statebits |= 0x08; @@ -1522,7 +1522,7 @@ void basilisk_sendmostprivs(struct supernet_info *myinfo,struct basilisk_swap *s data[datalen++] = swap->I.secretAm256[i]; } //printf("send privkeys.%d\n",datalen); - swap->I.statebits |= basilisk_swapsend(myinfo,swap,0x20,data,datalen,0x10,swap->I.crcs_myprivs); + swap->I.statebits |= basilisk_swapsend(&swap->myinfo,swap,0x20,data,datalen,0x10,swap->I.crcs_myprivs); } void basilisk_alicepayment(struct supernet_info *myinfo,struct basilisk_swap *swap,struct iguana_info *coin,struct basilisk_rawtx *alicepayment,bits256 pubAm,bits256 pubBn) @@ -1539,22 +1539,22 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap printf("D r%u/q%u swapstate.%x otherstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits,swap->I.otherstatebits); if ( (swap->I.statebits & 0x80) == 0 ) // wait for fee { - if ( basilisk_swapget(myinfo,swap,0x80,data,maxlen,basilisk_verify_otherfee) == 0 ) + if ( basilisk_swapget(&swap->myinfo,swap,0x80,data,maxlen,basilisk_verify_otherfee) == 0 ) { // verify and submit otherfee swap->I.statebits |= 0x80; - basilisk_sendstate(myinfo,swap,data,maxlen); + basilisk_sendstate(&swap->myinfo,swap,data,maxlen); } } - basilisk_sendstate(myinfo,swap,data,maxlen); - basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); + basilisk_sendstate(&swap->myinfo,swap,data,maxlen); + basilisk_swapget(&swap->myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); if ( (swap->I.otherstatebits & 0x80) != 0 && (swap->I.statebits & 0x80) != 0 ) break; sleep(3 + (swap->I.iambob == 0)*1); - basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); - basilisk_sendstate(myinfo,swap,data,maxlen); + basilisk_swapget(&swap->myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); + basilisk_sendstate(&swap->myinfo,swap,data,maxlen); if ( (swap->I.otherstatebits & 0x80) == 0 ) - basilisk_swapdata_rawtxsend(myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40); + basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40); } while ( retval == 0 && time(NULL) < swap->I.expiration ) // both sides have setup required data and paid txfee { @@ -1566,13 +1566,13 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap if ( (swap->I.statebits & 0x100) == 0 ) { printf("send bobdeposit\n"); - swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x200,data,maxlen,&swap->bobdeposit,0x100); + swap->I.statebits |= basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0x200,data,maxlen,&swap->bobdeposit,0x100); } // [BLOCKING: altfound] make sure altpayment is confirmed and send payment else if ( (swap->I.statebits & 0x1000) == 0 ) { printf("check alicepayment\n"); - if ( basilisk_swapget(myinfo,swap,0x1000,data,maxlen,basilisk_verify_alicepaid) == 0 ) + if ( basilisk_swapget(&swap->myinfo,swap,0x1000,data,maxlen,basilisk_verify_alicepaid) == 0 ) { swap->I.statebits |= 0x1000; printf("got alicepayment\n"); @@ -1580,7 +1580,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap } else if ( (swap->I.statebits & 0x2000) == 0 ) { - if ( basilisk_numconfirms(myinfo,&swap->alicepayment) >= swap->I.aliceconfirms ) + if ( basilisk_numconfirms(&swap->myinfo,&swap->alicepayment) >= swap->I.aliceconfirms ) { swap->I.statebits |= 0x2000; printf("alicepayment confirmed\n"); @@ -1588,25 +1588,25 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap } else if ( (swap->I.statebits & 0x4000) == 0 ) { - basilisk_bobscripts_set(myinfo,swap,0,1); + basilisk_bobscripts_set(&swap->myinfo,swap,0,1); printf("send bobpayment\n"); - swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x8000,data,maxlen,&swap->bobpayment,0x4000); + swap->I.statebits |= basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0x8000,data,maxlen,&swap->bobpayment,0x4000); } // [BLOCKING: privM] Bob waits for privAm either from Alice or alice blockchain else if ( (swap->I.statebits & 0x40000) == 0 ) { - if ( basilisk_swapget(myinfo,swap,0x40000,data,maxlen,basilisk_verify_privi) == 0 || basilisk_privAm_extract(myinfo,swap) == 0 ) // divulges privAm + if ( basilisk_swapget(&swap->myinfo,swap,0x40000,data,maxlen,basilisk_verify_privi) == 0 || basilisk_privAm_extract(&swap->myinfo,swap) == 0 ) // divulges privAm { printf("got privi spend alicepayment\n"); - basilisk_alicepayment_spend(myinfo,swap,&swap->bobspend); - if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobspend,0x40000) == 0 ) + basilisk_alicepayment_spend(&swap->myinfo,swap,&swap->bobspend); + if ( basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0,data,maxlen,&swap->bobspend,0x40000) == 0 ) printf("Bob error spending alice payment\n"); else { - tradebot_swap_balancingtrade(myinfo,swap,1); + tradebot_swap_balancingtrade(&swap->myinfo,swap,1); printf("Bob spends alicepayment\n"); swap->I.statebits |= 0x40000; - while ( basilisk_numconfirms(myinfo,&swap->bobspend) < swap->I.aliceconfirms ) + while ( basilisk_numconfirms(&swap->myinfo,&swap->bobspend) < swap->I.aliceconfirms ) { printf("bobspend confirmed\n"); swap->I.statebits |= 0x80000; @@ -1622,14 +1622,14 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap // submit reclaim of payment printf("bob reclaims bobpayment\n"); swap->I.statebits |= (0x40000 | 0x80000); - if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobreclaim,0) == 0 ) + if ( basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0,data,maxlen,&swap->bobreclaim,0) == 0 ) printf("Bob error reclaiming own payment after alice timed out\n"); else { printf("Bob reclaimed own payment\n"); while ( 0 && (swap->I.statebits & 0x100000) == 0 ) // why wait for own tx? { - if ( basilisk_numconfirms(myinfo,&swap->bobreclaim) >= 1 ) + if ( basilisk_numconfirms(&swap->myinfo,&swap->bobreclaim) >= 1 ) { printf("bobreclaim confirmed\n"); swap->I.statebits |= 0x100000; @@ -1648,7 +1648,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap if ( (swap->I.statebits & 0x200) == 0 ) { printf("checkfor deposit\n"); - if ( basilisk_swapget(myinfo,swap,0x200,data,maxlen,basilisk_verify_bobdeposit) == 0 ) + if ( basilisk_swapget(&swap->myinfo,swap,0x200,data,maxlen,basilisk_verify_bobdeposit) == 0 ) { // verify deposit and submit, set confirmed height printf("got bobdeposit\n"); @@ -1657,7 +1657,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap } else if ( (swap->I.statebits & 0x400) == 0 ) { - if ( basilisk_numconfirms(myinfo,&swap->bobdeposit) >= swap->I.bobconfirms ) + if ( basilisk_numconfirms(&swap->myinfo,&swap->bobdeposit) >= swap->I.bobconfirms ) { printf("bobdeposit confirmed\n"); swap->I.statebits |= 0x400; @@ -1666,22 +1666,22 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap else if ( (swap->I.statebits & 0x800) == 0 ) { printf("send alicepayment\n"); - swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x1000,data,maxlen,&swap->alicepayment,0x800); + swap->I.statebits |= basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0x1000,data,maxlen,&swap->alicepayment,0x800); } // [BLOCKING: payfound] make sure payment is confrmed and send in spend or see bob's reclaim and claim else if ( (swap->I.statebits & 0x8000) == 0 ) { - if ( basilisk_swapget(myinfo,swap,0x8000,data,maxlen,basilisk_verify_bobpaid) == 0 ) + if ( basilisk_swapget(&swap->myinfo,swap,0x8000,data,maxlen,basilisk_verify_bobpaid) == 0 ) { printf("got bobpayment\n"); - tradebot_swap_balancingtrade(myinfo,swap,0); + tradebot_swap_balancingtrade(&swap->myinfo,swap,0); // verify payment and submit, set confirmed height swap->I.statebits |= 0x8000; } } else if ( (swap->I.statebits & 0x10000) == 0 ) { - if ( basilisk_numconfirms(myinfo,&swap->bobpayment) >= swap->I.bobconfirms ) + if ( basilisk_numconfirms(&swap->myinfo,&swap->bobpayment) >= swap->I.bobconfirms ) { printf("bobpayment confirmed\n"); swap->I.statebits |= 0x10000; @@ -1690,17 +1690,17 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap else if ( (swap->I.statebits & 0x20000) == 0 ) { printf("alicespend bobpayment\n"); - if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->alicespend,0x20000) != 0 && basilisk_numconfirms(myinfo,&swap->alicespend) > 0 ) + if ( basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0,data,maxlen,&swap->alicespend,0x20000) != 0 && basilisk_numconfirms(&swap->myinfo,&swap->alicespend) > 0 ) { for (j=datalen=0; j<32; j++) data[datalen++] = swap->I.privAm.bytes[j]; printf("send privAm\n"); - swap->I.statebits |= basilisk_swapsend(myinfo,swap,0x40000,data,datalen,0x20000,swap->I.crcs_mypriv); + swap->I.statebits |= basilisk_swapsend(&swap->myinfo,swap,0x40000,data,datalen,0x20000,swap->I.crcs_mypriv); } } else if ( (swap->I.statebits & 0x40000) == 0 ) { - if ( basilisk_numconfirms(myinfo,&swap->alicespend) >= swap->I.bobconfirms ) + if ( basilisk_numconfirms(&swap->myinfo,&swap->alicespend) >= swap->I.bobconfirms ) { swap->I.statebits |= 0x40000; printf("Alice confirms spend of Bob's payment\n"); @@ -1710,7 +1710,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap if ( swap->bobdeposit.I.locktime != 0 && time(NULL) > swap->bobdeposit.I.locktime ) { printf("Alice claims deposit\n"); - if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->aliceclaim,0) == 0 ) + if ( basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0,data,maxlen,&swap->aliceclaim,0) == 0 ) printf("Alice couldnt claim deposit\n"); else { @@ -1718,11 +1718,11 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap retval = 1; } } - else if ( basilisk_privBn_extract(myinfo,swap,data,maxlen) == 0 ) + else if ( basilisk_privBn_extract(&swap->myinfo,swap,data,maxlen) == 0 ) { printf("Alice reclaims her payment\n"); swap->I.statebits |= 0x40000000; - if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->alicereclaim,0x40000000) == 0 ) + if ( basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0,data,maxlen,&swap->alicereclaim,0x40000000) == 0 ) printf("Alice error sending alicereclaim\n"); else { @@ -1734,8 +1734,8 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap if ( (rand() % 30) == 0 ) printf("finished swapstate.%x other.%x\n",swap->I.statebits,swap->I.otherstatebits); sleep(3 + (swap->I.iambob == 0)); - basilisk_sendstate(myinfo,swap,data,maxlen); - basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); + basilisk_sendstate(&swap->myinfo,swap,data,maxlen); + basilisk_swapget(&swap->myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); } return(retval); } @@ -1766,33 +1766,33 @@ void basilisk_swaploop(void *_swap) while ( (swap->I.statebits & (0x08|0x02)) != (0x08|0x02) && time(NULL) < expiration ) { printf("A r%u/q%u swapstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits); - //basilisk_channelsend(myinfo,swap->I.req.srchash,swap->I.req.desthash,channel,0x4000000,(void *)&swap->I.req.requestid,sizeof(swap->I.req.requestid),60); - dex_channelsend(myinfo,swap->I.req.srchash,swap->I.req.desthash,channel,0x4000000,(void *)&swap->I.req.requestid,sizeof(swap->I.req.requestid)); //,60); - basilisk_sendstate(myinfo,swap,data,maxlen); - basilisk_sendpubkeys(myinfo,swap,data,maxlen); // send pubkeys - if ( basilisk_checkdeck(myinfo,swap,data,maxlen) == 0) // check for other deck 0x02 - basilisk_sendchoosei(myinfo,swap,data,maxlen); - basilisk_waitchoosei(myinfo,swap,data,maxlen); // wait for choosei 0x08 + //basilisk_channelsend(&swap->myinfo,swap->I.req.srchash,swap->I.req.desthash,channel,0x4000000,(void *)&swap->I.req.requestid,sizeof(swap->I.req.requestid),60); + dex_channelsend(&swap->myinfo,swap->I.req.srchash,swap->I.req.desthash,channel,0x4000000,(void *)&swap->I.req.requestid,sizeof(swap->I.req.requestid)); //,60); + basilisk_sendstate(&swap->myinfo,swap,data,maxlen); + basilisk_sendpubkeys(&swap->myinfo,swap,data,maxlen); // send pubkeys + if ( basilisk_checkdeck(&swap->myinfo,swap,data,maxlen) == 0) // check for other deck 0x02 + basilisk_sendchoosei(&swap->myinfo,swap,data,maxlen); + basilisk_waitchoosei(&swap->myinfo,swap,data,maxlen); // wait for choosei 0x08 if ( (swap->I.statebits & (0x08|0x02)) == (0x08|0x02) ) break; sleep(1); - dpow_nanomsg_update(myinfo); - dex_updateclient(myinfo); + dpow_nanomsg_update(&swap->myinfo); + dex_updateclient(&swap->myinfo); } while ( (swap->I.statebits & 0x20) == 0 && time(NULL) < expiration ) { printf("B r%u/q%u swapstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits); - basilisk_sendstate(myinfo,swap,data,maxlen); - basilisk_sendchoosei(myinfo,swap,data,maxlen); - basilisk_sendmostprivs(myinfo,swap,data,maxlen); - if ( basilisk_swapget(myinfo,swap,0x20,data,maxlen,basilisk_verify_privkeys) == 0 ) + basilisk_sendstate(&swap->myinfo,swap,data,maxlen); + basilisk_sendchoosei(&swap->myinfo,swap,data,maxlen); + basilisk_sendmostprivs(&swap->myinfo,swap,data,maxlen); + if ( basilisk_swapget(&swap->myinfo,swap,0x20,data,maxlen,basilisk_verify_privkeys) == 0 ) { swap->I.statebits |= 0x20; break; } sleep(3 + (swap->I.iambob == 0)*1); - dpow_nanomsg_update(myinfo); - dex_updateclient(myinfo); + dpow_nanomsg_update(&swap->myinfo); + dex_updateclient(&swap->myinfo); } if ( time(NULL) >= expiration ) retval = -1; @@ -1800,12 +1800,12 @@ void basilisk_swaploop(void *_swap) printf("C r%u/q%u swapstate.%x retval.%d\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits,retval); while ( retval == 0 && (swap->I.statebits & 0x40) == 0 ) // send fee { - dpow_nanomsg_update(myinfo); - dex_updateclient(myinfo); + dpow_nanomsg_update(&swap->myinfo); + dex_updateclient(&swap->myinfo); printf("sendstate.%x\n",swap->I.statebits); - basilisk_sendstate(myinfo,swap,data,maxlen); + basilisk_sendstate(&swap->myinfo,swap,data,maxlen); printf("swapget\n"); - basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); + basilisk_swapget(&swap->myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); printf("after swapget\n"); if ( swap->myfee.txbytes == 0 ) { @@ -1839,11 +1839,11 @@ void basilisk_swaploop(void *_swap) for (i=0; i<32; i++) printf("%02x",swap->pubB1.bytes[i]); printf(" <- pubB1\n");*/ - basilisk_txlog(myinfo,swap,0,-1); + basilisk_txlog(&swap->myinfo,swap,0,-1); if ( swap->I.iambob != 0 ) { printf("bobscripts set\n"); - if ( basilisk_bobscripts_set(myinfo,swap,1,1) < 0 ) + if ( basilisk_bobscripts_set(&swap->myinfo,swap,1,1) < 0 ) { sleep(3); printf("bobscripts set error\n"); @@ -1856,7 +1856,7 @@ void basilisk_swaploop(void *_swap) { //if ( swap->alicepayment.txbytes != 0 && swap->alicepayment.I.spendlen != 0 ) // break; - basilisk_alicepayment(myinfo,swap,swap->alicepayment.coin,&swap->alicepayment,swap->I.pubAm,swap->I.pubBn); + basilisk_alicepayment(&swap->myinfo,swap,swap->alicepayment.coin,&swap->alicepayment,swap->I.pubAm,swap->I.pubBn); if ( swap->alicepayment.txbytes == 0 || swap->alicepayment.I.spendlen == 0 ) { printf("error alice generating payment.%d\n",swap->alicepayment.I.spendlen); @@ -1868,8 +1868,8 @@ void basilisk_swaploop(void *_swap) for (i=0; ialicepayment.I.spendlen; i++) printf("%02x",swap->alicepayment.txbytes[i]); printf(" ALICE PAYMENT created\n"); - iguana_unspents_mark(myinfo,swap->alicecoin,swap->alicepayment.vins); - basilisk_txlog(myinfo,swap,&swap->alicepayment,-1); + iguana_unspents_mark(&swap->myinfo,swap->alicecoin,swap->alicepayment.vins); + basilisk_txlog(&swap->myinfo,swap,&swap->alicepayment,-1); break; } } @@ -1878,9 +1878,9 @@ void basilisk_swaploop(void *_swap) if ( basilisk_rawtx_gen("myfee",myinfo,swap,swap->I.iambob,1,&swap->myfee,0,swap->myfee.spendscript,swap->myfee.I.spendlen,swap->myfee.coin->chain->txfee,1,0) == 0 ) { printf("done generate fee\n"); - swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40); - iguana_unspents_mark(myinfo,swap->I.iambob!=0?swap->bobcoin:swap->alicecoin,swap->myfee.vins); - basilisk_txlog(myinfo,swap,&swap->myfee,-1); + swap->I.statebits |= basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40); + iguana_unspents_mark(&swap->myinfo,swap->I.iambob!=0?swap->bobcoin:swap->alicecoin,swap->myfee.vins); + basilisk_txlog(&swap->myinfo,swap,&swap->myfee,-1); for (i=0; imyfee.I.spendlen; i++) printf("%02x",swap->myfee.txbytes[i]); printf(" fee %p %x\n",swap->myfee.txbytes,swap->I.statebits); @@ -1895,22 +1895,22 @@ void basilisk_swaploop(void *_swap) } } } - while ( basilisk_swapiteration(myinfo,swap,data,maxlen) == 0 ) + while ( basilisk_swapiteration(&swap->myinfo,swap,data,maxlen) == 0 ) { sleep(3); - basilisk_sendstate(myinfo,swap,data,maxlen); - basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); + basilisk_sendstate(&swap->myinfo,swap,data,maxlen); + basilisk_swapget(&swap->myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); if ( time(NULL) > swap->I.expiration ) break; - dpow_nanomsg_update(myinfo); - dex_updateclient(myinfo); + dpow_nanomsg_update(&swap->myinfo); + dex_updateclient(&swap->myinfo); } printf("end of atomic swap\n"); if ( swap->I.iambob != 0 && swap->bobdeposit.txbytes != 0 ) { printf("BOB reclaims refund\n"); - basilisk_bobdeposit_refund(myinfo,swap,0); - if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobrefund,0x40000000) == 0 ) // use secretBn + basilisk_bobdeposit_refund(&swap->myinfo,swap,0); + if ( basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0,data,maxlen,&swap->bobrefund,0x40000000) == 0 ) // use secretBn { printf("Bob submit error getting refund of deposit\n"); } @@ -1919,17 +1919,17 @@ void basilisk_swaploop(void *_swap) // maybe wait for bobrefund to be confirmed for (j=datalen=0; j<32; j++) data[datalen++] = swap->I.privBn.bytes[j]; - basilisk_swapsend(myinfo,swap,0x40000000,data,datalen,0x40000000,swap->I.crcs_mypriv); + basilisk_swapsend(&swap->myinfo,swap,0x40000000,data,datalen,0x40000000,swap->I.crcs_mypriv); } } - if ( swapcompleted(myinfo,swap) > 0 ) // only if swap completed + if ( swapcompleted(&swap->myinfo,swap) > 0 ) // only if swap completed { if ( swap->I.iambob != 0 ) - tradebot_pendingadd(myinfo,swapjson(myinfo,swap),swap->I.req.src,dstr(swap->I.req.srcamount),swap->I.req.dest,dstr(swap->I.req.destamount)); - else tradebot_pendingadd(myinfo,swapjson(myinfo,swap),swap->I.req.dest,dstr(swap->I.req.destamount),swap->I.req.src,dstr(swap->I.req.srcamount)); + tradebot_pendingadd(&swap->myinfo,swapjson(&swap->myinfo,swap),swap->I.req.src,dstr(swap->I.req.srcamount),swap->I.req.dest,dstr(swap->I.req.destamount)); + else tradebot_pendingadd(&swap->myinfo,swapjson(&swap->myinfo,swap),swap->I.req.dest,dstr(swap->I.req.destamount),swap->I.req.src,dstr(swap->I.req.srcamount)); } printf("%s swap finished statebits %x\n",swap->I.iambob!=0?"BOB":"ALICE",swap->I.statebits); - basilisk_swap_purge(myinfo,swap); + basilisk_swap_purge(&swap->myinfo,swap); free(data); } diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index c09076a46..2530a51b4 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -384,7 +384,7 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch vals = cJSON_CreateObject(); jaddstr(vals,"source","BTC"); jaddstr(vals,"dest","KMD"); - jaddnum(vals,"amount",btcavail*.95); + jaddnum(vals,"amount",btcavail*.85); jaddnum(vals,"minprice",kmdprice*.95); jaddnum(vals,"usejumblr",1); memset(hash.bytes,0,sizeof(hash)); From f512da63ae8e49d64433bd808fbe1f89ea7ac1bb Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 19:25:40 +0200 Subject: [PATCH 308/495] Test --- iguana/dpow/dpow_network.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 7cac5a7ea..3c24aca37 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -257,7 +257,7 @@ void dex_packet(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp,int32_t char *retstr; int32_t datalen; struct iguana_info *coin; struct dex_request dexreq; //for (i=0; ihandler,size,calc_crc32(0,dexp->packet,dexp->datalen),(int32_t)(time(NULL)-dexp->timestamp),dexp->size,dexp->datalen); + printf(" uniq.%s DEX_PACKET.[%d] crc.%x lag.%d (%d %d)\n",dexp->handler,size,calc_crc32(0,dexp->packet,dexp->datalen),(int32_t)(time(NULL)-dexp->timestamp),dexp->size,dexp->datalen); if ( strcmp(dexp->handler,"DEX") == 0 && dexp->datalen > BASILISK_KEYSIZE ) { if ( (retstr= basilisk_respond_addmessage(myinfo,dexp->packet,BASILISK_KEYSIZE,&dexp->packet[BASILISK_KEYSIZE],dexp->datalen-BASILISK_KEYSIZE,0,BASILISK_DEXDURATION)) != 0 ) @@ -306,7 +306,7 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 //prio = 8; //nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDPRIO,&prio,sizeof(prio)); //nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVPRIO,&prio,sizeof(prio)); - } + } if ( reqsock >= 0 ) { if ( myinfo->IAMNOTARY == 0 && subsock < 0 && (subsock= nn_socket(AF_SP,NN_SUB)) >= 0 ) @@ -368,7 +368,7 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 if ( nn_poll(&pfd,1,100) > 0 ) { sentbytes = nn_send(myinfo->reqsock,dexp,size,0); - //printf(" sent.%d:%d datalen.%d crc.%08x\n",sentbytes,size,datalen,calc_crc32(0,(void *)dexp,size)); + printf(" sent.%d:%d datalen.%d crc.%08x\n",sentbytes,size,datalen,calc_crc32(0,(void *)dexp,size)); break; } usleep(1000); From ba1b581f0c0ba939b39e9c28773311f7e321f159 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 19:31:24 +0200 Subject: [PATCH 309/495] Test --- iguana/dpow/dpow_network.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 3c24aca37..09af1a04c 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -257,9 +257,9 @@ void dex_packet(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp,int32_t char *retstr; int32_t datalen; struct iguana_info *coin; struct dex_request dexreq; //for (i=0; ihandler,size,calc_crc32(0,dexp->packet,dexp->datalen),(int32_t)(time(NULL)-dexp->timestamp),dexp->size,dexp->datalen); if ( strcmp(dexp->handler,"DEX") == 0 && dexp->datalen > BASILISK_KEYSIZE ) { + printf(" uniq.%s DEX_PACKET.[%d] crc.%x lag.%d (%d %d)\n",dexp->handler,size,calc_crc32(0,dexp->packet,dexp->datalen),(int32_t)(time(NULL)-dexp->timestamp),dexp->size,dexp->datalen); if ( (retstr= basilisk_respond_addmessage(myinfo,dexp->packet,BASILISK_KEYSIZE,&dexp->packet[BASILISK_KEYSIZE],dexp->datalen-BASILISK_KEYSIZE,0,BASILISK_DEXDURATION)) != 0 ) free(retstr); } From 3f25ae3c3c663227d2147136d35f7d9349e119f9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 19:33:59 +0200 Subject: [PATCH 310/495] Test --- iguana/dpow/dpow_network.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 09af1a04c..9a69085e5 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1091,7 +1091,7 @@ int32_t dex_packetcheck(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp if ( dexp->datalen == (size - sizeof(*dexp)) ) { crc32 = calc_crc32(0,dexp->packet,dexp->datalen);//(void *)((long)dexp + sizeof(dexp->crc32)),(int32_t)(size - sizeof(dexp->crc32))); - if ( dexp->crc32 == crc32 )//&& (firstz= dex_crc32find(myinfo,crc32)) >= 0 ) + if ( dexp->crc32 == crc32 && (firstz= dex_crc32find(myinfo,crc32)) >= 0 ) return(0); else printf("dexp %08x != %08x || firstz.%d < 0\n",dexp->crc32,crc32,firstz); } else printf("datalen.%d != (%d - %ld)\n",dexp->datalen,size,sizeof(*dexp)); From 383c4ae79a43391597c347e9d4a3d614ebe9f401 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 19:38:24 +0200 Subject: [PATCH 311/495] Test --- iguana/dpow/dpow_network.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 9a69085e5..e5d50a111 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1093,7 +1093,7 @@ int32_t dex_packetcheck(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp crc32 = calc_crc32(0,dexp->packet,dexp->datalen);//(void *)((long)dexp + sizeof(dexp->crc32)),(int32_t)(size - sizeof(dexp->crc32))); if ( dexp->crc32 == crc32 && (firstz= dex_crc32find(myinfo,crc32)) >= 0 ) return(0); - else printf("dexp %08x != %08x || firstz.%d < 0\n",dexp->crc32,crc32,firstz); + //else printf("dexp %08x != %08x || firstz.%d < 0\n",dexp->crc32,crc32,firstz); } else printf("datalen.%d != (%d - %ld)\n",dexp->datalen,size,sizeof(*dexp)); } return(-1); From 8c8b249f57f44cc8cf85bf5bdb34c8825f847c3b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 19:38:56 +0200 Subject: [PATCH 312/495] Test --- iguana/dpow/dpow_network.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index e5d50a111..d68b36283 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -2010,7 +2010,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); //printf("REP.%08x -> dexbus and pub, t.%d lag.%d\n",dexp->crc32,dexp->timestamp,(int32_t)(time(NULL)-dexp->timestamp)); dex_packet(myinfo,dexp,size); - } else printf("failed dexpacketcheck\n"); + } //else printf("failed dexpacketcheck\n"); } //printf("GOT DEX rep PACKET.%d\n",size); //if ( freeptr != 0 ) From b1087ee2106bc8ee9d328313a9f12dec88cd5f20 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 19:50:12 +0200 Subject: [PATCH 313/495] Test --- basilisk/basilisk_MSG.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index 4cf5b5f49..156cbef3d 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -217,7 +217,11 @@ char *basilisk_respond_addmessage(struct supernet_info *myinfo,uint8_t *key,int3 HASH_ADD_KEYPTR(hh,myinfo->messagetable,msg->key,msg->keylen,msg); QUEUEITEMS++; portable_mutex_unlock(&myinfo->messagemutex); -printf("add message keylen.%d [%d]\n",msg->keylen,datalen); + { + bits256 srchash,desthash; uint32_t channel,msgid; + basilisk_messagekeyread(key,&channel,&msgid,&srchash,&desthash); + printf("add message keylen.%d [%d] msgid.%x channel.%x\n",msg->keylen,datalen,msgid,channel); + } //if ( myinfo->NOTARY.RELAYID >= 0 ) // dpow_handler(myinfo,msg); if ( sendping != 0 ) From 973fa0bbe767d11cf3217e55c88cd1a121d1a1be Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 23:26:00 +0200 Subject: [PATCH 314/495] Test --- basilisk/basilisk_MSG.c | 12 +++++++++ basilisk/basilisk_swap.c | 51 +++++++++++++++++++++++++++++--------- basilisk/jumblr.c | 2 +- iguana/dPoW.h | 2 ++ iguana/dpow/dpow_network.c | 26 ++++++++++++++++--- iguana/main.c | 2 +- 6 files changed, 77 insertions(+), 18 deletions(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index 156cbef3d..4f7ccc9ab 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -263,6 +263,18 @@ char *basilisk_respond_MSG(struct supernet_info *myinfo,char *CMD,void *addr,cha return(retstr); } +cJSON *dpow_getmessage(struct supernet_info *myinfo,char *jsonstr) +{ + cJSON *valsobj,*retjson = 0; char *retstr; + if ( (valsobj= cJSON_Parse(jsonstr)) != 0 ) + { + retstr = basilisk_iterate_MSG(myinfo,juint(valsobj,"channel"),juint(valsobj,"msgid"),jbits256(valsobj,"srchash"),jbits256(valsobj,"desthash"),juint(valsobj,"width")); + retjson = cJSON_Parse(retstr); + free(retstr); + } + return(retjson); +} + #include "../includes/iguana_apidefs.h" #include "../includes/iguana_apideclares.h" diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 67bd43ae6..c94fa93d7 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -414,7 +414,7 @@ int32_t basilisk_verify_otherfee(struct supernet_info *myinfo,void *ptr,uint8_t return(0); } -int32_t basilisk_rawtx_spendscript(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t height,struct basilisk_rawtx *rawtx,int32_t v,uint8_t *recvbuf,int32_t recvlen,int32_t suppress_pubkeys) +int32_t basilisk_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct basilisk_rawtx *rawtx,int32_t v,uint8_t *recvbuf,int32_t recvlen,int32_t suppress_pubkeys) { int32_t datalen=0,retval=-1,hexlen,n; uint8_t *data; cJSON *txobj,*skey,*vouts,*vout; char *hexstr; datalen = recvbuf[0]; @@ -495,7 +495,7 @@ int32_t basilisk_swapuserdata(struct basilisk_swap *swap,uint8_t *userdata,bits2 int32_t basilisk_verify_bobdeposit(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) { uint8_t userdata[512]; int32_t i,retval,len = 0; static bits256 zero; struct basilisk_swap *swap = ptr; - if ( basilisk_rawtx_spendscript(&swap->myinfo,swap,swap->bobcoin->blocks.hwmchain.height,&swap->bobdeposit,0,data,datalen,0) == 0 ) + if ( basilisk_rawtx_spendscript(swap,swap->bobcoin->blocks.hwmchain.height,&swap->bobdeposit,0,data,datalen,0) == 0 ) { len = basilisk_swapuserdata(swap,userdata,zero,1,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); if ( (retval= basilisk_rawtx_sign(&swap->myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->aliceclaim,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) @@ -556,7 +556,7 @@ int32_t basilisk_verify_bobpaid(struct supernet_info *myinfo,void *ptr,uint8_t * { uint8_t userdata[512]; int32_t i,retval,len = 0; bits256 revAm; struct basilisk_swap *swap = ptr; memset(revAm.bytes,0,sizeof(revAm)); - if ( basilisk_rawtx_spendscript(&swap->myinfo,swap,swap->bobcoin->blocks.hwmchain.height,&swap->bobpayment,0,data,datalen,0) == 0 ) + if ( basilisk_rawtx_spendscript(swap,swap->bobcoin->blocks.hwmchain.height,&swap->bobpayment,0,data,datalen,0) == 0 ) { for (i=0; i<32; i++) revAm.bytes[i] = swap->I.privAm.bytes[31-i]; @@ -598,7 +598,7 @@ int32_t basilisk_alicepayment_spend(struct supernet_info *myinfo,struct basilisk int32_t basilisk_verify_alicepaid(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) { struct basilisk_swap *swap = ptr; - if ( basilisk_rawtx_spendscript(&swap->myinfo,swap,swap->alicecoin->blocks.hwmchain.height,&swap->alicepayment,0,data,datalen,0) == 0 ) + if ( basilisk_rawtx_spendscript(swap,swap->alicecoin->blocks.hwmchain.height,&swap->alicepayment,0,data,datalen,0) == 0 ) return(0); else return(-1); } @@ -881,16 +881,43 @@ int32_t basilisk_process_swapverify(struct supernet_info *myinfo,void *ptr,int32 int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,int32_t (*basilisk_verify_func)(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen)) { - int32_t datalen; uint32_t crc; - if ( (crc= basilisk_crcrecv(&swap->myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),&datalen,swap->I.otherhash,swap->I.myhash,swap->I.req.quoteid,msgbits)) != 0 ) - { - if ( datalen > 0 && datalen < maxlen ) + cJSON *valsobj,*array,*item; int32_t i,n,datalen,retval = -1; char *retstr,*hexstr=0; + //int32_t datalen; uint32_t crc; + //if ( (crc= basilisk_crcrecv(&swap->myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),&datalen,swap->I.otherhash,swap->I.myhash,swap->I.req.quoteid,msgbits)) != 0 ) + valsobj = cJSON_CreateObject(); + jaddnum(valsobj,"channel",swap->I.req.quoteid); + jaddnum(valsobj,"msgid",msgbits); + jaddbits256(valsobj,"srchash",swap->I.otherhash); + jaddbits256(valsobj,"desthash",swap->I.myhash); + jaddnum(valsobj,"width",0); + if ( (retstr= _dex_getmessage(myinfo,jprint(valsobj,1))) != 0 ) + { + if ( (array= cJSON_Parse(retstr)) != 0 ) { - memcpy(data,swap->verifybuf,datalen); - return((*basilisk_verify_func)(&swap->myinfo,swap,data,datalen)); + if ( (n= cJSON_GetArraySize(array)) > 0 ) + { + for (i=0; i> 1; + if ( datalen > 0 && datalen < maxlen ) + { + decode_hex(data,datalen,hexstr); + if ( (retval= (*basilisk_verify_func)(&swap->myinfo,swap,data,datalen)) == 0 ) + { + break; + } + } + } + } + } + free_json(array); } + free(retstr); } - return(-1); + return(retval); } uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t datalen,uint32_t nextbits,uint32_t crcs[2]) @@ -1949,7 +1976,7 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 swap = calloc(1,sizeof(*swap)); vcalc_sha256(0,swap->I.orderhash.bytes,(uint8_t *)rp,sizeof(*rp)); swap->I.req = *rp; - //swap->myinfo = myinfo; + swap->myinfo = *myinfo; swap->myinfo.ctx = myinfo->ctx; bitcoin_pubkey33(myinfo->ctx,pubkey33,privkey); pubkey25519 = curve25519(privkey,curve25519_basepoint9()); diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 2530a51b4..e1ffb7f58 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -413,7 +413,7 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 } fee = JUMBLR_INCR * JUMBLR_FEE; OS_randombytes(&r,sizeof(r)); -r = 0; +//r = 0; if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) { //printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); diff --git a/iguana/dPoW.h b/iguana/dPoW.h index e6e8f9d80..7ddef6ce3 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -167,6 +167,7 @@ char *dpow_alladdresses(struct supernet_info *myinfo,struct iguana_info *coin); cJSON *dpow_kvupdate(struct supernet_info *myinfo,struct iguana_info *coin,char *key,char *value,int32_t flags); cJSON *dpow_kvsearch(struct supernet_info *myinfo,struct iguana_info *coin,char *key); void init_alladdresses(struct supernet_info *myinfo,struct iguana_info *coin); +cJSON *dpow_getmessage(struct supernet_info *myinfo,char *jsonstr); char *_dex_getinfo(struct supernet_info *myinfo,char *symbol); char *_dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 txid); @@ -178,6 +179,7 @@ char *_dex_gettxout(struct supernet_info *myinfo,char *symbol,bits256 txid,int32 char *_dex_gettxin(struct supernet_info *myinfo,char *symbol,bits256 txid,int32_t vout); char *_dex_importaddress(struct supernet_info *myinfo,char *symbol,char *address); char *_dex_validateaddress(struct supernet_info *myinfo,char *symbol,char *address); +char *_dex_getmessage(struct supernet_info *myinfo,char *jsonstr); char *_dex_listunspent(struct supernet_info *myinfo,char *symbol,char *address); char *_dex_listunspent2(struct supernet_info *myinfo,char *symbol,char *address); char *_dex_listspent(struct supernet_info *myinfo,char *symbol,char *address); diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index d68b36283..87985e7d3 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -416,14 +416,14 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 printf("%d: subscribe connect (%s)\n",myinfo->numdexipbits,str); } } -//#ifndef __APPLE__ +#ifndef __APPLE__ if ( (rand() % 100) < 40 ) { nanomsg_tcpname(0,str,ipaddr,REP_SOCK); nn_connect(myinfo->reqsock,str); printf("%d: req connect (%s)\n",myinfo->numdexipbits,str); } -//#endif +#endif } } if ( freeptr != 0 ) @@ -644,6 +644,14 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d retstr = jprint(retjson,1); } } + else if ( dexreq.func == 'M' ) + { + if ( (retjson= dpow_getmessage(myinfo,(char *)&dexp->packet[datalen])) != 0 ) + { + dpow_randipbits(myinfo,coin,retjson); + retstr = jprint(retjson,1); + } + } else if ( dexreq.func == 'N' ) { uint8_t pubkeys[64][33]; char str[128]; int32_t numnotaries; cJSON *array,*item; @@ -993,6 +1001,15 @@ char *_dex_validateaddress(struct supernet_info *myinfo,char *symbol,char *addre return(_dex_sendrequeststr(myinfo,&dexreq,address,0,1,"")); } +char *_dex_getmessage(struct supernet_info *myinfo,char *jsonstr) +{ + struct dex_request dexreq; + memset(&dexreq,0,sizeof(dexreq)); + safecopy(dexreq.name,"KMD",sizeof(dexreq.name)); + dexreq.func = 'M'; + return(_dex_sendrequeststr(myinfo,&dexreq,jsonstr,0,1,"")); +} + char *_dex_listunspentarg(struct supernet_info *myinfo,char *symbol,char *address,uint8_t arg) { struct dex_request dexreq; char *retstr; @@ -1992,8 +2009,9 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) free(retstr); if ( broadcastflag != 0 ) { - //printf("BROADCAST dexp request.[%d]\n",size); + printf("BROADCAST dexp request.[%d]\n",size); signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->dexsock,dexp,size); + signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); } } else @@ -2007,7 +2025,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->dexsock,dexp,size); - signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); + //signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); //printf("REP.%08x -> dexbus and pub, t.%d lag.%d\n",dexp->crc32,dexp->timestamp,(int32_t)(time(NULL)-dexp->timestamp)); dex_packet(myinfo,dexp,size); } //else printf("failed dexpacketcheck\n"); diff --git a/iguana/main.c b/iguana/main.c index 55ca8824c..986764423 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -747,7 +747,7 @@ void iguana_urlinit(struct supernet_info *myinfo,int32_t ismainnet,int32_t usess void jumblr_loop(void *ptr) { - struct iguana_info *coin; uint32_t t; struct supernet_info *myinfo = ptr; int32_t mult = 1; + struct iguana_info *coin; uint32_t t; struct supernet_info *myinfo = ptr; int32_t mult = 10; printf("JUMBLR loop\n"); while ( 1 ) { From da18970c671c6f5676a4f8bdad2f85a83adf3aed Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 23:32:14 +0200 Subject: [PATCH 315/495] Test --- basilisk/basilisk_MSG.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index 4f7ccc9ab..cacf9f0e5 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -400,7 +400,10 @@ cJSON *basilisk_channelget(struct supernet_info *myinfo,bits256 srchash,bits256 jaddnum(valsobj,"numrequired",1); jaddbits256(valsobj,"srchash",srchash); jaddbits256(valsobj,"desthash",desthash); - if ( (retstr= basilisk_getmessage(myinfo,0,0,0,desthash,valsobj,0)) != 0 ) + if ( myinfo->IAMNOTARY != 0 ) + retstr = basilisk_getmessage(myinfo,0,0,0,desthash,valsobj,0); + else retstr = _dex_getmessage(myinfo,jprint(valsobj,0)); + if ( retstr != 0 ) { printf("channel.%u msgid.%u gotmessage.(%d) %s\n",channel,msgid,(int32_t)strlen(retstr),strlen(retstr) < 100 ? retstr : "(too long)"); if ( (retarray= cJSON_Parse(retstr)) != 0 ) From 12b1b22de7a229d9876c2de4d77f19138f387200 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 23:32:41 +0200 Subject: [PATCH 316/495] Test --- basilisk/basilisk_MSG.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index cacf9f0e5..b7541bb96 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -402,10 +402,13 @@ cJSON *basilisk_channelget(struct supernet_info *myinfo,bits256 srchash,bits256 jaddbits256(valsobj,"desthash",desthash); if ( myinfo->IAMNOTARY != 0 ) retstr = basilisk_getmessage(myinfo,0,0,0,desthash,valsobj,0); - else retstr = _dex_getmessage(myinfo,jprint(valsobj,0)); - if ( retstr != 0 ) + else { + retstr = _dex_getmessage(myinfo,jprint(valsobj,0)); printf("channel.%u msgid.%u gotmessage.(%d) %s\n",channel,msgid,(int32_t)strlen(retstr),strlen(retstr) < 100 ? retstr : "(too long)"); + } + if ( retstr != 0 ) + { if ( (retarray= cJSON_Parse(retstr)) != 0 ) { if ( is_cJSON_Array(retarray) == 0 ) From cf225f8aefdca1219ac503ffe24e86a71954f882 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 23:39:37 +0200 Subject: [PATCH 317/495] Test --- basilisk/basilisk_DEX.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 7d0aafeb2..564a30f23 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -276,7 +276,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) { static uint32_t lastpoll; char *retstr; uint8_t data[32768]; cJSON *outerarray,*retjson; uint32_t msgid,channel; int32_t datalen,i,n; struct basilisk_request issueR; double hwm = 0.; - if ( time(NULL) < lastpoll+13 ) + if ( time(NULL) < lastpoll+20 || (myinfo->IAMLP == 0 && myinfo->DEXactive == 0) ) return; lastpoll = (uint32_t)time(NULL); memset(&issueR,0,sizeof(issueR)); From 435cb374b2b95ddc1752f68326fafca3992e2fed Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 23:42:35 +0200 Subject: [PATCH 318/495] Test --- basilisk/basilisk_DEX.c | 2 +- iguana/tests/notlp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100755 iguana/tests/notlp diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 564a30f23..e8036287e 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -276,7 +276,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) { static uint32_t lastpoll; char *retstr; uint8_t data[32768]; cJSON *outerarray,*retjson; uint32_t msgid,channel; int32_t datalen,i,n; struct basilisk_request issueR; double hwm = 0.; - if ( time(NULL) < lastpoll+20 || (myinfo->IAMLP == 0 && myinfo->DEXactive == 0) ) + if ( myinfo->IAMNOTARY != 0 || time(NULL) < lastpoll+20 || (myinfo->IAMLP == 0 && myinfo->DEXactive == 0) ) return; lastpoll = (uint32_t)time(NULL); memset(&issueR,0,sizeof(issueR)); diff --git a/iguana/tests/notlp b/iguana/tests/notlp new file mode 100755 index 000000000..b29c9dde7 --- /dev/null +++ b/iguana/tests/notlp @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"notlp\"}" From eb1ee31610432afadad8ba46eb6ef769e42e6a14 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 23:43:38 +0200 Subject: [PATCH 319/495] Test --- basilisk/jumblr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index e1ffb7f58..a53d05069 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -369,7 +369,7 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch static double kmdprice,pending; static uint32_t lasttime; double btcavail=0,minbtc,avebid,aveask,highbid,lowask,CMC_average,USD_average,changes[3]; struct iguana_info *coinbtc; cJSON *vals; bits256 hash; char *retstr; coinbtc = iguana_coinfind("BTC"); - if ( kmdprice == 0. || time(NULL) > lasttime+600 ) + if ( kmdprice == 0. || time(NULL) > lasttime+60 ) { kmdprice = get_theoretical(&avebid,&aveask,&highbid,&lowask,&CMC_average,changes,"komodo","KMD","BTC",&USD_average); lasttime = (uint32_t)time(NULL); From 889018be37d1f0e7e49c31928e7c6cb8d8d62f99 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 23:51:17 +0200 Subject: [PATCH 320/495] Test --- basilisk/jumblr.c | 12 ++---------- iguana/main.c | 17 ++++++++++++----- includes/iguana_funcs.h | 1 + 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index a53d05069..5272bd8f3 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -395,22 +395,14 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch free(retstr); } // curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"request\",\"vals\":{\"source\":\"KMD\",\"amount\":20,\"dest\":\"USD\",\"minprice\":0.08}}" - } else printf("btcavail %.8f\n",btcavail); - } + } else printf("btcavail %.8f pending %.8f\n",btcavail,pending); + } else printf("null kmdprice %.8f\n",kmdprice); } void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval) { static uint32_t lasttime; char BTCaddr[64],KMDaddr[64],*zaddr,*retstr; bits256 privkey; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r; - privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); - if ( time(NULL) > lasttime+60 ) - { - // if BTC has arrived in deposit address, invoke DEX -> KMD - // if BTC has arrived in destination address, invoke DEX -> BTC - jumblr_DEXcheck(myinfo,coin,BTCaddr,KMDaddr,privkey); - lasttime = (uint32_t)time(NULL); - } fee = JUMBLR_INCR * JUMBLR_FEE; OS_randombytes(&r,sizeof(r)); //r = 0; diff --git a/iguana/main.c b/iguana/main.c index 986764423..8b06d5deb 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -747,16 +747,23 @@ void iguana_urlinit(struct supernet_info *myinfo,int32_t ismainnet,int32_t usess void jumblr_loop(void *ptr) { - struct iguana_info *coin; uint32_t t; struct supernet_info *myinfo = ptr; int32_t mult = 10; + struct iguana_info *coin; char BTCaddr[64],KMDaddr[64]; bits256 privkey; uint32_t t; struct supernet_info *myinfo = ptr; int32_t mult = 10; printf("JUMBLR loop\n"); while ( 1 ) { - t = (uint32_t)time(NULL); - if ( (coin= iguana_coinfind("KMD")) != 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 && (t % (120 * mult)) < 60 ) + if ( (coin= iguana_coinfind("KMD")) != 0 && coin->FULLNODE < 0 ) { - jumblr_iteration(myinfo,coin,(t % (360 * mult)) / (120 * mult),t % (120 * mult)); + privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + // if BTC has arrived in deposit address, invoke DEX -> KMD + // if BTC has arrived in destination address, invoke DEX -> BTC + jumblr_DEXcheck(myinfo,coin,BTCaddr,KMDaddr,privkey); + t = (uint32_t)time(NULL); + if ( myinfo->jumblr_passphrase[0] != 0 && (t % (120 * mult)) < 60 ) + { + jumblr_iteration(myinfo,coin,(t % (360 * mult)) / (120 * mult),t % (120 * mult)); + } + //printf("t.%u %p.%d %s\n",t,coin,coin!=0?coin->FULLNODE:0,myinfo->jumblr_passphrase); } - //printf("t.%u %p.%d %s\n",t,coin,coin!=0?coin->FULLNODE:0,myinfo->jumblr_passphrase); sleep(55); } } diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index dffa53ed0..b60b72b8a 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -615,6 +615,7 @@ int32_t iguana_staker_sort(struct iguana_info *coin,bits256 *hash2p,uint8_t *ref bits256 mpz_div64(bits256 hash,uint64_t divval); void iguana_walletinitcheck(struct supernet_info *myinfo,struct iguana_info *coin); void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval); +void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,char *BTCaddr,char *KMDaddr,bits256 privkey); bits256 jumblr_privkey(struct supernet_info *myinfo,char *BTCaddr,char *KMDaddr,char *prefix); char *jumblr_importprivkey(struct supernet_info *myinfo,struct iguana_info *coin,char *wifstr); int64_t iguana_esttxfee(struct supernet_info *myinfo,struct iguana_info *coin,char *rawtx,char *signedtx,int32_t numvins); From 0fcaaab67a539693f15550690d15a16faec7ac72 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 23:55:07 +0200 Subject: [PATCH 321/495] Test --- iguana/iguana_notary.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index c9532e3c0..2d718e6ba 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -615,7 +615,7 @@ HASH_AND_STRING_AND_INT(dex,gettxout,txid,symbol,vout) TWO_STRINGS(dex,listunspent,symbol,address) { - if ( symbol != 0 && strcmp(symbol,"BTC") == 0 && (coin= iguana_coinfind("BTC")) != 0 && coin->FULLNODE == 0 && myinfo->IAMLP != 0 ) + if ( symbol != 0 && strcmp(symbol,"BTC") == 0 && (coin= iguana_coinfind("BTC")) != 0 && coin->FULLNODE == 0 && myinfo->blocktrail_apikey[0] != 0 ) { char url[1024],*retstr,*coinaddr,*script; int32_t i,n,vout; cJSON *retjson,*data,*item,*item3,*data3; bits256 txid; uint64_t val; sprintf(url,"https://api.blocktrail.com/v1/btc/address/%s/unspent-outputs?api_key=%s",address,myinfo->blocktrail_apikey); @@ -670,7 +670,7 @@ TWO_STRINGS(dex,listunspent,symbol,address) TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions,symbol,address,count,skip) { - if ( symbol != 0 && strcmp(symbol,"BTC") == 0 && (coin= iguana_coinfind("BTC")) != 0 && coin->FULLNODE == 0 && myinfo->IAMLP != 0 ) + if ( symbol != 0 && strcmp(symbol,"BTC") == 0 && (coin= iguana_coinfind("BTC")) != 0 && coin->FULLNODE == 0 && myinfo->blocktrail_apikey[0] != 0 ) { char url[1024],*retstr,*retstr2; cJSON *retjson,*retjson2,*retjson3,*data,*data2; int32_t i,n; sprintf(url,"https://api.blocktrail.com/v1/btc/address/%s/transactions?api_key=%s",address,myinfo->blocktrail_apikey); @@ -860,7 +860,7 @@ TWO_STRINGS(dex,getbalance,symbol,address) } if ( symbol != 0 && address != 0 ) { - if ( strcmp(symbol,"BTC") == 0 && myinfo->IAMLP != 0 ) + if ( strcmp(symbol,"BTC") == 0 && myinfo->blocktrail_apikey[0] != 0 ) { sprintf(url,"https://api.blocktrail.com/v1/btc/address/%s?api_key=%s",address,myinfo->blocktrail_apikey); if ( (retstr= issue_curl(url)) != 0 ) From c7b4b26b92a8b12d886bea35739a70a6bbc00a83 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 00:04:07 +0200 Subject: [PATCH 322/495] Test --- basilisk/basilisk_MSG.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index b7541bb96..33de5aa2f 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -434,7 +434,7 @@ int32_t basilisk_process_retarray(struct supernet_info *myinfo,void *ptr,int32_t item = jitem(retarray,i); if ( jobj(item,"error") != 0 ) continue; - //printf("(%s).%d ",jprint(item,0),i); + printf("(%s).%d ",jprint(item,0),i); if ( (datalen= basilisk_message_returned(key,data,maxlen,item)) > 0 ) { duration = juint(item,"duration"); From 9bb36b37a4e1dcf296bf03988f7d681541e9f1fb Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 00:13:13 +0200 Subject: [PATCH 323/495] Test --- basilisk/basilisk_MSG.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index 33de5aa2f..be288096b 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -400,13 +400,13 @@ cJSON *basilisk_channelget(struct supernet_info *myinfo,bits256 srchash,bits256 jaddnum(valsobj,"numrequired",1); jaddbits256(valsobj,"srchash",srchash); jaddbits256(valsobj,"desthash",desthash); - if ( myinfo->IAMNOTARY != 0 ) + //if ( myinfo->IAMNOTARY != 0 ) retstr = basilisk_getmessage(myinfo,0,0,0,desthash,valsobj,0); - else + /*else { retstr = _dex_getmessage(myinfo,jprint(valsobj,0)); printf("channel.%u msgid.%u gotmessage.(%d) %s\n",channel,msgid,(int32_t)strlen(retstr),strlen(retstr) < 100 ? retstr : "(too long)"); - } + }*/ if ( retstr != 0 ) { if ( (retarray= cJSON_Parse(retstr)) != 0 ) From 31b91361b50fa81eaf3976f989c91cf371744a3b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 00:17:41 +0200 Subject: [PATCH 324/495] Test --- basilisk/basilisk_MSG.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index be288096b..33de5aa2f 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -400,13 +400,13 @@ cJSON *basilisk_channelget(struct supernet_info *myinfo,bits256 srchash,bits256 jaddnum(valsobj,"numrequired",1); jaddbits256(valsobj,"srchash",srchash); jaddbits256(valsobj,"desthash",desthash); - //if ( myinfo->IAMNOTARY != 0 ) + if ( myinfo->IAMNOTARY != 0 ) retstr = basilisk_getmessage(myinfo,0,0,0,desthash,valsobj,0); - /*else + else { retstr = _dex_getmessage(myinfo,jprint(valsobj,0)); printf("channel.%u msgid.%u gotmessage.(%d) %s\n",channel,msgid,(int32_t)strlen(retstr),strlen(retstr) < 100 ? retstr : "(too long)"); - }*/ + } if ( retstr != 0 ) { if ( (retarray= cJSON_Parse(retstr)) != 0 ) From 41f21d67f97b0ba20bc028cec0b5609394b97088 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 00:27:27 +0200 Subject: [PATCH 325/495] Test --- basilisk/basilisk_swap.c | 252 +++++++++++++++++++-------------------- 1 file changed, 126 insertions(+), 126 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index c94fa93d7..893030f84 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -291,7 +291,7 @@ bits256 basilisk_swap_broadcast(char *name,struct supernet_info *myinfo,struct b #endif signedtx = malloc(datalen*2 + 1); init_hexbytes_noT(signedtx,data,datalen); - if ( (retstr= basilisk_sendrawtransaction(&swap->myinfo,coin,signedtx)) != 0 ) + if ( (retstr= basilisk_sendrawtransaction(myinfo,coin,signedtx)) != 0 ) { if ( is_hexstr(retstr,0) == 64 ) { @@ -371,11 +371,11 @@ int32_t basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,struct b jadd(txobj,"vin",vins); //printf("basilisk_rawtx_sign locktime.%u/%u for %s spendscript.%s -> %s, suppress.%d\n",rawtx->locktime,dest->locktime,rawtx->name,hexstr,dest->name,dest->suppress_pubkeys); txobj = bitcoin_txoutput(txobj,dest->spendscript,dest->I.spendlen,dest->I.amount); - if ( (rawtxbytes= bitcoin_json2hex(&swap->myinfo,rawtx->coin,&dest->I.txid,txobj,V)) != 0 ) + if ( (rawtxbytes= bitcoin_json2hex(myinfo,rawtx->coin,&dest->I.txid,txobj,V)) != 0 ) { if ( needsig == 0 ) signedtx = rawtxbytes; - if ( signedtx != 0 || (signedtx= iguana_signrawtx(&swap->myinfo,rawtx->coin,height,&dest->I.signedtxid,&dest->I.completed,vins,rawtxbytes,privkeys,V)) != 0 ) + if ( signedtx != 0 || (signedtx= iguana_signrawtx(myinfo,rawtx->coin,height,&dest->I.signedtxid,&dest->I.completed,vins,rawtxbytes,privkeys,V)) != 0 ) { dest->I.datalen = (int32_t)strlen(signedtx) >> 1; dest->txbytes = calloc(1,dest->I.datalen); @@ -410,7 +410,7 @@ int32_t basilisk_verify_otherfee(struct supernet_info *myinfo,void *ptr,uint8_t swap->otherfee.txbytes = calloc(1,datalen); memcpy(swap->otherfee.txbytes,data,datalen); swap->otherfee.I.actualtxid = swap->otherfee.I.signedtxid = bits256_doublesha256(0,data,datalen); - basilisk_txlog(&swap->myinfo,swap,&swap->otherfee,-1); + basilisk_txlog(myinfo,swap,&swap->otherfee,-1); return(0); } @@ -457,7 +457,7 @@ int32_t basilisk_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,str { decode_hex(rawtx->spendscript,hexlen,hexstr); rawtx->I.spendlen = hexlen; - basilisk_txlog(&swap->myinfo,swap,rawtx,-1); // bobdeposit, bobpayment or alicepayment + basilisk_txlog(myinfo,swap,rawtx,-1); // bobdeposit, bobpayment or alicepayment retval = 0; } } else printf("%s ERROR.(%s)\n",rawtx->name,jprint(txobj,0)); @@ -498,7 +498,7 @@ int32_t basilisk_verify_bobdeposit(struct supernet_info *myinfo,void *ptr,uint8_ if ( basilisk_rawtx_spendscript(swap,swap->bobcoin->blocks.hwmchain.height,&swap->bobdeposit,0,data,datalen,0) == 0 ) { len = basilisk_swapuserdata(swap,userdata,zero,1,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); - if ( (retval= basilisk_rawtx_sign(&swap->myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->aliceclaim,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) + if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->aliceclaim,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) { for (i=0; ibobdeposit.I.datalen; i++) printf("%02x",swap->bobdeposit.txbytes[i]); @@ -506,7 +506,7 @@ int32_t basilisk_verify_bobdeposit(struct supernet_info *myinfo,void *ptr,uint8_ for (i=0; ialiceclaim.I.datalen; i++) printf("%02x",swap->aliceclaim.txbytes[i]); printf(" <- aliceclaim\n"); - basilisk_txlog(&swap->myinfo,swap,&swap->aliceclaim,swap->I.putduration+swap->I.callduration); + basilisk_txlog(myinfo,swap,&swap->aliceclaim,swap->I.putduration+swap->I.callduration); return(retval); } } @@ -518,12 +518,12 @@ int32_t basilisk_bobdeposit_refund(struct supernet_info *myinfo,struct basilisk_ { uint8_t userdata[512]; int32_t i,retval,len = 0; char str[65]; len = basilisk_swapuserdata(swap,userdata,swap->I.privBn,0,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); - if ( (retval= basilisk_rawtx_sign(&swap->myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->bobrefund,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,0)) == 0 ) + if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->bobrefund,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,0)) == 0 ) { for (i=0; ibobrefund.I.datalen; i++) printf("%02x",swap->bobrefund.txbytes[i]); printf(" <- bobrefund.(%s)\n",bits256_str(str,swap->bobrefund.I.txid)); - basilisk_txlog(&swap->myinfo,swap,&swap->bobrefund,delay); + basilisk_txlog(myinfo,swap,&swap->bobrefund,delay); return(retval); } return(-1); @@ -541,12 +541,12 @@ int32_t basilisk_bobpayment_reclaim(struct supernet_info *myinfo,struct basilisk uint8_t userdata[512]; int32_t i,retval,len = 0; static bits256 zero; printf("basilisk_bobpayment_reclaim\n"); len = basilisk_swapuserdata(swap,userdata,zero,1,swap->I.myprivs[1],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); - if ( (retval= basilisk_rawtx_sign(&swap->myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->bobreclaim,&swap->bobpayment,swap->I.myprivs[1],0,userdata,len,1)) == 0 ) + if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->bobreclaim,&swap->bobpayment,swap->I.myprivs[1],0,userdata,len,1)) == 0 ) { for (i=0; ibobreclaim.I.datalen; i++) printf("%02x",swap->bobreclaim.txbytes[i]); printf(" <- bobreclaim\n"); - basilisk_txlog(&swap->myinfo,swap,&swap->bobreclaim,delay); + basilisk_txlog(myinfo,swap,&swap->bobreclaim,delay); return(retval); } return(-1); @@ -562,7 +562,7 @@ int32_t basilisk_verify_bobpaid(struct supernet_info *myinfo,void *ptr,uint8_t * revAm.bytes[i] = swap->I.privAm.bytes[31-i]; len = basilisk_swapuserdata(swap,userdata,revAm,0,swap->I.myprivs[0],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); char str[65]; printf("bobpaid.(%s)\n",bits256_str(str,swap->I.privAm)); - if ( (retval= basilisk_rawtx_sign(&swap->myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->alicespend,&swap->bobpayment,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) + if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->alicespend,&swap->bobpayment,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) { for (i=0; ibobpayment.I.datalen; i++) printf("%02x",swap->bobpayment.txbytes[i]); @@ -571,7 +571,7 @@ int32_t basilisk_verify_bobpaid(struct supernet_info *myinfo,void *ptr,uint8_t * printf("%02x",swap->alicespend.txbytes[i]); printf(" <- alicespend\n\n"); swap->I.alicespent = 1; - basilisk_txlog(&swap->myinfo,swap,&swap->alicespend,-1); + basilisk_txlog(myinfo,swap,&swap->alicespend,-1); return(retval); } } @@ -583,13 +583,13 @@ int32_t basilisk_alicepayment_spend(struct supernet_info *myinfo,struct basilisk int32_t i,retval; //printf("alicepayment_spend\n"); swap->alicepayment.I.spendlen = basilisk_alicescript(swap->alicepayment.redeemscript,&swap->alicepayment.I.redeemlen,swap->alicepayment.spendscript,0,swap->alicepayment.I.destaddr,swap->alicecoin->chain->p2shtype,swap->I.pubAm,swap->I.pubBn); - if ( (retval= basilisk_rawtx_sign(&swap->myinfo,swap->alicecoin->blocks.hwmchain.height,swap,dest,&swap->alicepayment,swap->I.privAm,&swap->I.privBn,0,0,1)) == 0 ) + if ( (retval= basilisk_rawtx_sign(myinfo,swap->alicecoin->blocks.hwmchain.height,swap,dest,&swap->alicepayment,swap->I.privAm,&swap->I.privBn,0,0,1)) == 0 ) { for (i=0; iI.datalen; i++) printf("%02x",dest->txbytes[i]); printf(" <- msigspend\n\n"); swap->I.bobspent = 1; - basilisk_txlog(&swap->myinfo,swap,dest,0); // bobspend or alicereclaim + basilisk_txlog(myinfo,swap,dest,0); // bobspend or alicereclaim return(retval); } return(-1); @@ -726,7 +726,7 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,struct basilis rawtx->I.locktime = locktime; //printf("%s locktime.%u\n",rawtx->name,locktime); V = calloc(256,sizeof(*V)); - if ( (retstr= basilisk_bitcoinrawtx(&swap->myinfo,rawtx->coin,"",basilisktag,jint(valsobj,"timeout"),valsobj,V)) != 0 ) + if ( (retstr= basilisk_bitcoinrawtx(myinfo,rawtx->coin,"",basilisktag,jint(valsobj,"timeout"),valsobj,V)) != 0 ) { //printf("%s %s basilisk_bitcoinrawtx.(%s)\n",rawtx->name,str,retstr); flag = 0; @@ -737,7 +737,7 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,struct basilis n = cJSON_GetArraySize(retarray); for (i=0; imyinfo,rawtx->coin->blocks.hwmchain.height,rawtx,jitem(retarray,i),lockinputs,V)) == 0 ) + if ( (retval= basilisk_rawtx_return(myinfo,rawtx->coin->blocks.hwmchain.height,rawtx,jitem(retarray,i),lockinputs,V)) == 0 ) { rawtx->vins = jobj(jitem(retarray,i),"vins"); break; @@ -746,7 +746,7 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,struct basilis } else { - retval = basilisk_rawtx_return(&swap->myinfo,rawtx->coin->blocks.hwmchain.height,rawtx,retarray,lockinputs,V); + retval = basilisk_rawtx_return(myinfo,rawtx->coin->blocks.hwmchain.height,rawtx,retarray,lockinputs,V); rawtx->vins = jobj(retarray,"vins"); } free(retarray); @@ -790,8 +790,8 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa // printf("%02x",swap->bobpayment.redeemscript[j]); //printf(" <- redeem.%d\n",swap->bobpayment.redeemlen); printf(" <- GENERATED BOB PAYMENT.%d\n",swap->bobpayment.I.datalen); - iguana_unspents_mark(&swap->myinfo,swap->bobcoin,swap->bobpayment.vins); - basilisk_bobpayment_reclaim(&swap->myinfo,swap,swap->I.callduration); + iguana_unspents_mark(myinfo,swap->bobcoin,swap->bobpayment.vins); + basilisk_bobpayment_reclaim(myinfo,swap,swap->I.callduration); printf("bobscripts set completed\n"); return(0); } @@ -823,8 +823,8 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa // printf("%02x",swap->bobdeposit.redeemscript[j]); //printf(" <- redeem.%d\n",swap->bobdeposit.redeemlen); //printf("GENERATED BOB DEPOSIT\n"); - iguana_unspents_mark(&swap->myinfo,swap->bobcoin,swap->bobdeposit.vins); - basilisk_bobdeposit_refund(&swap->myinfo,swap,swap->I.putduration); + iguana_unspents_mark(myinfo,swap->bobcoin,swap->bobdeposit.vins); + basilisk_bobdeposit_refund(myinfo,swap,swap->I.putduration); printf("bobscripts set completed\n"); return(0); } @@ -856,7 +856,7 @@ int32_t basilisk_verify_privi(struct supernet_info *myinfo,void *ptr,uint8_t *da swap->I.privAm = privkey; vcalc_sha256(0,swap->I.secretAm256,privkey.bytes,sizeof(privkey)); printf("set privAm.%s %s\n",bits256_str(str,swap->I.privAm),bits256_str(str2,*(bits256 *)swap->I.secretAm256)); - basilisk_bobscripts_set(&swap->myinfo,swap,0,1); + basilisk_bobscripts_set(myinfo,swap,0,1); } else { @@ -875,7 +875,7 @@ int32_t basilisk_process_swapverify(struct supernet_info *myinfo,void *ptr,int32 { struct basilisk_swap *swap = ptr; if ( internal_func != 0 ) - return((*internal_func)(&swap->myinfo,swap,data,datalen)); + return((*internal_func)(myinfo,swap,data,datalen)); else return(0); } @@ -883,7 +883,7 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap { cJSON *valsobj,*array,*item; int32_t i,n,datalen,retval = -1; char *retstr,*hexstr=0; //int32_t datalen; uint32_t crc; - //if ( (crc= basilisk_crcrecv(&swap->myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),&datalen,swap->I.otherhash,swap->I.myhash,swap->I.req.quoteid,msgbits)) != 0 ) + //if ( (crc= basilisk_crcrecv(myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),&datalen,swap->I.otherhash,swap->I.myhash,swap->I.req.quoteid,msgbits)) != 0 ) valsobj = cJSON_CreateObject(); jaddnum(valsobj,"channel",swap->I.req.quoteid); jaddnum(valsobj,"msgid",msgbits); @@ -905,7 +905,7 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap if ( datalen > 0 && datalen < maxlen ) { decode_hex(data,datalen,hexstr); - if ( (retval= (*basilisk_verify_func)(&swap->myinfo,swap,data,datalen)) == 0 ) + if ( (retval= (*basilisk_verify_func)(myinfo,swap,data,datalen)) == 0 ) { break; } @@ -923,10 +923,10 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t datalen,uint32_t nextbits,uint32_t crcs[2]) { //if ( (rand() % 10) == 0 ) - // basilisk_channelsend(&swap->myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,INSTANTDEX_LOCKTIME*2); - //if ( basilisk_crcsend(&swap->myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,crcs) != 0 ) + // basilisk_channelsend(myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,INSTANTDEX_LOCKTIME*2); + //if ( basilisk_crcsend(myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,crcs) != 0 ) //return(nextbits); - dex_channelsend(&swap->myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen); //INSTANTDEX_LOCKTIME*2 + dex_channelsend(myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen); //INSTANTDEX_LOCKTIME*2 return(0); } @@ -954,16 +954,16 @@ int32_t basilisk_priviextract(struct supernet_info *myinfo,struct iguana_info *c int32_t basilisk_privBn_extract(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { - if ( basilisk_priviextract(&swap->myinfo,swap->bobcoin,"privBn",&swap->I.privBn,swap->I.secretBn,swap->bobrefund.I.actualtxid,0) == 0 ) + if ( basilisk_priviextract(myinfo,swap->bobcoin,"privBn",&swap->I.privBn,swap->I.secretBn,swap->bobrefund.I.actualtxid,0) == 0 ) { } - if ( basilisk_swapget(&swap->myinfo,swap,0x40000000,data,maxlen,basilisk_verify_privi) == 0 ) + if ( basilisk_swapget(myinfo,swap,0x40000000,data,maxlen,basilisk_verify_privi) == 0 ) { if ( bits256_nonz(swap->I.privBn) != 0 && swap->alicereclaim.txbytes == 0 ) { char str[65]; printf("have privBn.%s\n",bits256_str(str,swap->I.privBn)); - return(basilisk_alicepayment_spend(&swap->myinfo,swap,&swap->alicereclaim)); + return(basilisk_alicepayment_spend(myinfo,swap,&swap->alicereclaim)); } } return(-1); @@ -971,14 +971,14 @@ int32_t basilisk_privBn_extract(struct supernet_info *myinfo,struct basilisk_swa int32_t basilisk_privAm_extract(struct supernet_info *myinfo,struct basilisk_swap *swap) { - if ( basilisk_priviextract(&swap->myinfo,swap->bobcoin,"privAm",&swap->I.privAm,swap->I.secretAm,swap->bobpayment.I.actualtxid,0) == 0 ) + if ( basilisk_priviextract(myinfo,swap->bobcoin,"privAm",&swap->I.privAm,swap->I.secretAm,swap->bobpayment.I.actualtxid,0) == 0 ) { } if ( bits256_nonz(swap->I.privAm) != 0 && swap->bobspend.txbytes == 0 ) { char str[65]; printf("have privAm.%s\n",bits256_str(str,swap->I.privAm)); - return(basilisk_alicepayment_spend(&swap->myinfo,swap,&swap->bobspend)); + return(basilisk_alicepayment_spend(myinfo,swap,&swap->bobspend)); } return(-1); } @@ -1293,7 +1293,7 @@ void basilisk_swap_purge(struct supernet_info *myinfo,struct basilisk_swap *swap { myinfo->swaps[i] = myinfo->swaps[--myinfo->numswaps]; myinfo->swaps[myinfo->numswaps] = 0; - basilisk_swap_finished(&swap->myinfo,swap); + basilisk_swap_finished(myinfo,swap); break; } portable_mutex_unlock(&myinfo->DEX_swapmutex); @@ -1385,7 +1385,7 @@ int32_t basilisk_verify_privkeys(struct supernet_info *myinfo,void *ptr,uint8_t swap->I.secretAm[i] = data[len++]; for (i=0; i<32; i++) swap->I.secretAm256[i] = data[len++]; - basilisk_bobscripts_set(&swap->myinfo,swap,1,1); + basilisk_bobscripts_set(myinfo,swap,1,1); } else { @@ -1395,7 +1395,7 @@ int32_t basilisk_verify_privkeys(struct supernet_info *myinfo,void *ptr,uint8_t swap->I.secretBn[i] = data[len++]; for (i=0; i<32; i++) swap->I.secretBn256[i] = data[len++]; - //basilisk_bobscripts_set(&swap->myinfo,swap,0); + //basilisk_bobscripts_set(myinfo,swap,0); } } else printf("failed verification: wrong firstbyte.%d errs.%d\n",wrongfirstbyte,errs); } @@ -1406,7 +1406,7 @@ int32_t basilisk_verify_privkeys(struct supernet_info *myinfo,void *ptr,uint8_t uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,struct basilisk_rawtx *rawtx,uint32_t nextbits) { uint8_t sendbuf[32768]; int32_t sendlen; - if ( basilisk_swapdata_rawtx(&swap->myinfo,swap,data,maxlen,rawtx) != 0 ) + if ( basilisk_swapdata_rawtx(myinfo,swap,data,maxlen,rawtx) != 0 ) { if ( bits256_nonz(rawtx->I.signedtxid) != 0 && bits256_nonz(rawtx->I.actualtxid) == 0 ) { @@ -1427,7 +1427,7 @@ uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilis sendlen += rawtx->I.redeemlen; } //printf("sendlen.%d datalen.%d redeemlen.%d\n",sendlen,rawtx->datalen,rawtx->redeemlen); - return(basilisk_swapsend(&swap->myinfo,swap,msgbits,sendbuf,sendlen,nextbits,rawtx->I.crcs)); + return(basilisk_swapsend(myinfo,swap,msgbits,sendbuf,sendlen,nextbits,rawtx->I.crcs)); } } return(nextbits); @@ -1438,9 +1438,9 @@ uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilis void basilisk_sendpubkeys(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { int32_t datalen; - datalen = basilisk_swapdata_deck(&swap->myinfo,swap,data,maxlen); + datalen = basilisk_swapdata_deck(myinfo,swap,data,maxlen); //printf("send deck.%d\n",datalen); - swap->I.statebits |= basilisk_swapsend(&swap->myinfo,swap,0x02,data,datalen,0x01,swap->I.crcs_mypub); + swap->I.statebits |= basilisk_swapsend(myinfo,swap,0x02,data,datalen,0x01,swap->I.crcs_mypub); } int32_t basilisk_checkdeck(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) @@ -1448,7 +1448,7 @@ int32_t basilisk_checkdeck(struct supernet_info *myinfo,struct basilisk_swap *sw if ( (swap->I.statebits & 0x02) == 0 ) { //printf("check for other deck\n"); - if ( basilisk_swapget(&swap->myinfo,swap,0x02,data,maxlen,basilisk_verify_otherdeck) == 0 ) + if ( basilisk_swapget(myinfo,swap,0x02,data,maxlen,basilisk_verify_otherdeck) == 0 ) swap->I.statebits |= 0x02; else return(-1); } @@ -1459,7 +1459,7 @@ void basilisk_sendstate(struct supernet_info *myinfo,struct basilisk_swap *swap, { int32_t datalen; datalen = iguana_rwnum(1,data,sizeof(swap->I.statebits),&swap->I.statebits); - basilisk_swapsend(&swap->myinfo,swap,0x80000000,data,datalen,0,0); + basilisk_swapsend(myinfo,swap,0x80000000,data,datalen,0,0); } void basilisk_sendchoosei(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) @@ -1482,14 +1482,14 @@ void basilisk_sendchoosei(struct supernet_info *myinfo,struct basilisk_swap *swa data[datalen++] = swap->I.pubA1.bytes[i]; printf("SEND pubA0/1 %s\n",bits256_str(str,swap->I.pubA0)); } - swap->I.statebits |= basilisk_swapsend(&swap->myinfo,swap,0x08,data,datalen,0x04,swap->I.crcs_mychoosei); + swap->I.statebits |= basilisk_swapsend(myinfo,swap,0x08,data,datalen,0x04,swap->I.crcs_mychoosei); } void basilisk_waitchoosei(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { uint8_t pubkey33[33]; //char str[65],str2[65]; //printf("check otherchoosei\n"); - if ( basilisk_swapget(&swap->myinfo,swap,0x08,data,maxlen,basilisk_verify_choosei) == 0 ) + if ( basilisk_swapget(myinfo,swap,0x08,data,maxlen,basilisk_verify_choosei) == 0 ) { if ( swap->I.iambob != 0 ) { @@ -1501,7 +1501,7 @@ void basilisk_waitchoosei(struct supernet_info *myinfo,struct basilisk_swap *swa vcalc_sha256(0,swap->I.secretBn256,swap->I.privBn.bytes,sizeof(swap->I.privBn)); swap->I.pubBn = bitcoin_pubkey33(myinfo->ctx,pubkey33,swap->I.privBn); //printf("set privBn.%s %s\n",bits256_str(str,swap->privBn),bits256_str(str2,*(bits256 *)swap->secretBn256)); - basilisk_bobscripts_set(&swap->myinfo,swap,1,1); + basilisk_bobscripts_set(myinfo,swap,1,1); } } else @@ -1514,7 +1514,7 @@ void basilisk_waitchoosei(struct supernet_info *myinfo,struct basilisk_swap *swa vcalc_sha256(0,swap->I.secretAm256,swap->I.privAm.bytes,sizeof(swap->I.privAm)); swap->I.pubAm = bitcoin_pubkey33(myinfo->ctx,pubkey33,swap->I.privAm); //printf("set privAm.%s %s\n",bits256_str(str,swap->privAm),bits256_str(str2,*(bits256 *)swap->secretAm256)); - //basilisk_bobscripts_set(&swap->myinfo,swap,0); + //basilisk_bobscripts_set(myinfo,swap,0); } } swap->I.statebits |= 0x08; @@ -1549,7 +1549,7 @@ void basilisk_sendmostprivs(struct supernet_info *myinfo,struct basilisk_swap *s data[datalen++] = swap->I.secretAm256[i]; } //printf("send privkeys.%d\n",datalen); - swap->I.statebits |= basilisk_swapsend(&swap->myinfo,swap,0x20,data,datalen,0x10,swap->I.crcs_myprivs); + swap->I.statebits |= basilisk_swapsend(myinfo,swap,0x20,data,datalen,0x10,swap->I.crcs_myprivs); } void basilisk_alicepayment(struct supernet_info *myinfo,struct basilisk_swap *swap,struct iguana_info *coin,struct basilisk_rawtx *alicepayment,bits256 pubAm,bits256 pubBn) @@ -1566,22 +1566,22 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap printf("D r%u/q%u swapstate.%x otherstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits,swap->I.otherstatebits); if ( (swap->I.statebits & 0x80) == 0 ) // wait for fee { - if ( basilisk_swapget(&swap->myinfo,swap,0x80,data,maxlen,basilisk_verify_otherfee) == 0 ) + if ( basilisk_swapget(myinfo,swap,0x80,data,maxlen,basilisk_verify_otherfee) == 0 ) { // verify and submit otherfee swap->I.statebits |= 0x80; - basilisk_sendstate(&swap->myinfo,swap,data,maxlen); + basilisk_sendstate(myinfo,swap,data,maxlen); } } - basilisk_sendstate(&swap->myinfo,swap,data,maxlen); - basilisk_swapget(&swap->myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); + basilisk_sendstate(myinfo,swap,data,maxlen); + basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); if ( (swap->I.otherstatebits & 0x80) != 0 && (swap->I.statebits & 0x80) != 0 ) break; - sleep(3 + (swap->I.iambob == 0)*1); - basilisk_swapget(&swap->myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); - basilisk_sendstate(&swap->myinfo,swap,data,maxlen); + sleep(13 + (swap->I.iambob == 0)*1); + basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); + basilisk_sendstate(myinfo,swap,data,maxlen); if ( (swap->I.otherstatebits & 0x80) == 0 ) - basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40); + basilisk_swapdata_rawtxsend(myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40); } while ( retval == 0 && time(NULL) < swap->I.expiration ) // both sides have setup required data and paid txfee { @@ -1593,13 +1593,13 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap if ( (swap->I.statebits & 0x100) == 0 ) { printf("send bobdeposit\n"); - swap->I.statebits |= basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0x200,data,maxlen,&swap->bobdeposit,0x100); + swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x200,data,maxlen,&swap->bobdeposit,0x100); } // [BLOCKING: altfound] make sure altpayment is confirmed and send payment else if ( (swap->I.statebits & 0x1000) == 0 ) { printf("check alicepayment\n"); - if ( basilisk_swapget(&swap->myinfo,swap,0x1000,data,maxlen,basilisk_verify_alicepaid) == 0 ) + if ( basilisk_swapget(myinfo,swap,0x1000,data,maxlen,basilisk_verify_alicepaid) == 0 ) { swap->I.statebits |= 0x1000; printf("got alicepayment\n"); @@ -1607,7 +1607,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap } else if ( (swap->I.statebits & 0x2000) == 0 ) { - if ( basilisk_numconfirms(&swap->myinfo,&swap->alicepayment) >= swap->I.aliceconfirms ) + if ( basilisk_numconfirms(myinfo,&swap->alicepayment) >= swap->I.aliceconfirms ) { swap->I.statebits |= 0x2000; printf("alicepayment confirmed\n"); @@ -1615,25 +1615,25 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap } else if ( (swap->I.statebits & 0x4000) == 0 ) { - basilisk_bobscripts_set(&swap->myinfo,swap,0,1); + basilisk_bobscripts_set(myinfo,swap,0,1); printf("send bobpayment\n"); - swap->I.statebits |= basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0x8000,data,maxlen,&swap->bobpayment,0x4000); + swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x8000,data,maxlen,&swap->bobpayment,0x4000); } // [BLOCKING: privM] Bob waits for privAm either from Alice or alice blockchain else if ( (swap->I.statebits & 0x40000) == 0 ) { - if ( basilisk_swapget(&swap->myinfo,swap,0x40000,data,maxlen,basilisk_verify_privi) == 0 || basilisk_privAm_extract(&swap->myinfo,swap) == 0 ) // divulges privAm + if ( basilisk_swapget(myinfo,swap,0x40000,data,maxlen,basilisk_verify_privi) == 0 || basilisk_privAm_extract(myinfo,swap) == 0 ) // divulges privAm { printf("got privi spend alicepayment\n"); - basilisk_alicepayment_spend(&swap->myinfo,swap,&swap->bobspend); - if ( basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0,data,maxlen,&swap->bobspend,0x40000) == 0 ) + basilisk_alicepayment_spend(myinfo,swap,&swap->bobspend); + if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobspend,0x40000) == 0 ) printf("Bob error spending alice payment\n"); else { - tradebot_swap_balancingtrade(&swap->myinfo,swap,1); + tradebot_swap_balancingtrade(myinfo,swap,1); printf("Bob spends alicepayment\n"); swap->I.statebits |= 0x40000; - while ( basilisk_numconfirms(&swap->myinfo,&swap->bobspend) < swap->I.aliceconfirms ) + while ( basilisk_numconfirms(myinfo,&swap->bobspend) < swap->I.aliceconfirms ) { printf("bobspend confirmed\n"); swap->I.statebits |= 0x80000; @@ -1649,14 +1649,14 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap // submit reclaim of payment printf("bob reclaims bobpayment\n"); swap->I.statebits |= (0x40000 | 0x80000); - if ( basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0,data,maxlen,&swap->bobreclaim,0) == 0 ) + if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobreclaim,0) == 0 ) printf("Bob error reclaiming own payment after alice timed out\n"); else { printf("Bob reclaimed own payment\n"); while ( 0 && (swap->I.statebits & 0x100000) == 0 ) // why wait for own tx? { - if ( basilisk_numconfirms(&swap->myinfo,&swap->bobreclaim) >= 1 ) + if ( basilisk_numconfirms(myinfo,&swap->bobreclaim) >= 1 ) { printf("bobreclaim confirmed\n"); swap->I.statebits |= 0x100000; @@ -1675,7 +1675,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap if ( (swap->I.statebits & 0x200) == 0 ) { printf("checkfor deposit\n"); - if ( basilisk_swapget(&swap->myinfo,swap,0x200,data,maxlen,basilisk_verify_bobdeposit) == 0 ) + if ( basilisk_swapget(myinfo,swap,0x200,data,maxlen,basilisk_verify_bobdeposit) == 0 ) { // verify deposit and submit, set confirmed height printf("got bobdeposit\n"); @@ -1684,7 +1684,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap } else if ( (swap->I.statebits & 0x400) == 0 ) { - if ( basilisk_numconfirms(&swap->myinfo,&swap->bobdeposit) >= swap->I.bobconfirms ) + if ( basilisk_numconfirms(myinfo,&swap->bobdeposit) >= swap->I.bobconfirms ) { printf("bobdeposit confirmed\n"); swap->I.statebits |= 0x400; @@ -1693,22 +1693,22 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap else if ( (swap->I.statebits & 0x800) == 0 ) { printf("send alicepayment\n"); - swap->I.statebits |= basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0x1000,data,maxlen,&swap->alicepayment,0x800); + swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x1000,data,maxlen,&swap->alicepayment,0x800); } // [BLOCKING: payfound] make sure payment is confrmed and send in spend or see bob's reclaim and claim else if ( (swap->I.statebits & 0x8000) == 0 ) { - if ( basilisk_swapget(&swap->myinfo,swap,0x8000,data,maxlen,basilisk_verify_bobpaid) == 0 ) + if ( basilisk_swapget(myinfo,swap,0x8000,data,maxlen,basilisk_verify_bobpaid) == 0 ) { printf("got bobpayment\n"); - tradebot_swap_balancingtrade(&swap->myinfo,swap,0); + tradebot_swap_balancingtrade(myinfo,swap,0); // verify payment and submit, set confirmed height swap->I.statebits |= 0x8000; } } else if ( (swap->I.statebits & 0x10000) == 0 ) { - if ( basilisk_numconfirms(&swap->myinfo,&swap->bobpayment) >= swap->I.bobconfirms ) + if ( basilisk_numconfirms(myinfo,&swap->bobpayment) >= swap->I.bobconfirms ) { printf("bobpayment confirmed\n"); swap->I.statebits |= 0x10000; @@ -1717,17 +1717,17 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap else if ( (swap->I.statebits & 0x20000) == 0 ) { printf("alicespend bobpayment\n"); - if ( basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0,data,maxlen,&swap->alicespend,0x20000) != 0 && basilisk_numconfirms(&swap->myinfo,&swap->alicespend) > 0 ) + if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->alicespend,0x20000) != 0 && basilisk_numconfirms(myinfo,&swap->alicespend) > 0 ) { for (j=datalen=0; j<32; j++) data[datalen++] = swap->I.privAm.bytes[j]; printf("send privAm\n"); - swap->I.statebits |= basilisk_swapsend(&swap->myinfo,swap,0x40000,data,datalen,0x20000,swap->I.crcs_mypriv); + swap->I.statebits |= basilisk_swapsend(myinfo,swap,0x40000,data,datalen,0x20000,swap->I.crcs_mypriv); } } else if ( (swap->I.statebits & 0x40000) == 0 ) { - if ( basilisk_numconfirms(&swap->myinfo,&swap->alicespend) >= swap->I.bobconfirms ) + if ( basilisk_numconfirms(myinfo,&swap->alicespend) >= swap->I.bobconfirms ) { swap->I.statebits |= 0x40000; printf("Alice confirms spend of Bob's payment\n"); @@ -1737,7 +1737,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap if ( swap->bobdeposit.I.locktime != 0 && time(NULL) > swap->bobdeposit.I.locktime ) { printf("Alice claims deposit\n"); - if ( basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0,data,maxlen,&swap->aliceclaim,0) == 0 ) + if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->aliceclaim,0) == 0 ) printf("Alice couldnt claim deposit\n"); else { @@ -1745,11 +1745,11 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap retval = 1; } } - else if ( basilisk_privBn_extract(&swap->myinfo,swap,data,maxlen) == 0 ) + else if ( basilisk_privBn_extract(myinfo,swap,data,maxlen) == 0 ) { printf("Alice reclaims her payment\n"); swap->I.statebits |= 0x40000000; - if ( basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0,data,maxlen,&swap->alicereclaim,0x40000000) == 0 ) + if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->alicereclaim,0x40000000) == 0 ) printf("Alice error sending alicereclaim\n"); else { @@ -1760,9 +1760,9 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap } if ( (rand() % 30) == 0 ) printf("finished swapstate.%x other.%x\n",swap->I.statebits,swap->I.otherstatebits); - sleep(3 + (swap->I.iambob == 0)); - basilisk_sendstate(&swap->myinfo,swap,data,maxlen); - basilisk_swapget(&swap->myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); + sleep(13 + (swap->I.iambob == 0)); + basilisk_sendstate(myinfo,swap,data,maxlen); + basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); } return(retval); } @@ -1793,33 +1793,33 @@ void basilisk_swaploop(void *_swap) while ( (swap->I.statebits & (0x08|0x02)) != (0x08|0x02) && time(NULL) < expiration ) { printf("A r%u/q%u swapstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits); - //basilisk_channelsend(&swap->myinfo,swap->I.req.srchash,swap->I.req.desthash,channel,0x4000000,(void *)&swap->I.req.requestid,sizeof(swap->I.req.requestid),60); - dex_channelsend(&swap->myinfo,swap->I.req.srchash,swap->I.req.desthash,channel,0x4000000,(void *)&swap->I.req.requestid,sizeof(swap->I.req.requestid)); //,60); - basilisk_sendstate(&swap->myinfo,swap,data,maxlen); - basilisk_sendpubkeys(&swap->myinfo,swap,data,maxlen); // send pubkeys - if ( basilisk_checkdeck(&swap->myinfo,swap,data,maxlen) == 0) // check for other deck 0x02 - basilisk_sendchoosei(&swap->myinfo,swap,data,maxlen); - basilisk_waitchoosei(&swap->myinfo,swap,data,maxlen); // wait for choosei 0x08 + //basilisk_channelsend(myinfo,swap->I.req.srchash,swap->I.req.desthash,channel,0x4000000,(void *)&swap->I.req.requestid,sizeof(swap->I.req.requestid),60); + dex_channelsend(myinfo,swap->I.req.srchash,swap->I.req.desthash,channel,0x4000000,(void *)&swap->I.req.requestid,sizeof(swap->I.req.requestid)); //,60); + basilisk_sendstate(myinfo,swap,data,maxlen); + basilisk_sendpubkeys(myinfo,swap,data,maxlen); // send pubkeys + if ( basilisk_checkdeck(myinfo,swap,data,maxlen) == 0) // check for other deck 0x02 + basilisk_sendchoosei(myinfo,swap,data,maxlen); + basilisk_waitchoosei(myinfo,swap,data,maxlen); // wait for choosei 0x08 if ( (swap->I.statebits & (0x08|0x02)) == (0x08|0x02) ) break; - sleep(1); - dpow_nanomsg_update(&swap->myinfo); - dex_updateclient(&swap->myinfo); + sleep(10); + dpow_nanomsg_update(myinfo); + dex_updateclient(myinfo); } while ( (swap->I.statebits & 0x20) == 0 && time(NULL) < expiration ) { printf("B r%u/q%u swapstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits); - basilisk_sendstate(&swap->myinfo,swap,data,maxlen); - basilisk_sendchoosei(&swap->myinfo,swap,data,maxlen); - basilisk_sendmostprivs(&swap->myinfo,swap,data,maxlen); - if ( basilisk_swapget(&swap->myinfo,swap,0x20,data,maxlen,basilisk_verify_privkeys) == 0 ) + basilisk_sendstate(myinfo,swap,data,maxlen); + basilisk_sendchoosei(myinfo,swap,data,maxlen); + basilisk_sendmostprivs(myinfo,swap,data,maxlen); + if ( basilisk_swapget(myinfo,swap,0x20,data,maxlen,basilisk_verify_privkeys) == 0 ) { swap->I.statebits |= 0x20; break; } - sleep(3 + (swap->I.iambob == 0)*1); - dpow_nanomsg_update(&swap->myinfo); - dex_updateclient(&swap->myinfo); + sleep(13 + (swap->I.iambob == 0)*1); + dpow_nanomsg_update(myinfo); + dex_updateclient(myinfo); } if ( time(NULL) >= expiration ) retval = -1; @@ -1827,12 +1827,12 @@ void basilisk_swaploop(void *_swap) printf("C r%u/q%u swapstate.%x retval.%d\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits,retval); while ( retval == 0 && (swap->I.statebits & 0x40) == 0 ) // send fee { - dpow_nanomsg_update(&swap->myinfo); - dex_updateclient(&swap->myinfo); + dpow_nanomsg_update(myinfo); + dex_updateclient(myinfo); printf("sendstate.%x\n",swap->I.statebits); - basilisk_sendstate(&swap->myinfo,swap,data,maxlen); + basilisk_sendstate(myinfo,swap,data,maxlen); printf("swapget\n"); - basilisk_swapget(&swap->myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); + basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); printf("after swapget\n"); if ( swap->myfee.txbytes == 0 ) { @@ -1866,11 +1866,11 @@ void basilisk_swaploop(void *_swap) for (i=0; i<32; i++) printf("%02x",swap->pubB1.bytes[i]); printf(" <- pubB1\n");*/ - basilisk_txlog(&swap->myinfo,swap,0,-1); + basilisk_txlog(myinfo,swap,0,-1); if ( swap->I.iambob != 0 ) { printf("bobscripts set\n"); - if ( basilisk_bobscripts_set(&swap->myinfo,swap,1,1) < 0 ) + if ( basilisk_bobscripts_set(myinfo,swap,1,1) < 0 ) { sleep(3); printf("bobscripts set error\n"); @@ -1883,11 +1883,11 @@ void basilisk_swaploop(void *_swap) { //if ( swap->alicepayment.txbytes != 0 && swap->alicepayment.I.spendlen != 0 ) // break; - basilisk_alicepayment(&swap->myinfo,swap,swap->alicepayment.coin,&swap->alicepayment,swap->I.pubAm,swap->I.pubBn); + basilisk_alicepayment(myinfo,swap,swap->alicepayment.coin,&swap->alicepayment,swap->I.pubAm,swap->I.pubBn); if ( swap->alicepayment.txbytes == 0 || swap->alicepayment.I.spendlen == 0 ) { printf("error alice generating payment.%d\n",swap->alicepayment.I.spendlen); - sleep(3); + sleep(13); } else { @@ -1895,8 +1895,8 @@ void basilisk_swaploop(void *_swap) for (i=0; ialicepayment.I.spendlen; i++) printf("%02x",swap->alicepayment.txbytes[i]); printf(" ALICE PAYMENT created\n"); - iguana_unspents_mark(&swap->myinfo,swap->alicecoin,swap->alicepayment.vins); - basilisk_txlog(&swap->myinfo,swap,&swap->alicepayment,-1); + iguana_unspents_mark(myinfo,swap->alicecoin,swap->alicepayment.vins); + basilisk_txlog(myinfo,swap,&swap->alicepayment,-1); break; } } @@ -1905,9 +1905,9 @@ void basilisk_swaploop(void *_swap) if ( basilisk_rawtx_gen("myfee",myinfo,swap,swap->I.iambob,1,&swap->myfee,0,swap->myfee.spendscript,swap->myfee.I.spendlen,swap->myfee.coin->chain->txfee,1,0) == 0 ) { printf("done generate fee\n"); - swap->I.statebits |= basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40); - iguana_unspents_mark(&swap->myinfo,swap->I.iambob!=0?swap->bobcoin:swap->alicecoin,swap->myfee.vins); - basilisk_txlog(&swap->myinfo,swap,&swap->myfee,-1); + swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40); + iguana_unspents_mark(myinfo,swap->I.iambob!=0?swap->bobcoin:swap->alicecoin,swap->myfee.vins); + basilisk_txlog(myinfo,swap,&swap->myfee,-1); for (i=0; imyfee.I.spendlen; i++) printf("%02x",swap->myfee.txbytes[i]); printf(" fee %p %x\n",swap->myfee.txbytes,swap->I.statebits); @@ -1922,22 +1922,22 @@ void basilisk_swaploop(void *_swap) } } } - while ( basilisk_swapiteration(&swap->myinfo,swap,data,maxlen) == 0 ) + while ( basilisk_swapiteration(myinfo,swap,data,maxlen) == 0 ) { - sleep(3); - basilisk_sendstate(&swap->myinfo,swap,data,maxlen); - basilisk_swapget(&swap->myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); + sleep(13); + basilisk_sendstate(myinfo,swap,data,maxlen); + basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); if ( time(NULL) > swap->I.expiration ) break; - dpow_nanomsg_update(&swap->myinfo); - dex_updateclient(&swap->myinfo); + dpow_nanomsg_update(myinfo); + dex_updateclient(myinfo); } printf("end of atomic swap\n"); if ( swap->I.iambob != 0 && swap->bobdeposit.txbytes != 0 ) { printf("BOB reclaims refund\n"); - basilisk_bobdeposit_refund(&swap->myinfo,swap,0); - if ( basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0,data,maxlen,&swap->bobrefund,0x40000000) == 0 ) // use secretBn + basilisk_bobdeposit_refund(myinfo,swap,0); + if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobrefund,0x40000000) == 0 ) // use secretBn { printf("Bob submit error getting refund of deposit\n"); } @@ -1946,17 +1946,17 @@ void basilisk_swaploop(void *_swap) // maybe wait for bobrefund to be confirmed for (j=datalen=0; j<32; j++) data[datalen++] = swap->I.privBn.bytes[j]; - basilisk_swapsend(&swap->myinfo,swap,0x40000000,data,datalen,0x40000000,swap->I.crcs_mypriv); + basilisk_swapsend(myinfo,swap,0x40000000,data,datalen,0x40000000,swap->I.crcs_mypriv); } } - if ( swapcompleted(&swap->myinfo,swap) > 0 ) // only if swap completed + if ( swapcompleted(myinfo,swap) > 0 ) // only if swap completed { if ( swap->I.iambob != 0 ) - tradebot_pendingadd(&swap->myinfo,swapjson(&swap->myinfo,swap),swap->I.req.src,dstr(swap->I.req.srcamount),swap->I.req.dest,dstr(swap->I.req.destamount)); - else tradebot_pendingadd(&swap->myinfo,swapjson(&swap->myinfo,swap),swap->I.req.dest,dstr(swap->I.req.destamount),swap->I.req.src,dstr(swap->I.req.srcamount)); + tradebot_pendingadd(myinfo,swapjson(myinfo,swap),swap->I.req.src,dstr(swap->I.req.srcamount),swap->I.req.dest,dstr(swap->I.req.destamount)); + else tradebot_pendingadd(myinfo,swapjson(myinfo,swap),swap->I.req.dest,dstr(swap->I.req.destamount),swap->I.req.src,dstr(swap->I.req.srcamount)); } printf("%s swap finished statebits %x\n",swap->I.iambob!=0?"BOB":"ALICE",swap->I.statebits); - basilisk_swap_purge(&swap->myinfo,swap); + basilisk_swap_purge(myinfo,swap); free(data); } From d9bfcad2985ee6c086025394ef9a75a531459495 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 00:29:17 +0200 Subject: [PATCH 326/495] Test --- basilisk/basilisk_swap.c | 10 +++++----- iguana/iguana777.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 893030f84..af2ab611f 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -457,7 +457,7 @@ int32_t basilisk_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,str { decode_hex(rawtx->spendscript,hexlen,hexstr); rawtx->I.spendlen = hexlen; - basilisk_txlog(myinfo,swap,rawtx,-1); // bobdeposit, bobpayment or alicepayment + basilisk_txlog(swap->myinfoptr,swap,rawtx,-1); // bobdeposit, bobpayment or alicepayment retval = 0; } } else printf("%s ERROR.(%s)\n",rawtx->name,jprint(txobj,0)); @@ -1783,7 +1783,7 @@ cJSON *swapjson(struct supernet_info *myinfo,struct basilisk_swap *swap) void basilisk_swaploop(void *_swap) { uint8_t *data; uint32_t expiration; uint32_t channel; int32_t retval=0,i,j,datalen,maxlen; struct supernet_info *myinfo; struct basilisk_swap *swap = _swap; - myinfo = &swap->myinfo; + myinfo = swap->myinfoptr; fprintf(stderr,"start swap\n"); maxlen = 1024*1024 + sizeof(*swap); data = malloc(maxlen); @@ -1976,13 +1976,13 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 swap = calloc(1,sizeof(*swap)); vcalc_sha256(0,swap->I.orderhash.bytes,(uint8_t *)rp,sizeof(*rp)); swap->I.req = *rp; - swap->myinfo = *myinfo; - swap->myinfo.ctx = myinfo->ctx; + swap->myinfoptr = myinfo; + /*swap->myinfo.ctx = myinfo->ctx; bitcoin_pubkey33(myinfo->ctx,pubkey33,privkey); pubkey25519 = curve25519(privkey,curve25519_basepoint9()); swap->myinfo.persistent_priv = privkey; swap->myinfo.myaddr.persistent = pubkey25519; - memcpy(swap->myinfo.persistent_pubkey33,pubkey33,33); + memcpy(swap->myinfo.persistent_pubkey33,pubkey33,33);*/ m = n = 0; if ( bitcoin_swapinit(myinfo->ctx,privkey,pubkey33,pubkey25519,swap,optionduration) != 0 ) { diff --git a/iguana/iguana777.h b/iguana/iguana777.h index e724e828b..782695f8d 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -154,7 +154,7 @@ struct supernet_info struct basilisk_swap { - struct supernet_info myinfo; struct iguana_info *bobcoin,*alicecoin; + struct supernet_info *myinfoptr; struct iguana_info *bobcoin,*alicecoin; void (*balancingtrade)(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t iambob); struct basilisk_swapinfo I; struct basilisk_rawtx bobdeposit,bobpayment,alicepayment,myfee,otherfee,aliceclaim,alicespend,bobreclaim,bobspend,bobrefund,alicereclaim; From 2b717a63d3cb030bfb45d22fbc2d13786147f568 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 00:38:05 +0200 Subject: [PATCH 327/495] Test --- basilisk/basilisk_swap.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index af2ab611f..f01f125b0 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1977,12 +1977,12 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 vcalc_sha256(0,swap->I.orderhash.bytes,(uint8_t *)rp,sizeof(*rp)); swap->I.req = *rp; swap->myinfoptr = myinfo; - /*swap->myinfo.ctx = myinfo->ctx; + //swap->myinfo.ctx = myinfo->ctx; bitcoin_pubkey33(myinfo->ctx,pubkey33,privkey); pubkey25519 = curve25519(privkey,curve25519_basepoint9()); - swap->myinfo.persistent_priv = privkey; - swap->myinfo.myaddr.persistent = pubkey25519; - memcpy(swap->myinfo.persistent_pubkey33,pubkey33,33);*/ + //swap->myinfo.persistent_priv = privkey; + //swap->myinfo.myaddr.persistent = pubkey25519; + //memcpy(swap->myinfo.persistent_pubkey33,pubkey33,33); m = n = 0; if ( bitcoin_swapinit(myinfo->ctx,privkey,pubkey33,pubkey25519,swap,optionduration) != 0 ) { From f94a6d4ebc88cb638bd1a3879b115e7d6dcd740a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 00:44:02 +0200 Subject: [PATCH 328/495] Test --- basilisk/basilisk_swap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index f01f125b0..e51e98d97 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1979,7 +1979,7 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 swap->myinfoptr = myinfo; //swap->myinfo.ctx = myinfo->ctx; bitcoin_pubkey33(myinfo->ctx,pubkey33,privkey); - pubkey25519 = curve25519(privkey,curve25519_basepoint9()); + pubkey25519 = myinfo->myaddr.persistent;//curve25519(privkey,curve25519_basepoint9()); //swap->myinfo.persistent_priv = privkey; //swap->myinfo.myaddr.persistent = pubkey25519; //memcpy(swap->myinfo.persistent_pubkey33,pubkey33,33); From c6129bdb68bec5374a941308002287a369747390 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 00:50:44 +0200 Subject: [PATCH 329/495] Test --- basilisk/jumblr.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 5272bd8f3..1fd686e34 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -384,9 +384,9 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch vals = cJSON_CreateObject(); jaddstr(vals,"source","BTC"); jaddstr(vals,"dest","KMD"); - jaddnum(vals,"amount",btcavail*.85); + jaddnum(vals,"amount",btcavail*.25); jaddnum(vals,"minprice",kmdprice*.95); - jaddnum(vals,"usejumblr",1); + //jaddnum(vals,"usejumblr",1); memset(hash.bytes,0,sizeof(hash)); pending = btcavail; if ( (retstr= InstantDEX_request(myinfo,coinbtc,0,0,hash,vals,"")) != 0 ) @@ -401,7 +401,7 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval) { - static uint32_t lasttime; + //static uint32_t lasttime; char BTCaddr[64],KMDaddr[64],*zaddr,*retstr; bits256 privkey; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r; fee = JUMBLR_INCR * JUMBLR_FEE; OS_randombytes(&r,sizeof(r)); From 8ac4e64ecb7d344024ced7f7162bd81e33aa59fb Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 01:00:14 +0200 Subject: [PATCH 330/495] Test --- basilisk/basilisk_DEX.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index e8036287e..688ebc169 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -742,7 +742,7 @@ INT_ARG(InstantDEX,incoming,requestid) msgid = (uint32_t)time(NULL) + drift; if ( (retarray= basilisk_channelget(myinfo,zero,myinfo->myaddr.persistent,DEX_channel,msgid,width)) != 0 ) { - //printf("GOT.(%s)\n",jprint(retarray,0)); + printf("GOT.(%s)\n",jprint(retarray,0)); if ( (retval= basilisk_process_retarray(myinfo,0,InstantDEX_process_channelget,data,sizeof(data),DEX_channel,msgid,retarray,InstantDEX_incoming_func)) > 0 ) { jaddstr(retjson,"result","success"); From 1760cc4fcb2824b63d52aa57715fb11aedd2bde6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 01:04:10 +0200 Subject: [PATCH 331/495] Test --- basilisk/jumblr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 1fd686e34..e001f5174 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -384,7 +384,7 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch vals = cJSON_CreateObject(); jaddstr(vals,"source","BTC"); jaddstr(vals,"dest","KMD"); - jaddnum(vals,"amount",btcavail*.25); + jaddnum(vals,"amount",btcavail*.3); jaddnum(vals,"minprice",kmdprice*.95); //jaddnum(vals,"usejumblr",1); memset(hash.bytes,0,sizeof(hash)); From 456dbd41e482ce2b51f0f5b2d2cb613798d4c6ab Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 01:16:56 +0200 Subject: [PATCH 332/495] Test --- basilisk/basilisk_MSG.c | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index 33de5aa2f..f7cfbec45 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -103,7 +103,11 @@ char *basilisk_iterate_MSG(struct supernet_info *myinfo,uint32_t channel,uint32_ { keylen = basilisk_messagekey(key,channel,msgid,srchash,desthash); if ( (item= _basilisk_respond_getmessage(myinfo,key,keylen)) != 0 ) - jaddi(array,item);//, printf("gotmsg0.(%s)\n",jprint(item,0)); + { + jaddbits256(item,"src",srchash); + jaddbits256(item,"dest",desthash); + jaddi(array,item); + } //keylen = basilisk_messagekey(key,channel,msgid,desthash,srchash); //if ( (item= _basilisk_respond_getmessage(myinfo,key,keylen)) != 0 ) // jaddi(array,item);//, printf("gotmsg0.(%s)\n",jprint(item,0)); @@ -113,7 +117,11 @@ char *basilisk_iterate_MSG(struct supernet_info *myinfo,uint32_t channel,uint32_ { keylen = basilisk_messagekey(key,channel,msgid,zero,desthash); if ( (item= _basilisk_respond_getmessage(myinfo,key,keylen)) != 0 ) - jaddi(array,item);//, printf("gotmsg1.(%s)\n",jprint(item,0)); + { + jaddbits256(item,"src",srchash); + jaddbits256(item,"dest",desthash); + jaddi(array,item); + } //keylen = basilisk_messagekey(key,channel,msgid,desthash,zero); //if ( (item= _basilisk_respond_getmessage(myinfo,key,keylen)) != 0 ) // jaddi(array,item);//, printf("gotmsg1.(%s)\n",jprint(item,0)); @@ -122,7 +130,11 @@ char *basilisk_iterate_MSG(struct supernet_info *myinfo,uint32_t channel,uint32_ { keylen = basilisk_messagekey(key,channel,msgid,srchash,zero); if ( (item= _basilisk_respond_getmessage(myinfo,key,keylen)) != 0 ) - jaddi(array,item);//, printf("gotmsg2.(%s)\n",jprint(item,0)); + { + jaddbits256(item,"src",srchash); + jaddbits256(item,"dest",desthash); + jaddi(array,item); + } //keylen = basilisk_messagekey(key,channel,msgid,zero,srchash); //if ( (item= _basilisk_respond_getmessage(myinfo,key,keylen)) != 0 ) // jaddi(array,item);//, printf("gotmsg2.(%s)\n",jprint(item,0)); @@ -131,7 +143,11 @@ char *basilisk_iterate_MSG(struct supernet_info *myinfo,uint32_t channel,uint32_ { keylen = basilisk_messagekey(key,channel,msgid,zero,zero); if ( (item= _basilisk_respond_getmessage(myinfo,key,keylen)) != 0 ) - jaddi(array,item);//, printf("gotmsg3.(%s)\n",jprint(item,0)); + { + jaddbits256(item,"src",srchash); + jaddbits256(item,"dest",desthash); + jaddi(array,item); + } } } msgid--; @@ -143,7 +159,11 @@ char *basilisk_iterate_MSG(struct supernet_info *myinfo,uint32_t channel,uint32_ if ( basilisk_msgcmp(msg,origwidth,channel,origmsgid,zero,zero) == 0 ) { if ( (msgjson= basilisk_msgjson(msg,msg->key,msg->keylen)) != 0 ) + { + jaddbits256(msgjson,"src",srchash); + jaddbits256(msgjson,"dest",desthash); jaddi(array,msgjson); + } } } if ( now > msg->expiration+60 ) @@ -404,8 +424,9 @@ cJSON *basilisk_channelget(struct supernet_info *myinfo,bits256 srchash,bits256 retstr = basilisk_getmessage(myinfo,0,0,0,desthash,valsobj,0); else { + char str[65],str2[65]; retstr = _dex_getmessage(myinfo,jprint(valsobj,0)); - printf("channel.%u msgid.%u gotmessage.(%d) %s\n",channel,msgid,(int32_t)strlen(retstr),strlen(retstr) < 100 ? retstr : "(too long)"); + printf("channel.%u msgid.%u gotmessage.(%d) %s %s %s\n",channel,msgid,(int32_t)strlen(retstr),strlen(retstr) < 100 ? retstr : "(too long)",bits256_str(str,srchash),bits256_str(str2,desthash)); } if ( retstr != 0 ) { From b6dd4e69b4a5b0677b7b1129d42b9859f8dfffc6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 01:17:49 +0200 Subject: [PATCH 333/495] Test --- iguana/dpow/dpow_network.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 87985e7d3..f66fa7174 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -620,7 +620,7 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d retstr = dpow_importaddress(myinfo,coin,(char *)&dexp->packet[datalen]); if ( retstr == 0 ) { - *broadcastflagp = 1; + //*broadcastflagp = 1; retstr = dpow_validateaddress(myinfo,coin,(char *)&dexp->packet[datalen]); } else From 422a40f4b237a45a350d7b58f293033f7831ceed Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 01:28:02 +0200 Subject: [PATCH 334/495] Test --- iguana/dpow/dpow_network.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index f66fa7174..68623a4a6 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -416,14 +416,14 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 printf("%d: subscribe connect (%s)\n",myinfo->numdexipbits,str); } } -#ifndef __APPLE__ - if ( (rand() % 100) < 40 ) +//#ifndef __APPLE__ + if ( 0 && (rand() % 100) < 40 ) { nanomsg_tcpname(0,str,ipaddr,REP_SOCK); nn_connect(myinfo->reqsock,str); printf("%d: req connect (%s)\n",myinfo->numdexipbits,str); } -#endif +//#endif } } if ( freeptr != 0 ) From 1221e44f92621fadb3e6ab1179a264e014628f38 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 01:42:43 +0200 Subject: [PATCH 335/495] test --- iguana/dpow/dpow_network.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 68623a4a6..e568d62e5 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1108,7 +1108,7 @@ int32_t dex_packetcheck(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp if ( dexp->datalen == (size - sizeof(*dexp)) ) { crc32 = calc_crc32(0,dexp->packet,dexp->datalen);//(void *)((long)dexp + sizeof(dexp->crc32)),(int32_t)(size - sizeof(dexp->crc32))); - if ( dexp->crc32 == crc32 && (firstz= dex_crc32find(myinfo,crc32)) >= 0 ) + if ( dexp->crc32 == crc32 )//&& (firstz= dex_crc32find(myinfo,crc32)) >= 0 ) return(0); //else printf("dexp %08x != %08x || firstz.%d < 0\n",dexp->crc32,crc32,firstz); } else printf("datalen.%d != (%d - %ld)\n",dexp->datalen,size,sizeof(*dexp)); From bb16797aa1146d460500f72b35f2fb59c3c0b7b6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 01:54:02 +0200 Subject: [PATCH 336/495] Test --- iguana/dpow/dpow_network.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index e568d62e5..86b53d7ee 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1119,6 +1119,7 @@ int32_t dex_packetcheck(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp int32_t dex_subsock_poll(struct supernet_info *myinfo) { int32_t size= -1; struct dex_nanomsghdr *dexp; void *freeptr; + return(0); //fprintf(stderr,"subsock.%d\n",myinfo->subsock); if ( myinfo->subsock >= 0 && (size= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->subsock,&dexp)) >= 0 ) { From c5426295f097becc10f1df4915064586586eae49 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 02:03:49 +0200 Subject: [PATCH 337/495] Test --- basilisk/basilisk_MSG.c | 2 +- basilisk/basilisk_swap.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index f7cfbec45..d10a51369 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -98,7 +98,7 @@ char *basilisk_iterate_MSG(struct supernet_info *myinfo,uint32_t channel,uint32_ // char str[65],str2[65]; printf("MSGiterate (%s) -> (%s)\n",bits256_str(str,srchash),bits256_str(str2,desthash)); array = cJSON_CreateArray(); portable_mutex_lock(&myinfo->messagemutex); - //printf("iterate_MSG allflag.%d width.%d channel.%d msgid.%d src.%llx -> %llx\n",allflag,origwidth,channel,msgid,(long long)srchash.txid,(long long)desthash.txid); + printf("iterate_MSG width.%d channel.%d msgid.%d src.%llx -> %llx\n",origwidth,channel,msgid,(long long)srchash.txid,(long long)desthash.txid); for (i=0; iI.otherhash); jaddbits256(valsobj,"desthash",swap->I.myhash); - jaddnum(valsobj,"width",0); + jaddnum(valsobj,"width",30); if ( (retstr= _dex_getmessage(myinfo,jprint(valsobj,1))) != 0 ) { if ( (array= cJSON_Parse(retstr)) != 0 ) From 9ed0c3301507fa99fb559935e4f5eb3ec5ee3e37 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 11:38:31 +0200 Subject: [PATCH 338/495] Sock --- basilisk/basilisk_MSG.c | 24 ++++++ iguana/dPoW.h | 3 + iguana/dpow/dpow_network.c | 147 ++++++++++++++++++++++++++++++++-- iguana/iguana777.h | 4 + iguana/iguana_notary.c | 10 +++ iguana/main.c | 3 + includes/iguana_apideclares.h | 2 + includes/iguana_funcs.h | 1 + 8 files changed, 188 insertions(+), 6 deletions(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index d10a51369..e6d55208d 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -295,6 +295,30 @@ cJSON *dpow_getmessage(struct supernet_info *myinfo,char *jsonstr) return(retjson); } +cJSON *dpow_addmessage(struct supernet_info *myinfo,char *jsonstr) +{ + cJSON *vals,*retjson=0; char *retstr=0,*datastr; int32_t datalen,keylen; uint8_t *data=0,key[BASILISK_KEYSIZE]; + if ( (vals= cJSON_Parse(jsonstr)) != 0 ) + { + keylen = basilisk_messagekey(key,juint(vals,"channel"),juint(vals,"msgid"),jbits256(vals,"srchash"),jbits256(vals,"desthash")); + if ( (datastr= jstr(vals,"data")) != 0 ) + { + datalen = (int32_t)strlen(datastr) >> 1; + data = malloc(datalen); + decode_hex(data,datalen,datastr); + if ( (retstr= basilisk_respond_addmessage(myinfo,key,keylen,data,datalen,0,juint(vals,"duration"))) != 0 ) + retjson = cJSON_Parse(retstr); + } + if ( retstr != 0 ) + free(retstr); + if ( data != 0 ) + free(data); + } + if ( retjson == 0 ) + retjson = cJSON_Parse("{\"error\":\"couldnt add message\"}"); + return(retjson); +} + #include "../includes/iguana_apidefs.h" #include "../includes/iguana_apideclares.h" diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 7ddef6ce3..dcde86599 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -168,6 +168,8 @@ cJSON *dpow_kvupdate(struct supernet_info *myinfo,struct iguana_info *coin,char cJSON *dpow_kvsearch(struct supernet_info *myinfo,struct iguana_info *coin,char *key); void init_alladdresses(struct supernet_info *myinfo,struct iguana_info *coin); cJSON *dpow_getmessage(struct supernet_info *myinfo,char *jsonstr); +cJSON *dpow_addmessage(struct supernet_info *myinfo,char *jsonstr); +cJSON *dpow_psock(struct supernet_info *myinfo,char *jsonstr); char *_dex_getinfo(struct supernet_info *myinfo,char *symbol); char *_dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 txid); @@ -191,6 +193,7 @@ int32_t _dex_getheight(struct supernet_info *myinfo,char *symbol); char *_dex_getnotaries(struct supernet_info *myinfo,char *symbol); char *_dex_kvupdate(struct supernet_info *myinfo,char *symbol,char *key,char *value,int32_t flags); char *_dex_kvsearch(struct supernet_info *myinfo,char *symbol,char *key); +char *_dex_psock(struct supernet_info *myinfo,char *jsonstr); int32_t komodo_notaries(char *symbol,uint8_t pubkeys[64][33],int32_t height); cJSON *dpow_checkaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *address); diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 86b53d7ee..73d6054e7 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -239,6 +239,106 @@ char *nanomsg_tcpname(struct supernet_info *myinfo,char *str,char *ipaddr,uint16 return(str); } +void dpow_psockloop(void *_ptr) +{ + int32_t i,nonz,size,sentbytes; uint32_t now; struct psock *ptr; void *buf; struct supernet_info *myinfo = _ptr; + while ( 1 ) + { + now = (uint32_t)time(NULL); + for (i=nonz=0; inumpsocks; i++) // change to nn_poll! + { + portable_mutex_lock(&myinfo->psockmutex); + if ( i < myinfo->numpsocks ) + { + ptr = &myinfo->PSOCKS[i]; + if ( (size= nn_recv(ptr->pullsock,&buf,NN_MSG,0)) > 0 ) + { + ptr->lasttime = now; + if ( (sentbytes= nn_send(ptr->pubsock,buf,size,0)) > 0 ) + { + printf("PSOCKS[%d] of %d (%u %u) -> %d/%d bytes\n",i,myinfo->numpsocks,ptr->pushport,ptr->subport,size,sentbytes); + nonz++; + } + } + else if ( now > ptr->lasttime+PSOCK_IDLETIMEOUT ) + { + printf("PSOCKS[%d] of %d (%u %u) lag.%d IDLETIMEOUT\n",i,myinfo->numpsocks,ptr->pushport,ptr->subport,now - ptr->lasttime); + nn_close(ptr->pullsock); + nn_close(ptr->pubsock); + if ( myinfo->numpsocks > 1 ) + { + myinfo->PSOCKS[i] = myinfo->PSOCKS[--myinfo->numpsocks]; + memset(&myinfo->PSOCKS[myinfo->numpsocks],0,sizeof(*ptr)); + } else myinfo->numpsocks = 0; + } + if ( buf != 0 ) + nn_freemsg(buf), buf = 0; + } + portable_mutex_unlock(&myinfo->psockmutex); + } + if ( nonz == 0 ) + usleep(100000); + } +} + +void dpow_psockadd(struct supernet_info *myinfo,int32_t pullsock,uint16_t pushport,int32_t pubsock,uint16_t subport) +{ + struct psock *ptr; + portable_mutex_lock(&myinfo->psockmutex); + myinfo->PSOCKS = realloc(myinfo->PSOCKS,sizeof(*myinfo->PSOCKS) * (myinfo->numpsocks + 1)); + ptr = &myinfo->PSOCKS[myinfo->numpsocks++]; + ptr->pullsock = pullsock; + ptr->pushport = pushport; + ptr->pubsock = pubsock; + ptr->subport = subport; + ptr->lasttime = (uint32_t)time(NULL); + portable_mutex_unlock(&myinfo->psockmutex); +} + +cJSON *dpow_psock(struct supernet_info *myinfo,char *jsonstr) +{ + char pushaddr[128],subaddr[128]; uint16_t i,pushport,subport; int32_t timeout,maxsize,pullsock=-1,pubsock=-1; cJSON *retjson=0; + retjson = cJSON_CreateObject(); + pushport = myinfo->psockport++; + subport = myinfo->psockport++; + for (i=0; i<100; i++) + { + nanomsg_tcpname(myinfo,pushaddr,myinfo->ipaddr,pushport), pushport += 2; + nanomsg_tcpname(myinfo,subaddr,myinfo->ipaddr,subport), subport += 2; + if ( (pullsock= nn_socket(AF_SP,NN_PULL)) >= 0 && (pubsock= nn_socket(AF_SP,NN_PUB)) >= 0 ) + { + if ( nn_bind(pullsock,pushaddr) >= 0 && nn_bind(pubsock,subaddr) >= 0 ) + { + timeout = 10; + nn_setsockopt(pubsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + timeout = 1; + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + timeout = 1; + maxsize = 1024 * 1024; + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); + dpow_psockadd(myinfo,pullsock,pushport,pubsock,subport); + jaddstr(retjson,"result","success"); + jaddstr(retjson,"pushaddr",pushaddr); + jaddstr(retjson,"subaddr",subaddr); + break; + } + } + if ( pushport < 1000 ) + pushport = 1001; + if ( subport < 1000 ) + subport = 1001; + } + if ( i == 100 ) + { + jaddstr(retjson,"error","cant find psock ports"); + if ( pullsock >= 0 ) + nn_close(pullsock); + if ( pubsock >= 0 ) + nn_close(pubsock); + } + return(retjson); +} + static int _increasing_ipbits(const void *a,const void *b) { #define uint32_a (*(uint32_t *)a) @@ -254,7 +354,7 @@ static int _increasing_ipbits(const void *a,const void *b) void dex_packet(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp,int32_t size) { - char *retstr; int32_t datalen; struct iguana_info *coin; struct dex_request dexreq; + char *retstr; int32_t datalen; struct dex_request dexreq; //struct iguana_info *coin; //for (i=0; ihandler,"DEX") == 0 && dexp->datalen > BASILISK_KEYSIZE ) @@ -266,12 +366,12 @@ void dex_packet(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp,int32_t else if ( strcmp(dexp->handler,"request") == 0 ) { datalen = dex_rwrequest(0,dexp->packet,&dexreq); - if ( myinfo->IAMNOTARY != 0 && dexreq.func == 'A' && (coin= iguana_coinfind(dexreq.name)) != 0 ) + /*if ( myinfo->IAMNOTARY != 0 && dexreq.func == 'A' && (coin= iguana_coinfind(dexreq.name)) != 0 ) { if ( (retstr= dpow_importaddress(myinfo,coin,(char *)&dexp->packet[datalen])) != 0 ) free(retstr); printf("process broadcast importaddress.(%s) [%s]\n",(char *)&dexp->packet[datalen],dexreq.name); - } + }*/ } } @@ -652,6 +752,23 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d retstr = jprint(retjson,1); } } + else if ( dexreq.func == 'Z' ) + { + if ( (retjson= dpow_psock(myinfo,(char *)&dexp->packet[datalen])) != 0 ) + { + dpow_randipbits(myinfo,coin,retjson); + retstr = jprint(retjson,1); + } + } + else if ( 0 && dexreq.func == 'a' ) + { + if ( (retjson= dpow_addmessage(myinfo,(char *)&dexp->packet[datalen])) != 0 ) + { + *broadcastflagp = 1; + dpow_randipbits(myinfo,coin,retjson); + retstr = jprint(retjson,1); + } + } else if ( dexreq.func == 'N' ) { uint8_t pubkeys[64][33]; char str[128]; int32_t numnotaries; cJSON *array,*item; @@ -1010,6 +1127,24 @@ char *_dex_getmessage(struct supernet_info *myinfo,char *jsonstr) return(_dex_sendrequeststr(myinfo,&dexreq,jsonstr,0,1,"")); } +char *_dex_sendmessage(struct supernet_info *myinfo,char *jsonstr) +{ + struct dex_request dexreq; + memset(&dexreq,0,sizeof(dexreq)); + safecopy(dexreq.name,"KMD",sizeof(dexreq.name)); + dexreq.func = 'a'; + return(_dex_sendrequeststr(myinfo,&dexreq,jsonstr,0,1,"")); +} + +char *_dex_psock(struct supernet_info *myinfo,char *jsonstr) +{ + struct dex_request dexreq; + memset(&dexreq,0,sizeof(dexreq)); + safecopy(dexreq.name,"KMD",sizeof(dexreq.name)); + dexreq.func = 'Z'; + return(_dex_sendrequeststr(myinfo,&dexreq,jsonstr,0,1,"")); +} + char *_dex_listunspentarg(struct supernet_info *myinfo,char *symbol,char *address,uint8_t arg) { struct dex_request dexreq; char *retstr; @@ -1102,7 +1237,7 @@ int32_t dex_crc32find(struct supernet_info *myinfo,uint32_t crc32) int32_t dex_packetcheck(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp,int32_t size) { - int32_t firstz=-1; uint32_t crc32; + uint32_t crc32; //int32_t firstz=-1; if ( dexp->version0 == (DEX_VERSION & 0xff) && dexp->version1 == ((DEX_VERSION >> 8) & 0xff) ) { if ( dexp->datalen == (size - sizeof(*dexp)) ) @@ -1988,7 +2123,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { //printf("FROM BUS.%08x -> pub\n",dexp->crc32); - signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); + //signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); dex_packet(myinfo,dexp,size); } //printf("GOT DEX bus PACKET.%d\n",size); @@ -2012,7 +2147,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) { printf("BROADCAST dexp request.[%d]\n",size); signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->dexsock,dexp,size); - signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); + //signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); } } else diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 782695f8d..a31b4b01e 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -90,6 +90,9 @@ struct supernet_address struct pending_trade { UT_hash_handle hh; double basevolume,relvolume,dir; char base[32],rel[32]; }; +#define PSOCK_IDLETIMEOUT 600 +struct psock { uint32_t lasttime; int32_t pullsock,pubsock; uint16_t pushport,subport; }; + #define JUMBLR_DEPOSITPREFIX "deposit " struct jumblr_item { @@ -149,6 +152,7 @@ struct supernet_info uint8_t logs[256],exps[510]; struct message_info msgids[8192]; double *svmfeatures; + uint16_t psockport,numpsocks; struct psock *PSOCKS; portable_mutex_t psockmutex; uint8_t notaries[64][33]; int32_t numnotaries,DEXEXPLORER; }; diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 2d718e6ba..e8b80daa2 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -747,6 +747,16 @@ TWO_STRINGS(dex,validateaddress,symbol,address) return(_dex_validateaddress(myinfo,symbol,address)); } +STRING_ARG(dex,getmessage,argstr) +{ + return(_dex_getmessage(myinfo,argstr)); +} + +STRING_ARG(dex,psock,argstr) +{ + return(_dex_psock(myinfo,argstr)); +} + STRING_ARG(dex,getnotaries,symbol) { return(_dex_getnotaries(myinfo,symbol)); diff --git a/iguana/main.c b/iguana/main.c index 8b06d5deb..b8d7e20a6 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -785,6 +785,7 @@ void iguana_launchdaemons(struct supernet_info *myinfo) printf("launch mainloop\n"); OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)DEX_explorerloop,(void *)myinfo); OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)jumblr_loop,(void *)myinfo); + OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)dpow_psockloop,(void *)myinfo); mainloop(myinfo); } @@ -1749,6 +1750,7 @@ void iguana_main(void *arg) myinfo->rpcport = IGUANA_RPCPORT; myinfo->dpowsock = myinfo->dexsock = myinfo->pubsock = myinfo->subsock = myinfo->reqsock = myinfo->repsock = -1; dex_init(myinfo); + myinfo->psockport = 30000; if ( arg != 0 ) { if ( strcmp((char *)arg,"OStests") == 0 ) @@ -1775,6 +1777,7 @@ void iguana_main(void *arg) portable_mutex_init(&myinfo->pending_mutex); portable_mutex_init(&myinfo->dpowmutex); portable_mutex_init(&myinfo->notarymutex); + portable_mutex_init(&myinfo->psockmutex); #if LIQUIDITY_PROVIDER myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("nxtae"),0); myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("bitcoin"),0); diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 3f952e15a..632026ffb 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -49,6 +49,8 @@ HASH_AND_STRING_AND_INT(dex,gettxin,txid,symbol,vout); TWO_STRINGS(dex,listspent,symbol,address); TWO_STRINGS(dex,getbalance,symbol,address); STRING_ARG(dex,explorer,symbol); +STRING_ARG(dex,getmessage,argstr); +STRING_ARG(dex,psock,argstr); HASH_ARRAY_STRING(basilisk,genesis_opreturn,hash,vals,hexstr); HASH_ARRAY_STRING(basilisk,history,hash,vals,hexstr); diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index b60b72b8a..95ae1e414 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -596,6 +596,7 @@ void basilisk_ensurerelay(struct supernet_info *myinfo,struct iguana_info *notar void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr); int32_t iguana_datachain_scan(struct supernet_info *myinfo,struct iguana_info *coin,uint8_t rmd160[20]); void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey); +void dpow_psockloop(void *_ptr); void iguana_RTreset(struct iguana_info *coin); void iguana_RTpurge(struct iguana_info *coin,int32_t lastheight); From 1b8b4262bf0b9f19d7d49e8b6770e53f18982216 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 11:40:37 +0200 Subject: [PATCH 339/495] Test --- iguana/iguana777.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/iguana/iguana777.h b/iguana/iguana777.h index a31b4b01e..5beb12130 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -59,12 +59,14 @@ #include "../crypto777/nanosrc/nn.h" #include "../crypto777/nanosrc/bus.h" #include "../crypto777/nanosrc/pubsub.h" +#include "../crypto777/nanosrc/pipeline.h" #include "../crypto777/nanosrc/reqrep.h" #include "../crypto777/nanosrc/tcp.h" #else #include "/usr/local/include/nanomsg/nn.h" #include "/usr/local/include/nanomsg/bus.h" #include "/usr/local/include/nanomsg/pubsub.h" +#include "/usr/local/include/nanomsg/pipeline.h" #include "/usr/local/include/nanomsg/reqrep.h" #include "/usr/local/include/nanomsg/tcp.h" #endif From ea3226e721ad772e2d0287e0f0ea6c210dd07db8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 15:09:54 +0200 Subject: [PATCH 340/495] Test --- basilisk/basilisk_DEX.c | 20 +++- basilisk/basilisk_swap.c | 195 +++++++++++++++++++++++++++-------- basilisk/basilisk_tradebot.c | 8 ++ iguana/dpow/dpow_network.c | 13 +-- iguana/iguana777.h | 7 +- iguana/tests/dexkvupdate | 4 +- iguana/tests/dexpsock | 2 + 7 files changed, 192 insertions(+), 57 deletions(-) create mode 100755 iguana/tests/dexpsock diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 688ebc169..7cadc124c 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -276,7 +276,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) { static uint32_t lastpoll; char *retstr; uint8_t data[32768]; cJSON *outerarray,*retjson; uint32_t msgid,channel; int32_t datalen,i,n; struct basilisk_request issueR; double hwm = 0.; - if ( myinfo->IAMNOTARY != 0 || time(NULL) < lastpoll+20 || (myinfo->IAMLP == 0 && myinfo->DEXactive == 0) ) + if ( myinfo->IAMNOTARY != 0 || time(NULL) < lastpoll+20 || (myinfo->IAMLP == 0 && myinfo->DEXactive < time(NULL)) ) return; lastpoll = (uint32_t)time(NULL); memset(&issueR,0,sizeof(issueR)); @@ -317,7 +317,23 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) dex_updateclient(myinfo); if ( (retstr= basilisk_start(myinfo,myinfo->persistent_priv,&issueR,1,issueR.optionhours * 3600)) != 0 ) free(retstr); - /*if ( (retstr= InstantDEX_accept(myinfo,0,0,0,issueR.requestid,issueR.quoteid)) != 0 ) + } + else if ( bits256_cmp(myinfo->jumblr_pubkey,issueR.srchash) == 0 ) + { + dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 + dpow_nanomsg_update(myinfo); + dex_updateclient(myinfo); + if ( (retstr= basilisk_start(myinfo,myinfo->jumblr_pubkey,&issueR,1,issueR.optionhours * 3600)) != 0 ) + free(retstr); + } + else if ( bits256_cmp(myinfo->jumblr_depositkey,issueR.srchash) == 0 ) + { + dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 + dpow_nanomsg_update(myinfo); + dex_updateclient(myinfo); + if ( (retstr= basilisk_start(myinfo,myinfo->jumblr_depositkey,&issueR,1,issueR.optionhours * 3600)) != 0 ) + free(retstr); + /*if ( (retstr= InstantDEX_accept(myinfo,0,0,0,issueR.requestid,issueR.quoteid)) != 0 ) free(retstr); printf("my req hwm %f -> %u\n",hwm,issueR.requestid); basilisk_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid),60); diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index d77843148..7f935e2d7 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -245,7 +245,7 @@ int32_t basilisk_confirmsobj(cJSON *item) return(-1); } -int32_t basilisk_numconfirms(struct supernet_info *myinfo,struct basilisk_rawtx *rawtx) +int32_t basilisk_numconfirms(struct supernet_info *myinfo,struct basilisk_swap *swap,struct basilisk_rawtx *rawtx) { cJSON *argjson,*valuearray=0; char *valstr; int32_t i,n,retval = -1; #ifdef BASILISK_DISABLEWAITTX @@ -255,7 +255,7 @@ int32_t basilisk_numconfirms(struct supernet_info *myinfo,struct basilisk_rawtx jaddbits256(argjson,"txid",rawtx->I.actualtxid); jaddnum(argjson,"vout",0); jaddstr(argjson,"coin",rawtx->coin->symbol); - if ( (valstr= basilisk_value(myinfo,rawtx->coin,0,0,myinfo->myaddr.persistent,argjson,0)) != 0 ) + if ( (valstr= basilisk_value(myinfo,rawtx->coin,0,0,swap->persistent_pubkey,argjson,0)) != 0 ) { //char str[65]; printf("%s %s valstr.(%s)\n",rawtx->name,bits256_str(str,rawtx->I.actualtxid),valstr); if ( (valuearray= cJSON_Parse(valstr)) != 0 ) @@ -704,7 +704,7 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,struct basilis //bitcoin_address(coinaddr,rawtx->coin->chain->pubtype,myinfo->persistent_pubkey33,33); if ( rawtx->coin->changeaddr[0] == 0 ) { - bitcoin_address(rawtx->coin->changeaddr,rawtx->coin->chain->pubtype,myinfo->persistent_pubkey33,33); + bitcoin_address(rawtx->coin->changeaddr,rawtx->coin->chain->pubtype,swap->persistent_pubkey33,33); printf("set change address.(%s)\n",rawtx->coin->changeaddr); } init_hexbytes_noT(scriptstr,script,scriptlen); @@ -720,7 +720,7 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,struct basilis jaddnum(valsobj,"timeout",30000); jaddnum(valsobj,"timestamp",swap->I.started+delay); addresses = cJSON_CreateArray(); - bitcoin_address(coinaddr,rawtx->coin->chain->pubtype,myinfo->persistent_pubkey33,33); + bitcoin_address(coinaddr,rawtx->coin->chain->pubtype,swap->persistent_pubkey33,33); jaddistr(addresses,coinaddr); jadd(valsobj,"addresses",addresses); rawtx->I.locktime = locktime; @@ -1123,15 +1123,21 @@ int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct igu return(0); } -struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey33,bits256 pubkey25519,struct basilisk_swap *swap,int32_t optionduration) +struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey33,bits256 pubkey25519,struct basilisk_swap *swap,int32_t optionduration,uint32_t statebits) { - struct iguana_info *coin,*bobcoin,*alicecoin; uint8_t *alicepub33=0,*bobpub33=0; int32_t x = -1; + struct iguana_info *bobcoin,*alicecoin; uint8_t *alicepub33=0,*bobpub33=0; int32_t x = -1; swap->I.putduration = swap->I.callduration = INSTANTDEX_LOCKTIME; if ( optionduration < 0 ) swap->I.putduration -= optionduration; else if ( optionduration > 0 ) swap->I.callduration += optionduration; - if ( strcmp("BTC",swap->I.req.src) == 0 ) + swap->bobcoin = iguana_coinfind(swap->I.req.dest); + swap->I.bobsatoshis = swap->I.req.destamount; + swap->I.bobconfirms = (1*0 + sqrt(dstr(swap->I.bobsatoshis) * .1)); + swap->alicecoin = iguana_coinfind(swap->I.req.src); + swap->I.alicesatoshis = swap->I.req.srcamount; + swap->I.aliceconfirms = swap->I.bobconfirms * 3; + /*if ( strcmp("BTC",swap->I.req.src) == 0 ) { swap->bobcoin = iguana_coinfind("BTC"); swap->I.bobsatoshis = swap->I.req.srcamount; @@ -1171,7 +1177,7 @@ struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey } else printf("neither coin handles ctlv %s %s\n",swap->I.req.src,swap->I.req.dest); } else printf("cant find src or dest coin.(%s %s)\n",swap->I.req.src,swap->I.req.dest); } else printf("cant find src coin.(%s)\n",swap->I.req.src); - } + }*/ if ( swap->bobcoin == 0 || swap->alicecoin == 0 ) { printf("missing bobcoin.%p or missing alicecoin.%p src.%p dest.%p\n",swap->bobcoin,swap->alicecoin,iguana_coinfind(swap->I.req.src),iguana_coinfind(swap->I.req.dest)); @@ -1196,7 +1202,17 @@ struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey swap->I.choosei %= INSTANTDEX_DECKSIZE; swap->I.otherchoosei = -1; swap->I.myhash = pubkey25519; - if ( bits256_cmp(swap->I.myhash,swap->I.req.srchash) == 0 ) + if ( statebits != 0 ) + { + swap->I.iambob = 0; + swap->I.otherhash = swap->I.req.desthash; + } + else + { + swap->I.iambob = 1; + swap->I.otherhash = swap->I.req.srchash; + } + /*if ( bits256_cmp(swap->I.myhash,swap->I.req.srchash) == 0 ) { swap->I.otherhash = swap->I.req.desthash; if ( strcmp(swap->I.req.src,swap->I.bobstr) == 0 ) @@ -1212,7 +1228,7 @@ struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey { printf("neither src nor dest error\n"); return(0); - } + }*/ if ( (bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash)+1)/2 != swap->I.iambob ) { printf("error iambob.%d != %d\n",swap->I.iambob,bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash)); @@ -1607,7 +1623,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap } else if ( (swap->I.statebits & 0x2000) == 0 ) { - if ( basilisk_numconfirms(myinfo,&swap->alicepayment) >= swap->I.aliceconfirms ) + if ( basilisk_numconfirms(myinfo,swap,&swap->alicepayment) >= swap->I.aliceconfirms ) { swap->I.statebits |= 0x2000; printf("alicepayment confirmed\n"); @@ -1633,7 +1649,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap tradebot_swap_balancingtrade(myinfo,swap,1); printf("Bob spends alicepayment\n"); swap->I.statebits |= 0x40000; - while ( basilisk_numconfirms(myinfo,&swap->bobspend) < swap->I.aliceconfirms ) + while ( basilisk_numconfirms(myinfo,swap,&swap->bobspend) < swap->I.aliceconfirms ) { printf("bobspend confirmed\n"); swap->I.statebits |= 0x80000; @@ -1656,7 +1672,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap printf("Bob reclaimed own payment\n"); while ( 0 && (swap->I.statebits & 0x100000) == 0 ) // why wait for own tx? { - if ( basilisk_numconfirms(myinfo,&swap->bobreclaim) >= 1 ) + if ( basilisk_numconfirms(myinfo,swap,&swap->bobreclaim) >= 1 ) { printf("bobreclaim confirmed\n"); swap->I.statebits |= 0x100000; @@ -1684,7 +1700,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap } else if ( (swap->I.statebits & 0x400) == 0 ) { - if ( basilisk_numconfirms(myinfo,&swap->bobdeposit) >= swap->I.bobconfirms ) + if ( basilisk_numconfirms(myinfo,swap,&swap->bobdeposit) >= swap->I.bobconfirms ) { printf("bobdeposit confirmed\n"); swap->I.statebits |= 0x400; @@ -1708,7 +1724,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap } else if ( (swap->I.statebits & 0x10000) == 0 ) { - if ( basilisk_numconfirms(myinfo,&swap->bobpayment) >= swap->I.bobconfirms ) + if ( basilisk_numconfirms(myinfo,swap,&swap->bobpayment) >= swap->I.bobconfirms ) { printf("bobpayment confirmed\n"); swap->I.statebits |= 0x10000; @@ -1717,7 +1733,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap else if ( (swap->I.statebits & 0x20000) == 0 ) { printf("alicespend bobpayment\n"); - if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->alicespend,0x20000) != 0 && basilisk_numconfirms(myinfo,&swap->alicespend) > 0 ) + if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->alicespend,0x20000) != 0 && basilisk_numconfirms(myinfo,swap,&swap->alicespend) > 0 ) { for (j=datalen=0; j<32; j++) data[datalen++] = swap->I.privAm.bytes[j]; @@ -1727,7 +1743,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap } else if ( (swap->I.statebits & 0x40000) == 0 ) { - if ( basilisk_numconfirms(myinfo,&swap->alicespend) >= swap->I.bobconfirms ) + if ( basilisk_numconfirms(myinfo,swap,&swap->alicespend) >= swap->I.bobconfirms ) { swap->I.statebits |= 0x40000; printf("Alice confirms spend of Bob's payment\n"); @@ -1780,6 +1796,68 @@ cJSON *swapjson(struct supernet_info *myinfo,struct basilisk_swap *swap) return(retjson); } +void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap,char *pushaddr,char *subaddr) +{ + char keystr[64],databuf[1024],*retstr,*datastr; cJSON *retjson,*addrjson; uint8_t data[512]; int32_t datalen,timeout,pushsock = -1,subsock = -1; + if ( swap->connected == 1 ) + return; + if ( swap->pushsock < 0 && swap->subsock < 0 && (pushsock= nn_socket(AF_SP,NN_PUSH)) >= 0 && (subsock= nn_socket(AF_SP,NN_SUB)) >= 0 ) + { + timeout = 100; + nn_setsockopt(pushsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + timeout = 1; + nn_setsockopt(subsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(subsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); + swap->pushsock = pushsock; + swap->subsock = subsock; + } + sprintf(keystr,"%08x-%08x",swap->I.req.requestid,swap->I.req.quoteid); + if ( pushaddr != 0 && subaddr != 0 ) + { + if ( nn_connect(pushsock,pushaddr) >= 0 && nn_connect(subsock,subaddr) >= 0 ) + swap->connected = 1; + sprintf(databuf,"{\"push\":\"%s\",\"sub\":\"%s\"}",pushaddr,subaddr); + datalen = (int32_t)strlen(databuf) + 1; + decode_hex(data,datalen,databuf); + init_hexbytes_noT(databuf,data,datalen); + printf("%s -> %s\n",keystr,databuf); + if ( (retstr= _dex_kvupdate(myinfo,"KV",keystr,databuf,1)) != 0 ) + { + printf("KVupdate.(%s)\n",retstr); + free(retstr); + } + } + else + { + if ( (retstr= _dex_kvsearch(myinfo,"KV",keystr)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( (datastr= jstr(retjson,"value")) != 0 ) + { + datalen = (int32_t)strlen(datastr) >> 1; + decode_hex((uint8_t *)databuf,datalen,datastr); + if ( (addrjson= cJSON_Parse(databuf)) != 0 ) + { + pushaddr = jstr(addrjson,"push"); + subaddr = jstr(addrjson,"sub"); + if ( pushaddr != 0 && subaddr != 0 ) + { + printf("KV decoded (%s and %s)\n",pushaddr,subaddr); + if ( nn_connect(pushsock,pushaddr) >= 0 && nn_connect(subsock,subaddr) >= 0 ) + swap->connected = 1; + } + free_json(addrjson); + } + } + free_json(retjson); + } + printf("KVsearch.(%s)\n",retstr); + free(retstr); + } + } +} + void basilisk_swaploop(void *_swap) { uint8_t *data; uint32_t expiration; uint32_t channel; int32_t retval=0,i,j,datalen,maxlen; struct supernet_info *myinfo; struct basilisk_swap *swap = _swap; @@ -1792,21 +1870,30 @@ void basilisk_swaploop(void *_swap) channel = 'D' + ((uint32_t)'E' << 8) + ((uint32_t)'X' << 16); while ( (swap->I.statebits & (0x08|0x02)) != (0x08|0x02) && time(NULL) < expiration ) { - printf("A r%u/q%u swapstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits); - //basilisk_channelsend(myinfo,swap->I.req.srchash,swap->I.req.desthash,channel,0x4000000,(void *)&swap->I.req.requestid,sizeof(swap->I.req.requestid),60); dex_channelsend(myinfo,swap->I.req.srchash,swap->I.req.desthash,channel,0x4000000,(void *)&swap->I.req.requestid,sizeof(swap->I.req.requestid)); //,60); - basilisk_sendstate(myinfo,swap,data,maxlen); - basilisk_sendpubkeys(myinfo,swap,data,maxlen); // send pubkeys - if ( basilisk_checkdeck(myinfo,swap,data,maxlen) == 0) // check for other deck 0x02 - basilisk_sendchoosei(myinfo,swap,data,maxlen); - basilisk_waitchoosei(myinfo,swap,data,maxlen); // wait for choosei 0x08 - if ( (swap->I.statebits & (0x08|0x02)) == (0x08|0x02) ) - break; + if ( swap->I.iambob == 0 && swap->connected == 0 ) + basilisk_psockinit(myinfo,swap,0,0); + if ( swap->connected != 0 ) + { + printf("A r%u/q%u swapstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits); + basilisk_sendstate(myinfo,swap,data,maxlen); + basilisk_sendpubkeys(myinfo,swap,data,maxlen); // send pubkeys + if ( basilisk_checkdeck(myinfo,swap,data,maxlen) == 0) // check for other deck 0x02 + basilisk_sendchoosei(myinfo,swap,data,maxlen); + basilisk_waitchoosei(myinfo,swap,data,maxlen); // wait for choosei 0x08 + if ( (swap->I.statebits & (0x08|0x02)) == (0x08|0x02) ) + break; + } sleep(10); - dpow_nanomsg_update(myinfo); - dex_updateclient(myinfo); + //dpow_nanomsg_update(myinfo); + //dex_updateclient(myinfo); + } + if ( swap->connected == 0 ) + { + printf("couldnt establish connection\n"); + retval = -1; } - while ( (swap->I.statebits & 0x20) == 0 && time(NULL) < expiration ) + while ( retval == 0 && (swap->I.statebits & 0x20) == 0 && time(NULL) < expiration ) { printf("B r%u/q%u swapstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits); basilisk_sendstate(myinfo,swap,data,maxlen); @@ -1818,17 +1905,20 @@ void basilisk_swaploop(void *_swap) break; } sleep(13 + (swap->I.iambob == 0)*1); - dpow_nanomsg_update(myinfo); - dex_updateclient(myinfo); + //dpow_nanomsg_update(myinfo); + //dex_updateclient(myinfo); } + myinfo->DEXactive = swap->I.expiration; if ( time(NULL) >= expiration ) + { retval = -1; - myinfo->DEXactive = swap->I.expiration; + myinfo->DEXactive = 0; + } printf("C r%u/q%u swapstate.%x retval.%d\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits,retval); while ( retval == 0 && (swap->I.statebits & 0x40) == 0 ) // send fee { - dpow_nanomsg_update(myinfo); - dex_updateclient(myinfo); + //dpow_nanomsg_update(myinfo); + //dex_updateclient(myinfo); printf("sendstate.%x\n",swap->I.statebits); basilisk_sendstate(myinfo,swap,data,maxlen); printf("swapget\n"); @@ -1929,8 +2019,8 @@ void basilisk_swaploop(void *_swap) basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); if ( time(NULL) > swap->I.expiration ) break; - dpow_nanomsg_update(myinfo); - dex_updateclient(myinfo); + //dpow_nanomsg_update(myinfo); + //dex_updateclient(myinfo); } printf("end of atomic swap\n"); if ( swap->I.iambob != 0 && swap->bobdeposit.txbytes != 0 ) @@ -1962,7 +2052,8 @@ void basilisk_swaploop(void *_swap) struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *rp,uint32_t statebits,int32_t optionduration) { - int32_t i,m,n; uint8_t pubkey33[33]; bits256 pubkey25519; uint32_t channel,starttime; cJSON *retarray,*item,*msgobj; struct basilisk_swap *swap = 0; + int32_t i,m,n; char *retstr; uint8_t pubkey33[33]; bits256 pubkey25519; uint32_t channel,starttime; cJSON *retarray,*item,*msgobj,*retjson; struct basilisk_swap *swap = 0; + // statebits 1 -> client, 0 -> LP portable_mutex_lock(&myinfo->DEX_swapmutex); for (i=0; inumswaps; i++) if ( myinfo->swaps[i]->I.req.requestid == rp->requestid ) @@ -1974,25 +2065,39 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 { printf("basilisk_thread_start request.%u statebits.%d\n",rp->requestid,statebits); swap = calloc(1,sizeof(*swap)); + swap->subsock = swap->pushsock = -1; vcalc_sha256(0,swap->I.orderhash.bytes,(uint8_t *)rp,sizeof(*rp)); swap->I.req = *rp; swap->myinfoptr = myinfo; - //swap->myinfo.ctx = myinfo->ctx; bitcoin_pubkey33(myinfo->ctx,pubkey33,privkey); - pubkey25519 = myinfo->myaddr.persistent;//curve25519(privkey,curve25519_basepoint9()); - //swap->myinfo.persistent_priv = privkey; - //swap->myinfo.myaddr.persistent = pubkey25519; - //memcpy(swap->myinfo.persistent_pubkey33,pubkey33,33); + pubkey25519 = curve25519(privkey,curve25519_basepoint9()); + swap->persistent_pubkey = pubkey25519; + swap->persistent_privkey = privkey; + memcpy(swap->persistent_pubkey33,pubkey33,33); m = n = 0; - if ( bitcoin_swapinit(myinfo->ctx,privkey,pubkey33,pubkey25519,swap,optionduration) != 0 ) + if ( bitcoin_swapinit(myinfo->ctx,privkey,pubkey33,pubkey25519,swap,optionduration,statebits) != 0 ) { + if ( statebits == 0 ) + { + if ( (retstr= _dex_psock(myinfo,"{}")) != 0 ) + { + // {"result":"success","pushaddr":"tcp://5.9.102.210:30002","subaddr":"tcp://5.9.102.210:30003","randipbits":3606291758,"coin":"KMD","tag":"6952562460568228137"} + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + basilisk_psockinit(myinfo,swap,jstr(retjson,"pushaddr"),jstr(retjson,"subaddr")); + free_json(retjson); + } + free(retstr); + } + } else basilisk_psockinit(myinfo,swap,0,0); + starttime = (uint32_t)time(NULL); printf("statebits.%x m.%d n.%d\n",statebits,m,n); while ( statebits == 0 && m <= n/2 && time(NULL) < starttime+BASILISK_MSGDURATION ) { m = n = 0; - dpow_nanomsg_update(myinfo); - dex_updateclient(myinfo); + //dpow_nanomsg_update(myinfo); + //dex_updateclient(myinfo); sleep(3); printf("waiting for offer to be accepted\n"); channel = 'D' + ((uint32_t)'E' << 8) + ((uint32_t)'X' << 16); diff --git a/basilisk/basilisk_tradebot.c b/basilisk/basilisk_tradebot.c index d98bc1200..dbb6ca742 100755 --- a/basilisk/basilisk_tradebot.c +++ b/basilisk/basilisk_tradebot.c @@ -290,6 +290,10 @@ double basilisk_request_listprocess(struct supernet_info *myinfo,struct basilisk } if ( bits256_cmp(myinfo->myaddr.persistent,list[0].srchash) == 0 ) // my request myrequest = 1; + else if ( bits256_cmp(myinfo->jumblr_pubkey,list[0].srchash) == 0 ) // my request + myrequest = 1; + else if ( bits256_cmp(myinfo->jumblr_depositkey,list[0].srchash) == 0 ) // my request + myrequest = 1; for (i=0; imyaddr.persistent,list[i].desthash) == 0 ) // my quoteid myrequest |= 2; + else if ( bits256_cmp(myinfo->jumblr_pubkey,list[i].desthash) == 0 ) // my quoteid + myrequest |= 2; + else if ( bits256_cmp(myinfo->jumblr_depositkey,list[i].desthash) == 0 ) // my quoteid + myrequest |= 2; havequoteflag++; if ( pendingid == 0 ) { diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 73d6054e7..a0b99d84a 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -303,6 +303,7 @@ cJSON *dpow_psock(struct supernet_info *myinfo,char *jsonstr) subport = myinfo->psockport++; for (i=0; i<100; i++) { + pullsock = pubsock = -1; nanomsg_tcpname(myinfo,pushaddr,myinfo->ipaddr,pushport), pushport += 2; nanomsg_tcpname(myinfo,subaddr,myinfo->ipaddr,subport), subport += 2; if ( (pullsock= nn_socket(AF_SP,NN_PULL)) >= 0 && (pubsock= nn_socket(AF_SP,NN_PUB)) >= 0 ) @@ -322,6 +323,10 @@ cJSON *dpow_psock(struct supernet_info *myinfo,char *jsonstr) jaddstr(retjson,"subaddr",subaddr); break; } + if ( pullsock >= 0 ) + nn_close(pullsock); + if ( pubsock >= 0 ) + nn_close(pubsock); } if ( pushport < 1000 ) pushport = 1001; @@ -329,13 +334,7 @@ cJSON *dpow_psock(struct supernet_info *myinfo,char *jsonstr) subport = 1001; } if ( i == 100 ) - { jaddstr(retjson,"error","cant find psock ports"); - if ( pullsock >= 0 ) - nn_close(pullsock); - if ( pubsock >= 0 ) - nn_close(pubsock); - } return(retjson); } @@ -1139,6 +1138,8 @@ char *_dex_sendmessage(struct supernet_info *myinfo,char *jsonstr) char *_dex_psock(struct supernet_info *myinfo,char *jsonstr) { struct dex_request dexreq; + if ( jsonstr == 0 ) + jsonstr = "{}"; memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,"KMD",sizeof(dexreq.name)); dexreq.func = 'Z'; diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 5beb12130..e9b6a5f23 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -116,7 +116,7 @@ struct message_info { int32_t msgcount; bits256 refhash,msghashes[64]; uint32_t struct supernet_info { struct supernet_address myaddr; - bits256 persistent_priv,privkey; + bits256 persistent_priv,privkey,jumblr_pubkey,jumblr_depositkey; uint8_t persistent_pubkey33[33]; char ipaddr[64],NXTAPIURL[512],secret[4096],password[4096],rpcsymbol[64],handle[1024],permanentfile[1024],jumblr_passphrase[1024]; char *decryptstr; @@ -162,11 +162,14 @@ struct basilisk_swap { struct supernet_info *myinfoptr; struct iguana_info *bobcoin,*alicecoin; void (*balancingtrade)(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t iambob); + bits256 persistent_privkey,persistent_pubkey; struct basilisk_swapinfo I; struct basilisk_rawtx bobdeposit,bobpayment,alicepayment,myfee,otherfee,aliceclaim,alicespend,bobreclaim,bobspend,bobrefund,alicereclaim; bits256 privkeys[INSTANTDEX_DECKSIZE]; + int32_t subsock,pushsock,connected; uint64_t otherdeck[INSTANTDEX_DECKSIZE][2],deck[INSTANTDEX_DECKSIZE][2]; - uint8_t verifybuf[65536]; + uint8_t persistent_pubkey33[33],pad[15],verifybuf[65536]; + }; #include "../includes/iguana_funcs.h" diff --git a/iguana/tests/dexkvupdate b/iguana/tests/dexkvupdate index a98240995..a6792a142 100755 --- a/iguana/tests/dexkvupdate +++ b/iguana/tests/dexkvupdate @@ -1,3 +1,3 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"kvupdate\",\"key\":\"test\",\"value\":\"$1\",\"flags\":0,\"symbol\":\"KMD\"}" -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"kvupdate\",\"key\":\"test\",\"value\":\"$1\",\"flags\":0,\"symbol\":\"KV\"}" +#curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"kvupdate\",\"key\":\"test\",\"value\":\"$1\",\"flags\":0,\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"kvupdate\",\"key\":\"testtest\",\"value\":\"$1\",\"flags\":0,\"symbol\":\"KV\"}" diff --git a/iguana/tests/dexpsock b/iguana/tests/dexpsock new file mode 100755 index 000000000..0a0e6fb16 --- /dev/null +++ b/iguana/tests/dexpsock @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"psock\"}" From c44405d9656e75bf1b84f3aff7c3e466596ead89 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 15:26:19 +0200 Subject: [PATCH 341/495] Test --- basilisk/basilisk_swap.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 7f935e2d7..61c01ab95 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1077,13 +1077,13 @@ void basilisk_rawtx_setparms(char *name,struct basilisk_swap *swap,struct basili } else printf("%s vouttype.%d destaddr.(%s)\n",name,rawtx->I.vouttype,rawtx->I.destaddr); } -int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct iguana_info **alicecoinp,char *src,char *dest,bits256 srchash,bits256 desthash) +int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct iguana_info **alicecoinp,char *src,char *dest,bits256 srchash,bits256 desthash,int32_t iambob) { struct iguana_info *coin = iguana_coinfind(src); if ( coin == 0 || iguana_coinfind(dest) == 0 ) return(0); *bobcoinp = *alicecoinp = 0; - if ( strcmp("BTC",src) == 0 ) + /*if ( strcmp("BTC",src) == 0 ) { *bobcoinp = iguana_coinfind(src); *alicecoinp = iguana_coinfind(dest); @@ -1103,7 +1103,9 @@ int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct igu *bobcoinp = iguana_coinfind(dest); *alicecoinp = iguana_coinfind(src); } - else return(0); + else return(0);*/ + *bobcoinp = iguana_coinfind(dest); + *alicecoinp = iguana_coinfind(src); if ( bits256_cmp(pubkey,srchash) == 0 ) { if ( strcmp(src,(*bobcoinp)->symbol) == 0 ) @@ -1229,9 +1231,9 @@ struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey printf("neither src nor dest error\n"); return(0); }*/ - if ( (bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash)+1)/2 != swap->I.iambob ) + if ( (bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash,swap->I.iambob)+1)/2 != swap->I.iambob ) { - printf("error iambob.%d != %d\n",swap->I.iambob,bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash)); + printf("error iambob.%d != %d\n",swap->I.iambob,bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash,swap->I.iambob)); return(0); } if ( bits256_nonz(privkey) == 0 || (x= instantdex_pubkeyargs(ctx,swap,2 + INSTANTDEX_DECKSIZE,privkey,swap->I.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) From f6b0c9c40245775e9d4d06a833f532e7fa464841 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 15:27:29 +0200 Subject: [PATCH 342/495] Test --- basilisk/basilisk_swap.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 61c01ab95..09db82854 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1077,7 +1077,7 @@ void basilisk_rawtx_setparms(char *name,struct basilisk_swap *swap,struct basili } else printf("%s vouttype.%d destaddr.(%s)\n",name,rawtx->I.vouttype,rawtx->I.destaddr); } -int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct iguana_info **alicecoinp,char *src,char *dest,bits256 srchash,bits256 desthash,int32_t iambob) +int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct iguana_info **alicecoinp,char *src,char *dest,bits256 srchash,bits256 desthash) { struct iguana_info *coin = iguana_coinfind(src); if ( coin == 0 || iguana_coinfind(dest) == 0 ) @@ -1231,9 +1231,9 @@ struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey printf("neither src nor dest error\n"); return(0); }*/ - if ( (bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash,swap->I.iambob)+1)/2 != swap->I.iambob ) + if ( (bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash)+1)/2 != swap->I.iambob ) { - printf("error iambob.%d != %d\n",swap->I.iambob,bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash,swap->I.iambob)); + printf("error iambob.%d != %d\n",swap->I.iambob,bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash)); return(0); } if ( bits256_nonz(privkey) == 0 || (x= instantdex_pubkeyargs(ctx,swap,2 + INSTANTDEX_DECKSIZE,privkey,swap->I.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) From e4d266aa91c6f2d4724a46d27c36d422aaf21101 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 15:49:52 +0200 Subject: [PATCH 343/495] Test --- basilisk/basilisk_swap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 09db82854..a2c47b67d 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1230,12 +1230,12 @@ struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey { printf("neither src nor dest error\n"); return(0); - }*/ + } if ( (bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash)+1)/2 != swap->I.iambob ) { printf("error iambob.%d != %d\n",swap->I.iambob,bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash)); return(0); - } + }*/ if ( bits256_nonz(privkey) == 0 || (x= instantdex_pubkeyargs(ctx,swap,2 + INSTANTDEX_DECKSIZE,privkey,swap->I.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) { printf("couldnt generate privkeys %d\n",x); From 5bd6c409b1e074632f9481359d35fcd4191c8f24 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 15:59:01 +0200 Subject: [PATCH 344/495] Test --- basilisk/basilisk_swap.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index a2c47b67d..5843af951 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1818,9 +1818,9 @@ void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap, { if ( nn_connect(pushsock,pushaddr) >= 0 && nn_connect(subsock,subaddr) >= 0 ) swap->connected = 1; - sprintf(databuf,"{\"push\":\"%s\",\"sub\":\"%s\"}",pushaddr,subaddr); - datalen = (int32_t)strlen(databuf) + 1; - decode_hex(data,datalen,databuf); + sprintf((char *)data,"{\"push\":\"%s\",\"sub\":\"%s\"}",pushaddr,subaddr); + datalen = (int32_t)strlen((char *)data) + 1; + printf("datalen.%d (%s)\n",datalen,(char *)data); init_hexbytes_noT(databuf,data,datalen); printf("%s -> %s\n",keystr,databuf); if ( (retstr= _dex_kvupdate(myinfo,"KV",keystr,databuf,1)) != 0 ) From 68ca1cc0b54bfa6c97eba98b24f30299a2d0cb06 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 16:45:39 +0200 Subject: [PATCH 345/495] Test --- basilisk/basilisk_MSG.c | 4 +-- basilisk/basilisk_swap.c | 70 ++++++++++++++++++++++++++++++++++++-- iguana/dpow/dpow_network.c | 2 +- iguana/iguana777.h | 8 +++++ 4 files changed, 78 insertions(+), 6 deletions(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index e6d55208d..a3ea7b343 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -448,9 +448,9 @@ cJSON *basilisk_channelget(struct supernet_info *myinfo,bits256 srchash,bits256 retstr = basilisk_getmessage(myinfo,0,0,0,desthash,valsobj,0); else { - char str[65],str2[65]; + //char str[65],str2[65]; retstr = _dex_getmessage(myinfo,jprint(valsobj,0)); - printf("channel.%u msgid.%u gotmessage.(%d) %s %s %s\n",channel,msgid,(int32_t)strlen(retstr),strlen(retstr) < 100 ? retstr : "(too long)",bits256_str(str,srchash),bits256_str(str2,desthash)); + //printf("channel.%u msgid.%u gotmessage.(%d) %s %s %s\n",channel,msgid,(int32_t)strlen(retstr),strlen(retstr) < 100 ? retstr : "(too long)",bits256_str(str,srchash),bits256_str(str2,desthash)); } if ( retstr != 0 ) { diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 5843af951..47eecd497 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -879,9 +879,29 @@ int32_t basilisk_process_swapverify(struct supernet_info *myinfo,void *ptr,int32 else return(0); } +void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t crc32,bits256 srchash,bits256 desthash,uint32_t quoteid,uint32_t msgbits,uint8_t *data,int32_t datalen) +{ + int32_t i; struct basilisk_swapmessage *mp; + for (i=0; inummessages; i++) + if ( crc32 == swap->messages[i].crc32 ) + return; + printf("new message.[%d] datalen.%d Q.%x msg.%x\n",swap->nummessages,datalen,quoteid,msgbits); + swap->messages = realloc(swap->messages,sizeof(*swap->messages) * (swap->nummessages + 1)); + mp = &swap->messages[swap->nummessages++]; + mp->crc32 = crc32; + mp->srchash = srchash; + mp->desthash = desthash; + mp->msgbits = msgbits; + mp->quoteid = quoteid; + mp->data = malloc(datalen); + memcpy(mp->data,data,datalen); + mp->datalen = datalen; +} + int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,int32_t (*basilisk_verify_func)(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen)) { - cJSON *valsobj,*array,*item; int32_t i,n,datalen,retval = -1; char *retstr,*hexstr=0; + uint8_t *ptr; bits256 srchash,desthash; uint32_t crc32,_msgbits,quoteid; int32_t i,size,offset,retval = -1; + /*cJSON *valsobj,*array,*item; int32_t i,n,datalen,retval = -1; char *retstr,*hexstr=0; //int32_t datalen; uint32_t crc; //if ( (crc= basilisk_crcrecv(myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),&datalen,swap->I.otherhash,swap->I.myhash,swap->I.req.quoteid,msgbits)) != 0 ) valsobj = cJSON_CreateObject(); @@ -916,17 +936,54 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap free_json(array); } free(retstr); + }*/ + while ( (size= nn_recv(swap->subsock,&ptr,NN_MSG,0)) >= 0 ) + { + memset(srchash.bytes,0,sizeof(srchash)); + memset(desthash.bytes,0,sizeof(desthash)); + crc32 = calc_crc32(0,ptr,size); + offset = 0; + for (i=0; i<32; i++) + srchash.bytes[i] = ptr[offset++]; + for (i=0; i<32; i++) + desthash.bytes[i] = ptr[offset++]; + offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),"eid); + offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),&_msgbits); + basilisk_swapgotdata(myinfo,swap,crc32,srchash,desthash,quoteid,_msgbits,&ptr[offset],size-offset); + if ( ptr != 0 ) + nn_freemsg(ptr), ptr = 0; + } + for (i=0; inummessages; i++) + { + if ( swap->messages[i].msgbits == msgbits ) + { + printf("matched %x datalen.%d\n",msgbits,swap->messages[i].datalen); + retval = (*basilisk_verify_func)(myinfo,swap,swap->messages[i].data,swap->messages[i].datalen); + break; + } } return(retval); } uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t datalen,uint32_t nextbits,uint32_t crcs[2]) { + uint8_t *buf; int32_t sentbytes,offset=0,i; //if ( (rand() % 10) == 0 ) // basilisk_channelsend(myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,INSTANTDEX_LOCKTIME*2); //if ( basilisk_crcsend(myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,crcs) != 0 ) //return(nextbits); - dex_channelsend(myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen); //INSTANTDEX_LOCKTIME*2 + //dex_channelsend(myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen); //INSTANTDEX_LOCKTIME*2 + buf = malloc(datalen) + sizeof(msgbits) + sizeof(swap->I.req.quoteid) + sizeof(bits256)*2; + for (i=0; i<32; i++) + buf[offset++] = swap->I.myhash.bytes[i]; + for (i=0; i<32; i++) + buf[offset++] = swap->I.otherhash.bytes[i]; + offset += iguana_rwnum(1,&buf[offset],sizeof(swap->I.req.quoteid),&swap->I.req.quoteid); + offset += iguana_rwnum(1,&buf[offset],sizeof(msgbits),&msgbits); + memcpy(&buf[offset],data,datalen), offset += datalen; + if ( (sentbytes= nn_send(swap->pushsock,buf,offset,0)) != offset ) + printf("sentbytes.%d vs offset.%d\n",sentbytes,offset); + free(buf); return(0); } @@ -1127,7 +1184,8 @@ int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct igu struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey33,bits256 pubkey25519,struct basilisk_swap *swap,int32_t optionduration,uint32_t statebits) { - struct iguana_info *bobcoin,*alicecoin; uint8_t *alicepub33=0,*bobpub33=0; int32_t x = -1; + //struct iguana_info *bobcoin,*alicecoin; + uint8_t *alicepub33=0,*bobpub33=0; int32_t x = -1; swap->I.putduration = swap->I.callduration = INSTANTDEX_LOCKTIME; if ( optionduration < 0 ) swap->I.putduration -= optionduration; @@ -1285,6 +1343,7 @@ void basilisk_rawtx_purge(struct basilisk_rawtx *rawtx) void basilisk_swap_finished(struct supernet_info *myinfo,struct basilisk_swap *swap) { + int32_t i; swap->I.finished = (uint32_t)time(NULL); // save to permanent storage basilisk_rawtx_purge(&swap->bobdeposit); @@ -1297,6 +1356,11 @@ void basilisk_swap_finished(struct supernet_info *myinfo,struct basilisk_swap *s basilisk_rawtx_purge(&swap->bobreclaim); basilisk_rawtx_purge(&swap->bobspend); basilisk_rawtx_purge(&swap->bobrefund); + for (i=0; inummessages; i++) + if ( swap->messages[i].data != 0 ) + free(swap->messages[i].data), swap->messages[i].data = 0; + free(swap->messages), swap->messages = 0; + swap->nummessages = 0; } void basilisk_swap_purge(struct supernet_info *myinfo,struct basilisk_swap *swap) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index a0b99d84a..6f17c611a 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -467,7 +467,7 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 if ( nn_poll(&pfd,1,100) > 0 ) { sentbytes = nn_send(myinfo->reqsock,dexp,size,0); - printf(" sent.%d:%d datalen.%d crc.%08x\n",sentbytes,size,datalen,calc_crc32(0,(void *)dexp,size)); + //printf(" sent.%d:%d datalen.%d crc.%08x\n",sentbytes,size,datalen,calc_crc32(0,(void *)dexp,size)); break; } usleep(1000); diff --git a/iguana/iguana777.h b/iguana/iguana777.h index e9b6a5f23..cf733a81b 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -158,6 +158,13 @@ struct supernet_info uint8_t notaries[64][33]; int32_t numnotaries,DEXEXPLORER; }; +struct basilisk_swapmessage +{ + bits256 srchash,desthash; + uint32_t crc32,msgbits,quoteid,datalen; + uint8_t *data; +}; + struct basilisk_swap { struct supernet_info *myinfoptr; struct iguana_info *bobcoin,*alicecoin; @@ -167,6 +174,7 @@ struct basilisk_swap struct basilisk_rawtx bobdeposit,bobpayment,alicepayment,myfee,otherfee,aliceclaim,alicespend,bobreclaim,bobspend,bobrefund,alicereclaim; bits256 privkeys[INSTANTDEX_DECKSIZE]; int32_t subsock,pushsock,connected; + struct basilisk_swapmessage *messages; int32_t nummessages; uint64_t otherdeck[INSTANTDEX_DECKSIZE][2],deck[INSTANTDEX_DECKSIZE][2]; uint8_t persistent_pubkey33[33],pad[15],verifybuf[65536]; From 20edc4e11088cf7f2694e1763a3b05498e6ba53d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 17:27:02 +0200 Subject: [PATCH 346/495] Test --- basilisk/basilisk_swap.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 47eecd497..3a45d7fb3 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -951,7 +951,12 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),&_msgbits); basilisk_swapgotdata(myinfo,swap,crc32,srchash,desthash,quoteid,_msgbits,&ptr[offset],size-offset); if ( ptr != 0 ) - nn_freemsg(ptr), ptr = 0; + { + fprintf(stderr,"free ptr\n"); + nn_freemsg(ptr); + ptr = 0; + fprintf(stderr,"freed ptr\n"); + } } for (i=0; inummessages; i++) { @@ -983,7 +988,9 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw memcpy(&buf[offset],data,datalen), offset += datalen; if ( (sentbytes= nn_send(swap->pushsock,buf,offset,0)) != offset ) printf("sentbytes.%d vs offset.%d\n",sentbytes,offset); + fprintf(stderr,"free buf\n"); free(buf); + fprintf(stderr,"freed buf\n"); return(0); } From 3647dbb01e9636de0365c15b08f2e35767a6723e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 17:35:00 +0200 Subject: [PATCH 347/495] Test --- basilisk/basilisk_swap.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 3a45d7fb3..97202bc6b 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -951,12 +951,7 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),&_msgbits); basilisk_swapgotdata(myinfo,swap,crc32,srchash,desthash,quoteid,_msgbits,&ptr[offset],size-offset); if ( ptr != 0 ) - { - fprintf(stderr,"free ptr\n"); - nn_freemsg(ptr); - ptr = 0; - fprintf(stderr,"freed ptr\n"); - } + nn_freemsg(ptr), ptr = 0; } for (i=0; inummessages; i++) { @@ -978,7 +973,7 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw //if ( basilisk_crcsend(myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,crcs) != 0 ) //return(nextbits); //dex_channelsend(myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen); //INSTANTDEX_LOCKTIME*2 - buf = malloc(datalen) + sizeof(msgbits) + sizeof(swap->I.req.quoteid) + sizeof(bits256)*2; + buf = malloc(datalen + sizeof(msgbits) + sizeof(swap->I.req.quoteid) + sizeof(bits256)*2); for (i=0; i<32; i++) buf[offset++] = swap->I.myhash.bytes[i]; for (i=0; i<32; i++) @@ -988,9 +983,7 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw memcpy(&buf[offset],data,datalen), offset += datalen; if ( (sentbytes= nn_send(swap->pushsock,buf,offset,0)) != offset ) printf("sentbytes.%d vs offset.%d\n",sentbytes,offset); - fprintf(stderr,"free buf\n"); free(buf); - fprintf(stderr,"freed buf\n"); return(0); } From 3b95bcd971162383dfe5a605fc4b496e185ca3ab Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 17:44:05 +0200 Subject: [PATCH 348/495] Test --- basilisk/basilisk_swap.c | 7 ++++--- iguana/iguana777.h | 2 +- iguana/unparsed.txt | 1 + 3 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 iguana/unparsed.txt diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 97202bc6b..4879757b8 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -955,9 +955,9 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap } for (i=0; inummessages; i++) { - if ( swap->messages[i].msgbits == msgbits ) + if ( swap->messages[i].msgbits == msgbits && bits256_cmp(swap->messages[i].desthash,swap->persistent_pubkey) == 0 ) { - printf("matched %x datalen.%d\n",msgbits,swap->messages[i].datalen); + //printf("matched %x datalen.%d\n",msgbits,swap->messages[i].datalen); retval = (*basilisk_verify_func)(myinfo,swap,swap->messages[i].data,swap->messages[i].datalen); break; } @@ -1895,6 +1895,7 @@ void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap, } else { + printf("connected.%d\n",swap->connected); if ( (retstr= _dex_kvsearch(myinfo,"KV",keystr)) != 0 ) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) @@ -1918,7 +1919,7 @@ void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap, } free_json(retjson); } - printf("KVsearch.(%s)\n",retstr); + printf("KVsearch.(%s) connected.%d\n",retstr,swap->connected); free(retstr); } } diff --git a/iguana/iguana777.h b/iguana/iguana777.h index cf733a81b..b66a833a0 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -169,11 +169,11 @@ struct basilisk_swap { struct supernet_info *myinfoptr; struct iguana_info *bobcoin,*alicecoin; void (*balancingtrade)(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t iambob); + int32_t subsock,pushsock,connected; bits256 persistent_privkey,persistent_pubkey; struct basilisk_swapinfo I; struct basilisk_rawtx bobdeposit,bobpayment,alicepayment,myfee,otherfee,aliceclaim,alicespend,bobreclaim,bobspend,bobrefund,alicereclaim; bits256 privkeys[INSTANTDEX_DECKSIZE]; - int32_t subsock,pushsock,connected; struct basilisk_swapmessage *messages; int32_t nummessages; uint64_t otherdeck[INSTANTDEX_DECKSIZE][2],deck[INSTANTDEX_DECKSIZE][2]; uint8_t persistent_pubkey33[33],pad[15],verifybuf[65536]; diff --git a/iguana/unparsed.txt b/iguana/unparsed.txt new file mode 100644 index 000000000..8d0877d63 --- /dev/null +++ b/iguana/unparsed.txt @@ -0,0 +1 @@ +6304a16dbc58b1752102baf994f2e1e765f474a3fd8c46f6b13c518e8855858ab46c69008c91ee84cda2ac67a914eed7fe456f91215de2205098928052bd8dbda9c6882103baf994f2e1e765f474a3fd8c46f6b13c518e8855858ab46c69008c91ee84cda2ac68 From 86f56ab98618a9af80a8be4b99b35ee2a3394f2c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 17:56:41 +0200 Subject: [PATCH 349/495] Test --- basilisk/basilisk_DEX.c | 4 ++-- basilisk/basilisk_swap.c | 10 +++++++--- basilisk/jumblr.c | 2 +- iguana/unparsed.txt | 2 +- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 7cadc124c..bb17423af 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -315,7 +315,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 dpow_nanomsg_update(myinfo); dex_updateclient(myinfo); - if ( (retstr= basilisk_start(myinfo,myinfo->persistent_priv,&issueR,1,issueR.optionhours * 3600)) != 0 ) + if ( (retstr= basilisk_start(myinfo,myinfo->jumblr_depositkey,&issueR,1,issueR.optionhours * 3600)) != 0 ) free(retstr); } else if ( bits256_cmp(myinfo->jumblr_pubkey,issueR.srchash) == 0 ) @@ -758,7 +758,7 @@ INT_ARG(InstantDEX,incoming,requestid) msgid = (uint32_t)time(NULL) + drift; if ( (retarray= basilisk_channelget(myinfo,zero,myinfo->myaddr.persistent,DEX_channel,msgid,width)) != 0 ) { - printf("GOT.(%s)\n",jprint(retarray,0)); + //printf("GOT.(%s)\n",jprint(retarray,0)); if ( (retval= basilisk_process_retarray(myinfo,0,InstantDEX_process_channelget,data,sizeof(data),DEX_channel,msgid,retarray,InstantDEX_incoming_func)) > 0 ) { jaddstr(retjson,"result","success"); diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 4879757b8..d7aa5a418 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1383,10 +1383,13 @@ void basilisk_swap_purge(struct supernet_info *myinfo,struct basilisk_swap *swap int32_t basilisk_verify_otherstatebits(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) { - struct basilisk_swap *swap = ptr; + int32_t retval; struct basilisk_swap *swap = ptr; if ( datalen == sizeof(swap->I.otherstatebits) ) - return(iguana_rwnum(0,data,sizeof(swap->I.otherstatebits),&swap->I.otherstatebits)); - else return(-1); + { + retval = iguana_rwnum(0,data,sizeof(swap->I.otherstatebits),&swap->I.otherstatebits); + printf("got sendstate.%x\n",swap->I.otherstatebits); + return(retval); + } else return(-1); } int32_t basilisk_verify_choosei(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) @@ -1540,6 +1543,7 @@ int32_t basilisk_checkdeck(struct supernet_info *myinfo,struct basilisk_swap *sw void basilisk_sendstate(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { int32_t datalen; + printf("sendstate.%x\n",swap->I.statebits); datalen = iguana_rwnum(1,data,sizeof(swap->I.statebits),&swap->I.statebits); basilisk_swapsend(myinfo,swap,0x80000000,data,datalen,0,0); } diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index e001f5174..f77302a91 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -564,7 +564,7 @@ ZERO_ARGS(jumblr,status) jaddnum(retjson,"received",dstr(received)); jaddnum(retjson,"finished",dstr(finished)); return(jprint(retjson,1)); - } else return(clonestr("{\"error\":\"no passphrase or no native komodod\"}")); + } else return(clonestr("{\"error\":\"jumblr status no passphrase or no native komodod\"}")); } #include "../includes/iguana_apiundefs.h" diff --git a/iguana/unparsed.txt b/iguana/unparsed.txt index 8d0877d63..d468bd962 100644 --- a/iguana/unparsed.txt +++ b/iguana/unparsed.txt @@ -1 +1 @@ -6304a16dbc58b1752102baf994f2e1e765f474a3fd8c46f6b13c518e8855858ab46c69008c91ee84cda2ac67a914eed7fe456f91215de2205098928052bd8dbda9c6882103baf994f2e1e765f474a3fd8c46f6b13c518e8855858ab46c69008c91ee84cda2ac68 +6304ed6fbc58b1752102b12fb1636597dbb81f5da6b05fa8e7d1d2613ada75c57fe6de2816e7ec3b23b5ac67a914f2d2987381a415363dc6a07c2d6440eefff54279882103fef6acf0aa9a0306647a928cc20784fe8349d020d811d2c098b370aa7bc3ba64ac68 From 4b316f55ea3c2ca46512db9a9eca3e28ed6161e9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 18:08:18 +0200 Subject: [PATCH 350/495] Test --- basilisk/basilisk_DEX.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index bb17423af..78bad0c89 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -315,7 +315,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 dpow_nanomsg_update(myinfo); dex_updateclient(myinfo); - if ( (retstr= basilisk_start(myinfo,myinfo->jumblr_depositkey,&issueR,1,issueR.optionhours * 3600)) != 0 ) + if ( (retstr= basilisk_start(myinfo,myinfo->persistent_priv,&issueR,1,issueR.optionhours * 3600)) != 0 ) free(retstr); } else if ( bits256_cmp(myinfo->jumblr_pubkey,issueR.srchash) == 0 ) From d02161bf8c09e04e72284f118d1434abfcc7d7d5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 18:09:40 +0200 Subject: [PATCH 351/495] Test --- basilisk/basilisk_DEX.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 78bad0c89..bb17423af 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -315,7 +315,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 dpow_nanomsg_update(myinfo); dex_updateclient(myinfo); - if ( (retstr= basilisk_start(myinfo,myinfo->persistent_priv,&issueR,1,issueR.optionhours * 3600)) != 0 ) + if ( (retstr= basilisk_start(myinfo,myinfo->jumblr_depositkey,&issueR,1,issueR.optionhours * 3600)) != 0 ) free(retstr); } else if ( bits256_cmp(myinfo->jumblr_pubkey,issueR.srchash) == 0 ) From ce0b209cfd56c13d540deab8e5bd5787318aa17f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 18:13:55 +0200 Subject: [PATCH 352/495] Test --- basilisk/basilisk_swap.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index d7aa5a418..449e5d4cf 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1914,8 +1914,8 @@ void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap, subaddr = jstr(addrjson,"sub"); if ( pushaddr != 0 && subaddr != 0 ) { - printf("KV decoded (%s and %s)\n",pushaddr,subaddr); - if ( nn_connect(pushsock,pushaddr) >= 0 && nn_connect(subsock,subaddr) >= 0 ) + printf("KV decoded (%s and %s) %d %d\n",pushaddr,subaddr,swap->pushsock,swap->subsock); + if ( nn_connect(swap->pushsock,pushaddr) >= 0 && nn_connect(swap->subsock,subaddr) >= 0 ) swap->connected = 1; } free_json(addrjson); @@ -1923,7 +1923,7 @@ void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap, } free_json(retjson); } - printf("KVsearch.(%s) connected.%d\n",retstr,swap->connected); + printf("KVsearch.(%s) connected.%d socks.(%d %d)\n",retstr,swap->connected,swap->pushsock,swap->subsock); free(retstr); } } From 38a5aaa03496d8db29f8e49471582d7ebcdf63a5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 18:22:52 +0200 Subject: [PATCH 353/495] Test --- basilisk/basilisk_DEX.c | 2 +- basilisk/basilisk_MSG.c | 4 ++-- basilisk/basilisk_swap.c | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index bb17423af..78bad0c89 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -315,7 +315,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 dpow_nanomsg_update(myinfo); dex_updateclient(myinfo); - if ( (retstr= basilisk_start(myinfo,myinfo->jumblr_depositkey,&issueR,1,issueR.optionhours * 3600)) != 0 ) + if ( (retstr= basilisk_start(myinfo,myinfo->persistent_priv,&issueR,1,issueR.optionhours * 3600)) != 0 ) free(retstr); } else if ( bits256_cmp(myinfo->jumblr_pubkey,issueR.srchash) == 0 ) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index a3ea7b343..64aecc90d 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -240,7 +240,7 @@ char *basilisk_respond_addmessage(struct supernet_info *myinfo,uint8_t *key,int3 { bits256 srchash,desthash; uint32_t channel,msgid; basilisk_messagekeyread(key,&channel,&msgid,&srchash,&desthash); - printf("add message keylen.%d [%d] msgid.%x channel.%x\n",msg->keylen,datalen,msgid,channel); + //printf("add message keylen.%d [%d] msgid.%x channel.%x\n",msg->keylen,datalen,msgid,channel); } //if ( myinfo->NOTARY.RELAYID >= 0 ) // dpow_handler(myinfo,msg); @@ -395,7 +395,7 @@ int32_t basilisk_channelsend(struct supernet_info *myinfo,bits256 srchash,bits25 jaddnum(valsobj,"timeout",1000); jaddbits256(valsobj,"srchash",srchash); jaddbits256(valsobj,"desthash",desthash); - char str[65]; printf("sendmessage.[%d] channel.%u msgid.%x -> %s numrelays.%d\n",datalen,channel,msgid,bits256_str(str,desthash),myinfo->NOTARY.NUMRELAYS); + //char str[65]; printf("sendmessage.[%d] channel.%u msgid.%x -> %s numrelays.%d\n",datalen,channel,msgid,bits256_str(str,desthash),myinfo->NOTARY.NUMRELAYS); if ( (retstr= basilisk_sendmessage(myinfo,0,0,0,desthash,valsobj,hexstr)) != 0 ) free(retstr); free_json(valsobj); diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 449e5d4cf..ec4d01ca3 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1061,7 +1061,7 @@ int32_t instantdex_pubkeyargs(void *ctx,struct basilisk_swap *swap,int32_t numpu for (i=n=m=0; iI.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) { - printf("couldnt generate privkeys %d\n",x); + char str[65]; printf("couldnt generate privkeys %d %s\n",x,bits256_str(str,privkey)); return(0); } if ( swap->I.iambob != 0 ) From d843d822a25543c9fbad3ce1c2afba8b899b37c3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 18:36:22 +0200 Subject: [PATCH 354/495] Test --- basilisk/basilisk_swap.c | 17 ++++++++++++++--- iguana/unparsed.txt | 2 +- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index ec4d01ca3..7e2157256 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -949,7 +949,8 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap desthash.bytes[i] = ptr[offset++]; offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),"eid); offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),&_msgbits); - basilisk_swapgotdata(myinfo,swap,crc32,srchash,desthash,quoteid,_msgbits,&ptr[offset],size-offset); + if ( size > offset ) + basilisk_swapgotdata(myinfo,swap,crc32,srchash,desthash,quoteid,_msgbits,&ptr[offset],size-offset); if ( ptr != 0 ) nn_freemsg(ptr), ptr = 0; } @@ -980,9 +981,19 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw buf[offset++] = swap->I.otherhash.bytes[i]; offset += iguana_rwnum(1,&buf[offset],sizeof(swap->I.req.quoteid),&swap->I.req.quoteid); offset += iguana_rwnum(1,&buf[offset],sizeof(msgbits),&msgbits); - memcpy(&buf[offset],data,datalen), offset += datalen; + if ( datalen > 0 ) + memcpy(&buf[offset],data,datalen), offset += datalen; if ( (sentbytes= nn_send(swap->pushsock,buf,offset,0)) != offset ) printf("sentbytes.%d vs offset.%d\n",sentbytes,offset); + else + { + if ( msgbits == 0x80000000 ) + { + for (i=0; i<4; i++) + printf("%02x ",data[i]); + printf("datalen.%d\n",datalen); + } + } free(buf); return(0); } @@ -1061,7 +1072,7 @@ int32_t instantdex_pubkeyargs(void *ctx,struct basilisk_swap *swap,int32_t numpu for (i=n=m=0; i Date: Sun, 5 Mar 2017 18:39:17 +0200 Subject: [PATCH 355/495] Test --- basilisk/jumblr.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index f77302a91..ec3e797dc 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -564,7 +564,12 @@ ZERO_ARGS(jumblr,status) jaddnum(retjson,"received",dstr(received)); jaddnum(retjson,"finished",dstr(finished)); return(jprint(retjson,1)); - } else return(clonestr("{\"error\":\"jumblr status no passphrase or no native komodod\"}")); + } + else + { + printf("(%s) (%s) %d\n",coin->symbol,myinfo->jumblr_passphrase,coin->FULLNODE); + return(clonestr("{\"error\":\"jumblr status no passphrase or no native komodod\"}")); + } } #include "../includes/iguana_apiundefs.h" From 8713888524d2ea97a93aec604fece0de629bcded Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 18:50:28 +0200 Subject: [PATCH 356/495] Test --- basilisk/basilisk_swap.c | 13 +++++++++++-- iguana/unparsed.txt | 2 +- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 7e2157256..546bf4265 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -885,7 +885,10 @@ void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swa for (i=0; inummessages; i++) if ( crc32 == swap->messages[i].crc32 ) return; - printf("new message.[%d] datalen.%d Q.%x msg.%x\n",swap->nummessages,datalen,quoteid,msgbits); + if ( datalen < 8 ) + for (i=0; inummessages,datalen,quoteid,msgbits); swap->messages = realloc(swap->messages,sizeof(*swap->messages) * (swap->nummessages + 1)); mp = &swap->messages[swap->nummessages++]; mp->crc32 = crc32; @@ -949,6 +952,12 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap desthash.bytes[i] = ptr[offset++]; offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),"eid); offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),&_msgbits); + if ( _msgbits == 0x80000000 ) + { + for (i=0; i offset ) basilisk_swapgotdata(myinfo,swap,crc32,srchash,desthash,quoteid,_msgbits,&ptr[offset],size-offset); if ( ptr != 0 ) @@ -991,7 +1000,7 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw { for (i=0; i<4; i++) printf("%02x ",data[i]); - printf("datalen.%d\n",datalen); + printf("datalen.%d offset.%d\n",datalen,offset); } } free(buf); diff --git a/iguana/unparsed.txt b/iguana/unparsed.txt index 39ba7bdda..515dd4416 100644 --- a/iguana/unparsed.txt +++ b/iguana/unparsed.txt @@ -1 +1 @@ -6304d878bc58b17521029c992b28fcb42e4ecb64a7bef533a7998bd971a287891e7b51230b68f3051ebeac67a914782e47739e559fe5da02f4b40be525e7c47fccee88210387ddc27d8419f5eadb7f32e44f9246c168d379e73ab372398258acc7ef4fc36eac68 +63041a7dbc58b175210205a68a29ddd5ac3bc216274770787fe667c6687c7880c09d6e6d4177c6a261bbac67a914c176c745680464cea293d4f0ff70165fc00e84fc8821039a493992a86ce8bb4f7f66e74ac3929bfb37fa9f0efb3175b2c8d8e25b051daaac68 From ed89cf5ada66d5c0f4da50ff2169118a25203b80 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 18:57:39 +0200 Subject: [PATCH 357/495] Test --- basilisk/basilisk_swap.c | 4 ++-- iguana/unparsed.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 546bf4265..19ed533c3 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -887,7 +887,7 @@ void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swa return; if ( datalen < 8 ) for (i=0; inummessages,datalen,quoteid,msgbits); swap->messages = realloc(swap->messages,sizeof(*swap->messages) * (swap->nummessages + 1)); mp = &swap->messages[swap->nummessages++]; @@ -956,7 +956,7 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap { for (i=0; i offset ) basilisk_swapgotdata(myinfo,swap,crc32,srchash,desthash,quoteid,_msgbits,&ptr[offset],size-offset); diff --git a/iguana/unparsed.txt b/iguana/unparsed.txt index 515dd4416..8a0784e21 100644 --- a/iguana/unparsed.txt +++ b/iguana/unparsed.txt @@ -1 +1 @@ -63041a7dbc58b175210205a68a29ddd5ac3bc216274770787fe667c6687c7880c09d6e6d4177c6a261bbac67a914c176c745680464cea293d4f0ff70165fc00e84fc8821039a493992a86ce8bb4f7f66e74ac3929bfb37fa9f0efb3175b2c8d8e25b051daaac68 +6304457fbc58b1752102a8840cca0df07b83f53909a449e33ad300f8f72f72fcff2402113056ec281a6dac67a914dd008e8066dfa7f5e138b88892d3b751c39609a5882103d23f308d9f85ec5633122dd6c59e7004ab5915cc073104873a06adeef24eb6dbac68 From 54c6de9dbdd1474ecac61c4482900ce8cee963ad Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 19:04:13 +0200 Subject: [PATCH 358/495] Test --- .gitignore | 6 ++++++ basilisk/basilisk_swap.c | 7 ++++++- iguana/unparsed.txt | 1 - 3 files changed, 12 insertions(+), 2 deletions(-) delete mode 100644 iguana/unparsed.txt diff --git a/.gitignore b/.gitignore index 04fc232c4..ee4a9db1d 100755 --- a/.gitignore +++ b/.gitignore @@ -162,3 +162,9 @@ iguana/index7778.html *.json iguana/DB/KMD/utxo.dat + +iguana/unparsed.txt + +iguana/unparsed.txt + +iguana/unparsed.txt diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 19ed533c3..e2885b51f 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -967,7 +967,12 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap { if ( swap->messages[i].msgbits == msgbits && bits256_cmp(swap->messages[i].desthash,swap->persistent_pubkey) == 0 ) { - //printf("matched %x datalen.%d\n",msgbits,swap->messages[i].datalen); + if ( swap->messages[i].datalen < 8 ) + { + for (i=0; imessages[i].datalen; i++) + printf("%02x",swap->messages[i].data[i]); + printf("matched %x datalen.%d\n",msgbits,swap->messages[i].datalen); + } retval = (*basilisk_verify_func)(myinfo,swap,swap->messages[i].data,swap->messages[i].datalen); break; } diff --git a/iguana/unparsed.txt b/iguana/unparsed.txt deleted file mode 100644 index 8a0784e21..000000000 --- a/iguana/unparsed.txt +++ /dev/null @@ -1 +0,0 @@ -6304457fbc58b1752102a8840cca0df07b83f53909a449e33ad300f8f72f72fcff2402113056ec281a6dac67a914dd008e8066dfa7f5e138b88892d3b751c39609a5882103d23f308d9f85ec5633122dd6c59e7004ab5915cc073104873a06adeef24eb6dbac68 From 0e5fbf2a75bcef33ed73f48e63cb7c02344a30c7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 19:14:58 +0200 Subject: [PATCH 359/495] Test --- basilisk/basilisk_swap.c | 64 ++---------------------------------- basilisk/basilisk_tradebot.c | 2 +- 2 files changed, 3 insertions(+), 63 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index e2885b51f..e015ff4a4 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -885,9 +885,6 @@ void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swa for (i=0; inummessages; i++) if ( crc32 == swap->messages[i].crc32 ) return; - if ( datalen < 8 ) - for (i=0; inummessages,datalen,quoteid,msgbits); swap->messages = realloc(swap->messages,sizeof(*swap->messages) * (swap->nummessages + 1)); mp = &swap->messages[swap->nummessages++]; @@ -904,42 +901,6 @@ void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swa int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,int32_t (*basilisk_verify_func)(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen)) { uint8_t *ptr; bits256 srchash,desthash; uint32_t crc32,_msgbits,quoteid; int32_t i,size,offset,retval = -1; - /*cJSON *valsobj,*array,*item; int32_t i,n,datalen,retval = -1; char *retstr,*hexstr=0; - //int32_t datalen; uint32_t crc; - //if ( (crc= basilisk_crcrecv(myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),&datalen,swap->I.otherhash,swap->I.myhash,swap->I.req.quoteid,msgbits)) != 0 ) - valsobj = cJSON_CreateObject(); - jaddnum(valsobj,"channel",swap->I.req.quoteid); - jaddnum(valsobj,"msgid",msgbits); - jaddbits256(valsobj,"srchash",swap->I.otherhash); - jaddbits256(valsobj,"desthash",swap->I.myhash); - jaddnum(valsobj,"width",30); - if ( (retstr= _dex_getmessage(myinfo,jprint(valsobj,1))) != 0 ) - { - if ( (array= cJSON_Parse(retstr)) != 0 ) - { - if ( (n= cJSON_GetArraySize(array)) > 0 ) - { - for (i=0; i> 1; - if ( datalen > 0 && datalen < maxlen ) - { - decode_hex(data,datalen,hexstr); - if ( (retval= (*basilisk_verify_func)(myinfo,swap,data,datalen)) == 0 ) - { - break; - } - } - } - } - } - free_json(array); - } - free(retstr); - }*/ while ( (size= nn_recv(swap->subsock,&ptr,NN_MSG,0)) >= 0 ) { memset(srchash.bytes,0,sizeof(srchash)); @@ -952,12 +913,6 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap desthash.bytes[i] = ptr[offset++]; offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),"eid); offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),&_msgbits); - if ( _msgbits == 0x80000000 ) - { - for (i=0; i offset ) basilisk_swapgotdata(myinfo,swap,crc32,srchash,desthash,quoteid,_msgbits,&ptr[offset],size-offset); if ( ptr != 0 ) @@ -967,12 +922,6 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap { if ( swap->messages[i].msgbits == msgbits && bits256_cmp(swap->messages[i].desthash,swap->persistent_pubkey) == 0 ) { - if ( swap->messages[i].datalen < 8 ) - { - for (i=0; imessages[i].datalen; i++) - printf("%02x",swap->messages[i].data[i]); - printf("matched %x datalen.%d\n",msgbits,swap->messages[i].datalen); - } retval = (*basilisk_verify_func)(myinfo,swap,swap->messages[i].data,swap->messages[i].datalen); break; } @@ -999,15 +948,6 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw memcpy(&buf[offset],data,datalen), offset += datalen; if ( (sentbytes= nn_send(swap->pushsock,buf,offset,0)) != offset ) printf("sentbytes.%d vs offset.%d\n",sentbytes,offset); - else - { - if ( msgbits == 0x80000000 ) - { - for (i=0; i<4; i++) - printf("%02x ",data[i]); - printf("datalen.%d offset.%d\n",datalen,offset); - } - } free(buf); return(0); } @@ -1412,7 +1352,7 @@ int32_t basilisk_verify_otherstatebits(struct supernet_info *myinfo,void *ptr,ui if ( datalen == sizeof(swap->I.otherstatebits) ) { retval = iguana_rwnum(0,data,sizeof(swap->I.otherstatebits),&swap->I.otherstatebits); - printf("got sendstate.%x\n",swap->I.otherstatebits); + //printf("got sendstate.%x\n",swap->I.otherstatebits); return(retval); } else return(-1); } @@ -1568,7 +1508,7 @@ int32_t basilisk_checkdeck(struct supernet_info *myinfo,struct basilisk_swap *sw void basilisk_sendstate(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { int32_t datalen; - printf("sendstate.%x\n",swap->I.statebits); + //printf("sendstate.%x\n",swap->I.statebits); datalen = iguana_rwnum(1,data,sizeof(swap->I.statebits),&swap->I.statebits); basilisk_swapsend(myinfo,swap,0x80000000,data,datalen,0,0); } diff --git a/basilisk/basilisk_tradebot.c b/basilisk/basilisk_tradebot.c index dbb6ca742..ec60b1cc2 100755 --- a/basilisk/basilisk_tradebot.c +++ b/basilisk/basilisk_tradebot.c @@ -104,7 +104,7 @@ int32_t basilisk_swapconv(struct supernet_info *myinfo,struct basilisk_swap *swa if ( juint(obj,"requestid") == swap->I.req.requestid && juint(obj,"quoteid") == swap->I.req.quoteid ) return(0); printf("swapconv mismatched req/quote %d %d, %d %d\n",juint(obj,"requestid"),swap->I.req.requestid,juint(obj,"quoteid"),swap->I.req.quoteid); - } else printf("no info field in swap obj.(%s)\n",jprint(obj,0)); + } else printf("no info field in swap obj.(%s) len.%d vs %d\n",jprint(obj,0),(int32_t)strlen(hexstr),(int32_t)sizeof(swap->I)*2); return(-1); } From aeea388d671b563cf56ed9fc0c44ec0f2e88e0af Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 19:25:20 +0200 Subject: [PATCH 360/495] Test --- basilisk/basilisk.h | 2 +- iguana/iguana_unspents.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk.h b/basilisk/basilisk.h index 7ca809600..2900dd35f 100755 --- a/basilisk/basilisk.h +++ b/basilisk/basilisk.h @@ -77,7 +77,7 @@ struct basilisk_swapinfo int32_t choosei,otherchoosei,cutverified,otherverifiedcut,numpubs,havestate,otherhavestate; uint8_t secretAm[20],secretBn[20]; uint8_t secretAm256[32],secretBn256[32]; -}; +} PACKED; struct basilisk_value { bits256 txid; int64_t value; int32_t height; int16_t vout; char coinaddr[64]; }; diff --git a/iguana/iguana_unspents.c b/iguana/iguana_unspents.c index 0a2951429..12ec1e208 100755 --- a/iguana/iguana_unspents.c +++ b/iguana/iguana_unspents.c @@ -916,7 +916,7 @@ void iguana_unspents_mark(struct supernet_info *myinfo,struct iguana_info *coin, printf("slot.[%d] <- %s/v%d\n",firstslot,bits256_str(str,txid),vout); coin->markedunspents[firstslot] = txid; coin->markedunspents[firstslot].ushorts[15] = vout; - if ( coin->utxofp == 0 ) + if ( 0 && coin->utxofp == 0 ) { sprintf(fname,"%s/%s/utxo.dat",GLOBAL_DBDIR,coin->symbol), OS_compatible_path(fname); if ( (coin->utxofp= fopen(fname,"rb+")) == 0 ) @@ -939,6 +939,7 @@ void iguana_unspents_mark(struct supernet_info *myinfo,struct iguana_info *coin, void iguana_unspents_markinit(struct supernet_info *myinfo,struct iguana_info *coin) { char *filestr,fname[1024]; FILE *fp; long filesize; bits256 filetxid; cJSON *array,*item; int32_t i,filevout,n,firstslot; +return; sprintf(fname,"%s/%s/utxo.dat",GLOBAL_DBDIR,coin->symbol), OS_compatible_path(fname); if ( (fp= fopen(fname,"rb")) != 0 ) { From 8562b85e228a6ea803b7e28c35844c66c70ab4c7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 19:32:32 +0200 Subject: [PATCH 361/495] Test --- basilisk/basilisk.h | 6 +++--- iguana/iguana_unspents.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/basilisk/basilisk.h b/basilisk/basilisk.h index 2900dd35f..42a072486 100755 --- a/basilisk/basilisk.h +++ b/basilisk/basilisk.h @@ -69,15 +69,15 @@ struct basilisk_swapinfo char bobstr[64],alicestr[64]; bits256 myhash,otherhash,orderhash; uint32_t statebits,otherstatebits,started,expiration,finished,dead,reftime,putduration,callduration; - int32_t bobconfirms,aliceconfirms,iambob,reclaimed,bobspent,alicespent; + int32_t bobconfirms,aliceconfirms,iambob,reclaimed,bobspent,alicespent,pad; uint64_t alicesatoshis,bobsatoshis,bobinsurance,aliceinsurance; bits256 myprivs[2],mypubs[2],otherpubs[2],pubA0,pubA1,pubB0,pubB1,privAm,pubAm,privBn,pubBn; uint32_t crcs_mypub[2],crcs_mychoosei[2],crcs_myprivs[2],crcs_mypriv[2]; - int32_t choosei,otherchoosei,cutverified,otherverifiedcut,numpubs,havestate,otherhavestate; + int32_t choosei,otherchoosei,cutverified,otherverifiedcut,numpubs,havestate,otherhavestate,pad2; uint8_t secretAm[20],secretBn[20]; uint8_t secretAm256[32],secretBn256[32]; -} PACKED; +}; struct basilisk_value { bits256 txid; int64_t value; int32_t height; int16_t vout; char coinaddr[64]; }; diff --git a/iguana/iguana_unspents.c b/iguana/iguana_unspents.c index 12ec1e208..19db61d54 100755 --- a/iguana/iguana_unspents.c +++ b/iguana/iguana_unspents.c @@ -916,7 +916,7 @@ void iguana_unspents_mark(struct supernet_info *myinfo,struct iguana_info *coin, printf("slot.[%d] <- %s/v%d\n",firstslot,bits256_str(str,txid),vout); coin->markedunspents[firstslot] = txid; coin->markedunspents[firstslot].ushorts[15] = vout; - if ( 0 && coin->utxofp == 0 ) + if ( (0) && coin->utxofp == 0 ) { sprintf(fname,"%s/%s/utxo.dat",GLOBAL_DBDIR,coin->symbol), OS_compatible_path(fname); if ( (coin->utxofp= fopen(fname,"rb+")) == 0 ) From 071f3fc738f996e548b37de6cd38e60926273c7f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 19:42:45 +0200 Subject: [PATCH 362/495] Test --- basilisk/basilisk_tradebot.c | 1 + 1 file changed, 1 insertion(+) diff --git a/basilisk/basilisk_tradebot.c b/basilisk/basilisk_tradebot.c index ec60b1cc2..bf590458f 100755 --- a/basilisk/basilisk_tradebot.c +++ b/basilisk/basilisk_tradebot.c @@ -92,6 +92,7 @@ cJSON *basilisk_swapobj(struct supernet_info *myinfo,struct basilisk_swap *swap) jaddnum(obj,"quoteid",swap->I.req.quoteid); jadd(obj,"req",basilisk_requestjson(&swap->I.req)); jaddstr(obj,"info",hexstr); + printf("strlen(hexstr) swap->I %d vs %d\n",(int32_t)strlen(hexstr),(int32_t)sizeof(swap->I)*2); return(obj); } From 0a5f8883546755661df59fa14897a4a35e2cdf4e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 19:54:23 +0200 Subject: [PATCH 363/495] Test --- basilisk/basilisk_swap.c | 30 ++++++++++++++++-------------- basilisk/basilisk_tradebot.c | 4 ++-- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index e015ff4a4..73a5cc073 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -13,6 +13,8 @@ * * ******************************************************************************/ +#define DEX_SLEEP 1 + // Todo: monitor blockchains, ie complete extracting scriptsig // mode to autocreate required outputs // more better LP commands @@ -779,7 +781,7 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa if ( swap->bobpayment.txbytes == 0 || swap->bobpayment.I.spendlen == 0 ) { printf("error bob generating %p payment.%d\n",swap->bobpayment.txbytes,swap->bobpayment.I.spendlen); - sleep(3); + sleep(DEX_SLEEP); } else { @@ -812,7 +814,7 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa if ( swap->bobdeposit.txbytes == 0 || swap->bobdeposit.I.spendlen == 0 ) { printf("error bob generating %p deposit.%d\n",swap->bobdeposit.txbytes,swap->bobdeposit.I.spendlen); - sleep(3); + sleep(DEX_SLEEP); } else { @@ -1628,7 +1630,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); if ( (swap->I.otherstatebits & 0x80) != 0 && (swap->I.statebits & 0x80) != 0 ) break; - sleep(13 + (swap->I.iambob == 0)*1); + sleep(DEX_SLEEP + (swap->I.iambob == 0)*1); basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); basilisk_sendstate(myinfo,swap,data,maxlen); if ( (swap->I.otherstatebits & 0x80) == 0 ) @@ -1689,7 +1691,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap printf("bobspend confirmed\n"); swap->I.statebits |= 0x80000; printf("Bob confirms spend of Alice's payment\n"); - sleep(10); + sleep(DEX_SLEEP); } retval = 1; } @@ -1811,7 +1813,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap } if ( (rand() % 30) == 0 ) printf("finished swapstate.%x other.%x\n",swap->I.statebits,swap->I.otherstatebits); - sleep(13 + (swap->I.iambob == 0)); + sleep(DEX_SLEEP + (swap->I.iambob == 0)); basilisk_sendstate(myinfo,swap,data,maxlen); basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); } @@ -1920,7 +1922,7 @@ void basilisk_swaploop(void *_swap) if ( (swap->I.statebits & (0x08|0x02)) == (0x08|0x02) ) break; } - sleep(10); + sleep(DEX_SLEEP); //dpow_nanomsg_update(myinfo); //dex_updateclient(myinfo); } @@ -1940,7 +1942,7 @@ void basilisk_swaploop(void *_swap) swap->I.statebits |= 0x20; break; } - sleep(13 + (swap->I.iambob == 0)*1); + sleep(DEX_SLEEP + (swap->I.iambob == 0)*1); //dpow_nanomsg_update(myinfo); //dex_updateclient(myinfo); } @@ -1955,11 +1957,11 @@ void basilisk_swaploop(void *_swap) { //dpow_nanomsg_update(myinfo); //dex_updateclient(myinfo); - printf("sendstate.%x\n",swap->I.statebits); + //printf("sendstate.%x\n",swap->I.statebits); basilisk_sendstate(myinfo,swap,data,maxlen); - printf("swapget\n"); + //printf("swapget\n"); basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); - printf("after swapget\n"); + //printf("after swapget\n"); if ( swap->myfee.txbytes == 0 ) { /*for (i=0; i<20; i++) @@ -1998,7 +2000,7 @@ void basilisk_swaploop(void *_swap) printf("bobscripts set\n"); if ( basilisk_bobscripts_set(myinfo,swap,1,1) < 0 ) { - sleep(3); + sleep(DEX_SLEEP); printf("bobscripts set error\n"); continue; } @@ -2013,7 +2015,7 @@ void basilisk_swaploop(void *_swap) if ( swap->alicepayment.txbytes == 0 || swap->alicepayment.I.spendlen == 0 ) { printf("error alice generating payment.%d\n",swap->alicepayment.I.spendlen); - sleep(13); + sleep(DEX_SLEEP); } else { @@ -2050,7 +2052,7 @@ void basilisk_swaploop(void *_swap) } while ( basilisk_swapiteration(myinfo,swap,data,maxlen) == 0 ) { - sleep(13); + sleep(DEX_SLEEP); basilisk_sendstate(myinfo,swap,data,maxlen); basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); if ( time(NULL) > swap->I.expiration ) @@ -2134,7 +2136,7 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 m = n = 0; //dpow_nanomsg_update(myinfo); //dex_updateclient(myinfo); - sleep(3); + sleep(DEX_SLEEP); printf("waiting for offer to be accepted\n"); channel = 'D' + ((uint32_t)'E' << 8) + ((uint32_t)'X' << 16); if ( (retarray= basilisk_channelget(myinfo,rp->srchash,rp->desthash,channel,0x4000000,30)) != 0 ) diff --git a/basilisk/basilisk_tradebot.c b/basilisk/basilisk_tradebot.c index bf590458f..7491d8182 100755 --- a/basilisk/basilisk_tradebot.c +++ b/basilisk/basilisk_tradebot.c @@ -92,7 +92,7 @@ cJSON *basilisk_swapobj(struct supernet_info *myinfo,struct basilisk_swap *swap) jaddnum(obj,"quoteid",swap->I.req.quoteid); jadd(obj,"req",basilisk_requestjson(&swap->I.req)); jaddstr(obj,"info",hexstr); - printf("strlen(hexstr) swap->I %d vs %d\n",(int32_t)strlen(hexstr),(int32_t)sizeof(swap->I)*2); + //printf("strlen(hexstr) swap->I %d vs %d\n",(int32_t)strlen(hexstr),(int32_t)sizeof(swap->I)*2); return(obj); } @@ -105,7 +105,7 @@ int32_t basilisk_swapconv(struct supernet_info *myinfo,struct basilisk_swap *swa if ( juint(obj,"requestid") == swap->I.req.requestid && juint(obj,"quoteid") == swap->I.req.quoteid ) return(0); printf("swapconv mismatched req/quote %d %d, %d %d\n",juint(obj,"requestid"),swap->I.req.requestid,juint(obj,"quoteid"),swap->I.req.quoteid); - } else printf("no info field in swap obj.(%s) len.%d vs %d\n",jprint(obj,0),(int32_t)strlen(hexstr),(int32_t)sizeof(swap->I)*2); + } //else printf("no info field in swap obj.(%s) len.%d vs %d\n",jprint(obj,0),(int32_t)strlen(hexstr),(int32_t)sizeof(swap->I)*2); return(-1); } From 328331656996e995fac349b4c30f10b5c2479395 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 20:07:50 +0200 Subject: [PATCH 364/495] Test --- basilisk/basilisk_MSG.c | 2 +- basilisk/jumblr.c | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index 64aecc90d..3af06c656 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -479,7 +479,7 @@ int32_t basilisk_process_retarray(struct supernet_info *myinfo,void *ptr,int32_t item = jitem(retarray,i); if ( jobj(item,"error") != 0 ) continue; - printf("(%s).%d ",jprint(item,0),i); + //printf("(%s).%d ",jprint(item,0),i); if ( (datalen= basilisk_message_returned(key,data,maxlen,item)) > 0 ) { duration = juint(item,"duration"); diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index ec3e797dc..a39e7b0a5 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -383,6 +383,7 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch printf("BTC deposits %.8f, min %.8f\n",btcavail,minbtc); vals = cJSON_CreateObject(); jaddstr(vals,"source","BTC"); + jaddbits256(vals,"srchash",curve25519(privkey,curve25519_basepoint9())); jaddstr(vals,"dest","KMD"); jaddnum(vals,"amount",btcavail*.3); jaddnum(vals,"minprice",kmdprice*.95); @@ -494,6 +495,7 @@ STRING_ARG(jumblr,setpassphrase,passphrase) retjson = cJSON_CreateObject(); jaddstr(retjson,"result","success"); privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + myinfo->jumblr_depositkey = curve25519(privkey,curve25519_basepoint9()); bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); if ( coin->FULLNODE < 0 ) jumblr_importprivkey(myinfo,coin,wifstr); @@ -506,7 +508,8 @@ STRING_ARG(jumblr,setpassphrase,passphrase) jumblr_importprivkey(myinfo,coinbtc,wifstr); jaddnum(retjson,"BTCdeposits",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); } - jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); + privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); + myinfo->jumblr_pubkey = curve25519(privkey,curve25519_basepoint9()); jaddstr(retjson,"KMDjumblr",KMDaddr); jaddstr(retjson,"BTCjumblr",BTCaddr); if ( coinbtc != 0 ) From 7d9d5a42c835fc0ac64bb6df56271eec996a913e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 20:18:59 +0200 Subject: [PATCH 365/495] Test --- basilisk/basilisk_DEX.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 78bad0c89..a1f22b9ac 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -312,6 +312,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) free(retstr);*/ if ( bits256_cmp(myinfo->myaddr.persistent,issueR.srchash) == 0 ) // my request { + printf("matched persistent\n"); dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 dpow_nanomsg_update(myinfo); dex_updateclient(myinfo); @@ -320,6 +321,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) } else if ( bits256_cmp(myinfo->jumblr_pubkey,issueR.srchash) == 0 ) { + printf("matched jumblr_pubkey\n"); dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 dpow_nanomsg_update(myinfo); dex_updateclient(myinfo); @@ -328,6 +330,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) } else if ( bits256_cmp(myinfo->jumblr_depositkey,issueR.srchash) == 0 ) { + printf("matched jumblr_depositkey\n"); dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 dpow_nanomsg_update(myinfo); dex_updateclient(myinfo); From 984dd6e81a3ad6486b8373fbc6c06db68e1b4fc8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 20:23:51 +0200 Subject: [PATCH 366/495] Test --- basilisk/basilisk_DEX.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index a1f22b9ac..6e6432a3b 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -231,13 +231,14 @@ int32_t basilisk_request_create(struct basilisk_request *rp,cJSON *valsobj,bits2 char *basilisk_start(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *_rp,uint32_t statebits,int32_t optionduration) { - cJSON *retjson; struct basilisk_request *rp=0; int32_t i; + cJSON *retjson; struct basilisk_request *rp=0; int32_t i,reqmatch; if ( _rp->requestid == myinfo->lastdexrequestid ) { //printf("filter duplicate r%u\n",_rp->requestid); return(clonestr("{\"error\":\"filter duplicate requestid\"}")); } - if ( (bits256_cmp(_rp->srchash,myinfo->myaddr.persistent) == 0 || bits256_cmp(_rp->desthash,myinfo->myaddr.persistent) == 0) ) + reqmatch = (bits256_cmp(_rp->srchash,myinfo->myaddr.persistent) == 0 || bits256_cmp(_rp->srchash,myinfo->jumblr_pubkey) == 0 || bits256_cmp(_rp->srchash,myinfo->jumblr_depositkey) == 0); + if ( (reqmatch != 0 || bits256_cmp(_rp->desthash,myinfo->myaddr.persistent) == 0) ) { for (i=0; inumswaps; i++) if ( myinfo->swaps[i]->I.req.requestid == _rp->requestid ) From 29a71f6f55d2ef2bc67703c0ae0cd2b41782b24d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 20:40:46 +0200 Subject: [PATCH 367/495] Test --- basilisk/basilisk_swap.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 73a5cc073..7704d8941 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -950,6 +950,7 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw memcpy(&buf[offset],data,datalen), offset += datalen; if ( (sentbytes= nn_send(swap->pushsock,buf,offset,0)) != offset ) printf("sentbytes.%d vs offset.%d\n",sentbytes,offset); + else printf("send.[%d] %x\n",sentbytes,msgbits); free(buf); return(0); } @@ -1491,7 +1492,7 @@ void basilisk_sendpubkeys(struct supernet_info *myinfo,struct basilisk_swap *swa { int32_t datalen; datalen = basilisk_swapdata_deck(myinfo,swap,data,maxlen); - //printf("send deck.%d\n",datalen); + printf("send deck.%d\n",datalen); swap->I.statebits |= basilisk_swapsend(myinfo,swap,0x02,data,datalen,0x01,swap->I.crcs_mypub); } @@ -1566,7 +1567,7 @@ void basilisk_waitchoosei(struct supernet_info *myinfo,struct basilisk_swap *swa revcalc_rmd160_sha256(swap->I.secretAm,swap->I.privAm);//.bytes,sizeof(swap->privAm)); vcalc_sha256(0,swap->I.secretAm256,swap->I.privAm.bytes,sizeof(swap->I.privAm)); swap->I.pubAm = bitcoin_pubkey33(myinfo->ctx,pubkey33,swap->I.privAm); - //printf("set privAm.%s %s\n",bits256_str(str,swap->privAm),bits256_str(str2,*(bits256 *)swap->secretAm256)); + char str[65],str2[65]; printf("set privAm.%s %s\n",bits256_str(str,swap->I.privAm),bits256_str(str2,*(bits256 *)swap->I.secretAm256)); //basilisk_bobscripts_set(myinfo,swap,0); } } @@ -2050,7 +2051,7 @@ void basilisk_swaploop(void *_swap) } } } - while ( basilisk_swapiteration(myinfo,swap,data,maxlen) == 0 ) + while ( retval == 0 && basilisk_swapiteration(myinfo,swap,data,maxlen) == 0 ) { sleep(DEX_SLEEP); basilisk_sendstate(myinfo,swap,data,maxlen); From f19cba0e71ac338d6932160d93718d45591710ae Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 20:45:11 +0200 Subject: [PATCH 368/495] Test --- basilisk/basilisk_swap.c | 1 + 1 file changed, 1 insertion(+) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 7704d8941..1df1ce336 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -908,6 +908,7 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap memset(srchash.bytes,0,sizeof(srchash)); memset(desthash.bytes,0,sizeof(desthash)); crc32 = calc_crc32(0,ptr,size); + printf("gotmsg.[%d] crc.%x\n",size,crc32); offset = 0; for (i=0; i<32; i++) srchash.bytes[i] = ptr[offset++]; From fc49af5f09041d42189da6f9ccc77876bc425fcf Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 20:51:41 +0200 Subject: [PATCH 369/495] Test --- basilisk/basilisk_swap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 1df1ce336..3339da360 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -923,7 +923,7 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap } for (i=0; inummessages; i++) { - if ( swap->messages[i].msgbits == msgbits && bits256_cmp(swap->messages[i].desthash,swap->persistent_pubkey) == 0 ) + if ( swap->messages[i].msgbits == msgbits && bits256_cmp(swap->messages[i].srchash,swap->I.otherhash) == 0 ) { retval = (*basilisk_verify_func)(myinfo,swap,swap->messages[i].data,swap->messages[i].datalen); break; From e2f14d679fe1d63ce15526ade8a8ad323026a5f9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 20:57:51 +0200 Subject: [PATCH 370/495] Test --- basilisk/basilisk_swap.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 3339da360..ab6292eaa 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -923,7 +923,8 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap } for (i=0; inummessages; i++) { - if ( swap->messages[i].msgbits == msgbits && bits256_cmp(swap->messages[i].srchash,swap->I.otherhash) == 0 ) + char str[65],str2[65]; printf("%s vs %s\n",bits256_str(str,swap->messages[i].srchash),bits256_str(str2,swap->I.otherhash)); + if ( swap->messages[i].msgbits == msgbits )//&& bits256_cmp(swap->messages[i].srchash,swap->I.otherhash) == 0 ) { retval = (*basilisk_verify_func)(myinfo,swap,swap->messages[i].data,swap->messages[i].datalen); break; From 22ad4b81282650bea1b2cb24b0a2db274ae36815 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 21:02:42 +0200 Subject: [PATCH 371/495] Test --- basilisk/basilisk_swap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index ab6292eaa..98f9fe9ae 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -923,8 +923,8 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap } for (i=0; inummessages; i++) { - char str[65],str2[65]; printf("%s vs %s\n",bits256_str(str,swap->messages[i].srchash),bits256_str(str2,swap->I.otherhash)); - if ( swap->messages[i].msgbits == msgbits )//&& bits256_cmp(swap->messages[i].srchash,swap->I.otherhash) == 0 ) + //char str[65],str2[65]; printf("%s vs %s\n",bits256_str(str,swap->messages[i].srchash),bits256_str(str2,swap->I.otherhash)); + if ( swap->messages[i].msgbits == msgbits && bits256_cmp(swap->messages[i].srchash,swap->I.otherhash) != 0 ) { retval = (*basilisk_verify_func)(myinfo,swap,swap->messages[i].data,swap->messages[i].datalen); break; From 4a7b48a13a497118b847c73b532936888cbf302b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 21:09:33 +0200 Subject: [PATCH 372/495] Test --- basilisk/basilisk_swap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 98f9fe9ae..bedcd6c13 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -924,7 +924,7 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap for (i=0; inummessages; i++) { //char str[65],str2[65]; printf("%s vs %s\n",bits256_str(str,swap->messages[i].srchash),bits256_str(str2,swap->I.otherhash)); - if ( swap->messages[i].msgbits == msgbits && bits256_cmp(swap->messages[i].srchash,swap->I.otherhash) != 0 ) + if ( swap->messages[i].msgbits == msgbits && bits256_cmp(swap->messages[i].srchash,swap->I.otherhash) == 0 ) { retval = (*basilisk_verify_func)(myinfo,swap,swap->messages[i].data,swap->messages[i].datalen); break; From 10c9011c7984c01ef1ecaf9266ac890e29c4bca6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 21:22:32 +0200 Subject: [PATCH 373/495] Test --- basilisk/basilisk_swap.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index bedcd6c13..decdbb00a 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -921,15 +921,17 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap if ( ptr != 0 ) nn_freemsg(ptr), ptr = 0; } + char str[65],str2[65]; for (i=0; inummessages; i++) { - //char str[65],str2[65]; printf("%s vs %s\n",bits256_str(str,swap->messages[i].srchash),bits256_str(str2,swap->I.otherhash)); - if ( swap->messages[i].msgbits == msgbits && bits256_cmp(swap->messages[i].srchash,swap->I.otherhash) == 0 ) + printf("%d: %s vs %s\n",i,bits256_str(str,swap->messages[i].srchash),bits256_str(str2,swap->messages[i].desthash)); + if ( swap->messages[i].msgbits == msgbits && bits256_cmp(swap->messages[i].desthash,swap->I.myhash) == 0 ) { retval = (*basilisk_verify_func)(myinfo,swap,swap->messages[i].data,swap->messages[i].datalen); break; } } + printf("mine/other %s vs %s\n",bits256_str(str,swap->I.myhash),bits256_str(str2,swap->I.otherhash)); return(retval); } From b7134e6fd6c112d95f07d3a57e68d7e808a373e7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 21:31:58 +0200 Subject: [PATCH 374/495] Test --- basilisk/basilisk_DEX.c | 7 ++++--- basilisk/jumblr.c | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 6e6432a3b..5118711dd 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -231,14 +231,15 @@ int32_t basilisk_request_create(struct basilisk_request *rp,cJSON *valsobj,bits2 char *basilisk_start(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *_rp,uint32_t statebits,int32_t optionduration) { - cJSON *retjson; struct basilisk_request *rp=0; int32_t i,reqmatch; + cJSON *retjson; struct basilisk_request *rp=0; int32_t i,srcmatch,destmatch; if ( _rp->requestid == myinfo->lastdexrequestid ) { //printf("filter duplicate r%u\n",_rp->requestid); return(clonestr("{\"error\":\"filter duplicate requestid\"}")); } - reqmatch = (bits256_cmp(_rp->srchash,myinfo->myaddr.persistent) == 0 || bits256_cmp(_rp->srchash,myinfo->jumblr_pubkey) == 0 || bits256_cmp(_rp->srchash,myinfo->jumblr_depositkey) == 0); - if ( (reqmatch != 0 || bits256_cmp(_rp->desthash,myinfo->myaddr.persistent) == 0) ) + srcmatch = (bits256_cmp(_rp->srchash,myinfo->myaddr.persistent) == 0 || bits256_cmp(_rp->srchash,myinfo->jumblr_pubkey) == 0 || bits256_cmp(_rp->srchash,myinfo->jumblr_depositkey) == 0); + destmatch = (bits256_cmp(_rp->desthash,myinfo->myaddr.persistent) == 0 || bits256_cmp(_rp->desthash,myinfo->jumblr_pubkey) == 0 || bits256_cmp(_rp->desthash,myinfo->jumblr_depositkey) == 0); + if ( srcmatch != 0 || destmatch != 0 ) { for (i=0; inumswaps; i++) if ( myinfo->swaps[i]->I.req.requestid == _rp->requestid ) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index a39e7b0a5..4dabd3399 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -383,12 +383,13 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch printf("BTC deposits %.8f, min %.8f\n",btcavail,minbtc); vals = cJSON_CreateObject(); jaddstr(vals,"source","BTC"); - jaddbits256(vals,"srchash",curve25519(privkey,curve25519_basepoint9())); + hash = curve25519(privkey,curve25519_basepoint9()); + jaddbits256(vals,"srchash",hash); jaddstr(vals,"dest","KMD"); jaddnum(vals,"amount",btcavail*.3); jaddnum(vals,"minprice",kmdprice*.95); - //jaddnum(vals,"usejumblr",1); - memset(hash.bytes,0,sizeof(hash)); + jaddnum(vals,"usejumblr",1); + //memset(hash.bytes,0,sizeof(hash)); pending = btcavail; if ( (retstr= InstantDEX_request(myinfo,coinbtc,0,0,hash,vals,"")) != 0 ) { From bec70b031becbcf657063847f23cd7532ab1140f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 21:38:14 +0200 Subject: [PATCH 375/495] Test --- basilisk/basilisk_DEX.c | 4 ++-- basilisk/jumblr.c | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 5118711dd..6b976d964 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -661,8 +661,6 @@ HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr) uint8_t serialized[512]; bits256 privkey; char buf[512],BTCaddr[64],KMDaddr[64]; struct basilisk_request R; int32_t iambob,optionhours; cJSON *reqjson; uint32_t datalen=0,DEX_channel; struct iguana_info *bobcoin,*alicecoin; myinfo->DEXactive = (uint32_t)time(NULL) + 3*BASILISK_TIMEOUT + 60; jadd64bits(vals,"minamount",jdouble(vals,"minprice") * jdouble(vals,"amount") * SATOSHIDEN * SATOSHIDEN); - if ( jobj(vals,"srchash") == 0 ) - jaddbits256(vals,"srchash",myinfo->myaddr.persistent); if ( jobj(vals,"desthash") == 0 ) jaddbits256(vals,"desthash",hash); jadd64bits(vals,"satoshis",jdouble(vals,"amount") * SATOSHIDEN); @@ -673,6 +671,8 @@ HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr) else privkey = myinfo->persistent_priv; hash = curve25519(privkey,curve25519_basepoint9()); //hash = myinfo->myaddr.persistent; + if ( jobj(vals,"srchash") == 0 ) + jaddbits256(vals,"srchash",hash); printf("service.(%s)\n",jprint(vals,0)); memset(&R,0,sizeof(R)); if ( basilisk_request_create(&R,vals,hash,juint(vals,"timestamp")) == 0 ) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 4dabd3399..a5e356735 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -383,13 +383,12 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch printf("BTC deposits %.8f, min %.8f\n",btcavail,minbtc); vals = cJSON_CreateObject(); jaddstr(vals,"source","BTC"); - hash = curve25519(privkey,curve25519_basepoint9()); - jaddbits256(vals,"srchash",hash); + //hash = curve25519(privkey,curve25519_basepoint9()); jaddstr(vals,"dest","KMD"); jaddnum(vals,"amount",btcavail*.3); jaddnum(vals,"minprice",kmdprice*.95); jaddnum(vals,"usejumblr",1); - //memset(hash.bytes,0,sizeof(hash)); + memset(hash.bytes,0,sizeof(hash)); pending = btcavail; if ( (retstr= InstantDEX_request(myinfo,coinbtc,0,0,hash,vals,"")) != 0 ) { From 16e75cb61f1f9e0e85d27a28b2cfc810c0beff90 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 21:48:06 +0200 Subject: [PATCH 376/495] Test --- basilisk/basilisk_DEX.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 6b976d964..9ffba09ef 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -277,7 +277,7 @@ char *basilisk_start(struct supernet_info *myinfo,bits256 privkey,struct basilis void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) { static uint32_t lastpoll; - char *retstr; uint8_t data[32768]; cJSON *outerarray,*retjson; uint32_t msgid,channel; int32_t datalen,i,n; struct basilisk_request issueR; double hwm = 0.; + char *retstr,BTCaddr[64],KMDaddr[64]; uint8_t data[32768]; cJSON *outerarray,*retjson; uint32_t msgid,channel; int32_t datalen,i,n; struct basilisk_request issueR; double hwm = 0.; if ( myinfo->IAMNOTARY != 0 || time(NULL) < lastpoll+20 || (myinfo->IAMLP == 0 && myinfo->DEXactive < time(NULL)) ) return; lastpoll = (uint32_t)time(NULL); @@ -327,7 +327,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 dpow_nanomsg_update(myinfo); dex_updateclient(myinfo); - if ( (retstr= basilisk_start(myinfo,myinfo->jumblr_pubkey,&issueR,1,issueR.optionhours * 3600)) != 0 ) + if ( (retstr= basilisk_start(myinfo,jumblr_privkey(myinfo,BTCaddr,KMDaddr,""),&issueR,1,issueR.optionhours * 3600)) != 0 ) free(retstr); } else if ( bits256_cmp(myinfo->jumblr_depositkey,issueR.srchash) == 0 ) @@ -336,7 +336,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 dpow_nanomsg_update(myinfo); dex_updateclient(myinfo); - if ( (retstr= basilisk_start(myinfo,myinfo->jumblr_depositkey,&issueR,1,issueR.optionhours * 3600)) != 0 ) + if ( (retstr= basilisk_start(myinfo,jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX),&issueR,1,issueR.optionhours * 3600)) != 0 ) free(retstr); /*if ( (retstr= InstantDEX_accept(myinfo,0,0,0,issueR.requestid,issueR.quoteid)) != 0 ) free(retstr); From ce1b86963a4685de823b7f248dc3f0ccde368464 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 21:52:26 +0200 Subject: [PATCH 377/495] Test --- basilisk/basilisk_swap.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index decdbb00a..28606f5a3 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -921,17 +921,17 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap if ( ptr != 0 ) nn_freemsg(ptr), ptr = 0; } - char str[65],str2[65]; + //char str[65],str2[65]; for (i=0; inummessages; i++) { - printf("%d: %s vs %s\n",i,bits256_str(str,swap->messages[i].srchash),bits256_str(str2,swap->messages[i].desthash)); + //printf("%d: %s vs %s\n",i,bits256_str(str,swap->messages[i].srchash),bits256_str(str2,swap->messages[i].desthash)); if ( swap->messages[i].msgbits == msgbits && bits256_cmp(swap->messages[i].desthash,swap->I.myhash) == 0 ) { retval = (*basilisk_verify_func)(myinfo,swap,swap->messages[i].data,swap->messages[i].datalen); break; } } - printf("mine/other %s vs %s\n",bits256_str(str,swap->I.myhash),bits256_str(str2,swap->I.otherhash)); + //printf("mine/other %s vs %s\n",bits256_str(str,swap->I.myhash),bits256_str(str2,swap->I.otherhash)); return(retval); } From d3031aaec106ea959f782944e85424240df0f120 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 22:28:38 +0200 Subject: [PATCH 378/495] Test --- basilisk/jumblr.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index a5e356735..c64614514 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -245,7 +245,9 @@ int32_t jumblr_itemset(struct jumblr_item *ptr,cJSON *item,char *status) { //printf("params.(%s)\n",jprint(params,0)); if ( (from= jstr(params,"fromaddress")) != 0 ) + { safecopy(ptr->src,from,sizeof(ptr->src)); + } if ( (amounts= jarray(&n,params,"amounts")) != 0 ) { for (i=0; istatus == 0 ) { if ( (retstr= jumblr_zgetoperationstatus(myinfo,coin,ptr->opid)) != 0 ) @@ -287,6 +289,15 @@ void jumblr_opidupdate(struct supernet_info *myinfo,struct iguana_info *coin,str if ( strcmp(status,"success") == 0 ) { ptr->status = jumblr_itemset(ptr,item,status); + jumblr_privkey(myinfo,BTCaddr,KMDdeposit,JUMBLR_DEPOSITPREFIX); + jumblr_privkey(myinfo,BTCaddr,KMDjumblr,""); + if ( (jumblr_addresstype(myinfo,coin,ptr->src) == 't' && jumblr_addresstype(myinfo,coin,ptr->src) == 'z' && strcmp(ptr->src,KMDdeposit) != 0) || (jumblr_addresstype(myinfo,coin,ptr->src) == 'z' && jumblr_addresstype(myinfo,coin,ptr->src) == 't' && strcmp(ptr->dest,KMDjumblr) != 0) ) + { + printf("a non-jumblr t->z pruned\n"); + free(jumblr_zgetoperationresult(myinfo,coin,ptr->opid)); + ptr->status = -1; + } + } else if ( strcmp(status,"failed") == 0 ) { From b309937f475bfa87e7e2fc24b7945792d43e8fd1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 7 Mar 2017 21:08:48 +0200 Subject: [PATCH 379/495] Test --- basilisk/basilisk.c | 3 +- basilisk/basilisk_DEX.c | 83 +++++------------------------------- basilisk/basilisk_swap.c | 14 +++++- basilisk/basilisk_tradebot.c | 14 ++---- basilisk/jumblr.c | 2 + basilisk/smartaddress.c | 81 +++++++++++++++++++++++++++++++++++ iguana/dpow/dpow_network.c | 6 +-- iguana/iguana777.h | 7 +++ iguana/iguana_wallet.c | 3 ++ iguana/tests/loop | 1 - includes/iguana_funcs.h | 6 ++- 11 files changed, 128 insertions(+), 92 deletions(-) create mode 100755 basilisk/smartaddress.c diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index fe2150489..ae02e86ea 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -482,6 +482,7 @@ int32_t basilisk_relayid(struct supernet_info *myinfo,uint32_t ipbits) #include "basilisk_ether.c" #include "basilisk_waves.c" #include "basilisk_lisk.c" +#include "smartaddress.c" #include "basilisk_MSG.c" #include "tradebots_marketmaker.c" @@ -924,7 +925,7 @@ void basilisks_loop(void *arg) if ( myinfo->expiration != 0 && (myinfo->dexsock >= 0 || myinfo->IAMLP != 0 || myinfo->DEXactive > time(NULL)) ) { //fprintf(stderr,"H "); - basilisk_requests_poll(myinfo,myinfo->persistent_priv); + basilisk_requests_poll(myinfo); } //printf("RELAYID.%d endmilli %f vs now %f\n",myinfo->NOTARY.RELAYID,endmilli,startmilli); while ( OS_milliseconds() < endmilli ) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 9ffba09ef..973f7fc2a 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -237,8 +237,8 @@ char *basilisk_start(struct supernet_info *myinfo,bits256 privkey,struct basilis //printf("filter duplicate r%u\n",_rp->requestid); return(clonestr("{\"error\":\"filter duplicate requestid\"}")); } - srcmatch = (bits256_cmp(_rp->srchash,myinfo->myaddr.persistent) == 0 || bits256_cmp(_rp->srchash,myinfo->jumblr_pubkey) == 0 || bits256_cmp(_rp->srchash,myinfo->jumblr_depositkey) == 0); - destmatch = (bits256_cmp(_rp->desthash,myinfo->myaddr.persistent) == 0 || bits256_cmp(_rp->desthash,myinfo->jumblr_pubkey) == 0 || bits256_cmp(_rp->desthash,myinfo->jumblr_depositkey) == 0); + srcmatch = smartaddress_pubkey(myinfo,&privkey,_rp->srchash) >= 0; + destmatch = smartaddress_pubkey(myinfo,&privkey,_rp->desthash) >= 0; if ( srcmatch != 0 || destmatch != 0 ) { for (i=0; inumswaps; i++) @@ -274,10 +274,10 @@ char *basilisk_start(struct supernet_info *myinfo,bits256 privkey,struct basilis } else return(clonestr("{\"error\":\"unexpected basilisk_start not mine and amrelay\"}")); } -void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) +void basilisk_requests_poll(struct supernet_info *myinfo) { static uint32_t lastpoll; - char *retstr,BTCaddr[64],KMDaddr[64]; uint8_t data[32768]; cJSON *outerarray,*retjson; uint32_t msgid,channel; int32_t datalen,i,n; struct basilisk_request issueR; double hwm = 0.; + char *retstr; uint8_t data[32768]; cJSON *outerarray,*retjson; uint32_t msgid,channel; int32_t datalen,i,n; struct basilisk_request issueR; bits256 privkey; double hwm = 0.; if ( myinfo->IAMNOTARY != 0 || time(NULL) < lastpoll+20 || (myinfo->IAMLP == 0 && myinfo->DEXactive < time(NULL)) ) return; lastpoll = (uint32_t)time(NULL); @@ -301,61 +301,15 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) channel = 'D' + ((uint32_t)'E' << 8) + ((uint32_t)'X' << 16); if ( hwm > 0. ) { - //printf("hwm %f\n",hwm); - //for (i=0; iDEXaccept = issueR; - /*issueR.quoteid = basilisk_quoteid(&issueR); - datalen = basilisk_rwDEXquote(1,data,&issueR); - msgid = (uint32_t)time(NULL); - keylen = basilisk_messagekey(key,0,msgid,issueR.srchash,issueR.desthash); - if ( (retstr= basilisk_respond_addmessage(myinfo,key,keylen,data,datalen,0,BASILISK_DEXDURATION)) != 0 ) - free(retstr);*/ - if ( bits256_cmp(myinfo->myaddr.persistent,issueR.srchash) == 0 ) // my request - { - printf("matched persistent\n"); - dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 - dpow_nanomsg_update(myinfo); - dex_updateclient(myinfo); - if ( (retstr= basilisk_start(myinfo,myinfo->persistent_priv,&issueR,1,issueR.optionhours * 3600)) != 0 ) - free(retstr); - } - else if ( bits256_cmp(myinfo->jumblr_pubkey,issueR.srchash) == 0 ) - { - printf("matched jumblr_pubkey\n"); - dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 - dpow_nanomsg_update(myinfo); - dex_updateclient(myinfo); - if ( (retstr= basilisk_start(myinfo,jumblr_privkey(myinfo,BTCaddr,KMDaddr,""),&issueR,1,issueR.optionhours * 3600)) != 0 ) - free(retstr); - } - else if ( bits256_cmp(myinfo->jumblr_depositkey,issueR.srchash) == 0 ) + if ( smartaddress_pubkey(myinfo,&privkey,issueR.srchash) >= 0 ) { - printf("matched jumblr_depositkey\n"); + printf("matched dex_smartpubkey\n"); dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 dpow_nanomsg_update(myinfo); dex_updateclient(myinfo); - if ( (retstr= basilisk_start(myinfo,jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX),&issueR,1,issueR.optionhours * 3600)) != 0 ) + if ( (retstr= basilisk_start(myinfo,privkey,&issueR,1,issueR.optionhours * 3600)) != 0 ) free(retstr); - /*if ( (retstr= InstantDEX_accept(myinfo,0,0,0,issueR.requestid,issueR.quoteid)) != 0 ) - free(retstr); - printf("my req hwm %f -> %u\n",hwm,issueR.requestid); - basilisk_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid),60); - numiters = crc = 0; - while ( numiters < 10 && (crc= basilisk_crcsend(myinfo,0,buf,sizeof(buf),issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid),crcs)) == 0 ) - { - printf("didnt get back what was sent\n"); - sleep(3); - basilisk_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid),60); - numiters++; - } - if ( crc != 0 ) - { - printf("crc.%08x -> basilisk_starta\n",crc); - if ( (retstr= basilisk_start(myinfo,&issueR,1,issueR.optionhours * 3600)) != 0 ) - free(retstr); - } // else printf("couldnt accept offer\n");*/ } else if ( issueR.requestid != myinfo->lastdexrequestid )//if ( issueR.quoteid == 0 ) { @@ -369,22 +323,6 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) dex_updateclient(myinfo); if ( (retstr= basilisk_start(myinfo,myinfo->persistent_priv,&issueR,0,issueR.optionhours * 3600)) != 0 ) free(retstr); - /*crcs[0] = crcs[1] = 0; - numiters = 0; - basilisk_channelsend(myinfo,issueR.desthash,issueR.srchash,channel,msgid,data,datalen,INSTANTDEX_LOCKTIME*2); - while ( numiters < 10 && (crc= basilisk_crcsend(myinfo,0,buf,sizeof(buf),issueR.desthash,issueR.srchash,channel,msgid,data,datalen,crcs)) == 0 ) - { - //printf("didnt get back what was sent\n"); - sleep(3); - basilisk_channelsend(myinfo,issueR.desthash,issueR.srchash,channel,msgid,data,datalen,INSTANTDEX_LOCKTIME*2); - numiters++; - } - if ( crc != 0 ) - { - printf("crc.%08x -> basilisk_start\n",crc); - if ( (retstr= basilisk_start(myinfo,&issueR,0,issueR.optionhours * 3600)) != 0 ) - free(retstr); - }*/ } //else printf("basilisk_requests_poll unexpected hwm issueR\n"); } } @@ -658,7 +596,7 @@ STRING_ARG(InstantDEX,available,source) HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr) { - uint8_t serialized[512]; bits256 privkey; char buf[512],BTCaddr[64],KMDaddr[64]; struct basilisk_request R; int32_t iambob,optionhours; cJSON *reqjson; uint32_t datalen=0,DEX_channel; struct iguana_info *bobcoin,*alicecoin; + uint8_t serialized[512]; bits256 privkey; char buf[512],BTCaddr[64],KMDaddr[64]; struct basilisk_request R; int32_t jumblr,iambob,optionhours; cJSON *reqjson; uint32_t datalen=0,DEX_channel; struct iguana_info *bobcoin,*alicecoin; myinfo->DEXactive = (uint32_t)time(NULL) + 3*BASILISK_TIMEOUT + 60; jadd64bits(vals,"minamount",jdouble(vals,"minprice") * jdouble(vals,"amount") * SATOSHIDEN * SATOSHIDEN); if ( jobj(vals,"desthash") == 0 ) @@ -666,11 +604,10 @@ HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr) jadd64bits(vals,"satoshis",jdouble(vals,"amount") * SATOSHIDEN); jadd64bits(vals,"destsatoshis",jdouble(vals,"destamount") * SATOSHIDEN); jaddnum(vals,"timestamp",time(NULL)); - if ( jint(vals,"usejumblr") != 0 ) - privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + if ( (jumblr= jint(vals,"usejumblr")) != 0 ) + privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,jumblr == 1 ? JUMBLR_DEPOSITPREFIX : ""); else privkey = myinfo->persistent_priv; hash = curve25519(privkey,curve25519_basepoint9()); - //hash = myinfo->myaddr.persistent; if ( jobj(vals,"srchash") == 0 ) jaddbits256(vals,"srchash",hash); printf("service.(%s)\n",jprint(vals,0)); diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 28606f5a3..e7ed820a2 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -13,6 +13,10 @@ * * ******************************************************************************/ +/*use external privkey to sign +make sure to broadcast deposit before claiming refund, or to just skip it if neither is done +*/ + #define DEX_SLEEP 1 // Todo: monitor blockchains, ie complete extracting scriptsig @@ -628,7 +632,7 @@ int32_t basilisk_verify_pubpair(int32_t *wrongfirstbytep,struct basilisk_swap *s cJSON *basilisk_privkeyarray(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *vins) { - cJSON *privkeyarray,*item,*sobj; struct iguana_waddress *waddr; struct iguana_waccount *wacct; char coinaddr[64],account[128],wifstr[64],str[65],*hexstr; uint8_t script[1024]; int32_t i,n,len,vout; bits256 txid; + cJSON *privkeyarray,*item,*sobj; struct iguana_waddress *waddr; struct iguana_waccount *wacct; char coinaddr[64],account[128],wifstr[64],str[65],*hexstr; uint8_t script[1024]; int32_t i,n,len,vout; bits256 txid,privkey; privkeyarray = cJSON_CreateArray(); //printf("%s persistent.(%s) (%s) change.(%s) scriptstr.(%s)\n",coin->symbol,myinfo->myaddr.BTC,coinaddr,coin->changeaddr,scriptstr); if ( (n= cJSON_GetArraySize(vins)) > 0 ) @@ -657,7 +661,13 @@ cJSON *basilisk_privkeyarray(struct supernet_info *myinfo,struct iguana_info *co { bitcoin_priv2wif(wifstr,waddr->privkey,coin->chain->wiftype); jaddistr(privkeyarray,waddr->wifstr); - } else printf("cant find (%s) in wallet\n",coinaddr); + } + else if ( smartaddress(myinfo,&privkey,coinaddr) > 0 ) + { + bitcoin_priv2wif(wifstr,waddr->privkey,coin->chain->wiftype); + jaddistr(privkeyarray,waddr->wifstr); + } + else printf("cant find (%s) in wallet\n",coinaddr); } else printf("cant coinaddr from (%s).v%d\n",bits256_str(str,txid),vout); } else printf("invalid txid/vout %d of %d\n",i,n); } diff --git a/basilisk/basilisk_tradebot.c b/basilisk/basilisk_tradebot.c index 7491d8182..8b66ee5a8 100755 --- a/basilisk/basilisk_tradebot.c +++ b/basilisk/basilisk_tradebot.c @@ -279,7 +279,7 @@ int32_t basilisk_request_cmpref(struct basilisk_request *ref,struct basilisk_req double basilisk_request_listprocess(struct supernet_info *myinfo,struct basilisk_request *issueR,struct basilisk_request *list,int32_t n) { - int32_t i,noquoteflag=0,havequoteflag=0,myrequest=0,maxi=-1; int64_t balance=0,destamount,minamount = 0,maxamount = 0; uint32_t pendingid=0; struct basilisk_swap *active; double metric = 0.; + int32_t i,noquoteflag=0,havequoteflag=0,myrequest=0,maxi=-1; int64_t balance=0,destamount,minamount = 0,maxamount = 0; bits256 privkey; uint32_t pendingid=0; struct basilisk_swap *active; double metric = 0.; memset(issueR,0,sizeof(*issueR)); minamount = list[0].minamount; //printf("need to verify null quoteid is list[0] requestid.%u quoteid.%u\n",list[0].requestid,list[0].quoteid); @@ -289,11 +289,7 @@ double basilisk_request_listprocess(struct supernet_info *myinfo,struct basilisk return(0.); pendingid = active->I.req.quoteid; } - if ( bits256_cmp(myinfo->myaddr.persistent,list[0].srchash) == 0 ) // my request - myrequest = 1; - else if ( bits256_cmp(myinfo->jumblr_pubkey,list[0].srchash) == 0 ) // my request - myrequest = 1; - else if ( bits256_cmp(myinfo->jumblr_depositkey,list[0].srchash) == 0 ) // my request + if ( smartaddress_pubkey(myinfo,&privkey,list[0].srchash) >= 0 ) myrequest = 1; for (i=0; imyaddr.persistent,list[i].desthash) == 0 ) // my quoteid - myrequest |= 2; - else if ( bits256_cmp(myinfo->jumblr_pubkey,list[i].desthash) == 0 ) // my quoteid - myrequest |= 2; - else if ( bits256_cmp(myinfo->jumblr_depositkey,list[i].desthash) == 0 ) // my quoteid + if ( smartaddress_pubkey(myinfo,&privkey,list[i].desthash) >= 0 ) myrequest |= 2; havequoteflag++; if ( pendingid == 0 ) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index c64614514..4d897725a 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -506,6 +506,7 @@ STRING_ARG(jumblr,setpassphrase,passphrase) retjson = cJSON_CreateObject(); jaddstr(retjson,"result","success"); privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + smartaddress_add(myinfo,privkey); myinfo->jumblr_depositkey = curve25519(privkey,curve25519_basepoint9()); bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); if ( coin->FULLNODE < 0 ) @@ -520,6 +521,7 @@ STRING_ARG(jumblr,setpassphrase,passphrase) jaddnum(retjson,"BTCdeposits",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); } privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); + smartaddress_add(myinfo,privkey); myinfo->jumblr_pubkey = curve25519(privkey,curve25519_basepoint9()); jaddstr(retjson,"KMDjumblr",KMDaddr); jaddstr(retjson,"BTCjumblr",BTCaddr); diff --git a/basilisk/smartaddress.c b/basilisk/smartaddress.c new file mode 100755 index 000000000..bfcaf50e8 --- /dev/null +++ b/basilisk/smartaddress.c @@ -0,0 +1,81 @@ +/****************************************************************************** + * Copyright © 2014-2017 The SuperNET Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * SuperNET software, including this file may be copied, modified, propagated * + * or distributed except according to the terms contained in the LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +// included from basilisk.c + +int32_t smartaddress_add(struct supernet_info *myinfo,bits256 privkey) +{ + struct smartaddress *ap; + int32_t i; + if ( myinfo->numsmartaddrs < sizeof(myinfo->smartaddrs)/sizeof(*myinfo->smartaddrs) ) + { + for (i=0; inumsmartaddrs; i++) + if ( bits256_cmp(myinfo->smartaddrs[i].privkey,privkey) == 0 ) + return(-1); + ap = &myinfo->smartaddrs[myinfo->numsmartaddrs++]; + ap->privkey = privkey; + bitcoin_pubkey33(myinfo->ctx,ap->pubkey33,privkey); + ap->pubkey = curve25519(privkey,curve25519_basepoint9()); + calc_rmd160(0,ap->rmd160,ap->pubkey33,33); + } + printf("too many smartaddresses\n"); + return(-1); +} + +int32_t smartaddress(struct supernet_info *myinfo,bits256 *privkeyp,char *coinaddr) +{ + int32_t i; uint8_t addrtype,rmd160[20]; + memset(privkeyp,0,sizeof(*privkeyp)); + bitcoin_addr2rmd160(&addrtype,rmd160,coinaddr); + for (i=0; inumsmartaddrs; i++) + if ( memcmp(myinfo->smartaddrs[i].rmd160,rmd160,20) == 0 ) + { + *privkeyp = myinfo->smartaddrs[i].privkey; + return(i); + } + return(-1); +} + +int32_t smartaddress_pubkey(struct supernet_info *myinfo,bits256 *privkeyp,bits256 pubkey) +{ + int32_t i; + memset(privkeyp,0,sizeof(*privkeyp)); + for (i=0; inumsmartaddrs; i++) + if ( bits256_cmp(myinfo->smartaddrs[i].pubkey,pubkey) == 0 ) + { + *privkeyp = myinfo->smartaddrs[i].privkey; + return(i); + } + return(-1); +} + +int32_t smartaddress_pubkey33(struct supernet_info *myinfo,bits256 *privkeyp,uint8_t *pubkey33) +{ + int32_t i; + memset(privkeyp,0,sizeof(*privkeyp)); + for (i=0; inumsmartaddrs; i++) + if ( memcmp(myinfo->smartaddrs[i].pubkey33,pubkey33,33) == 0 ) + { + *privkeyp = myinfo->smartaddrs[i].privkey; + return(i); + } + return(0); +} + +#include "../includes/iguana_apidefs.h" +#include "../includes/iguana_apideclares.h" + + +#include "../includes/iguana_apiundefs.h" diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 6f17c611a..0bd18acf1 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -515,14 +515,14 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 printf("%d: subscribe connect (%s)\n",myinfo->numdexipbits,str); } } -//#ifndef __APPLE__ - if ( 0 && (rand() % 100) < 40 ) +#ifndef __APPLE__ + if ( (rand() % 100) < 40 ) { nanomsg_tcpname(0,str,ipaddr,REP_SOCK); nn_connect(myinfo->reqsock,str); printf("%d: req connect (%s)\n",myinfo->numdexipbits,str); } -//#endif +#endif } } if ( freeptr != 0 ) diff --git a/iguana/iguana777.h b/iguana/iguana777.h index b66a833a0..5da5222c5 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -90,6 +90,12 @@ struct supernet_address char NXTADDR[32],BTC[64],BTCD[64]; }; +struct smartaddress +{ + bits256 privkey,pubkey; + uint8_t pubkey33[33],rmd160[20]; +}; + struct pending_trade { UT_hash_handle hh; double basevolume,relvolume,dir; char base[32],rel[32]; }; #define PSOCK_IDLETIMEOUT 600 @@ -156,6 +162,7 @@ struct supernet_info double *svmfeatures; uint16_t psockport,numpsocks; struct psock *PSOCKS; portable_mutex_t psockmutex; uint8_t notaries[64][33]; int32_t numnotaries,DEXEXPLORER; + struct smartaddress smartaddrs[64]; int32_t numsmartaddrs; }; struct basilisk_swapmessage diff --git a/iguana/iguana_wallet.c b/iguana/iguana_wallet.c index 65f5c0d56..d6183f657 100755 --- a/iguana/iguana_wallet.c +++ b/iguana/iguana_wallet.c @@ -1367,6 +1367,9 @@ TWOSTRINGS_AND_INT(bitcoinrpc,walletpassphrase,password,permanentfile,timeout) jumblr_importprivkey(myinfo,coin,wifstr); } } + if ( bits256_nonz(myinfo->persistent_priv) != 0 ) + smartaddress_add(myinfo,myinfo->persistent_priv); + //basilisk_unspents_update(myinfo,coin); return(retstr); } diff --git a/iguana/tests/loop b/iguana/tests/loop index b7e8cfa16..460d2c4db 100755 --- a/iguana/tests/loop +++ b/iguana/tests/loop @@ -1,7 +1,6 @@ #!/bin/bash while true do -./dexlistunspent ./dexgetinfo done diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index 95ae1e414..bcdd21cdf 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -595,8 +595,12 @@ int32_t iguana_scriptdata(struct iguana_info *coin,uint8_t *scriptspace,long fil void basilisk_ensurerelay(struct supernet_info *myinfo,struct iguana_info *notaries,uint32_t ipbits); void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr); int32_t iguana_datachain_scan(struct supernet_info *myinfo,struct iguana_info *coin,uint8_t rmd160[20]); -void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey); +void basilisk_requests_poll(struct supernet_info *myinfo); void dpow_psockloop(void *_ptr); +int32_t smartaddress_add(struct supernet_info *myinfo,bits256 privkey); +int32_t smartaddress(struct supernet_info *myinfo,bits256 *privkeyp,char *coinaddr); +int32_t smartaddress_pubkey(struct supernet_info *myinfo,bits256 *privkeyp,bits256 pubkey); +int32_t smartaddress_pubkey33(struct supernet_info *myinfo,bits256 *privkeyp,uint8_t *pubkey33); void iguana_RTreset(struct iguana_info *coin); void iguana_RTpurge(struct iguana_info *coin,int32_t lastheight); From 723b1f454d711f2c9f2675df9597aac86dcf1422 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 7 Mar 2017 21:14:28 +0200 Subject: [PATCH 380/495] Test --- basilisk/basilisk_DEX.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 973f7fc2a..30f9bed74 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -231,14 +231,14 @@ int32_t basilisk_request_create(struct basilisk_request *rp,cJSON *valsobj,bits2 char *basilisk_start(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *_rp,uint32_t statebits,int32_t optionduration) { - cJSON *retjson; struct basilisk_request *rp=0; int32_t i,srcmatch,destmatch; + cJSON *retjson; bits256 tmpprivkey; struct basilisk_request *rp=0; int32_t i,srcmatch,destmatch; if ( _rp->requestid == myinfo->lastdexrequestid ) { //printf("filter duplicate r%u\n",_rp->requestid); return(clonestr("{\"error\":\"filter duplicate requestid\"}")); } - srcmatch = smartaddress_pubkey(myinfo,&privkey,_rp->srchash) >= 0; - destmatch = smartaddress_pubkey(myinfo,&privkey,_rp->desthash) >= 0; + srcmatch = smartaddress_pubkey(myinfo,&tmpprivkey,_rp->srchash) >= 0; + destmatch = smartaddress_pubkey(myinfo,&tmpprivkey,_rp->desthash) >= 0; if ( srcmatch != 0 || destmatch != 0 ) { for (i=0; inumswaps; i++) @@ -257,8 +257,7 @@ char *basilisk_start(struct supernet_info *myinfo,bits256 privkey,struct basilis { basilisk_request_enqueue(myinfo,rp); return(clonestr("{\"result\":\"started atomic swap thread\"}")); - } - else return(clonestr("{\"error\":\"couldnt atomic swap thread\"}")); + } else return(clonestr("{\"error\":\"couldnt atomic swap thread\"}")); } else { From 16e96e1a42ae59b4954ab4d6c670dea10aa3d2c4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 7 Mar 2017 21:16:11 +0200 Subject: [PATCH 381/495] Test --- basilisk/smartaddress.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/smartaddress.c b/basilisk/smartaddress.c index bfcaf50e8..66e54590d 100755 --- a/basilisk/smartaddress.c +++ b/basilisk/smartaddress.c @@ -30,7 +30,7 @@ int32_t smartaddress_add(struct supernet_info *myinfo,bits256 privkey) ap->pubkey = curve25519(privkey,curve25519_basepoint9()); calc_rmd160(0,ap->rmd160,ap->pubkey33,33); } - printf("too many smartaddresses\n"); + printf("too many smartaddresses %d vs %d\n",myinfo->numsmartaddrs,(int32_t)(sizeof(myinfo->smartaddrs)/sizeof(*myinfo->smartaddrs))); return(-1); } From d8c3bcdbf1c44a5619edcabf5ef0741009e3e4e0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 7 Mar 2017 21:21:42 +0200 Subject: [PATCH 382/495] Test --- basilisk/basilisk_swap.c | 6 +++--- basilisk/smartaddress.c | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index e7ed820a2..a3cfebe14 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -662,10 +662,10 @@ cJSON *basilisk_privkeyarray(struct supernet_info *myinfo,struct iguana_info *co bitcoin_priv2wif(wifstr,waddr->privkey,coin->chain->wiftype); jaddistr(privkeyarray,waddr->wifstr); } - else if ( smartaddress(myinfo,&privkey,coinaddr) > 0 ) + else if ( smartaddress(myinfo,&privkey,coinaddr) >= 0 ) { - bitcoin_priv2wif(wifstr,waddr->privkey,coin->chain->wiftype); - jaddistr(privkeyarray,waddr->wifstr); + bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); + jaddistr(privkeyarray,wifstr); } else printf("cant find (%s) in wallet\n",coinaddr); } else printf("cant coinaddr from (%s).v%d\n",bits256_str(str,txid),vout); diff --git a/basilisk/smartaddress.c b/basilisk/smartaddress.c index 66e54590d..bd54aefe4 100755 --- a/basilisk/smartaddress.c +++ b/basilisk/smartaddress.c @@ -29,6 +29,7 @@ int32_t smartaddress_add(struct supernet_info *myinfo,bits256 privkey) bitcoin_pubkey33(myinfo->ctx,ap->pubkey33,privkey); ap->pubkey = curve25519(privkey,curve25519_basepoint9()); calc_rmd160(0,ap->rmd160,ap->pubkey33,33); + return(myinfo->numsmartaddrs); } printf("too many smartaddresses %d vs %d\n",myinfo->numsmartaddrs,(int32_t)(sizeof(myinfo->smartaddrs)/sizeof(*myinfo->smartaddrs))); return(-1); From 17ec128da646b33030fd3ddf7609ff6979526fb3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 7 Mar 2017 21:26:43 +0200 Subject: [PATCH 383/495] Test --- basilisk/smartaddress.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/basilisk/smartaddress.c b/basilisk/smartaddress.c index bd54aefe4..e653a96db 100755 --- a/basilisk/smartaddress.c +++ b/basilisk/smartaddress.c @@ -44,8 +44,10 @@ int32_t smartaddress(struct supernet_info *myinfo,bits256 *privkeyp,char *coinad if ( memcmp(myinfo->smartaddrs[i].rmd160,rmd160,20) == 0 ) { *privkeyp = myinfo->smartaddrs[i].privkey; + printf("MATCHED %s\n",coinaddr); return(i); } + printf("smartaddress cant find (%s) of %d\n",coinaddr,myinfo->numsmartaddrs); return(-1); } From 9d2b7a628c0cf230e643b34da91a4663ce5dc5cf Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 7 Mar 2017 21:31:49 +0200 Subject: [PATCH 384/495] Test --- basilisk/basilisk_swap.c | 4 ++-- basilisk/smartaddress.c | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index a3cfebe14..655ffe433 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -918,7 +918,7 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap memset(srchash.bytes,0,sizeof(srchash)); memset(desthash.bytes,0,sizeof(desthash)); crc32 = calc_crc32(0,ptr,size); - printf("gotmsg.[%d] crc.%x\n",size,crc32); + //printf("gotmsg.[%d] crc.%x\n",size,crc32); offset = 0; for (i=0; i<32; i++) srchash.bytes[i] = ptr[offset++]; @@ -964,7 +964,7 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw memcpy(&buf[offset],data,datalen), offset += datalen; if ( (sentbytes= nn_send(swap->pushsock,buf,offset,0)) != offset ) printf("sentbytes.%d vs offset.%d\n",sentbytes,offset); - else printf("send.[%d] %x\n",sentbytes,msgbits); + //else printf("send.[%d] %x\n",sentbytes,msgbits); free(buf); return(0); } diff --git a/basilisk/smartaddress.c b/basilisk/smartaddress.c index e653a96db..0b79e950b 100755 --- a/basilisk/smartaddress.c +++ b/basilisk/smartaddress.c @@ -29,6 +29,10 @@ int32_t smartaddress_add(struct supernet_info *myinfo,bits256 privkey) bitcoin_pubkey33(myinfo->ctx,ap->pubkey33,privkey); ap->pubkey = curve25519(privkey,curve25519_basepoint9()); calc_rmd160(0,ap->rmd160,ap->pubkey33,33); + char coinaddr[64]; bitcoin_address(coinaddr,0,ap->rmd160,20); + for (i=0; i<20; i++) + printf("%02x",ap->rmd160[i]); + printf (" <- rmd160 for %d %s\n",myinfo->numsmartaddrs,coinaddr); return(myinfo->numsmartaddrs); } printf("too many smartaddresses %d vs %d\n",myinfo->numsmartaddrs,(int32_t)(sizeof(myinfo->smartaddrs)/sizeof(*myinfo->smartaddrs))); From 1adb8552f71be4d57e87aedf7ca746b51e0bdd27 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 7 Mar 2017 21:40:22 +0200 Subject: [PATCH 385/495] Test --- basilisk/jumblr.c | 4 ++-- basilisk/smartaddress.c | 8 ++++---- iguana/iguana_wallet.c | 2 +- includes/iguana_funcs.h | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 4d897725a..11ef2a220 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -506,7 +506,7 @@ STRING_ARG(jumblr,setpassphrase,passphrase) retjson = cJSON_CreateObject(); jaddstr(retjson,"result","success"); privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); - smartaddress_add(myinfo,privkey); + smartaddress_add(myinfo,privkey,BTCaddr,KMDaddr); myinfo->jumblr_depositkey = curve25519(privkey,curve25519_basepoint9()); bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); if ( coin->FULLNODE < 0 ) @@ -521,7 +521,7 @@ STRING_ARG(jumblr,setpassphrase,passphrase) jaddnum(retjson,"BTCdeposits",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); } privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); - smartaddress_add(myinfo,privkey); + smartaddress_add(myinfo,privkey,BTCaddr,KMDaddr); myinfo->jumblr_pubkey = curve25519(privkey,curve25519_basepoint9()); jaddstr(retjson,"KMDjumblr",KMDaddr); jaddstr(retjson,"BTCjumblr",BTCaddr); diff --git a/basilisk/smartaddress.c b/basilisk/smartaddress.c index 0b79e950b..3fc645fcf 100755 --- a/basilisk/smartaddress.c +++ b/basilisk/smartaddress.c @@ -15,7 +15,7 @@ // included from basilisk.c -int32_t smartaddress_add(struct supernet_info *myinfo,bits256 privkey) +int32_t smartaddress_add(struct supernet_info *myinfo,bits256 privkey,char *BTCaddr,char *KMDaddr) { struct smartaddress *ap; int32_t i; @@ -27,12 +27,12 @@ int32_t smartaddress_add(struct supernet_info *myinfo,bits256 privkey) ap = &myinfo->smartaddrs[myinfo->numsmartaddrs++]; ap->privkey = privkey; bitcoin_pubkey33(myinfo->ctx,ap->pubkey33,privkey); - ap->pubkey = curve25519(privkey,curve25519_basepoint9()); calc_rmd160(0,ap->rmd160,ap->pubkey33,33); - char coinaddr[64]; bitcoin_address(coinaddr,0,ap->rmd160,20); + ap->pubkey = curve25519(privkey,curve25519_basepoint9()); + char coinaddr[64]; bitcoin_address(coinaddr,0,ap->pubkey33,33); for (i=0; i<20; i++) printf("%02x",ap->rmd160[i]); - printf (" <- rmd160 for %d %s\n",myinfo->numsmartaddrs,coinaddr); + printf (" <- rmd160 for %d %s vs %s\n",myinfo->numsmartaddrs,coinaddr,BTCaddr); return(myinfo->numsmartaddrs); } printf("too many smartaddresses %d vs %d\n",myinfo->numsmartaddrs,(int32_t)(sizeof(myinfo->smartaddrs)/sizeof(*myinfo->smartaddrs))); diff --git a/iguana/iguana_wallet.c b/iguana/iguana_wallet.c index d6183f657..90303ae80 100755 --- a/iguana/iguana_wallet.c +++ b/iguana/iguana_wallet.c @@ -1368,7 +1368,7 @@ TWOSTRINGS_AND_INT(bitcoinrpc,walletpassphrase,password,permanentfile,timeout) } } if ( bits256_nonz(myinfo->persistent_priv) != 0 ) - smartaddress_add(myinfo,myinfo->persistent_priv); + smartaddress_add(myinfo,myinfo->persistent_priv,"",""); //basilisk_unspents_update(myinfo,coin); return(retstr); diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index bcdd21cdf..f36ea10e4 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -597,7 +597,7 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr); int32_t iguana_datachain_scan(struct supernet_info *myinfo,struct iguana_info *coin,uint8_t rmd160[20]); void basilisk_requests_poll(struct supernet_info *myinfo); void dpow_psockloop(void *_ptr); -int32_t smartaddress_add(struct supernet_info *myinfo,bits256 privkey); +int32_t smartaddress_add(struct supernet_info *myinfo,bits256 privkey,char *BTCaddr,char *KMDaddr); int32_t smartaddress(struct supernet_info *myinfo,bits256 *privkeyp,char *coinaddr); int32_t smartaddress_pubkey(struct supernet_info *myinfo,bits256 *privkeyp,bits256 pubkey); int32_t smartaddress_pubkey33(struct supernet_info *myinfo,bits256 *privkeyp,uint8_t *pubkey33); From 8a8ebf5f48c53a900fcb638659dc0ddae7333a98 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 7 Mar 2017 21:45:16 +0200 Subject: [PATCH 386/495] Test --- basilisk/smartaddress.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/basilisk/smartaddress.c b/basilisk/smartaddress.c index 3fc645fcf..0f1ea7224 100755 --- a/basilisk/smartaddress.c +++ b/basilisk/smartaddress.c @@ -51,7 +51,9 @@ int32_t smartaddress(struct supernet_info *myinfo,bits256 *privkeyp,char *coinad printf("MATCHED %s\n",coinaddr); return(i); } - printf("smartaddress cant find (%s) of %d\n",coinaddr,myinfo->numsmartaddrs); + for (i=0; i<20; i++) + printf("%02x",rmd160[i]); + printf(" <- rmd160 smartaddress cant find (%s) of %d\n",coinaddr,myinfo->numsmartaddrs); return(-1); } From 0eaf00aa98ece0d1cfe5a488435b0746d10ab91a Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 7 Mar 2017 21:50:50 +0200 Subject: [PATCH 387/495] Test --- basilisk/smartaddress.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/basilisk/smartaddress.c b/basilisk/smartaddress.c index 0f1ea7224..2aa4b5923 100755 --- a/basilisk/smartaddress.c +++ b/basilisk/smartaddress.c @@ -29,9 +29,14 @@ int32_t smartaddress_add(struct supernet_info *myinfo,bits256 privkey,char *BTCa bitcoin_pubkey33(myinfo->ctx,ap->pubkey33,privkey); calc_rmd160(0,ap->rmd160,ap->pubkey33,33); ap->pubkey = curve25519(privkey,curve25519_basepoint9()); - char coinaddr[64]; bitcoin_address(coinaddr,0,ap->pubkey33,33); + char coinaddr[64]; uint8_t addrtype,rmd160[20]; + bitcoin_address(coinaddr,0,ap->pubkey33,33); for (i=0; i<20; i++) printf("%02x",ap->rmd160[i]); + bitcoin_addr2rmd160(&addrtype,rmd160,coinaddr); + printf(", "); + for (i=0; i<20; i++) + printf("%02x",rmd160[i]); printf (" <- rmd160 for %d %s vs %s\n",myinfo->numsmartaddrs,coinaddr,BTCaddr); return(myinfo->numsmartaddrs); } From 09a946c5fd2d224a3944bbe7e1bacd3474023c63 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 7 Mar 2017 21:57:47 +0200 Subject: [PATCH 388/495] Test --- basilisk/smartaddress.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/smartaddress.c b/basilisk/smartaddress.c index 2aa4b5923..95b15c6e9 100755 --- a/basilisk/smartaddress.c +++ b/basilisk/smartaddress.c @@ -27,7 +27,7 @@ int32_t smartaddress_add(struct supernet_info *myinfo,bits256 privkey,char *BTCa ap = &myinfo->smartaddrs[myinfo->numsmartaddrs++]; ap->privkey = privkey; bitcoin_pubkey33(myinfo->ctx,ap->pubkey33,privkey); - calc_rmd160(0,ap->rmd160,ap->pubkey33,33); + calc_rmd160_sha256(ap->rmd160,ap->pubkey33,33); ap->pubkey = curve25519(privkey,curve25519_basepoint9()); char coinaddr[64]; uint8_t addrtype,rmd160[20]; bitcoin_address(coinaddr,0,ap->pubkey33,33); From 86ca9765f648d67c24722f9328ccbbe4149c1395 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 8 Mar 2017 10:10:23 +0200 Subject: [PATCH 389/495] Test --- basilisk/basilisk_swap.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 655ffe433..8794cab01 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -912,7 +912,7 @@ void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swa int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,int32_t (*basilisk_verify_func)(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen)) { - uint8_t *ptr; bits256 srchash,desthash; uint32_t crc32,_msgbits,quoteid; int32_t i,size,offset,retval = -1; + uint8_t *ptr; bits256 srchash,desthash; uint32_t crc32,_msgbits,quoteid; int32_t i,size,offset,retval = -1; struct basilisk_swapmessage *mp = 0; while ( (size= nn_recv(swap->subsock,&ptr,NN_MSG,0)) >= 0 ) { memset(srchash.bytes,0,sizeof(srchash)); @@ -937,10 +937,13 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap //printf("%d: %s vs %s\n",i,bits256_str(str,swap->messages[i].srchash),bits256_str(str2,swap->messages[i].desthash)); if ( swap->messages[i].msgbits == msgbits && bits256_cmp(swap->messages[i].desthash,swap->I.myhash) == 0 ) { - retval = (*basilisk_verify_func)(myinfo,swap,swap->messages[i].data,swap->messages[i].datalen); - break; + mp = &swap->messages[i]; + if ( msgbits != 0x80000000 ) + break; } } + if ( mp != 0 ) + retval = (*basilisk_verify_func)(myinfo,swap,swap->messages[i].data,swap->messages[i].datalen); //printf("mine/other %s vs %s\n",bits256_str(str,swap->I.myhash),bits256_str(str2,swap->I.otherhash)); return(retval); } @@ -1365,10 +1368,11 @@ void basilisk_swap_purge(struct supernet_info *myinfo,struct basilisk_swap *swap int32_t basilisk_verify_otherstatebits(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) { - int32_t retval; struct basilisk_swap *swap = ptr; - if ( datalen == sizeof(swap->I.otherstatebits) ) + int32_t retval; uint32_t t; struct basilisk_swap *swap = ptr; + if ( datalen == sizeof(swap->I.otherstatebits)+sizeof(t) ) { retval = iguana_rwnum(0,data,sizeof(swap->I.otherstatebits),&swap->I.otherstatebits); + retval += iguana_rwnum(0,data,sizeof(t),&t); //printf("got sendstate.%x\n",swap->I.otherstatebits); return(retval); } else return(-1); @@ -1524,9 +1528,10 @@ int32_t basilisk_checkdeck(struct supernet_info *myinfo,struct basilisk_swap *sw void basilisk_sendstate(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { - int32_t datalen; + int32_t datalen; uint32_t t = (uint32_t)time(NULL); //printf("sendstate.%x\n",swap->I.statebits); datalen = iguana_rwnum(1,data,sizeof(swap->I.statebits),&swap->I.statebits); + datalen += iguana_rwnum(1,data,sizeof(t),&t); basilisk_swapsend(myinfo,swap,0x80000000,data,datalen,0,0); } From e3824d672e067688d6250777a7fb075cee636eaa Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 8 Mar 2017 15:11:12 +0200 Subject: [PATCH 390/495] Test --- basilisk/basilisk_swap.c | 6 ++++-- iguana/iguana_chains.c | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 8794cab01..9615da35d 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -719,6 +719,8 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,struct basilis bitcoin_address(rawtx->coin->changeaddr,rawtx->coin->chain->pubtype,swap->persistent_pubkey33,33); printf("set change address.(%s)\n",rawtx->coin->changeaddr); } + //if ( strcmp(rawtx->coin->symbol,"BTC") == 0 ) + // txfee = 0; init_hexbytes_noT(scriptstr,script,scriptlen); basilisktag = (uint32_t)rand(); valsobj = cJSON_CreateObject(); @@ -1373,7 +1375,7 @@ int32_t basilisk_verify_otherstatebits(struct supernet_info *myinfo,void *ptr,ui { retval = iguana_rwnum(0,data,sizeof(swap->I.otherstatebits),&swap->I.otherstatebits); retval += iguana_rwnum(0,data,sizeof(t),&t); - //printf("got sendstate.%x\n",swap->I.otherstatebits); + printf("got sendstate.%x t.%u\n",swap->I.otherstatebits,t); return(retval); } else return(-1); } @@ -1529,7 +1531,7 @@ int32_t basilisk_checkdeck(struct supernet_info *myinfo,struct basilisk_swap *sw void basilisk_sendstate(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { int32_t datalen; uint32_t t = (uint32_t)time(NULL); - //printf("sendstate.%x\n",swap->I.statebits); + printf("sendstate.%x\n",swap->I.statebits); datalen = iguana_rwnum(1,data,sizeof(swap->I.statebits),&swap->I.statebits); datalen += iguana_rwnum(1,data,sizeof(t),&t); basilisk_swapsend(myinfo,swap,0x80000000,data,datalen,0,0); diff --git a/iguana/iguana_chains.c b/iguana/iguana_chains.c index 87a8ce798..b5749f8f5 100755 --- a/iguana/iguana_chains.c +++ b/iguana/iguana_chains.c @@ -486,7 +486,7 @@ void iguana_chaininit(struct supernet_info *myinfo,struct iguana_chain *chain,in if ( strcmp(chain->symbol,"BTC") == 0 ) { chain->unitval = 0x1d; - chain->txfee = 10000; + chain->txfee = 50000; chain->havecltv = 1; } else chain->txfee = 10000; From cbf8fed7cb9316f910faac15d3ae7438a99d7013 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 8 Mar 2017 15:15:53 +0200 Subject: [PATCH 391/495] Test --- basilisk/basilisk_swap.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 9615da35d..8cda95bc5 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -899,7 +899,7 @@ void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swa for (i=0; inummessages; i++) if ( crc32 == swap->messages[i].crc32 ) return; - printf(" new message.[%d] datalen.%d Q.%x msg.%x\n",swap->nummessages,datalen,quoteid,msgbits); + printf(" new message.[%d] datalen.%d Q.%x msg.%x [%x]\n",swap->nummessages,datalen,quoteid,msgbits,*(uint32_t *)data); swap->messages = realloc(swap->messages,sizeof(*swap->messages) * (swap->nummessages + 1)); mp = &swap->messages[swap->nummessages++]; mp->crc32 = crc32; @@ -942,6 +942,7 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap mp = &swap->messages[i]; if ( msgbits != 0x80000000 ) break; + printf("set 80000000 -> %d\n",i); } } if ( mp != 0 ) From 1beb3bd8c75921d63171e2cfe161528f8e6f5c98 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 8 Mar 2017 15:24:40 +0200 Subject: [PATCH 392/495] Test --- basilisk/basilisk_swap.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 8cda95bc5..ef8ff6633 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -899,7 +899,7 @@ void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swa for (i=0; inummessages; i++) if ( crc32 == swap->messages[i].crc32 ) return; - printf(" new message.[%d] datalen.%d Q.%x msg.%x [%x]\n",swap->nummessages,datalen,quoteid,msgbits,*(uint32_t *)data); + printf(" new message.[%d] datalen.%d Q.%x msg.%x [%llx]\n",swap->nummessages,datalen,quoteid,msgbits,*(long long *)data); swap->messages = realloc(swap->messages,sizeof(*swap->messages) * (swap->nummessages + 1)); mp = &swap->messages[swap->nummessages++]; mp->crc32 = crc32; @@ -942,11 +942,11 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap mp = &swap->messages[i]; if ( msgbits != 0x80000000 ) break; - printf("set 80000000 -> %d\n",i); + printf("set 80000000 -> %d [%llx]\n",i,*(long long *)swap->messages[i].data); } } if ( mp != 0 ) - retval = (*basilisk_verify_func)(myinfo,swap,swap->messages[i].data,swap->messages[i].datalen); + retval = (*basilisk_verify_func)(myinfo,swap,mp->data,mp->datalen); //printf("mine/other %s vs %s\n",bits256_str(str,swap->I.myhash),bits256_str(str2,swap->I.otherhash)); return(retval); } @@ -970,7 +970,7 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw memcpy(&buf[offset],data,datalen), offset += datalen; if ( (sentbytes= nn_send(swap->pushsock,buf,offset,0)) != offset ) printf("sentbytes.%d vs offset.%d\n",sentbytes,offset); - //else printf("send.[%d] %x\n",sentbytes,msgbits); + else printf("send.[%d] %x [%llx]\n",sentbytes,msgbits,*(long long *)&buf[offset - datalen]); free(buf); return(0); } From 71a5bc16a2bb4423735448990a5d7b0e732eb585 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 8 Mar 2017 15:33:22 +0200 Subject: [PATCH 393/495] Test --- basilisk/basilisk_swap.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index ef8ff6633..2092f9afc 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -897,7 +897,7 @@ void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swa { int32_t i; struct basilisk_swapmessage *mp; for (i=0; inummessages; i++) - if ( crc32 == swap->messages[i].crc32 ) + if ( crc32 == swap->messages[i].crc32 && msgbits == swap->messages[i].msgbits && bits256_cmp(srchash,swap->messages[i].srchash) == 0 && bits256_cmp(desthash,swap->messages[i].desthash) == 0 ) return; printf(" new message.[%d] datalen.%d Q.%x msg.%x [%llx]\n",swap->nummessages,datalen,quoteid,msgbits,*(long long *)data); swap->messages = realloc(swap->messages,sizeof(*swap->messages) * (swap->nummessages + 1)); @@ -929,7 +929,10 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),"eid); offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),&_msgbits); if ( size > offset ) + { + printf("size.%d offset.%d datalen.%d\n",size,offset,size-offset); basilisk_swapgotdata(myinfo,swap,crc32,srchash,desthash,quoteid,_msgbits,&ptr[offset],size-offset); + } if ( ptr != 0 ) nn_freemsg(ptr), ptr = 0; } @@ -970,7 +973,7 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw memcpy(&buf[offset],data,datalen), offset += datalen; if ( (sentbytes= nn_send(swap->pushsock,buf,offset,0)) != offset ) printf("sentbytes.%d vs offset.%d\n",sentbytes,offset); - else printf("send.[%d] %x [%llx]\n",sentbytes,msgbits,*(long long *)&buf[offset - datalen]); + else printf("send.[%d] %x offset.%d datalen.%d [%llx]\n",sentbytes,msgbits,offset,datalen,*(long long *)data); free(buf); return(0); } From 90eab0ae3750bd7732f6926b787f11e2cf885ca7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 8 Mar 2017 15:40:11 +0200 Subject: [PATCH 394/495] Test --- basilisk/basilisk_swap.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 2092f9afc..7fc616e9c 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1374,12 +1374,11 @@ void basilisk_swap_purge(struct supernet_info *myinfo,struct basilisk_swap *swap int32_t basilisk_verify_otherstatebits(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) { - int32_t retval; uint32_t t; struct basilisk_swap *swap = ptr; - if ( datalen == sizeof(swap->I.otherstatebits)+sizeof(t) ) + int32_t retval; struct basilisk_swap *swap = ptr; + if ( datalen == sizeof(swap->I.otherstatebits) ) { retval = iguana_rwnum(0,data,sizeof(swap->I.otherstatebits),&swap->I.otherstatebits); - retval += iguana_rwnum(0,data,sizeof(t),&t); - printf("got sendstate.%x t.%u\n",swap->I.otherstatebits,t); + printf("got sendstate.%x\n",swap->I.otherstatebits); return(retval); } else return(-1); } @@ -1534,10 +1533,9 @@ int32_t basilisk_checkdeck(struct supernet_info *myinfo,struct basilisk_swap *sw void basilisk_sendstate(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { - int32_t datalen; uint32_t t = (uint32_t)time(NULL); + int32_t datalen=0; printf("sendstate.%x\n",swap->I.statebits); datalen = iguana_rwnum(1,data,sizeof(swap->I.statebits),&swap->I.statebits); - datalen += iguana_rwnum(1,data,sizeof(t),&t); basilisk_swapsend(myinfo,swap,0x80000000,data,datalen,0,0); } From 72d1d2b0e5d06198b70c2da05158bcf9d1404bb5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 8 Mar 2017 15:47:14 +0200 Subject: [PATCH 395/495] Test --- basilisk/basilisk_swap.c | 97 +--------------------------------------- 1 file changed, 2 insertions(+), 95 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 7fc616e9c..5eeb65d96 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -930,7 +930,7 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),&_msgbits); if ( size > offset ) { - printf("size.%d offset.%d datalen.%d\n",size,offset,size-offset); + //printf("size.%d offset.%d datalen.%d\n",size,offset,size-offset); basilisk_swapgotdata(myinfo,swap,crc32,srchash,desthash,quoteid,_msgbits,&ptr[offset],size-offset); } if ( ptr != 0 ) @@ -945,7 +945,6 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap mp = &swap->messages[i]; if ( msgbits != 0x80000000 ) break; - printf("set 80000000 -> %d [%llx]\n",i,*(long long *)swap->messages[i].data); } } if ( mp != 0 ) @@ -957,11 +956,6 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t datalen,uint32_t nextbits,uint32_t crcs[2]) { uint8_t *buf; int32_t sentbytes,offset=0,i; - //if ( (rand() % 10) == 0 ) - // basilisk_channelsend(myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,INSTANTDEX_LOCKTIME*2); - //if ( basilisk_crcsend(myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,crcs) != 0 ) - //return(nextbits); - //dex_channelsend(myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen); //INSTANTDEX_LOCKTIME*2 buf = malloc(datalen + sizeof(msgbits) + sizeof(swap->I.req.quoteid) + sizeof(bits256)*2); for (i=0; i<32; i++) buf[offset++] = swap->I.myhash.bytes[i]; @@ -973,7 +967,7 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw memcpy(&buf[offset],data,datalen), offset += datalen; if ( (sentbytes= nn_send(swap->pushsock,buf,offset,0)) != offset ) printf("sentbytes.%d vs offset.%d\n",sentbytes,offset); - else printf("send.[%d] %x offset.%d datalen.%d [%llx]\n",sentbytes,msgbits,offset,datalen,*(long long *)data); + //else printf("send.[%d] %x offset.%d datalen.%d [%llx]\n",sentbytes,msgbits,offset,datalen,*(long long *)data); free(buf); return(0); } @@ -1131,27 +1125,6 @@ int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct igu if ( coin == 0 || iguana_coinfind(dest) == 0 ) return(0); *bobcoinp = *alicecoinp = 0; - /*if ( strcmp("BTC",src) == 0 ) - { - *bobcoinp = iguana_coinfind(src); - *alicecoinp = iguana_coinfind(dest); - } - else if ( strcmp("BTC",dest) == 0 ) - { - *bobcoinp = iguana_coinfind(dest); - *alicecoinp = iguana_coinfind(src); - } - else if ( (coin= iguana_coinfind(src)) != 0 && coin->chain->havecltv != 0 ) - { - *bobcoinp = iguana_coinfind(src); - *alicecoinp = iguana_coinfind(dest); - } - else if ( (coin= iguana_coinfind(dest)) != 0 && coin->chain->havecltv != 0 ) - { - *bobcoinp = iguana_coinfind(dest); - *alicecoinp = iguana_coinfind(src); - } - else return(0);*/ *bobcoinp = iguana_coinfind(dest); *alicecoinp = iguana_coinfind(src); if ( bits256_cmp(pubkey,srchash) == 0 ) @@ -1175,7 +1148,6 @@ int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct igu struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey33,bits256 pubkey25519,struct basilisk_swap *swap,int32_t optionduration,uint32_t statebits) { - //struct iguana_info *bobcoin,*alicecoin; uint8_t *alicepub33=0,*bobpub33=0; int32_t x = -1; swap->I.putduration = swap->I.callduration = INSTANTDEX_LOCKTIME; if ( optionduration < 0 ) @@ -1188,47 +1160,6 @@ struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey swap->alicecoin = iguana_coinfind(swap->I.req.src); swap->I.alicesatoshis = swap->I.req.srcamount; swap->I.aliceconfirms = swap->I.bobconfirms * 3; - /*if ( strcmp("BTC",swap->I.req.src) == 0 ) - { - swap->bobcoin = iguana_coinfind("BTC"); - swap->I.bobsatoshis = swap->I.req.srcamount; - swap->I.bobconfirms = (1*0 + sqrt(dstr(swap->I.bobsatoshis) * .1)); - swap->alicecoin = iguana_coinfind(swap->I.req.dest); - swap->I.alicesatoshis = swap->I.req.destamount; - swap->I.aliceconfirms = swap->I.bobconfirms * 3; - } - else if ( strcmp("BTC",swap->I.req.dest) == 0 ) - { - swap->bobcoin = iguana_coinfind("BTC"); - swap->I.bobsatoshis = swap->I.req.destamount; - swap->I.bobconfirms = (1*0 + sqrt(dstr(swap->I.bobsatoshis) * .1)); - swap->alicecoin = iguana_coinfind(swap->I.req.src); - swap->I.alicesatoshis = swap->I.req.srcamount; - swap->I.aliceconfirms = swap->I.bobconfirms * 3; - } - else - { - if ( (coin= iguana_coinfind(swap->I.req.src)) != 0 ) - { - if ( coin->chain->havecltv != 0 ) - { - swap->bobcoin = coin; - swap->I.bobsatoshis = swap->I.req.srcamount; - swap->alicecoin = iguana_coinfind(swap->I.req.dest); - swap->I.alicesatoshis = swap->I.req.destamount; - } - else if ( (coin= iguana_coinfind(swap->I.req.dest)) != 0 ) - { - if ( coin->chain->havecltv != 0 ) - { - swap->bobcoin = coin; - swap->I.bobsatoshis = swap->I.req.destamount; - swap->alicecoin = iguana_coinfind(swap->I.req.src); - swap->I.alicesatoshis = swap->I.req.srcamount; - } else printf("neither coin handles ctlv %s %s\n",swap->I.req.src,swap->I.req.dest); - } else printf("cant find src or dest coin.(%s %s)\n",swap->I.req.src,swap->I.req.dest); - } else printf("cant find src coin.(%s)\n",swap->I.req.src); - }*/ if ( swap->bobcoin == 0 || swap->alicecoin == 0 ) { printf("missing bobcoin.%p or missing alicecoin.%p src.%p dest.%p\n",swap->bobcoin,swap->alicecoin,iguana_coinfind(swap->I.req.src),iguana_coinfind(swap->I.req.dest)); @@ -1263,28 +1194,6 @@ struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey swap->I.iambob = 1; swap->I.otherhash = swap->I.req.srchash; } - /*if ( bits256_cmp(swap->I.myhash,swap->I.req.srchash) == 0 ) - { - swap->I.otherhash = swap->I.req.desthash; - if ( strcmp(swap->I.req.src,swap->I.bobstr) == 0 ) - swap->I.iambob = 1; - } - else if ( bits256_cmp(swap->I.myhash,swap->I.req.desthash) == 0 ) - { - swap->I.otherhash = swap->I.req.srchash; - if ( strcmp(swap->I.req.dest,swap->I.bobstr) == 0 ) - swap->I.iambob = 1; - } - else - { - printf("neither src nor dest error\n"); - return(0); - } - if ( (bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash)+1)/2 != swap->I.iambob ) - { - printf("error iambob.%d != %d\n",swap->I.iambob,bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash)); - return(0); - }*/ if ( bits256_nonz(privkey) == 0 || (x= instantdex_pubkeyargs(ctx,swap,2 + INSTANTDEX_DECKSIZE,privkey,swap->I.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) { char str[65]; printf("couldnt generate privkeys %d %s\n",x,bits256_str(str,privkey)); @@ -1378,7 +1287,6 @@ int32_t basilisk_verify_otherstatebits(struct supernet_info *myinfo,void *ptr,ui if ( datalen == sizeof(swap->I.otherstatebits) ) { retval = iguana_rwnum(0,data,sizeof(swap->I.otherstatebits),&swap->I.otherstatebits); - printf("got sendstate.%x\n",swap->I.otherstatebits); return(retval); } else return(-1); } @@ -1534,7 +1442,6 @@ int32_t basilisk_checkdeck(struct supernet_info *myinfo,struct basilisk_swap *sw void basilisk_sendstate(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { int32_t datalen=0; - printf("sendstate.%x\n",swap->I.statebits); datalen = iguana_rwnum(1,data,sizeof(swap->I.statebits),&swap->I.statebits); basilisk_swapsend(myinfo,swap,0x80000000,data,datalen,0,0); } From 4137c512f780121a4f181a86cc7982fde250f16f Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 8 Mar 2017 17:17:46 +0200 Subject: [PATCH 396/495] Test --- basilisk/basilisk.h | 2 +- basilisk/basilisk_swap.c | 28 ++++++++++++++-------------- basilisk/tradebots_liquidity.c | 2 ++ 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/basilisk/basilisk.h b/basilisk/basilisk.h index 42a072486..916504b2d 100755 --- a/basilisk/basilisk.h +++ b/basilisk/basilisk.h @@ -16,7 +16,7 @@ #ifndef H_BASILISK_H #define H_BASILISK_H -//#define BASILISK_DISABLESENDTX +#define BASILISK_DISABLESENDTX #define BASILISK_DISABLEWAITTX #include "../iguana/iguana777.h" diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 5eeb65d96..fa237968b 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -501,10 +501,10 @@ int32_t basilisk_swapuserdata(struct basilisk_swap *swap,uint8_t *userdata,bits2 int32_t basilisk_verify_bobdeposit(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) { uint8_t userdata[512]; int32_t i,retval,len = 0; static bits256 zero; struct basilisk_swap *swap = ptr; - if ( basilisk_rawtx_spendscript(swap,swap->bobcoin->blocks.hwmchain.height,&swap->bobdeposit,0,data,datalen,0) == 0 ) + if ( basilisk_rawtx_spendscript(swap,swap->bobcoin->longestchain,&swap->bobdeposit,0,data,datalen,0) == 0 ) { len = basilisk_swapuserdata(swap,userdata,zero,1,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); - if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->aliceclaim,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) + if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->longestchain,swap,&swap->aliceclaim,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) { for (i=0; ibobdeposit.I.datalen; i++) printf("%02x",swap->bobdeposit.txbytes[i]); @@ -524,7 +524,7 @@ int32_t basilisk_bobdeposit_refund(struct supernet_info *myinfo,struct basilisk_ { uint8_t userdata[512]; int32_t i,retval,len = 0; char str[65]; len = basilisk_swapuserdata(swap,userdata,swap->I.privBn,0,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); - if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->bobrefund,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,0)) == 0 ) + if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->longestchain,swap,&swap->bobrefund,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,0)) == 0 ) { for (i=0; ibobrefund.I.datalen; i++) printf("%02x",swap->bobrefund.txbytes[i]); @@ -547,7 +547,7 @@ int32_t basilisk_bobpayment_reclaim(struct supernet_info *myinfo,struct basilisk uint8_t userdata[512]; int32_t i,retval,len = 0; static bits256 zero; printf("basilisk_bobpayment_reclaim\n"); len = basilisk_swapuserdata(swap,userdata,zero,1,swap->I.myprivs[1],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); - if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->bobreclaim,&swap->bobpayment,swap->I.myprivs[1],0,userdata,len,1)) == 0 ) + if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->longestchain,swap,&swap->bobreclaim,&swap->bobpayment,swap->I.myprivs[1],0,userdata,len,1)) == 0 ) { for (i=0; ibobreclaim.I.datalen; i++) printf("%02x",swap->bobreclaim.txbytes[i]); @@ -562,13 +562,13 @@ int32_t basilisk_verify_bobpaid(struct supernet_info *myinfo,void *ptr,uint8_t * { uint8_t userdata[512]; int32_t i,retval,len = 0; bits256 revAm; struct basilisk_swap *swap = ptr; memset(revAm.bytes,0,sizeof(revAm)); - if ( basilisk_rawtx_spendscript(swap,swap->bobcoin->blocks.hwmchain.height,&swap->bobpayment,0,data,datalen,0) == 0 ) + if ( basilisk_rawtx_spendscript(swap,swap->bobcoin->longestchain,&swap->bobpayment,0,data,datalen,0) == 0 ) { for (i=0; i<32; i++) revAm.bytes[i] = swap->I.privAm.bytes[31-i]; len = basilisk_swapuserdata(swap,userdata,revAm,0,swap->I.myprivs[0],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); char str[65]; printf("bobpaid.(%s)\n",bits256_str(str,swap->I.privAm)); - if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->alicespend,&swap->bobpayment,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) + if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->longestchain,swap,&swap->alicespend,&swap->bobpayment,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) { for (i=0; ibobpayment.I.datalen; i++) printf("%02x",swap->bobpayment.txbytes[i]); @@ -587,9 +587,9 @@ int32_t basilisk_verify_bobpaid(struct supernet_info *myinfo,void *ptr,uint8_t * int32_t basilisk_alicepayment_spend(struct supernet_info *myinfo,struct basilisk_swap *swap,struct basilisk_rawtx *dest) { int32_t i,retval; - //printf("alicepayment_spend\n"); + printf("alicepayment_spend\n"); swap->alicepayment.I.spendlen = basilisk_alicescript(swap->alicepayment.redeemscript,&swap->alicepayment.I.redeemlen,swap->alicepayment.spendscript,0,swap->alicepayment.I.destaddr,swap->alicecoin->chain->p2shtype,swap->I.pubAm,swap->I.pubBn); - if ( (retval= basilisk_rawtx_sign(myinfo,swap->alicecoin->blocks.hwmchain.height,swap,dest,&swap->alicepayment,swap->I.privAm,&swap->I.privBn,0,0,1)) == 0 ) + if ( (retval= basilisk_rawtx_sign(myinfo,swap->alicecoin->longestchain,swap,dest,&swap->alicepayment,swap->I.privAm,&swap->I.privBn,0,0,1)) == 0 ) { for (i=0; iI.datalen; i++) printf("%02x",dest->txbytes[i]); @@ -604,7 +604,7 @@ int32_t basilisk_alicepayment_spend(struct supernet_info *myinfo,struct basilisk int32_t basilisk_verify_alicepaid(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) { struct basilisk_swap *swap = ptr; - if ( basilisk_rawtx_spendscript(swap,swap->alicecoin->blocks.hwmchain.height,&swap->alicepayment,0,data,datalen,0) == 0 ) + if ( basilisk_rawtx_spendscript(swap,swap->alicecoin->longestchain,&swap->alicepayment,0,data,datalen,0) == 0 ) return(0); else return(-1); } @@ -751,7 +751,7 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,struct basilis n = cJSON_GetArraySize(retarray); for (i=0; icoin->blocks.hwmchain.height,rawtx,jitem(retarray,i),lockinputs,V)) == 0 ) + if ( (retval= basilisk_rawtx_return(myinfo,rawtx->coin->longestchain,rawtx,jitem(retarray,i),lockinputs,V)) == 0 ) { rawtx->vins = jobj(jitem(retarray,i),"vins"); break; @@ -760,7 +760,7 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,struct basilis } else { - retval = basilisk_rawtx_return(myinfo,rawtx->coin->blocks.hwmchain.height,rawtx,retarray,lockinputs,V); + retval = basilisk_rawtx_return(myinfo,rawtx->coin->longestchain,rawtx,retarray,lockinputs,V); rawtx->vins = jobj(retarray,"vins"); } free(retarray); @@ -986,7 +986,7 @@ int32_t basilisk_priviextract(struct supernet_info *myinfo,struct iguana_info *c if ( memcmp(secret160,rmd160,sizeof(rmd160)) == sizeof(rmd160) ) { *destp = privkey; - printf("found %s (%s)\n",name,bits256_str(str,privkey)); + printf("found privi %s (%s)\n",name,bits256_str(str,privkey)); return(0); } } @@ -1471,7 +1471,7 @@ void basilisk_sendchoosei(struct supernet_info *myinfo,struct basilisk_swap *swa void basilisk_waitchoosei(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { - uint8_t pubkey33[33]; //char str[65],str2[65]; + uint8_t pubkey33[33]; char str[65],str2[65]; //printf("check otherchoosei\n"); if ( basilisk_swapget(myinfo,swap,0x08,data,maxlen,basilisk_verify_choosei) == 0 ) { @@ -1484,7 +1484,7 @@ void basilisk_waitchoosei(struct supernet_info *myinfo,struct basilisk_swap *swa revcalc_rmd160_sha256(swap->I.secretBn,swap->I.privBn);//.bytes,sizeof(swap->privBn)); vcalc_sha256(0,swap->I.secretBn256,swap->I.privBn.bytes,sizeof(swap->I.privBn)); swap->I.pubBn = bitcoin_pubkey33(myinfo->ctx,pubkey33,swap->I.privBn); - //printf("set privBn.%s %s\n",bits256_str(str,swap->privBn),bits256_str(str2,*(bits256 *)swap->secretBn256)); + printf("set privBn.%s %s\n",bits256_str(str,swap->I.privBn),bits256_str(str2,*(bits256 *)swap->I.secretBn256)); basilisk_bobscripts_set(myinfo,swap,1,1); } } diff --git a/basilisk/tradebots_liquidity.c b/basilisk/tradebots_liquidity.c index 3cc4e7617..c87cea550 100755 --- a/basilisk/tradebots_liquidity.c +++ b/basilisk/tradebots_liquidity.c @@ -1131,6 +1131,8 @@ void _default_swap_balancingtrade(struct supernet_info *myinfo,struct basilisk_s void tradebot_swap_balancingtrade(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t iambob) { + printf("balancing trade\n"); + return; if ( swap->balancingtrade == 0 ) _default_swap_balancingtrade(myinfo,swap,iambob); else (*swap->balancingtrade)(myinfo,swap,iambob); From bce6732888db6cc318a638cd6641127a4cf10baa Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Mar 2017 09:47:36 +0200 Subject: [PATCH 397/495] Cancel refresh --- basilisk/basilisk.c | 13 + basilisk/basilisk.h | 3 +- basilisk/basilisk_DEX.c | 2 +- basilisk/basilisk_swap.c | 490 +++++++++++++++++++++------------- iguana/iguana777.h | 3 +- iguana/main.c | 1 + includes/iguana_apideclares.h | 1 + 7 files changed, 322 insertions(+), 191 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index ae02e86ea..47c997c14 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -1086,9 +1086,16 @@ int32_t utxocmp(cJSON *utxo,cJSON *utxo2) else return(-1); } +ZERO_ARGS(basilisk,cancelrefresh) +{ + myinfo->cancelrefresh = 1; + return(clonestr("{\"result\":\"refresh cancel started\"}")); +} + TWO_STRINGS(basilisk,refresh,symbol,address) { cJSON *array=0,*array2=0,*array3,*item,*item2; char *retstr; int32_t i,j,n,m,vout; bits256 txid; + myinfo->cancelrefresh = 0; if ( symbol != 0 && iguana_isnotarychain(symbol) >= 0 && address != 0 && address[0] != 0 ) { if ( (retstr= _dex_listunspent(myinfo,symbol,address)) != 0 ) @@ -1111,6 +1118,8 @@ TWO_STRINGS(basilisk,refresh,symbol,address) //printf("MERGE %s and %s\n",jprint(array,0),jprint(array2,0)); for (j=0; jcancelrefresh != 0 ) + break; item2 = jitem(array2,j); for (i=0; icancelrefresh != 0 ) + break; item = jitem(array,i); txid = jbits256(item,"txid"); vout = jint(item,"vout"); @@ -1152,9 +1163,11 @@ TWO_STRINGS(basilisk,refresh,symbol,address) } } free_json(array); + myinfo->cancelrefresh = 0; return(jprint(array3,1)); } else return(clonestr("[]")); } + myinfo->cancelrefresh = 0; return(clonestr("{\"error\":\"invalid coin or address specified\"}")); } diff --git a/basilisk/basilisk.h b/basilisk/basilisk.h index 916504b2d..a7bb6be4d 100755 --- a/basilisk/basilisk.h +++ b/basilisk/basilisk.h @@ -37,6 +37,7 @@ #define INSTANTDEX_INSURANCEDIV 777 #define INSTANTDEX_PUBKEY "03bc2c7ba671bae4a6fc835244c9762b41647b9827d4780a89a949b984a8ddcc06" #define INSTANTDEX_RMD160 "ca1e04745e8ca0c60d8c5881531d51bec470743f" +#define JUMBLR_RMD160 "5177f8b427e5f47342a4b8ab5dac770815d4389e" #define TIERNOLAN_RMD160 "daedddd8dbe7a2439841ced40ba9c3d375f98146" #define INSTANTDEX_BTC "1KRhTPvoxyJmVALwHFXZdeeWFbcJSbkFPu" #define INSTANTDEX_BTCD "RThtXup6Zo7LZAi8kRWgjAyi1s4u6U9Cpf" @@ -126,7 +127,7 @@ int32_t basilisk_update(char *symbol,uint32_t reftimestamp); void basilisk_seqresult(struct supernet_info *myinfo,char *retstr); struct iguana_info *basilisk_geckochain(struct supernet_info *myinfo,char *symbol,char *chainname,cJSON *valsobj); void basilisk_alicepayment(struct supernet_info *myinfo,struct basilisk_swap *swap,struct iguana_info *coin,struct basilisk_rawtx *alicepayment,bits256 pubAm,bits256 pubBn); -void basilisk_rawtx_setparms(char *name,struct basilisk_swap *swap,struct basilisk_rawtx *rawtx,struct iguana_info *coin,int32_t numconfirms,int32_t vintype,uint64_t satoshis,int32_t vouttype,uint8_t *pubkey33); +void basilisk_rawtx_setparms(char *name,uint32_t quoteid,struct basilisk_rawtx *rawtx,struct iguana_info *coin,int32_t numconfirms,int32_t vintype,uint64_t satoshis,int32_t vouttype,uint8_t *pubkey33,int32_t jumblrflag); void basilisk_setmyid(struct supernet_info *myinfo); int32_t basilisk_rwDEXquote(int32_t rwflag,uint8_t *serialized,struct basilisk_request *rp); cJSON *basilisk_requestjson(struct basilisk_request *rp); diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 30f9bed74..f67a8684d 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -253,7 +253,7 @@ char *basilisk_start(struct supernet_info *myinfo,bits256 privkey,struct basilis *rp = *_rp; printf("START thread to complete %u/%u for (%s %.8f) <-> (%s %.8f) q.%u\n",rp->requestid,rp->quoteid,rp->src,dstr(rp->srcamount),rp->dest,dstr(rp->destamount),rp->quoteid); myinfo->lastdexrequestid = rp->requestid; - if ( basilisk_thread_start(myinfo,privkey,rp,statebits,optionduration) != 0 ) + if ( basilisk_thread_start(myinfo,privkey,rp,statebits,optionduration,0) != 0 ) { basilisk_request_enqueue(myinfo,rp); return(clonestr("{\"result\":\"started atomic swap thread\"}")); diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index fa237968b..14a27263b 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -316,15 +316,11 @@ bits256 basilisk_swap_broadcast(char *name,struct supernet_info *myinfo,struct b return(txid); } -int32_t basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,struct basilisk_swap *swap,struct basilisk_rawtx *dest,struct basilisk_rawtx *rawtx,bits256 privkey,bits256 *privkey2,uint8_t *userdata,int32_t userdatalen,int32_t ignore_cltverr) +int32_t _basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,uint32_t timestamp,uint32_t locktime,uint32_t sequenceid,struct basilisk_rawtx *dest,struct basilisk_rawtx *rawtx,bits256 privkey,bits256 *privkey2,uint8_t *userdata,int32_t userdatalen,int32_t ignore_cltverr) { - char *rawtxbytes=0,*signedtx=0,hexstr[999],wifstr[128]; cJSON *txobj,*vins,*item,*sobj,*privkeys; int32_t needsig=1,retval = -1; uint32_t timestamp,sequenceid=0xffffffff; struct vin_info *V; uint32_t locktime=0; + char *rawtxbytes=0,*signedtx=0,hexstr[999],wifstr[128]; cJSON *txobj,*vins,*item,*sobj,*privkeys; int32_t needsig=1,retval = -1; struct vin_info *V; + V = calloc(16,sizeof(*V)); - timestamp = swap->I.started; - if ( dest == &swap->aliceclaim ) - locktime = swap->bobdeposit.I.locktime + 1, sequenceid = 0; - else if ( dest == &swap->bobreclaim ) - locktime = swap->bobpayment.I.locktime + 1, sequenceid = 0; V[0].signers[0].privkey = privkey; bitcoin_pubkey33(myinfo->ctx,V[0].signers[0].pubkey,privkey); privkeys = cJSON_CreateArray(); @@ -399,6 +395,159 @@ int32_t basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,struct b return(retval); } +int32_t basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,struct basilisk_swap *swap,struct basilisk_rawtx *dest,struct basilisk_rawtx *rawtx,bits256 privkey,bits256 *privkey2,uint8_t *userdata,int32_t userdatalen,int32_t ignore_cltverr) +{ + uint32_t timestamp,locktime=0,sequenceid = 0xffffffff; + timestamp = swap->I.started; + if ( dest == &swap->aliceclaim ) + locktime = swap->bobdeposit.I.locktime + 1, sequenceid = 0; + else if ( dest == &swap->bobreclaim ) + locktime = swap->bobpayment.I.locktime + 1, sequenceid = 0; + return(_basilisk_rawtx_sign(myinfo,height,timestamp,locktime,sequenceid,dest,rawtx,privkey,privkey2,userdata,userdatalen,ignore_cltverr)); +} + +cJSON *basilisk_privkeyarray(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *vins) +{ + cJSON *privkeyarray,*item,*sobj; struct iguana_waddress *waddr; struct iguana_waccount *wacct; char coinaddr[64],account[128],wifstr[64],str[65],*hexstr; uint8_t script[1024]; int32_t i,n,len,vout; bits256 txid,privkey; + privkeyarray = cJSON_CreateArray(); + //printf("%s persistent.(%s) (%s) change.(%s) scriptstr.(%s)\n",coin->symbol,myinfo->myaddr.BTC,coinaddr,coin->changeaddr,scriptstr); + if ( (n= cJSON_GetArraySize(vins)) > 0 ) + { + for (i=0; i= 0 ) + { + iguana_txidcategory(myinfo,coin,account,coinaddr,txid,vout); + if ( coinaddr[0] == 0 && (sobj= jobj(item,"scriptPubKey")) != 0 && (hexstr= jstr(sobj,"hex")) != 0 && is_hexstr(hexstr,0) > 0 ) + { + len = (int32_t)strlen(hexstr) >> 1; + if ( len < (sizeof(script) << 1) ) + { + decode_hex(script,len,hexstr); + if ( len == 25 && script[0] == 0x76 && script[1] == 0xa9 && script[2] == 0x14 ) + bitcoin_address(coinaddr,coin->chain->pubtype,script+3,20); + } + } + if ( coinaddr[0] != 0 ) + { + if ( (waddr= iguana_waddresssearch(myinfo,&wacct,coinaddr)) != 0 ) + { + bitcoin_priv2wif(wifstr,waddr->privkey,coin->chain->wiftype); + jaddistr(privkeyarray,waddr->wifstr); + } + else if ( smartaddress(myinfo,&privkey,coinaddr) >= 0 ) + { + bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); + jaddistr(privkeyarray,wifstr); + } + else printf("cant find (%s) in wallet\n",coinaddr); + } else printf("cant coinaddr from (%s).v%d\n",bits256_str(str,txid),vout); + } else printf("invalid txid/vout %d of %d\n",i,n); + } + } + return(privkeyarray); +} + +int32_t basilisk_rawtx_return(struct supernet_info *myinfo,int32_t height,struct basilisk_rawtx *rawtx,cJSON *item,int32_t lockinputs,struct vin_info *V) +{ + char *signedtx,*txbytes; cJSON *vins,*privkeyarray; int32_t i,n,retval = -1; + if ( (txbytes= jstr(item,"rawtx")) != 0 && (vins= jobj(item,"vins")) != 0 ) + { + privkeyarray = basilisk_privkeyarray(myinfo,rawtx->coin,vins); + if ( (signedtx= iguana_signrawtx(myinfo,rawtx->coin,height,&rawtx->I.signedtxid,&rawtx->I.completed,vins,txbytes,privkeyarray,V)) != 0 ) + { + if ( lockinputs != 0 ) + { + //printf("lockinputs\n"); + iguana_RTunspentslock(myinfo,rawtx->coin,vins); + if ( (n= cJSON_GetArraySize(vins)) != 0 ) + { + bits256 txid; int32_t vout; + for (i=0; iI.datalen = (int32_t)strlen(signedtx) >> 1; + rawtx->txbytes = calloc(1,rawtx->I.datalen); + decode_hex(rawtx->txbytes,rawtx->I.datalen,signedtx); + printf("%s SIGNEDTX.(%s)\n",rawtx->name,signedtx); + free(signedtx); + retval = 0; + } else printf("error signrawtx\n"); //do a very short timeout so it finishes via local poll + free_json(privkeyarray); + } + return(retval); +} + +int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swapstarted,uint8_t *pubkey33,int32_t iambob,int32_t lockinputs,struct basilisk_rawtx *rawtx,uint32_t locktime,uint8_t *script,int32_t scriptlen,int64_t txfee,int32_t minconf,int32_t delay) +{ + char *retstr,scriptstr[1024],coinaddr[64]; uint32_t basilisktag; int32_t flag,i,n,retval = -1; cJSON *addresses,*valsobj,*retarray=0; struct vin_info *V; + //bitcoin_address(coinaddr,rawtx->coin->chain->pubtype,myinfo->persistent_pubkey33,33); + if ( rawtx->coin->changeaddr[0] == 0 ) + { + bitcoin_address(rawtx->coin->changeaddr,rawtx->coin->chain->pubtype,pubkey33,33); + printf("set change address.(%s)\n",rawtx->coin->changeaddr); + } + //if ( strcmp(rawtx->coin->symbol,"BTC") == 0 ) + // txfee = 0; + init_hexbytes_noT(scriptstr,script,scriptlen); + basilisktag = (uint32_t)rand(); + valsobj = cJSON_CreateObject(); + jaddstr(valsobj,"coin",rawtx->coin->symbol); + jaddstr(valsobj,"spendscript",scriptstr); + jaddstr(valsobj,"changeaddr",rawtx->coin->changeaddr); + jadd64bits(valsobj,"satoshis",rawtx->I.amount); + jadd64bits(valsobj,"txfee",txfee); + jaddnum(valsobj,"minconf",minconf); + jaddnum(valsobj,"locktime",locktime); + jaddnum(valsobj,"timeout",30000); + jaddnum(valsobj,"timestamp",swapstarted+delay); + addresses = cJSON_CreateArray(); + bitcoin_address(coinaddr,rawtx->coin->chain->pubtype,pubkey33,33); + jaddistr(addresses,coinaddr); + jadd(valsobj,"addresses",addresses); + rawtx->I.locktime = locktime; + //printf("%s locktime.%u\n",rawtx->name,locktime); + V = calloc(256,sizeof(*V)); + if ( (retstr= basilisk_bitcoinrawtx(myinfo,rawtx->coin,"",basilisktag,jint(valsobj,"timeout"),valsobj,V)) != 0 ) + { + //printf("%s %s basilisk_bitcoinrawtx.(%s)\n",rawtx->name,str,retstr); + flag = 0; + if ( (retarray= cJSON_Parse(retstr)) != 0 ) + { + if ( is_cJSON_Array(retarray) != 0 ) + { + n = cJSON_GetArraySize(retarray); + for (i=0; icoin->longestchain,rawtx,jitem(retarray,i),lockinputs,V)) == 0 ) + { + rawtx->vins = jobj(jitem(retarray,i),"vins"); + break; + } + } + } + else + { + retval = basilisk_rawtx_return(myinfo,rawtx->coin->longestchain,rawtx,retarray,lockinputs,V); + rawtx->vins = jobj(retarray,"vins"); + } + free(retarray); + } else printf("error parsing.(%s)\n",retstr); + free(retstr); + } else printf("error creating %s feetx\n",iambob != 0 ? "BOB" : "ALICE"); + free_json(valsobj); + free(V); + return(retval); +} + struct basilisk_rawtx *basilisk_swapdata_rawtx(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen,struct basilisk_rawtx *rawtx) { if ( rawtx->txbytes != 0 && rawtx->I.datalen <= maxlen ) @@ -463,7 +612,8 @@ int32_t basilisk_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,str { decode_hex(rawtx->spendscript,hexlen,hexstr); rawtx->I.spendlen = hexlen; - basilisk_txlog(swap->myinfoptr,swap,rawtx,-1); // bobdeposit, bobpayment or alicepayment + if ( swap != 0 ) + basilisk_txlog(swap->myinfoptr,swap,rawtx,-1); // bobdeposit, bobpayment or alicepayment retval = 0; } } else printf("%s ERROR.(%s)\n",rawtx->name,jprint(txobj,0)); @@ -473,7 +623,7 @@ int32_t basilisk_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,str return(retval); } -int32_t basilisk_swapuserdata(struct basilisk_swap *swap,uint8_t *userdata,bits256 privkey,int32_t ifpath,bits256 signpriv,uint8_t *redeemscript,int32_t redeemlen) +int32_t basilisk_swapuserdata(uint8_t *userdata,bits256 privkey,int32_t ifpath,bits256 signpriv,uint8_t *redeemscript,int32_t redeemlen) { int32_t i,len = 0; #ifdef DISABLE_CHECKSIG @@ -503,7 +653,7 @@ int32_t basilisk_verify_bobdeposit(struct supernet_info *myinfo,void *ptr,uint8_ uint8_t userdata[512]; int32_t i,retval,len = 0; static bits256 zero; struct basilisk_swap *swap = ptr; if ( basilisk_rawtx_spendscript(swap,swap->bobcoin->longestchain,&swap->bobdeposit,0,data,datalen,0) == 0 ) { - len = basilisk_swapuserdata(swap,userdata,zero,1,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); + len = basilisk_swapuserdata(userdata,zero,1,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->longestchain,swap,&swap->aliceclaim,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) { for (i=0; ibobdeposit.I.datalen; i++) @@ -523,7 +673,7 @@ int32_t basilisk_verify_bobdeposit(struct supernet_info *myinfo,void *ptr,uint8_ int32_t basilisk_bobdeposit_refund(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t delay) { uint8_t userdata[512]; int32_t i,retval,len = 0; char str[65]; - len = basilisk_swapuserdata(swap,userdata,swap->I.privBn,0,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); + len = basilisk_swapuserdata(userdata,swap->I.privBn,0,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->longestchain,swap,&swap->bobrefund,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,0)) == 0 ) { for (i=0; ibobrefund.I.datalen; i++) @@ -546,7 +696,7 @@ int32_t basilisk_bobpayment_reclaim(struct supernet_info *myinfo,struct basilisk { uint8_t userdata[512]; int32_t i,retval,len = 0; static bits256 zero; printf("basilisk_bobpayment_reclaim\n"); - len = basilisk_swapuserdata(swap,userdata,zero,1,swap->I.myprivs[1],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); + len = basilisk_swapuserdata(userdata,zero,1,swap->I.myprivs[1],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->longestchain,swap,&swap->bobreclaim,&swap->bobpayment,swap->I.myprivs[1],0,userdata,len,1)) == 0 ) { for (i=0; ibobreclaim.I.datalen; i++) @@ -566,8 +716,8 @@ int32_t basilisk_verify_bobpaid(struct supernet_info *myinfo,void *ptr,uint8_t * { for (i=0; i<32; i++) revAm.bytes[i] = swap->I.privAm.bytes[31-i]; - len = basilisk_swapuserdata(swap,userdata,revAm,0,swap->I.myprivs[0],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); - char str[65]; printf("bobpaid.(%s)\n",bits256_str(str,swap->I.privAm)); + len = basilisk_swapuserdata(userdata,revAm,0,swap->I.myprivs[0],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); + char str[65],str2[65]; printf("bobpaid.(%s) (%s)\n",bits256_str(str,swap->I.privAm),bits256_str(str2,swap->I.myprivs[0])); if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->longestchain,swap,&swap->alicespend,&swap->bobpayment,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) { for (i=0; ibobpayment.I.datalen; i++) @@ -584,6 +734,12 @@ int32_t basilisk_verify_bobpaid(struct supernet_info *myinfo,void *ptr,uint8_t * return(-1); } +void basilisk_alicepayment(struct supernet_info *myinfo,struct basilisk_swap *swap,struct iguana_info *coin,struct basilisk_rawtx *alicepayment,bits256 pubAm,bits256 pubBn) +{ + alicepayment->I.spendlen = basilisk_alicescript(alicepayment->redeemscript,&alicepayment->I.redeemlen,alicepayment->spendscript,0,alicepayment->I.destaddr,coin->chain->p2shtype,pubAm,pubBn); + basilisk_rawtx_gen("alicepayment",myinfo,swap->I.started,swap->persistent_pubkey33,0,1,alicepayment,alicepayment->I.locktime,alicepayment->spendscript,alicepayment->I.spendlen,coin->chain->txfee,1,0); +} + int32_t basilisk_alicepayment_spend(struct supernet_info *myinfo,struct basilisk_swap *swap,struct basilisk_rawtx *dest) { int32_t i,retval; @@ -594,13 +750,104 @@ int32_t basilisk_alicepayment_spend(struct supernet_info *myinfo,struct basilisk for (i=0; iI.datalen; i++) printf("%02x",dest->txbytes[i]); printf(" <- msigspend\n\n"); - swap->I.bobspent = 1; + if ( dest == &swap->bobspend ) + swap->I.bobspent = 1; basilisk_txlog(myinfo,swap,dest,0); // bobspend or alicereclaim return(retval); } return(-1); } +int32_t basilisk_bobpayment_spendclone(struct supernet_info *myinfo,struct iguana_info *bobcoin,struct basilisk_rawtx *dest,struct basilisk_rawtx *src,uint32_t swapstarted,uint8_t *changepubkey33,uint32_t quoteid,uint64_t amount,bits256 privAm,bits256 myprivs0,uint8_t *data,int32_t datalen,int32_t jumblrflag) +{ + bits256 revAm; uint8_t userdata[512]; int32_t i,len,numconfirms = 0,retval = -1; uint32_t sequenceid = 0xffffffff; + basilisk_rawtx_setparms("bobpayment",quoteid,src,bobcoin,numconfirms,0,amount,3,0,jumblrflag); + dest->I.suppress_pubkeys = 1; + basilisk_rawtx_gen("bobpayment",myinfo,swapstarted,changepubkey33,1,1,src,src->I.locktime,src->spendscript,src->I.spendlen,bobcoin->chain->txfee,1,0); + if ( basilisk_rawtx_spendscript(0,bobcoin->longestchain,src,0,data,datalen,0) == 0 ) + { + memset(revAm.bytes,0,sizeof(revAm)); + for (i=0; i<32; i++) + revAm.bytes[i] = privAm.bytes[31-i]; + len = basilisk_swapuserdata(userdata,revAm,0,myprivs0,src->redeemscript,src->I.redeemlen); + if ( (retval= _basilisk_rawtx_sign(myinfo,bobcoin->longestchain,swapstarted,src->I.locktime,sequenceid,dest,src,myprivs0,0,userdata,len,1)) == 0 ) + { + } + } + return(retval); +} + +int32_t basilisk_bobpayment_reclaimclone(struct supernet_info *myinfo,struct iguana_info *bobcoin,struct basilisk_rawtx *dest,struct basilisk_rawtx *src,uint32_t swapstarted,uint8_t *changepubkey33,uint32_t quoteid,uint64_t amount,bits256 myprivs1,uint8_t *data,int32_t datalen,int32_t jumblrflag) +{ + bits256 zero; uint8_t userdata[512]; int32_t len,numconfirms = 0,retval = -1; uint32_t sequenceid = 0xffffffff; + basilisk_rawtx_setparms("bobpayment",quoteid,src,bobcoin,numconfirms,0,amount,3,0,jumblrflag); + dest->I.suppress_pubkeys = 1; + basilisk_rawtx_gen("bobpayment",myinfo,swapstarted,changepubkey33,1,1,src,src->I.locktime,src->spendscript,src->I.spendlen,bobcoin->chain->txfee,1,0); + if ( basilisk_rawtx_spendscript(0,bobcoin->longestchain,src,0,data,datalen,0) == 0 ) + { + memset(zero.bytes,0,sizeof(zero)); + len = basilisk_swapuserdata(userdata,zero,1,myprivs1,src->redeemscript,src->I.redeemlen); + if ( (retval= _basilisk_rawtx_sign(myinfo,bobcoin->longestchain,swapstarted,src->I.locktime,sequenceid,dest,src,myprivs1,0,userdata,len,1)) == 0 ) + { + } + } + return(retval); +} + +int32_t basilisk_bobdeposit_refundclone(struct supernet_info *myinfo,struct iguana_info *bobcoin,struct basilisk_rawtx *dest,struct basilisk_rawtx *src,uint32_t swapstarted,uint8_t *changepubkey33,uint32_t quoteid,uint64_t amount,bits256 myprivs0,bits256 privBn,uint8_t *data,int32_t datalen,int32_t jumblrflag) +{ + uint8_t userdata[512]; int32_t len,numconfirms = 0,retval = -1; uint32_t sequenceid = 0xffffffff; + basilisk_rawtx_setparms("bobdeposit",quoteid,src,bobcoin,numconfirms,0,amount,4,0,jumblrflag); + dest->I.suppress_pubkeys = 1; + basilisk_rawtx_gen("bobdeposit",myinfo,swapstarted,changepubkey33,1,1,src,src->I.locktime,src->spendscript,src->I.spendlen,bobcoin->chain->txfee,1,0); + if ( basilisk_rawtx_spendscript(0,bobcoin->longestchain,src,0,data,datalen,0) == 0 ) + { + len = basilisk_swapuserdata(userdata,privBn,0,myprivs0,src->redeemscript,src->I.redeemlen); + if ( (retval= _basilisk_rawtx_sign(myinfo,bobcoin->longestchain,swapstarted,src->I.locktime,sequenceid,dest,src,myprivs0,0,userdata,len,0)) == 0 ) + { + } + } + return(retval); +} + +int32_t basilisk_bobdeposit_claimclone(struct supernet_info *myinfo,struct iguana_info *bobcoin,struct basilisk_rawtx *dest,struct basilisk_rawtx *src,uint32_t swapstarted,uint8_t *changepubkey33,uint32_t quoteid,uint64_t amount,bits256 myprivs0,uint8_t *data,int32_t datalen,int32_t jumblrflag) +{ + bits256 zero; uint8_t userdata[512]; int32_t len,numconfirms = 0,retval = -1; uint32_t sequenceid = 0xffffffff; + basilisk_rawtx_setparms("bobdeposit",quoteid,src,bobcoin,numconfirms,0,amount,4,0,jumblrflag); + dest->I.suppress_pubkeys = 1; + basilisk_rawtx_gen("bobdeposit",myinfo,swapstarted,changepubkey33,1,1,src,src->I.locktime,src->spendscript,src->I.spendlen,bobcoin->chain->txfee,1,0); + if ( basilisk_rawtx_spendscript(0,bobcoin->longestchain,src,0,data,datalen,0) == 0 ) + { + memset(zero.bytes,0,sizeof(zero)); + len = basilisk_swapuserdata(userdata,zero,1,myprivs0,src->redeemscript,src->I.redeemlen); + if ( (retval= _basilisk_rawtx_sign(myinfo,bobcoin->longestchain,swapstarted,src->I.locktime,sequenceid,dest,src,myprivs0,0,userdata,len,1)) == 0 ) + { + } + } + return(retval); +} + +//basilisk_alicepayment_clone(myinfo,&dest,&src,swapstarted,changepubkey33,alicecoin,quoteid,amount,privAm,pubAm,privBn,pubBn); + +int32_t basilisk_alicepayment_spendclone(struct supernet_info *myinfo,struct iguana_info *alicecoin,struct basilisk_rawtx *dest,struct basilisk_rawtx *src,uint32_t swapstarted,uint8_t *changepubkey33,uint32_t quoteid,uint64_t amount,bits256 privAm,bits256 privBn,int32_t jumblrflag) +{ + uint8_t pubAm33[33],pubBn33[33]; bits256 pubAm,pubBn; int32_t retval,numconfirms = 0; uint32_t sequenceid = 0xffffffff; + bitcoin_pubkey33(myinfo->ctx,pubAm33,privAm); + memcpy(pubAm.bytes,pubAm33+1,32); + bitcoin_pubkey33(myinfo->ctx,pubBn33,privBn); + memcpy(pubBn.bytes,pubBn33+1,32); + memset(src,0,sizeof(*src)); + memset(dest,0,sizeof(*dest)); + basilisk_rawtx_setparms("alicepayment",quoteid,src,alicecoin,numconfirms,0,amount,2,0,jumblrflag); + src->I.spendlen = basilisk_alicescript(src->redeemscript,&src->I.redeemlen,src->spendscript,0,src->I.destaddr,alicecoin->chain->p2shtype,pubAm,pubBn); + basilisk_rawtx_gen("alicepayment",myinfo,swapstarted,changepubkey33,0,1,src,src->I.locktime,src->spendscript,src->I.spendlen,alicecoin->chain->txfee,1,0); + if ( (retval= _basilisk_rawtx_sign(myinfo,alicecoin->longestchain,swapstarted,src->I.locktime,sequenceid,dest,src,privAm,&privBn,0,0,1)) == 0 ) + { + + } + return(retval); +} + int32_t basilisk_verify_alicepaid(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) { struct basilisk_swap *swap = ptr; @@ -630,148 +877,6 @@ int32_t basilisk_verify_pubpair(int32_t *wrongfirstbytep,struct basilisk_swap *s return(0); } -cJSON *basilisk_privkeyarray(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *vins) -{ - cJSON *privkeyarray,*item,*sobj; struct iguana_waddress *waddr; struct iguana_waccount *wacct; char coinaddr[64],account[128],wifstr[64],str[65],*hexstr; uint8_t script[1024]; int32_t i,n,len,vout; bits256 txid,privkey; - privkeyarray = cJSON_CreateArray(); - //printf("%s persistent.(%s) (%s) change.(%s) scriptstr.(%s)\n",coin->symbol,myinfo->myaddr.BTC,coinaddr,coin->changeaddr,scriptstr); - if ( (n= cJSON_GetArraySize(vins)) > 0 ) - { - for (i=0; i= 0 ) - { - iguana_txidcategory(myinfo,coin,account,coinaddr,txid,vout); - if ( coinaddr[0] == 0 && (sobj= jobj(item,"scriptPubKey")) != 0 && (hexstr= jstr(sobj,"hex")) != 0 && is_hexstr(hexstr,0) > 0 ) - { - len = (int32_t)strlen(hexstr) >> 1; - if ( len < (sizeof(script) << 1) ) - { - decode_hex(script,len,hexstr); - if ( len == 25 && script[0] == 0x76 && script[1] == 0xa9 && script[2] == 0x14 ) - bitcoin_address(coinaddr,coin->chain->pubtype,script+3,20); - } - } - if ( coinaddr[0] != 0 ) - { - if ( (waddr= iguana_waddresssearch(myinfo,&wacct,coinaddr)) != 0 ) - { - bitcoin_priv2wif(wifstr,waddr->privkey,coin->chain->wiftype); - jaddistr(privkeyarray,waddr->wifstr); - } - else if ( smartaddress(myinfo,&privkey,coinaddr) >= 0 ) - { - bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); - jaddistr(privkeyarray,wifstr); - } - else printf("cant find (%s) in wallet\n",coinaddr); - } else printf("cant coinaddr from (%s).v%d\n",bits256_str(str,txid),vout); - } else printf("invalid txid/vout %d of %d\n",i,n); - } - } - return(privkeyarray); -} - -int32_t basilisk_rawtx_return(struct supernet_info *myinfo,int32_t height,struct basilisk_rawtx *rawtx,cJSON *item,int32_t lockinputs,struct vin_info *V) -{ - char *signedtx,*txbytes; cJSON *vins,*privkeyarray; int32_t i,n,retval = -1; - if ( (txbytes= jstr(item,"rawtx")) != 0 && (vins= jobj(item,"vins")) != 0 ) - { - privkeyarray = basilisk_privkeyarray(myinfo,rawtx->coin,vins); - if ( (signedtx= iguana_signrawtx(myinfo,rawtx->coin,height,&rawtx->I.signedtxid,&rawtx->I.completed,vins,txbytes,privkeyarray,V)) != 0 ) - { - if ( lockinputs != 0 ) - { - //printf("lockinputs\n"); - iguana_RTunspentslock(myinfo,rawtx->coin,vins); - if ( (n= cJSON_GetArraySize(vins)) != 0 ) - { - bits256 txid; int32_t vout; - for (i=0; iI.datalen = (int32_t)strlen(signedtx) >> 1; - rawtx->txbytes = calloc(1,rawtx->I.datalen); - decode_hex(rawtx->txbytes,rawtx->I.datalen,signedtx); - printf("%s SIGNEDTX.(%s)\n",rawtx->name,signedtx); - free(signedtx); - retval = 0; - } else printf("error signrawtx\n"); //do a very short timeout so it finishes via local poll - free_json(privkeyarray); - } - return(retval); -} - -int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t iambob,int32_t lockinputs,struct basilisk_rawtx *rawtx,uint32_t locktime,uint8_t *script,int32_t scriptlen,int64_t txfee,int32_t minconf,int32_t delay) -{ - char *retstr,scriptstr[1024],coinaddr[64]; uint32_t basilisktag; int32_t flag,i,n,retval = -1; cJSON *addresses,*valsobj,*retarray=0; struct vin_info *V; - //bitcoin_address(coinaddr,rawtx->coin->chain->pubtype,myinfo->persistent_pubkey33,33); - if ( rawtx->coin->changeaddr[0] == 0 ) - { - bitcoin_address(rawtx->coin->changeaddr,rawtx->coin->chain->pubtype,swap->persistent_pubkey33,33); - printf("set change address.(%s)\n",rawtx->coin->changeaddr); - } - //if ( strcmp(rawtx->coin->symbol,"BTC") == 0 ) - // txfee = 0; - init_hexbytes_noT(scriptstr,script,scriptlen); - basilisktag = (uint32_t)rand(); - valsobj = cJSON_CreateObject(); - jaddstr(valsobj,"coin",rawtx->coin->symbol); - jaddstr(valsobj,"spendscript",scriptstr); - jaddstr(valsobj,"changeaddr",rawtx->coin->changeaddr); - jadd64bits(valsobj,"satoshis",rawtx->I.amount); - jadd64bits(valsobj,"txfee",txfee); - jaddnum(valsobj,"minconf",minconf); - jaddnum(valsobj,"locktime",locktime); - jaddnum(valsobj,"timeout",30000); - jaddnum(valsobj,"timestamp",swap->I.started+delay); - addresses = cJSON_CreateArray(); - bitcoin_address(coinaddr,rawtx->coin->chain->pubtype,swap->persistent_pubkey33,33); - jaddistr(addresses,coinaddr); - jadd(valsobj,"addresses",addresses); - rawtx->I.locktime = locktime; - //printf("%s locktime.%u\n",rawtx->name,locktime); - V = calloc(256,sizeof(*V)); - if ( (retstr= basilisk_bitcoinrawtx(myinfo,rawtx->coin,"",basilisktag,jint(valsobj,"timeout"),valsobj,V)) != 0 ) - { - //printf("%s %s basilisk_bitcoinrawtx.(%s)\n",rawtx->name,str,retstr); - flag = 0; - if ( (retarray= cJSON_Parse(retstr)) != 0 ) - { - if ( is_cJSON_Array(retarray) != 0 ) - { - n = cJSON_GetArraySize(retarray); - for (i=0; icoin->longestchain,rawtx,jitem(retarray,i),lockinputs,V)) == 0 ) - { - rawtx->vins = jobj(jitem(retarray,i),"vins"); - break; - } - } - } - else - { - retval = basilisk_rawtx_return(myinfo,rawtx->coin->longestchain,rawtx,retarray,lockinputs,V); - rawtx->vins = jobj(retarray,"vins"); - } - free(retarray); - } else printf("error parsing.(%s)\n",retstr); - free(retstr); - } else printf("error creating %s feetx\n",iambob != 0 ? "BOB" : "ALICE"); - free_json(valsobj); - free(V); - return(retval); -} - int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t depositflag,int32_t genflag) { int32_t i,j; //char str[65]; @@ -789,7 +894,7 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa { //if ( swap->bobpayment.txbytes != 0 && swap->bobpayment.I.spendlen != 0 ) // break; - basilisk_rawtx_gen("payment",myinfo,swap,1,1,&swap->bobpayment,swap->bobpayment.I.locktime,swap->bobpayment.spendscript,swap->bobpayment.I.spendlen,swap->bobpayment.coin->chain->txfee,1,0); + basilisk_rawtx_gen("payment",myinfo,swap->I.started,swap->persistent_pubkey33,1,1,&swap->bobpayment,swap->bobpayment.I.locktime,swap->bobpayment.spendscript,swap->bobpayment.I.spendlen,swap->bobpayment.coin->chain->txfee,1,0); if ( swap->bobpayment.txbytes == 0 || swap->bobpayment.I.spendlen == 0 ) { printf("error bob generating %p payment.%d\n",swap->bobpayment.txbytes,swap->bobpayment.I.spendlen); @@ -822,7 +927,7 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa { //if ( swap->bobdeposit.txbytes != 0 && swap->bobdeposit.I.spendlen != 0 ) // break; - basilisk_rawtx_gen("deposit",myinfo,swap,1,1,&swap->bobdeposit,swap->bobdeposit.I.locktime,swap->bobdeposit.spendscript,swap->bobdeposit.I.spendlen,swap->bobdeposit.coin->chain->txfee,1,0); + basilisk_rawtx_gen("deposit",myinfo,swap->I.started,swap->persistent_pubkey33,1,1,&swap->bobdeposit,swap->bobdeposit.I.locktime,swap->bobdeposit.spendscript,swap->bobdeposit.I.spendlen,swap->bobdeposit.coin->chain->txfee,1,0); if ( swap->bobdeposit.txbytes == 0 || swap->bobdeposit.I.spendlen == 0 ) { printf("error bob generating %p deposit.%d\n",swap->bobdeposit.txbytes,swap->bobdeposit.I.spendlen); @@ -912,6 +1017,16 @@ void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swa mp->datalen = datalen; } +FILE *basilisk_swap_save(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *rp,uint32_t statebits,int32_t optionduration,int32_t reinit) +{ + FILE *fp; char fname[512]; + sprintf(fname,"%s/SWAPS/%u-%u",GLOBAL_DBDIR,rp->requestid,rp->quoteid), OS_compatible_path(fname); + if ( (fp= fopen(fname,"rb+")) == 0 ) + fp = fopen(fname,"wb+"); + else fseek(fp,0,SEEK_END); + return(fp); +} + int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,int32_t (*basilisk_verify_func)(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen)) { uint8_t *ptr; bits256 srchash,desthash; uint32_t crc32,_msgbits,quoteid; int32_t i,size,offset,retval = -1; struct basilisk_swapmessage *mp = 0; @@ -1090,7 +1205,7 @@ int32_t instantdex_pubkeyargs(void *ctx,struct basilisk_swap *swap,int32_t numpu return(n); } -void basilisk_rawtx_setparms(char *name,struct basilisk_swap *swap,struct basilisk_rawtx *rawtx,struct iguana_info *coin,int32_t numconfirms,int32_t vintype,uint64_t satoshis,int32_t vouttype,uint8_t *pubkey33) +void basilisk_rawtx_setparms(char *name,uint32_t quoteid,struct basilisk_rawtx *rawtx,struct iguana_info *coin,int32_t numconfirms,int32_t vintype,uint64_t satoshis,int32_t vouttype,uint8_t *pubkey33,int32_t jumblrflag) { strcpy(rawtx->name,name); rawtx->coin = coin; @@ -1101,9 +1216,12 @@ void basilisk_rawtx_setparms(char *name,struct basilisk_swap *swap,struct basili rawtx->I.vouttype = vouttype; // 0 -> fee, 1 -> std, 2 -> 2of2, 3 -> bobpayment, 4 -> bobdeposit if ( rawtx->I.vouttype == 0 ) { - if ( strcmp(coin->symbol,"BTC") == 0 && (swap->I.req.quoteid % 10) == 0 ) - decode_hex(rawtx->I.rmd160,20,TIERNOLAN_RMD160); - else decode_hex(rawtx->I.rmd160,20,INSTANTDEX_RMD160); + if ( jumblrflag == 0 ) + { + if ( strcmp(coin->symbol,"BTC") == 0 && (quoteid % 10) == 0 ) + decode_hex(rawtx->I.rmd160,20,TIERNOLAN_RMD160); + else decode_hex(rawtx->I.rmd160,20,INSTANTDEX_RMD160); + } else decode_hex(rawtx->I.rmd160,20,JUMBLR_RMD160); bitcoin_address(rawtx->I.destaddr,rawtx->coin->chain->pubtype,rawtx->I.rmd160,20); } if ( pubkey33 != 0 ) @@ -1146,9 +1264,9 @@ int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct igu return(0); } -struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey33,bits256 pubkey25519,struct basilisk_swap *swap,int32_t optionduration,uint32_t statebits) +struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 privkey,uint8_t *pubkey33,bits256 pubkey25519,struct basilisk_swap *swap,int32_t optionduration,uint32_t statebits) { - uint8_t *alicepub33=0,*bobpub33=0; int32_t x = -1; + uint8_t *alicepub33=0,*bobpub33=0; int32_t jumblrflag,x = -1; swap->I.putduration = swap->I.callduration = INSTANTDEX_LOCKTIME; if ( optionduration < 0 ) swap->I.putduration -= optionduration; @@ -1194,41 +1312,42 @@ struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey swap->I.iambob = 1; swap->I.otherhash = swap->I.req.srchash; } - if ( bits256_nonz(privkey) == 0 || (x= instantdex_pubkeyargs(ctx,swap,2 + INSTANTDEX_DECKSIZE,privkey,swap->I.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) + if ( bits256_nonz(privkey) == 0 || (x= instantdex_pubkeyargs(myinfo->ctx,swap,2 + INSTANTDEX_DECKSIZE,privkey,swap->I.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) { char str[65]; printf("couldnt generate privkeys %d %s\n",x,bits256_str(str,privkey)); return(0); } + jumblrflag = bits256_cmp(privkey,myinfo->persistent_priv) != 0; if ( swap->I.iambob != 0 ) { - basilisk_rawtx_setparms("myfee",swap,&swap->myfee,swap->bobcoin,0,0,swap->I.bobsatoshis/INSTANTDEX_DECKSIZE,0,0); - basilisk_rawtx_setparms("otherfee",swap,&swap->otherfee,swap->alicecoin,0,0,swap->I.alicesatoshis/INSTANTDEX_DECKSIZE,0,0); + basilisk_rawtx_setparms("myfee",swap->I.req.quoteid,&swap->myfee,swap->bobcoin,0,0,swap->I.bobsatoshis/INSTANTDEX_DECKSIZE,0,0,jumblrflag); + basilisk_rawtx_setparms("otherfee",swap->I.req.quoteid,&swap->otherfee,swap->alicecoin,0,0,swap->I.alicesatoshis/INSTANTDEX_DECKSIZE,0,0,jumblrflag); bobpub33 = pubkey33; } else { - basilisk_rawtx_setparms("otherfee",swap,&swap->otherfee,swap->bobcoin,0,0,swap->I.bobsatoshis/INSTANTDEX_DECKSIZE,0,0); - basilisk_rawtx_setparms("myfee",swap,&swap->myfee,swap->alicecoin,0,0,swap->I.alicesatoshis/INSTANTDEX_DECKSIZE,0,0); + basilisk_rawtx_setparms("otherfee",swap->I.req.quoteid,&swap->otherfee,swap->bobcoin,0,0,swap->I.bobsatoshis/INSTANTDEX_DECKSIZE,0,0,jumblrflag); + basilisk_rawtx_setparms("myfee",swap->I.req.quoteid,&swap->myfee,swap->alicecoin,0,0,swap->I.alicesatoshis/INSTANTDEX_DECKSIZE,0,0,jumblrflag); alicepub33 = pubkey33; } - basilisk_rawtx_setparms("bobdeposit",swap,&swap->bobdeposit,swap->bobcoin,swap->I.bobconfirms,0,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3) + swap->bobcoin->txfee,4,0); - basilisk_rawtx_setparms("bobrefund",swap,&swap->bobrefund,swap->bobcoin,1,4,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3),1,bobpub33); + basilisk_rawtx_setparms("bobdeposit",swap->I.req.quoteid,&swap->bobdeposit,swap->bobcoin,swap->I.bobconfirms,0,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3) + swap->bobcoin->txfee,4,0,jumblrflag); + basilisk_rawtx_setparms("bobrefund",swap->I.req.quoteid,&swap->bobrefund,swap->bobcoin,1,4,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3),1,bobpub33,jumblrflag); swap->bobrefund.I.suppress_pubkeys = 1; - basilisk_rawtx_setparms("aliceclaim",swap,&swap->aliceclaim,swap->bobcoin,1,4,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3),1,alicepub33); + basilisk_rawtx_setparms("aliceclaim",swap->I.req.quoteid,&swap->aliceclaim,swap->bobcoin,1,4,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3),1,alicepub33,jumblrflag); swap->aliceclaim.I.suppress_pubkeys = 1; swap->aliceclaim.I.locktime = swap->I.started + swap->I.putduration+swap->I.callduration + 1; - basilisk_rawtx_setparms("bobpayment",swap,&swap->bobpayment,swap->bobcoin,swap->I.bobconfirms,0,swap->I.bobsatoshis + swap->bobcoin->txfee,3,0); - basilisk_rawtx_setparms("alicespend",swap,&swap->alicespend,swap->bobcoin,swap->I.bobconfirms,3,swap->I.bobsatoshis,1,alicepub33); + basilisk_rawtx_setparms("bobpayment",swap->I.req.quoteid,&swap->bobpayment,swap->bobcoin,swap->I.bobconfirms,0,swap->I.bobsatoshis + swap->bobcoin->txfee,3,0,jumblrflag); + basilisk_rawtx_setparms("alicespend",swap->I.req.quoteid,&swap->alicespend,swap->bobcoin,swap->I.bobconfirms,3,swap->I.bobsatoshis,1,alicepub33,jumblrflag); swap->alicespend.I.suppress_pubkeys = 1; - basilisk_rawtx_setparms("bobreclaim",swap,&swap->bobreclaim,swap->bobcoin,swap->I.bobconfirms,3,swap->I.bobsatoshis,1,bobpub33); + basilisk_rawtx_setparms("bobreclaim",swap->I.req.quoteid,&swap->bobreclaim,swap->bobcoin,swap->I.bobconfirms,3,swap->I.bobsatoshis,1,bobpub33,jumblrflag); swap->bobreclaim.I.suppress_pubkeys = 1; swap->bobreclaim.I.locktime = swap->I.started + swap->I.putduration + 1; - basilisk_rawtx_setparms("alicepayment",swap,&swap->alicepayment,swap->alicecoin,swap->I.aliceconfirms,0,swap->I.alicesatoshis+swap->alicecoin->txfee,2,0); - basilisk_rawtx_setparms("bobspend",swap,&swap->bobspend,swap->alicecoin,swap->I.aliceconfirms,2,swap->I.alicesatoshis,1,bobpub33); + basilisk_rawtx_setparms("alicepayment",swap->I.req.quoteid,&swap->alicepayment,swap->alicecoin,swap->I.aliceconfirms,0,swap->I.alicesatoshis+swap->alicecoin->txfee,2,0,jumblrflag); + basilisk_rawtx_setparms("bobspend",swap->I.req.quoteid,&swap->bobspend,swap->alicecoin,swap->I.aliceconfirms,2,swap->I.alicesatoshis,1,bobpub33,jumblrflag); swap->bobspend.I.suppress_pubkeys = 1; - basilisk_rawtx_setparms("alicereclaim",swap,&swap->alicereclaim,swap->alicecoin,swap->I.aliceconfirms,2,swap->I.alicesatoshis,1,alicepub33); + basilisk_rawtx_setparms("alicereclaim",swap->I.req.quoteid,&swap->alicereclaim,swap->alicecoin,swap->I.aliceconfirms,2,swap->I.alicesatoshis,1,alicepub33,jumblrflag); swap->alicereclaim.I.suppress_pubkeys = 1; printf("IAMBOB.%d\n",swap->I.iambob); return(swap); @@ -1536,12 +1655,6 @@ void basilisk_sendmostprivs(struct supernet_info *myinfo,struct basilisk_swap *s swap->I.statebits |= basilisk_swapsend(myinfo,swap,0x20,data,datalen,0x10,swap->I.crcs_myprivs); } -void basilisk_alicepayment(struct supernet_info *myinfo,struct basilisk_swap *swap,struct iguana_info *coin,struct basilisk_rawtx *alicepayment,bits256 pubAm,bits256 pubBn) -{ - alicepayment->I.spendlen = basilisk_alicescript(alicepayment->redeemscript,&alicepayment->I.redeemlen,alicepayment->spendscript,0,alicepayment->I.destaddr,coin->chain->p2shtype,pubAm,pubBn); - basilisk_rawtx_gen("alicepayment",myinfo,swap,0,1,alicepayment,alicepayment->I.locktime,alicepayment->spendscript,alicepayment->I.spendlen,coin->chain->txfee,1,0); -} - int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { int32_t j,datalen,retval = 0; @@ -1961,7 +2074,7 @@ void basilisk_swaploop(void *_swap) } } printf("generate fee\n"); - if ( basilisk_rawtx_gen("myfee",myinfo,swap,swap->I.iambob,1,&swap->myfee,0,swap->myfee.spendscript,swap->myfee.I.spendlen,swap->myfee.coin->chain->txfee,1,0) == 0 ) + if ( basilisk_rawtx_gen("myfee",myinfo,swap->I.started,swap->persistent_pubkey33,swap->I.iambob,1,&swap->myfee,0,swap->myfee.spendscript,swap->myfee.I.spendlen,swap->myfee.coin->chain->txfee,1,0) == 0 ) { printf("done generate fee\n"); swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40); @@ -2019,7 +2132,7 @@ void basilisk_swaploop(void *_swap) free(data); } -struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *rp,uint32_t statebits,int32_t optionduration) +struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *rp,uint32_t statebits,int32_t optionduration,int32_t reinit) { int32_t i,m,n; char *retstr; uint8_t pubkey33[33]; bits256 pubkey25519; uint32_t channel,starttime; cJSON *retarray,*item,*msgobj,*retjson; struct basilisk_swap *swap = 0; // statebits 1 -> client, 0 -> LP @@ -2044,7 +2157,7 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 swap->persistent_privkey = privkey; memcpy(swap->persistent_pubkey33,pubkey33,33); m = n = 0; - if ( bitcoin_swapinit(myinfo->ctx,privkey,pubkey33,pubkey25519,swap,optionduration,statebits) != 0 ) + if ( bitcoin_swapinit(myinfo,privkey,pubkey33,pubkey25519,swap,optionduration,statebits) != 0 ) { if ( statebits == 0 ) { @@ -2094,6 +2207,7 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 //for (i=0; iI.req); i++) // fprintf(stderr,"%02x",((uint8_t *)&swap->I.req)[i]); fprintf(stderr," M.%d N.%d launch.%d %d %p\n",m,n,myinfo->numswaps,(int32_t)(sizeof(myinfo->swaps)/sizeof(*myinfo->swaps)),&swap->I.req); + swap->fp = basilisk_swap_save(myinfo,privkey,rp,statebits,optionduration,reinit); if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)basilisk_swaploop,(void *)swap) != 0 ) { diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 5da5222c5..a4a39c242 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -162,7 +162,7 @@ struct supernet_info double *svmfeatures; uint16_t psockport,numpsocks; struct psock *PSOCKS; portable_mutex_t psockmutex; uint8_t notaries[64][33]; int32_t numnotaries,DEXEXPLORER; - struct smartaddress smartaddrs[64]; int32_t numsmartaddrs; + struct smartaddress smartaddrs[64]; int32_t numsmartaddrs,cancelrefresh; }; struct basilisk_swapmessage @@ -177,6 +177,7 @@ struct basilisk_swap struct supernet_info *myinfoptr; struct iguana_info *bobcoin,*alicecoin; void (*balancingtrade)(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t iambob); int32_t subsock,pushsock,connected; + FILE *fp; bits256 persistent_privkey,persistent_pubkey; struct basilisk_swapinfo I; struct basilisk_rawtx bobdeposit,bobpayment,alicepayment,myfee,otherfee,aliceclaim,alicespend,bobreclaim,bobspend,bobrefund,alicereclaim; diff --git a/iguana/main.c b/iguana/main.c index b8d7e20a6..ac883a401 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -683,6 +683,7 @@ void iguana_ensuredirs() sprintf(dirname,"%s",GLOBAL_GENESISDIR), OS_ensure_directory(dirname); sprintf(dirname,"%s",GLOBAL_CONFSDIR), OS_ensure_directory(dirname); sprintf(dirname,"%s",GLOBAL_DBDIR), OS_ensure_directory(dirname); + sprintf(dirname,"%s/SWAPS",GLOBAL_DBDIR), OS_ensure_directory(dirname); sprintf(dirname,"%s/TRANSACTIONS",GLOBAL_DBDIR), OS_ensure_directory(dirname); sprintf(dirname,"%s/purgeable",GLOBAL_DBDIR), OS_ensure_directory(dirname); sprintf(dirname,"%s",GLOBAL_TMPDIR), OS_ensure_directory(dirname); diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 632026ffb..cfb110ae6 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -59,6 +59,7 @@ HASH_ARRAY_STRING(basilisk,balances,hash,vals,hexstr); HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr); HASH_ARRAY_STRING(basilisk,rawtx,hash,vals,hexstr); TWO_STRINGS(basilisk,refresh,symbol,address); +ZERO_ARGS(basilisk,cancelrefresh); STRING_ARRAY_OBJ_STRING(basilisk,utxorawtx,symbol,utxos,vals,ignore); HASH_ARRAY_STRING(basilisk,getmessage,hash,vals,hexstr); From 3963db3ff2b10b9a5437a952a631c65d99ec98e2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Mar 2017 15:46:07 +0200 Subject: [PATCH 398/495] Test --- basilisk/basilisk_swap.c | 95 +++++++++++++++++++++++++++++++++++++--- iguana/iguana777.h | 1 + iguana/iguana_notary.c | 1 - 3 files changed, 89 insertions(+), 8 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 14a27263b..684723e8b 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -998,7 +998,7 @@ int32_t basilisk_process_swapverify(struct supernet_info *myinfo,void *ptr,int32 else return(0); } -void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t crc32,bits256 srchash,bits256 desthash,uint32_t quoteid,uint32_t msgbits,uint8_t *data,int32_t datalen) +void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t crc32,bits256 srchash,bits256 desthash,uint32_t quoteid,uint32_t msgbits,uint8_t *data,int32_t datalen,int32_t reinit) { int32_t i; struct basilisk_swapmessage *mp; for (i=0; inummessages; i++) @@ -1013,20 +1013,82 @@ void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swa mp->msgbits = msgbits; mp->quoteid = quoteid; mp->data = malloc(datalen); - memcpy(mp->data,data,datalen); mp->datalen = datalen; + memcpy(mp->data,data,datalen); + if ( reinit == 0 && swap->fp != 0 ) + { + fwrite(mp,1,sizeof(*mp),swap->fp); + fwrite(data,1,datalen,swap->fp); + fflush(swap->fp); + } } -FILE *basilisk_swap_save(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *rp,uint32_t statebits,int32_t optionduration,int32_t reinit) +FILE *basilisk_swap_save(struct supernet_info *myinfo,struct basilisk_swap *swap,bits256 privkey,struct basilisk_request *rp,uint32_t statebits,int32_t optionduration,int32_t reinit) { FILE *fp; char fname[512]; sprintf(fname,"%s/SWAPS/%u-%u",GLOBAL_DBDIR,rp->requestid,rp->quoteid), OS_compatible_path(fname); if ( (fp= fopen(fname,"rb+")) == 0 ) - fp = fopen(fname,"wb+"); - else fseek(fp,0,SEEK_END); + { + if ( (fp= fopen(fname,"wb+")) != 0 ) + { + fwrite(privkey.bytes,1,sizeof(privkey),fp); + fwrite(rp,1,sizeof(*rp),fp); + fwrite(&statebits,1,sizeof(statebits),fp); + fwrite(&optionduration,1,sizeof(optionduration),fp); + fflush(fp); + } + } + else if ( reinit != 0 ) + { + } return(fp); } +struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *rp,uint32_t statebits,int32_t optionduration,int32_t reinit); + +void basilisk_swaps_init(struct supernet_info *myinfo) +{ + char fname[512]; uint32_t iter,swapcompleted,requestid,quoteid,optionduration,statebits; FILE *fp; bits256 privkey;struct basilisk_request R; struct basilisk_swapmessage M; struct basilisk_swap *swap = 0; + sprintf(fname,"%s/SWAPS/list",GLOBAL_DBDIR), OS_compatible_path(fname); + if ( (myinfo->swapsfp= fopen(fname,"rb+")) != 0 ) + { + while ( fread(&requestid,1,sizeof(requestid),myinfo->swapsfp) == sizeof(requestid) && fread("eid,1,sizeof(quoteid),myinfo->swapsfp) == sizeof(quoteid) ) + { + sprintf(fname,"%s/SWAPS/%u-%u",GLOBAL_DBDIR,requestid,quoteid), OS_compatible_path(fname); + if ( (fp= fopen(fname,"rb+")) != 0 ) // check to see if completed + { + memset(&M,0,sizeof(M)); + swapcompleted = 0; + for (iter=0; iter<2; iter++) + { + while ( fread(privkey.bytes,1,sizeof(privkey),fp) == sizeof(privkey) && + fread(&R,1,sizeof(R),fp) == sizeof(R) && + fread(&statebits,1,sizeof(statebits),fp) == sizeof(statebits) && + fread(&optionduration,1,sizeof(optionduration),fp) == sizeof(optionduration) && + fread(&M,1,sizeof(M),fp) == sizeof(M) ) + { + if ( M.datalen < 100000 ) + { + if ( M.data == 0 ) + M.data = malloc(M.datalen); + fread(M.data,1,M.datalen,fp); + if ( calc_crc32(0,M.data,M.datalen) == M.crc32 ) + { + if ( iter == 1 && (swap= basilisk_thread_start(myinfo,privkey,&R,statebits,optionduration,1)) != 0 ) + basilisk_swapgotdata(myinfo,swap,M.crc32,M.srchash,M.desthash,M.quoteid,M.msgbits,M.data,M.datalen,1); + } + free(M.data), M.data = 0; + } + } + if ( swapcompleted != 0 ) + break; + rewind(fp); + } + } + } + } +} + int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,int32_t (*basilisk_verify_func)(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen)) { uint8_t *ptr; bits256 srchash,desthash; uint32_t crc32,_msgbits,quoteid; int32_t i,size,offset,retval = -1; struct basilisk_swapmessage *mp = 0; @@ -1046,7 +1108,7 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap if ( size > offset ) { //printf("size.%d offset.%d datalen.%d\n",size,offset,size-offset); - basilisk_swapgotdata(myinfo,swap,crc32,srchash,desthash,quoteid,_msgbits,&ptr[offset],size-offset); + basilisk_swapgotdata(myinfo,swap,crc32,srchash,desthash,quoteid,_msgbits,&ptr[offset],size-offset,0); } if ( ptr != 0 ) nn_freemsg(ptr), ptr = 0; @@ -2207,7 +2269,26 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 //for (i=0; iI.req); i++) // fprintf(stderr,"%02x",((uint8_t *)&swap->I.req)[i]); fprintf(stderr," M.%d N.%d launch.%d %d %p\n",m,n,myinfo->numswaps,(int32_t)(sizeof(myinfo->swaps)/sizeof(*myinfo->swaps)),&swap->I.req); - swap->fp = basilisk_swap_save(myinfo,privkey,rp,statebits,optionduration,reinit); + if ( (swap->fp= basilisk_swap_save(myinfo,swap,privkey,rp,statebits,optionduration,reinit)) != 0 ) + { + if ( reinit == 0 ) + { + if ( myinfo->swapsfp == 0 ) + { + char fname[512]; + sprintf(fname,"%s/SWAPS/list",GLOBAL_DBDIR), OS_compatible_path(fname); + if ( (myinfo->swapsfp= fopen(fname,"rb+")) == 0 ) + myinfo->swapsfp = fopen(fname,"wb+"); + else fseek(myinfo->swapsfp,0,SEEK_END); + } + if ( myinfo->swapsfp != 0 ) + { + fwrite(&rp->requestid,1,sizeof(rp->requestid),myinfo->swapsfp); + fwrite(&rp->quoteid,1,sizeof(rp->quoteid),myinfo->swapsfp); + fflush(myinfo->swapsfp); + } + } + } if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)basilisk_swaploop,(void *)swap) != 0 ) { diff --git a/iguana/iguana777.h b/iguana/iguana777.h index a4a39c242..f09c5a9dc 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -162,6 +162,7 @@ struct supernet_info double *svmfeatures; uint16_t psockport,numpsocks; struct psock *PSOCKS; portable_mutex_t psockmutex; uint8_t notaries[64][33]; int32_t numnotaries,DEXEXPLORER; + FILE *swapsfp; struct smartaddress smartaddrs[64]; int32_t numsmartaddrs,cancelrefresh; }; diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index e8b80daa2..d4378efd6 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -373,7 +373,6 @@ THREE_STRINGS(iguana,passthru,asset,function,hex) else return(clonestr("{\"error\":\"assetchain not active, start in bitcoind mode\"}")); } - TWO_STRINGS(dex,send,hex,handler) { uint8_t data[8192]; int32_t datalen; char *retstr; From ec963ab8dd6db60b5d2086a86bf2db22b94a8fff Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Mar 2017 17:50:53 +0200 Subject: [PATCH 399/495] Test --- .gitignore | 6 + basilisk/basilisk_DEX.c | 7 + basilisk/basilisk_swap.c | 263 ++++++++++++++++++++-------------- iguana/iguana777.h | 7 +- iguana/tests/DEXinit | 2 + includes/iguana_apideclares.h | 1 + 6 files changed, 173 insertions(+), 113 deletions(-) create mode 100755 iguana/tests/DEXinit diff --git a/.gitignore b/.gitignore index ee4a9db1d..10edeb358 100755 --- a/.gitignore +++ b/.gitignore @@ -168,3 +168,9 @@ iguana/unparsed.txt iguana/unparsed.txt iguana/unparsed.txt + +iguana/DB/SWAPS/.tmpmarker + +iguana/DB/SWAPS/list + +iguana/DB/SWAPS/15974209-4014252807 diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index f67a8684d..3e3aaf8ea 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -748,4 +748,11 @@ TWO_INTS(InstantDEX,accept,requestid,quoteid) return(retstr); } } + +ZERO_ARGS(InstantDEX,init) +{ + basilisk_swaps_init(myinfo); + return(clonestr("{\"result\":\"success\"}")); +} + #include "../includes/iguana_apiundefs.h" diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 684723e8b..7f0cd0062 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1055,29 +1055,41 @@ void basilisk_swaps_init(struct supernet_info *myinfo) while ( fread(&requestid,1,sizeof(requestid),myinfo->swapsfp) == sizeof(requestid) && fread("eid,1,sizeof(quoteid),myinfo->swapsfp) == sizeof(quoteid) ) { sprintf(fname,"%s/SWAPS/%u-%u",GLOBAL_DBDIR,requestid,quoteid), OS_compatible_path(fname); + printf("%s\n",fname); if ( (fp= fopen(fname,"rb+")) != 0 ) // check to see if completed { memset(&M,0,sizeof(M)); swapcompleted = 0; for (iter=0; iter<2; iter++) { - while ( fread(privkey.bytes,1,sizeof(privkey),fp) == sizeof(privkey) && + if ( fread(privkey.bytes,1,sizeof(privkey),fp) == sizeof(privkey) && fread(&R,1,sizeof(R),fp) == sizeof(R) && fread(&statebits,1,sizeof(statebits),fp) == sizeof(statebits) && - fread(&optionduration,1,sizeof(optionduration),fp) == sizeof(optionduration) && - fread(&M,1,sizeof(M),fp) == sizeof(M) ) + fread(&optionduration,1,sizeof(optionduration),fp) == sizeof(optionduration) ) { - if ( M.datalen < 100000 ) + while ( fread(&M,1,sizeof(M),fp) == sizeof(M) ) { - if ( M.data == 0 ) - M.data = malloc(M.datalen); - fread(M.data,1,M.datalen,fp); - if ( calc_crc32(0,M.data,M.datalen) == M.crc32 ) + M.data = 0; + printf("entry iter.%d crc32.%x datalen.%d\n",iter,M.crc32,M.datalen); + if ( M.datalen < 100000 ) { - if ( iter == 1 && (swap= basilisk_thread_start(myinfo,privkey,&R,statebits,optionduration,1)) != 0 ) - basilisk_swapgotdata(myinfo,swap,M.crc32,M.srchash,M.desthash,M.quoteid,M.msgbits,M.data,M.datalen,1); + M.data = malloc(M.datalen); + fread(M.data,1,M.datalen,fp); + if ( calc_crc32(0,M.data,M.datalen) == M.crc32 ) + { + if ( iter == 1 ) + { + if ( swap == 0 ) + { + swap = basilisk_thread_start(myinfo,privkey,&R,statebits,optionduration,1); + swap->I.choosei = swap->I.otherchoosei = -1; + } + if ( swap != 0 ) + basilisk_swapgotdata(myinfo,swap,M.crc32,M.srchash,M.desthash,M.quoteid,M.msgbits,M.data,M.datalen,1); + } + } else printf("crc mismatch %x vs %x\n",calc_crc32(0,M.data,M.datalen),M.crc32); + free(M.data), M.data = 0; } - free(M.data), M.data = 0; } } if ( swapcompleted != 0 ) @@ -1096,7 +1108,6 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap { memset(srchash.bytes,0,sizeof(srchash)); memset(desthash.bytes,0,sizeof(desthash)); - crc32 = calc_crc32(0,ptr,size); //printf("gotmsg.[%d] crc.%x\n",size,crc32); offset = 0; for (i=0; i<32; i++) @@ -1105,6 +1116,7 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap desthash.bytes[i] = ptr[offset++]; offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),"eid); offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),&_msgbits); + crc32 = calc_crc32(0,&ptr[offset],size-offset); if ( size > offset ) { //printf("size.%d offset.%d datalen.%d\n",size,offset,size-offset); @@ -1326,57 +1338,80 @@ int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct igu return(0); } -struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 privkey,uint8_t *pubkey33,bits256 pubkey25519,struct basilisk_swap *swap,int32_t optionduration,uint32_t statebits) +struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 privkey,uint8_t *pubkey33,bits256 pubkey25519,struct basilisk_swap *swap,int32_t optionduration,uint32_t statebits,int32_t reinit) { - uint8_t *alicepub33=0,*bobpub33=0; int32_t jumblrflag,x = -1; - swap->I.putduration = swap->I.callduration = INSTANTDEX_LOCKTIME; - if ( optionduration < 0 ) - swap->I.putduration -= optionduration; - else if ( optionduration > 0 ) - swap->I.callduration += optionduration; - swap->bobcoin = iguana_coinfind(swap->I.req.dest); - swap->I.bobsatoshis = swap->I.req.destamount; - swap->I.bobconfirms = (1*0 + sqrt(dstr(swap->I.bobsatoshis) * .1)); - swap->alicecoin = iguana_coinfind(swap->I.req.src); - swap->I.alicesatoshis = swap->I.req.srcamount; - swap->I.aliceconfirms = swap->I.bobconfirms * 3; - if ( swap->bobcoin == 0 || swap->alicecoin == 0 ) + FILE *fp; char fname[512]; uint8_t *alicepub33=0,*bobpub33=0; int32_t jumblrflag,x = -1; + sprintf(fname,"%s/SWAPS/%u-%u.swap",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid); + printf("swapfile.(%s)\n",fname); + if ( reinit != 0 ) { - printf("missing bobcoin.%p or missing alicecoin.%p src.%p dest.%p\n",swap->bobcoin,swap->alicecoin,iguana_coinfind(swap->I.req.src),iguana_coinfind(swap->I.req.dest)); - free(swap); - return(0); - } - if ( swap->I.bobconfirms == 0 ) - swap->I.bobconfirms = swap->bobcoin->chain->minconfirms; - if ( swap->I.aliceconfirms == 0 ) - swap->I.aliceconfirms = swap->alicecoin->chain->minconfirms; - if ( (swap->I.bobinsurance= (swap->I.bobsatoshis / INSTANTDEX_INSURANCEDIV)) < 10000 ) - swap->I.bobinsurance = 10000; - if ( (swap->I.aliceinsurance= (swap->I.alicesatoshis / INSTANTDEX_INSURANCEDIV)) < 10000 ) - swap->I.aliceinsurance = 10000; - strcpy(swap->I.bobstr,swap->bobcoin->symbol); - strcpy(swap->I.alicestr,swap->alicecoin->symbol); - swap->I.started = (uint32_t)time(NULL); - swap->I.expiration = swap->I.req.timestamp + swap->I.putduration + swap->I.callduration; - OS_randombytes((uint8_t *)&swap->I.choosei,sizeof(swap->I.choosei)); - if ( swap->I.choosei < 0 ) - swap->I.choosei = -swap->I.choosei; - swap->I.choosei %= INSTANTDEX_DECKSIZE; - swap->I.otherchoosei = -1; - swap->I.myhash = pubkey25519; - if ( statebits != 0 ) - { - swap->I.iambob = 0; - swap->I.otherhash = swap->I.req.desthash; + if ( (fp= fopen(fname,"rb")) != 0 ) + { + fread(&swap->I,1,sizeof(swap->I),fp); + fread(swap->privkeys,1,sizeof(swap->privkeys),fp); + fread(swap->deck,1,sizeof(swap->deck),fp); + fclose(fp); + } } else { - swap->I.iambob = 1; - swap->I.otherhash = swap->I.req.srchash; + swap->I.putduration = swap->I.callduration = INSTANTDEX_LOCKTIME; + if ( optionduration < 0 ) + swap->I.putduration -= optionduration; + else if ( optionduration > 0 ) + swap->I.callduration += optionduration; + swap->I.bobsatoshis = swap->I.req.destamount; + swap->I.bobconfirms = (1*0 + sqrt(dstr(swap->I.bobsatoshis) * .1)); + swap->I.alicesatoshis = swap->I.req.srcamount; + swap->I.aliceconfirms = swap->I.bobconfirms * 3; + if ( swap->I.bobconfirms == 0 ) + swap->I.bobconfirms = swap->bobcoin->chain->minconfirms; + if ( swap->I.aliceconfirms == 0 ) + swap->I.aliceconfirms = swap->alicecoin->chain->minconfirms; + if ( (swap->I.bobinsurance= (swap->I.bobsatoshis / INSTANTDEX_INSURANCEDIV)) < 10000 ) + swap->I.bobinsurance = 10000; + if ( (swap->I.aliceinsurance= (swap->I.alicesatoshis / INSTANTDEX_INSURANCEDIV)) < 10000 ) + swap->I.aliceinsurance = 10000; + strcpy(swap->I.bobstr,swap->bobcoin->symbol); + strcpy(swap->I.alicestr,swap->alicecoin->symbol); + swap->I.started = (uint32_t)time(NULL); + swap->I.expiration = swap->I.req.timestamp + swap->I.putduration + swap->I.callduration; + OS_randombytes((uint8_t *)&swap->I.choosei,sizeof(swap->I.choosei)); + if ( swap->I.choosei < 0 ) + swap->I.choosei = -swap->I.choosei; + swap->I.choosei %= INSTANTDEX_DECKSIZE; + swap->I.otherchoosei = -1; + swap->I.myhash = pubkey25519; + if ( statebits != 0 ) + { + swap->I.iambob = 0; + swap->I.otherhash = swap->I.req.desthash; + } + else + { + swap->I.iambob = 1; + swap->I.otherhash = swap->I.req.srchash; + } + if ( bits256_nonz(privkey) == 0 || (x= instantdex_pubkeyargs(myinfo->ctx,swap,2 + INSTANTDEX_DECKSIZE,privkey,swap->I.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) + { + char str[65]; printf("couldnt generate privkeys %d %s\n",x,bits256_str(str,privkey)); + return(0); + } + if ( (fp= fopen(fname,"wb")) != 0 ) + { + printf("save swapfile\n"); + fwrite(&swap->I,1,sizeof(swap->I),fp); + fwrite(swap->privkeys,1,sizeof(swap->privkeys),fp); + fwrite(swap->deck,1,sizeof(swap->deck),fp); + fclose(fp); + } } - if ( bits256_nonz(privkey) == 0 || (x= instantdex_pubkeyargs(myinfo->ctx,swap,2 + INSTANTDEX_DECKSIZE,privkey,swap->I.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) + swap->bobcoin = iguana_coinfind(swap->I.req.dest); + swap->alicecoin = iguana_coinfind(swap->I.req.src); + if ( swap->bobcoin == 0 || swap->alicecoin == 0 ) { - char str[65]; printf("couldnt generate privkeys %d %s\n",x,bits256_str(str,privkey)); + printf("missing bobcoin.%p or missing alicecoin.%p src.%p dest.%p\n",swap->bobcoin,swap->alicecoin,iguana_coinfind(swap->I.req.src),iguana_coinfind(swap->I.req.dest)); + free(swap); return(0); } jumblrflag = bits256_cmp(privkey,myinfo->persistent_priv) != 0; @@ -2207,21 +2242,21 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 } if ( i == myinfo->numswaps && i < sizeof(myinfo->swaps)/sizeof(*myinfo->swaps) ) { - printf("basilisk_thread_start request.%u statebits.%d\n",rp->requestid,statebits); swap = calloc(1,sizeof(*swap)); swap->subsock = swap->pushsock = -1; vcalc_sha256(0,swap->I.orderhash.bytes,(uint8_t *)rp,sizeof(*rp)); swap->I.req = *rp; swap->myinfoptr = myinfo; + printf("basilisk_thread_start request.%u statebits.%d (%s/%s) reinit.%d\n",rp->requestid,statebits,rp->src,rp->dest,reinit); bitcoin_pubkey33(myinfo->ctx,pubkey33,privkey); pubkey25519 = curve25519(privkey,curve25519_basepoint9()); swap->persistent_pubkey = pubkey25519; swap->persistent_privkey = privkey; memcpy(swap->persistent_pubkey33,pubkey33,33); m = n = 0; - if ( bitcoin_swapinit(myinfo,privkey,pubkey33,pubkey25519,swap,optionduration,statebits) != 0 ) + if ( bitcoin_swapinit(myinfo,privkey,pubkey33,pubkey25519,swap,optionduration,statebits,reinit) != 0 ) { - if ( statebits == 0 ) + if ( statebits == 0 )//&& (swap->subsock < 0 || swap->pushsock < 0) ) { if ( (retstr= _dex_psock(myinfo,"{}")) != 0 ) { @@ -2234,67 +2269,77 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 free(retstr); } } else basilisk_psockinit(myinfo,swap,0,0); - - starttime = (uint32_t)time(NULL); - printf("statebits.%x m.%d n.%d\n",statebits,m,n); - while ( statebits == 0 && m <= n/2 && time(NULL) < starttime+BASILISK_MSGDURATION ) + if ( reinit != 0 ) + { + if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)basilisk_swaploop,(void *)swap) != 0 ) + { + + } + myinfo->swaps[myinfo->numswaps++] = swap; + } + else { - m = n = 0; - //dpow_nanomsg_update(myinfo); - //dex_updateclient(myinfo); - sleep(DEX_SLEEP); - printf("waiting for offer to be accepted\n"); - channel = 'D' + ((uint32_t)'E' << 8) + ((uint32_t)'X' << 16); - if ( (retarray= basilisk_channelget(myinfo,rp->srchash,rp->desthash,channel,0x4000000,30)) != 0 ) + starttime = (uint32_t)time(NULL); + printf("statebits.%x m.%d n.%d\n",statebits,m,n); + while ( statebits == 0 && m <= n/2 && time(NULL) < starttime+BASILISK_MSGDURATION ) { - if ( is_cJSON_Array(retarray) != 0 && (n= cJSON_GetArraySize(retarray)) > 0 ) + m = n = 0; + //dpow_nanomsg_update(myinfo); + //dex_updateclient(myinfo); + sleep(DEX_SLEEP); + printf("waiting for offer to be accepted\n"); + channel = 'D' + ((uint32_t)'E' << 8) + ((uint32_t)'X' << 16); + if ( (retarray= basilisk_channelget(myinfo,rp->srchash,rp->desthash,channel,0x4000000,30)) != 0 ) { - for (i=0; i 0 ) { - item = jitem(retarray,i); - if ( (msgobj= jarray(&n,item,"messages")) != 0 && n > 0 ) + for (i=0; i 0 ) + { + item = jitem(msgobj,0); + if ( jobj(item,"data") != 0 && jobj(item,"key") != 0 ) + m++; + else printf("(%s)\n",jprint(item,0)); + } //else printf("msgobj.%p m.%d n.%d\n",msgobj,m,n); + } } - } - } else printf("no retarray\n"); - } - printf("LAUNCH check.%d m.%d\n",statebits,m); - if ( statebits != 0 || m > 0 )//n/2 ) - { - //for (i=0; iI.req); i++) - // fprintf(stderr,"%02x",((uint8_t *)&swap->I.req)[i]); - fprintf(stderr," M.%d N.%d launch.%d %d %p\n",m,n,myinfo->numswaps,(int32_t)(sizeof(myinfo->swaps)/sizeof(*myinfo->swaps)),&swap->I.req); - if ( (swap->fp= basilisk_swap_save(myinfo,swap,privkey,rp,statebits,optionduration,reinit)) != 0 ) + } else printf("no retarray\n"); + } + printf("LAUNCH check.%d m.%d\n",statebits,m); + if ( statebits != 0 || m > 0 )//n/2 ) { - if ( reinit == 0 ) + //for (i=0; iI.req); i++) + // fprintf(stderr,"%02x",((uint8_t *)&swap->I.req)[i]); + fprintf(stderr," M.%d N.%d launch.%d %d %p\n",m,n,myinfo->numswaps,(int32_t)(sizeof(myinfo->swaps)/sizeof(*myinfo->swaps)),&swap->I.req); + if ( (swap->fp= basilisk_swap_save(myinfo,swap,privkey,rp,statebits,optionduration,reinit)) != 0 ) { - if ( myinfo->swapsfp == 0 ) - { - char fname[512]; - sprintf(fname,"%s/SWAPS/list",GLOBAL_DBDIR), OS_compatible_path(fname); - if ( (myinfo->swapsfp= fopen(fname,"rb+")) == 0 ) - myinfo->swapsfp = fopen(fname,"wb+"); - else fseek(myinfo->swapsfp,0,SEEK_END); - } - if ( myinfo->swapsfp != 0 ) + if ( reinit == 0 ) { - fwrite(&rp->requestid,1,sizeof(rp->requestid),myinfo->swapsfp); - fwrite(&rp->quoteid,1,sizeof(rp->quoteid),myinfo->swapsfp); - fflush(myinfo->swapsfp); + if ( myinfo->swapsfp == 0 ) + { + char fname[512]; + sprintf(fname,"%s/SWAPS/list",GLOBAL_DBDIR), OS_compatible_path(fname); + if ( (myinfo->swapsfp= fopen(fname,"rb+")) == 0 ) + myinfo->swapsfp = fopen(fname,"wb+"); + else fseek(myinfo->swapsfp,0,SEEK_END); + } + if ( myinfo->swapsfp != 0 ) + { + fwrite(&rp->requestid,1,sizeof(rp->requestid),myinfo->swapsfp); + fwrite(&rp->quoteid,1,sizeof(rp->quoteid),myinfo->swapsfp); + fflush(myinfo->swapsfp); + } } } - } - if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)basilisk_swaploop,(void *)swap) != 0 ) - { - - } - myinfo->swaps[myinfo->numswaps++] = swap; - } else printf("%u/%u offer wasnt accepted statebits.%d m.%d n.%d\n",rp->requestid,rp->quoteid,statebits,m,n); + if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)basilisk_swaploop,(void *)swap) != 0 ) + { + + } + myinfo->swaps[myinfo->numswaps++] = swap; + } else printf("%u/%u offer wasnt accepted statebits.%d m.%d n.%d\n",rp->requestid,rp->quoteid,statebits,m,n); + } } } portable_mutex_unlock(&myinfo->DEX_swapmutex); diff --git a/iguana/iguana777.h b/iguana/iguana777.h index f09c5a9dc..ae6629a6f 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -180,13 +180,12 @@ struct basilisk_swap int32_t subsock,pushsock,connected; FILE *fp; bits256 persistent_privkey,persistent_pubkey; - struct basilisk_swapinfo I; + struct basilisk_swapmessage *messages; int32_t nummessages; + uint8_t persistent_pubkey33[33],pad[15],verifybuf[65536]; struct basilisk_rawtx bobdeposit,bobpayment,alicepayment,myfee,otherfee,aliceclaim,alicespend,bobreclaim,bobspend,bobrefund,alicereclaim; + struct basilisk_swapinfo I; bits256 privkeys[INSTANTDEX_DECKSIZE]; - struct basilisk_swapmessage *messages; int32_t nummessages; uint64_t otherdeck[INSTANTDEX_DECKSIZE][2],deck[INSTANTDEX_DECKSIZE][2]; - uint8_t persistent_pubkey33[33],pad[15],verifybuf[65536]; - }; #include "../includes/iguana_funcs.h" diff --git a/iguana/tests/DEXinit b/iguana/tests/DEXinit new file mode 100755 index 000000000..63e43fe15 --- /dev/null +++ b/iguana/tests/DEXinit @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"init\"}" diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index cfb110ae6..dc8f26e42 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -217,6 +217,7 @@ STRING_AND_INT(InstantDEX,pollgap,exchange,pollgap); ZERO_ARGS(InstantDEX,allexchanges); STRING_ARG(InstantDEX,allpairs,exchange); THREE_STRINGS(InstantDEX,supports,exchange,base,rel); +ZERO_ARGS(InstantDEX,init); //THREE_STRINGS(atomic,approve,myorderid,otherid,txname); //THREE_STRINGS(atomic,claim,myorderid,otherid,txname); From 1fcd4af7100aac54d71d6650db02e21481849bd4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Mar 2017 18:02:13 +0200 Subject: [PATCH 400/495] Test --- basilisk/basilisk_swap.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 7f0cd0062..f03ebf4ef 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1230,12 +1230,12 @@ int32_t instantdex_pubkeyargs(void *ctx,struct basilisk_swap *swap,int32_t numpu { if ( swap->I.numpubs+2 >= numpubs ) return(numpubs); - printf(">>>>>> start generating %s\n",buf); + fprintf(stderr,">>>>>> start generating %s\n",buf); } for (i=n=m=0; iI,1,sizeof(swap->I),fp); @@ -1355,15 +1356,18 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv } else { + fprintf(stderr,"A\n"); swap->I.putduration = swap->I.callduration = INSTANTDEX_LOCKTIME; if ( optionduration < 0 ) swap->I.putduration -= optionduration; else if ( optionduration > 0 ) swap->I.callduration += optionduration; + fprintf(stderr,"B\n"); swap->I.bobsatoshis = swap->I.req.destamount; swap->I.bobconfirms = (1*0 + sqrt(dstr(swap->I.bobsatoshis) * .1)); swap->I.alicesatoshis = swap->I.req.srcamount; swap->I.aliceconfirms = swap->I.bobconfirms * 3; + fprintf(stderr,"C\n"); if ( swap->I.bobconfirms == 0 ) swap->I.bobconfirms = swap->bobcoin->chain->minconfirms; if ( swap->I.aliceconfirms == 0 ) @@ -1372,6 +1376,7 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv swap->I.bobinsurance = 10000; if ( (swap->I.aliceinsurance= (swap->I.alicesatoshis / INSTANTDEX_INSURANCEDIV)) < 10000 ) swap->I.aliceinsurance = 10000; + fprintf(stderr,"D\n"); strcpy(swap->I.bobstr,swap->bobcoin->symbol); strcpy(swap->I.alicestr,swap->alicecoin->symbol); swap->I.started = (uint32_t)time(NULL); @@ -1379,6 +1384,7 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv OS_randombytes((uint8_t *)&swap->I.choosei,sizeof(swap->I.choosei)); if ( swap->I.choosei < 0 ) swap->I.choosei = -swap->I.choosei; + fprintf(stderr,"E\n"); swap->I.choosei %= INSTANTDEX_DECKSIZE; swap->I.otherchoosei = -1; swap->I.myhash = pubkey25519; @@ -1392,14 +1398,15 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv swap->I.iambob = 1; swap->I.otherhash = swap->I.req.srchash; } + fprintf(stderr,"F\n"); if ( bits256_nonz(privkey) == 0 || (x= instantdex_pubkeyargs(myinfo->ctx,swap,2 + INSTANTDEX_DECKSIZE,privkey,swap->I.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) { char str[65]; printf("couldnt generate privkeys %d %s\n",x,bits256_str(str,privkey)); return(0); } + fprintf(stderr,"save swapfile.(%s)\n",fname); if ( (fp= fopen(fname,"wb")) != 0 ) { - printf("save swapfile\n"); fwrite(&swap->I,1,sizeof(swap->I),fp); fwrite(swap->privkeys,1,sizeof(swap->privkeys),fp); fwrite(swap->deck,1,sizeof(swap->deck),fp); From 4828910d4af6117afb0a7efbc0d4bc3ce18519b8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Mar 2017 18:10:46 +0200 Subject: [PATCH 401/495] Test --- .gitignore | 2 ++ basilisk/basilisk_swap.c | 6 +++++- iguana/iguana777.h | 7 ++++--- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 10edeb358..a4430f4ea 100755 --- a/.gitignore +++ b/.gitignore @@ -174,3 +174,5 @@ iguana/DB/SWAPS/.tmpmarker iguana/DB/SWAPS/list iguana/DB/SWAPS/15974209-4014252807 + +iguana/iguana777.o-0cc60f50 diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index f03ebf4ef..61151df29 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1235,7 +1235,7 @@ int32_t instantdex_pubkeyargs(void *ctx,struct basilisk_swap *swap,int32_t numpu for (i=n=m=0; iI.aliceinsurance = 10000; fprintf(stderr,"D\n"); strcpy(swap->I.bobstr,swap->bobcoin->symbol); + fprintf(stderr,"D2\n"); strcpy(swap->I.alicestr,swap->alicecoin->symbol); + fprintf(stderr,"D3\n"); swap->I.started = (uint32_t)time(NULL); + fprintf(stderr,"D4\n"); swap->I.expiration = swap->I.req.timestamp + swap->I.putduration + swap->I.callduration; + fprintf(stderr,"D5\n"); OS_randombytes((uint8_t *)&swap->I.choosei,sizeof(swap->I.choosei)); if ( swap->I.choosei < 0 ) swap->I.choosei = -swap->I.choosei; diff --git a/iguana/iguana777.h b/iguana/iguana777.h index ae6629a6f..f09c5a9dc 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -180,12 +180,13 @@ struct basilisk_swap int32_t subsock,pushsock,connected; FILE *fp; bits256 persistent_privkey,persistent_pubkey; - struct basilisk_swapmessage *messages; int32_t nummessages; - uint8_t persistent_pubkey33[33],pad[15],verifybuf[65536]; - struct basilisk_rawtx bobdeposit,bobpayment,alicepayment,myfee,otherfee,aliceclaim,alicespend,bobreclaim,bobspend,bobrefund,alicereclaim; struct basilisk_swapinfo I; + struct basilisk_rawtx bobdeposit,bobpayment,alicepayment,myfee,otherfee,aliceclaim,alicespend,bobreclaim,bobspend,bobrefund,alicereclaim; bits256 privkeys[INSTANTDEX_DECKSIZE]; + struct basilisk_swapmessage *messages; int32_t nummessages; uint64_t otherdeck[INSTANTDEX_DECKSIZE][2],deck[INSTANTDEX_DECKSIZE][2]; + uint8_t persistent_pubkey33[33],pad[15],verifybuf[65536]; + }; #include "../includes/iguana_funcs.h" From 4690cdf001b5a06da656ee35811e64cb6f5c9857 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Mar 2017 18:14:43 +0200 Subject: [PATCH 402/495] Test --- basilisk/basilisk_swap.c | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 61151df29..ed1023c77 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1230,7 +1230,7 @@ int32_t instantdex_pubkeyargs(void *ctx,struct basilisk_swap *swap,int32_t numpu { if ( swap->I.numpubs+2 >= numpubs ) return(numpubs); - fprintf(stderr,">>>>>> start generating %s\n",buf); + //fprintf(stderr,">>>>>> start generating %s\n",buf); } for (i=n=m=0; iI.putduration = swap->I.callduration = INSTANTDEX_LOCKTIME; if ( optionduration < 0 ) swap->I.putduration -= optionduration; else if ( optionduration > 0 ) swap->I.callduration += optionduration; - fprintf(stderr,"B\n"); swap->I.bobsatoshis = swap->I.req.destamount; swap->I.bobconfirms = (1*0 + sqrt(dstr(swap->I.bobsatoshis) * .1)); swap->I.alicesatoshis = swap->I.req.srcamount; swap->I.aliceconfirms = swap->I.bobconfirms * 3; - fprintf(stderr,"C\n"); - if ( swap->I.bobconfirms == 0 ) - swap->I.bobconfirms = swap->bobcoin->chain->minconfirms; - if ( swap->I.aliceconfirms == 0 ) - swap->I.aliceconfirms = swap->alicecoin->chain->minconfirms; if ( (swap->I.bobinsurance= (swap->I.bobsatoshis / INSTANTDEX_INSURANCEDIV)) < 10000 ) swap->I.bobinsurance = 10000; if ( (swap->I.aliceinsurance= (swap->I.alicesatoshis / INSTANTDEX_INSURANCEDIV)) < 10000 ) swap->I.aliceinsurance = 10000; - fprintf(stderr,"D\n"); - strcpy(swap->I.bobstr,swap->bobcoin->symbol); - fprintf(stderr,"D2\n"); - strcpy(swap->I.alicestr,swap->alicecoin->symbol); - fprintf(stderr,"D3\n"); + strcpy(swap->I.bobstr,swap->I.req.dest); + strcpy(swap->I.alicestr,swap->I.req.src); swap->I.started = (uint32_t)time(NULL); - fprintf(stderr,"D4\n"); swap->I.expiration = swap->I.req.timestamp + swap->I.putduration + swap->I.callduration; - fprintf(stderr,"D5\n"); OS_randombytes((uint8_t *)&swap->I.choosei,sizeof(swap->I.choosei)); if ( swap->I.choosei < 0 ) swap->I.choosei = -swap->I.choosei; - fprintf(stderr,"E\n"); swap->I.choosei %= INSTANTDEX_DECKSIZE; swap->I.otherchoosei = -1; swap->I.myhash = pubkey25519; @@ -1402,13 +1389,11 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv swap->I.iambob = 1; swap->I.otherhash = swap->I.req.srchash; } - fprintf(stderr,"F\n"); if ( bits256_nonz(privkey) == 0 || (x= instantdex_pubkeyargs(myinfo->ctx,swap,2 + INSTANTDEX_DECKSIZE,privkey,swap->I.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) { char str[65]; printf("couldnt generate privkeys %d %s\n",x,bits256_str(str,privkey)); return(0); } - fprintf(stderr,"save swapfile.(%s)\n",fname); if ( (fp= fopen(fname,"wb")) != 0 ) { fwrite(&swap->I,1,sizeof(swap->I),fp); @@ -1425,6 +1410,10 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv free(swap); return(0); } + if ( swap->I.bobconfirms == 0 ) + swap->I.bobconfirms = swap->bobcoin->chain->minconfirms; + if ( swap->I.aliceconfirms == 0 ) + swap->I.aliceconfirms = swap->alicecoin->chain->minconfirms; jumblrflag = bits256_cmp(privkey,myinfo->persistent_priv) != 0; if ( swap->I.iambob != 0 ) { From 90b4495a15c62708841ea1e679c77bc0f29392da Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Mar 2017 19:02:02 +0200 Subject: [PATCH 403/495] Test --- .gitignore | 4 ++++ basilisk/basilisk_swap.c | 35 ++++++++++++++++++++++++----------- iguana/iguana777.h | 2 +- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index a4430f4ea..a3fcad7b7 100755 --- a/.gitignore +++ b/.gitignore @@ -176,3 +176,7 @@ iguana/DB/SWAPS/list iguana/DB/SWAPS/15974209-4014252807 iguana/iguana777.o-0cc60f50 + +iguana/DB/SWAPS/667293271-3414303895 + +iguana/DB/SWAPS/667293271-3414303895.swap diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index ed1023c77..114d407d5 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1101,11 +1101,14 @@ void basilisk_swaps_init(struct supernet_info *myinfo) } } +void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap,char *pushaddr,char *subaddr); + int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,int32_t (*basilisk_verify_func)(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen)) { uint8_t *ptr; bits256 srchash,desthash; uint32_t crc32,_msgbits,quoteid; int32_t i,size,offset,retval = -1; struct basilisk_swapmessage *mp = 0; while ( (size= nn_recv(swap->subsock,&ptr,NN_MSG,0)) >= 0 ) { + swap->lasttime = (uint32_t)time(NULL); memset(srchash.bytes,0,sizeof(srchash)); memset(desthash.bytes,0,sizeof(desthash)); //printf("gotmsg.[%d] crc.%x\n",size,crc32); @@ -1125,6 +1128,15 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap if ( ptr != 0 ) nn_freemsg(ptr), ptr = 0; } + if ( swap->I.iambob == 0 && time(NULL) > swap->lasttime+360 ) + { + printf("nothing received for a while from Bob, try new sockets\n"); + if ( swap->pushsock >= 0 ) + nn_close(swap->pushsock), swap->pushsock = -1; + if ( swap->subsock >= 0 ) + nn_close(swap->subsock), swap->subsock = -1; + basilisk_psockinit(myinfo,swap,0,0); + } //char str[65],str2[65]; for (i=0; inummessages; i++) { @@ -1341,15 +1353,14 @@ int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct igu struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 privkey,uint8_t *pubkey33,bits256 pubkey25519,struct basilisk_swap *swap,int32_t optionduration,uint32_t statebits,int32_t reinit) { FILE *fp; char fname[512]; uint8_t *alicepub33=0,*bobpub33=0; int32_t jumblrflag,x = -1; - sprintf(fname,"%s/SWAPS/%u-%u.swap",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid); - printf("swapfile.(%s)\n",fname); if ( reinit != 0 ) { - fprintf(stderr,"Z\n"); + sprintf(fname,"%s/SWAPS/%u-%u.swap",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid); if ( (fp= fopen(fname,"rb")) != 0 ) { fread(&swap->I,1,sizeof(swap->I),fp); fread(swap->privkeys,1,sizeof(swap->privkeys),fp); + fread(swap->otherdeck,1,sizeof(swap->otherdeck),fp); fread(swap->deck,1,sizeof(swap->deck),fp); fclose(fp); } @@ -1394,13 +1405,6 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv char str[65]; printf("couldnt generate privkeys %d %s\n",x,bits256_str(str,privkey)); return(0); } - if ( (fp= fopen(fname,"wb")) != 0 ) - { - fwrite(&swap->I,1,sizeof(swap->I),fp); - fwrite(swap->privkeys,1,sizeof(swap->privkeys),fp); - fwrite(swap->deck,1,sizeof(swap->deck),fp); - fclose(fp); - } } swap->bobcoin = iguana_coinfind(swap->I.req.dest); swap->alicecoin = iguana_coinfind(swap->I.req.src); @@ -2039,7 +2043,7 @@ void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap, void basilisk_swaploop(void *_swap) { - uint8_t *data; uint32_t expiration; uint32_t channel; int32_t retval=0,i,j,datalen,maxlen; struct supernet_info *myinfo; struct basilisk_swap *swap = _swap; + uint8_t *data; uint32_t expiration; char fname[512]; uint32_t channel; int32_t retval=0,i,j,datalen,maxlen; FILE *fp; struct supernet_info *myinfo; struct basilisk_swap *swap = _swap; myinfo = swap->myinfoptr; fprintf(stderr,"start swap\n"); maxlen = 1024*1024 + sizeof(*swap); @@ -2094,6 +2098,15 @@ void basilisk_swaploop(void *_swap) myinfo->DEXactive = 0; } printf("C r%u/q%u swapstate.%x retval.%d\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits,retval); + sprintf(fname,"%s/SWAPS/%u-%u.swap",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid); + if ( (fp= fopen(fname,"wb")) != 0 ) + { + fwrite(&swap->I,1,sizeof(swap->I),fp); + fwrite(swap->privkeys,1,sizeof(swap->privkeys),fp); + fwrite(swap->otherdeck,1,sizeof(swap->otherdeck),fp); + fwrite(swap->deck,1,sizeof(swap->deck),fp); + fclose(fp); + } while ( retval == 0 && (swap->I.statebits & 0x40) == 0 ) // send fee { //dpow_nanomsg_update(myinfo); diff --git a/iguana/iguana777.h b/iguana/iguana777.h index f09c5a9dc..d39f498b5 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -177,7 +177,7 @@ struct basilisk_swap { struct supernet_info *myinfoptr; struct iguana_info *bobcoin,*alicecoin; void (*balancingtrade)(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t iambob); - int32_t subsock,pushsock,connected; + int32_t subsock,pushsock,connected; uint32_t lasttime; FILE *fp; bits256 persistent_privkey,persistent_pubkey; struct basilisk_swapinfo I; From 692208a96876811e9dcc6b76612465a1995cc1fe Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Mar 2017 19:05:05 +0200 Subject: [PATCH 404/495] Test --- basilisk/basilisk_swap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 114d407d5..490b551d6 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1128,7 +1128,7 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap if ( ptr != 0 ) nn_freemsg(ptr), ptr = 0; } - if ( swap->I.iambob == 0 && time(NULL) > swap->lasttime+360 ) + if ( swap->I.iambob == 0 && swap->lasttime != 0 && time(NULL) > swap->lasttime+360 ) { printf("nothing received for a while from Bob, try new sockets\n"); if ( swap->pushsock >= 0 ) From 6b8afc8099af8e1a211d6576d7f71c5d11a709af Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Mar 2017 20:59:34 +0200 Subject: [PATCH 405/495] Test --- .gitignore | 4 ++++ basilisk/basilisk_swap.c | 16 ++++++++------ iguana/exchanges/mm.c | 24 ++++++++++++-------- iguana/iguana_payments.c | 4 ++-- iguana/iguana_sign.c | 47 ++++++++++++++++------------------------ 5 files changed, 49 insertions(+), 46 deletions(-) diff --git a/.gitignore b/.gitignore index a3fcad7b7..89d21bd7a 100755 --- a/.gitignore +++ b/.gitignore @@ -180,3 +180,7 @@ iguana/iguana777.o-0cc60f50 iguana/DB/SWAPS/667293271-3414303895 iguana/DB/SWAPS/667293271-3414303895.swap + +iguana/DB/SWAPS/548227681-1452262678.swap + +iguana/DB/SWAPS/548227681-1452262678 diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 490b551d6..1ee664552 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -255,7 +255,7 @@ int32_t basilisk_numconfirms(struct supernet_info *myinfo,struct basilisk_swap * { cJSON *argjson,*valuearray=0; char *valstr; int32_t i,n,retval = -1; #ifdef BASILISK_DISABLEWAITTX - return(10); + return(100); #endif argjson = cJSON_CreateObject(); jaddbits256(argjson,"txid",rawtx->I.actualtxid); @@ -319,7 +319,6 @@ bits256 basilisk_swap_broadcast(char *name,struct supernet_info *myinfo,struct b int32_t _basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,uint32_t timestamp,uint32_t locktime,uint32_t sequenceid,struct basilisk_rawtx *dest,struct basilisk_rawtx *rawtx,bits256 privkey,bits256 *privkey2,uint8_t *userdata,int32_t userdatalen,int32_t ignore_cltverr) { char *rawtxbytes=0,*signedtx=0,hexstr[999],wifstr[128]; cJSON *txobj,*vins,*item,*sobj,*privkeys; int32_t needsig=1,retval = -1; struct vin_info *V; - V = calloc(16,sizeof(*V)); V[0].signers[0].privkey = privkey; bitcoin_pubkey33(myinfo->ctx,V[0].signers[0].pubkey,privkey); @@ -333,7 +332,7 @@ int32_t _basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,uint32_ bitcoin_priv2wif(wifstr,*privkey2,rawtx->coin->chain->wiftype); jaddistr(privkeys,wifstr); V[0].N = V[0].M = 2; - //char str[65]; printf("add second privkey.(%s) %s\n",jprint(privkeys,0),bits256_str(str,*privkey2)); + char str[65]; printf("add second privkey.(%s) %s\n",jprint(privkeys,0),bits256_str(str,*privkey2)); } else V[0].N = V[0].M = 1; V[0].suppress_pubkeys = dest->I.suppress_pubkeys; V[0].ignore_cltverr = ignore_cltverr; @@ -352,6 +351,7 @@ int32_t _basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,uint32_ needsig = 0; #endif } + printf("rawtx B\n"); if ( bits256_nonz(rawtx->I.actualtxid) != 0 ) jaddbits256(item,"txid",rawtx->I.actualtxid); else jaddbits256(item,"txid",rawtx->I.signedtxid); @@ -371,10 +371,11 @@ int32_t _basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,uint32_ jaddi(vins,item); jdelete(txobj,"vin"); jadd(txobj,"vin",vins); - //printf("basilisk_rawtx_sign locktime.%u/%u for %s spendscript.%s -> %s, suppress.%d\n",rawtx->locktime,dest->locktime,rawtx->name,hexstr,dest->name,dest->suppress_pubkeys); + printf("basilisk_rawtx_sign locktime.%u/%u for %s spendscript.%s -> %s, suppress.%d\n",rawtx->I.locktime,dest->I.locktime,rawtx->name,hexstr,dest->name,dest->I.suppress_pubkeys); txobj = bitcoin_txoutput(txobj,dest->spendscript,dest->I.spendlen,dest->I.amount); if ( (rawtxbytes= bitcoin_json2hex(myinfo,rawtx->coin,&dest->I.txid,txobj,V)) != 0 ) { + printf("rawtx.(%s) vins.%p\n",rawtxbytes,vins); if ( needsig == 0 ) signedtx = rawtxbytes; if ( signedtx != 0 || (signedtx= iguana_signrawtx(myinfo,rawtx->coin,height,&dest->I.signedtxid,&dest->I.completed,vins,rawtxbytes,privkeys,V)) != 0 ) @@ -745,6 +746,7 @@ int32_t basilisk_alicepayment_spend(struct supernet_info *myinfo,struct basilisk int32_t i,retval; printf("alicepayment_spend\n"); swap->alicepayment.I.spendlen = basilisk_alicescript(swap->alicepayment.redeemscript,&swap->alicepayment.I.redeemlen,swap->alicepayment.spendscript,0,swap->alicepayment.I.destaddr,swap->alicecoin->chain->p2shtype,swap->I.pubAm,swap->I.pubBn); + printf("alicepayment_spend len.%d\n",swap->alicepayment.I.spendlen); if ( (retval= basilisk_rawtx_sign(myinfo,swap->alicecoin->longestchain,swap,dest,&swap->alicepayment,swap->I.privAm,&swap->I.privBn,0,0,1)) == 0 ) { for (i=0; iI.datalen; i++) @@ -1373,9 +1375,7 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv else if ( optionduration > 0 ) swap->I.callduration += optionduration; swap->I.bobsatoshis = swap->I.req.destamount; - swap->I.bobconfirms = (1*0 + sqrt(dstr(swap->I.bobsatoshis) * .1)); swap->I.alicesatoshis = swap->I.req.srcamount; - swap->I.aliceconfirms = swap->I.bobconfirms * 3; if ( (swap->I.bobinsurance= (swap->I.bobsatoshis / INSTANTDEX_INSURANCEDIV)) < 10000 ) swap->I.bobinsurance = 10000; if ( (swap->I.aliceinsurance= (swap->I.alicesatoshis / INSTANTDEX_INSURANCEDIV)) < 10000 ) @@ -1414,6 +1414,8 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv free(swap); return(0); } + swap->I.bobconfirms = (1*0 + sqrt(dstr(swap->I.bobsatoshis) * .1)); + swap->I.aliceconfirms = swap->I.bobconfirms * 3; if ( swap->I.bobconfirms == 0 ) swap->I.bobconfirms = swap->bobcoin->chain->minconfirms; if ( swap->I.aliceconfirms == 0 ) @@ -1800,7 +1802,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap if ( basilisk_swapget(myinfo,swap,0x1000,data,maxlen,basilisk_verify_alicepaid) == 0 ) { swap->I.statebits |= 0x1000; - printf("got alicepayment\n"); + printf("got alicepayment aliceconfirms.%d\n",swap->I.aliceconfirms); } } else if ( (swap->I.statebits & 0x2000) == 0 ) diff --git a/iguana/exchanges/mm.c b/iguana/exchanges/mm.c index 2b4dee270..69502f02f 100644 --- a/iguana/exchanges/mm.c +++ b/iguana/exchanges/mm.c @@ -22,6 +22,7 @@ #include #include #include "OS_portable.h" +#define MAX(a,b) ((a) > (b) ? (a) : (b)) struct mmpending_order { @@ -501,15 +502,16 @@ int32_t marketmaker_spread(char *exchange,char *base,char *rel,double bid,double jaddnum(vals,"ask",ask); vol = bidvol > askvol ? askvol : bidvol; jaddnum(vals,"maxvol",vol); - jaddnum(vals,"minvol",vol * 0.1); + jaddnum(vals,"minvol",vol*0.1 > 100 ? 100 : vol * 0.1); sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"%s\",\"vals\":%s}",base,jprint(vals,1)); + printf("(%s)\n",postdata); if ( (retstr= bitcoind_RPC(0,"tradebot",url,0,"liqudity",postdata)) != 0 ) { //printf("(%s) -> (%s)\n",postdata,retstr); free(retstr); } - spread_ratio = (ask - bid) / (bid + ask); + spread_ratio = .5 * ((ask - bid) / (bid + ask)); for (i=0; i SMALLVAL ) @@ -519,7 +521,7 @@ int32_t marketmaker_spread(char *exchange,char *base,char *rel,double bid,double jaddnum(vals,"bid",PAXPRICES[i] * (1. - spread_ratio)); jaddnum(vals,"ask",PAXPRICES[i] * (1. + spread_ratio)); jaddnum(vals,"maxvol",vol * PAXPRICES[i]); - jaddnum(vals,"minvol",vol * 0.1 * PAXPRICES[i]); + jaddnum(vals,"minvol",MAX(1,(int32_t)(vol * 0.01 * PAXPRICES[i]))); sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"%s\",\"vals\":%s}","KMD",jprint(vals,1)); if ( (retstr= bitcoind_RPC(0,"tradebot",url,0,"liqudity",postdata)) != 0 ) @@ -528,6 +530,7 @@ int32_t marketmaker_spread(char *exchange,char *base,char *rel,double bid,double free(retstr); } } +break; } } else printf("unsupported ask only for DEX %s/%s\n",base,rel); } @@ -561,7 +564,7 @@ int32_t marketmaker_spread(char *exchange,char *base,char *rel,double bid,double void marketmaker(double minask,double maxbid,char *baseaddr,char *reladdr,double start_BASE,double start_REL,double profitmargin,double maxexposure,double ratioincr,char *exchange,char *name,char *base,char *rel) { static uint32_t counter; - cJSON *fiatjson; double start_DEXbase,start_DEXrel,USD_average=0.,DEX_base = 0.,DEX_rel = 0.,balance_base=0.,balance_rel=0.,mmbid,mmask,usdprice=0.,CMC_average=0.,aveprice,incr,pendingbids,pendingasks,buyvol,sellvol,bidincr,askincr,filledprice,avebid=0.,aveask=0.,val,changes[3],highbid=0.,lowask=0.,theoretical = 0.; uint32_t lasttime = 0; + cJSON *fiatjson; double bid,ask,start_DEXbase,start_DEXrel,USD_average=0.,DEX_base = 0.,DEX_rel = 0.,balance_base=0.,balance_rel=0.,mmbid,mmask,usdprice=0.,CMC_average=0.,aveprice,incr,pendingbids,pendingasks,buyvol,sellvol,bidincr,askincr,filledprice,avebid=0.,aveask=0.,val,changes[3],highbid=0.,lowask=0.,theoretical = 0.; uint32_t lasttime = 0; incr = maxexposure * ratioincr; buyvol = sellvol = 0.; start_DEXbase = dex_balance(base,baseaddr); @@ -636,8 +639,11 @@ void marketmaker(double minask,double maxbid,char *baseaddr,char *reladdr,double mmask = 0.; } marketmaker_volumeset(&bidincr,&askincr,incr,buyvol,pendingbids,sellvol,pendingasks,maxexposure); - printf("AVE.(%.8f %.8f) hbla %.8f %.8f bid %.8f ask %.8f theory %.8f buys.(%.6f %.6f) sells.(%.6f %.6f) incr.(%.6f %.6f) balances.(%.8f + %.8f, %.8f + %.8f)\n",avebid,aveask,highbid,lowask,mmbid,mmask,theoretical,buyvol,pendingbids,sellvol,pendingasks,bidincr,askincr,balance_base,DEX_base,balance_rel,DEX_rel); - marketmaker_spread("DEX",base,rel,avebid - profitmargin*aveprice,incr,aveask + profitmargin*aveprice,incr,profitmargin*aveprice*0.5); + printf("AVE.(%.8f %.8f) hbla %.8f %.8f bid %.8f ask %.8f theory %.8f buys.(%.6f %.6f) sells.(%.6f %.6f) incr.(%.6f %.6f) balances.(%.8f + %.8f, %.8f + %.8f) test %f\n",avebid,aveask,highbid,lowask,mmbid,mmask,theoretical,buyvol,pendingbids,sellvol,pendingasks,bidincr,askincr,balance_base,DEX_base,balance_rel,DEX_rel,(aveask - avebid)/aveprice); + if ( (aveask - avebid)/aveprice > 4*profitmargin ) + bid = highbid * (1 - 4*profitmargin), ask = lowask * (1 + 4*profitmargin); + else bid = avebid - profitmargin*aveprice, ask = avebid + profitmargin*aveprice; + marketmaker_spread("DEX",base,rel,bid,incr,ask,incr,profitmargin*aveprice*0.5); if ( (pendingbids + buyvol) > (pendingasks + sellvol) ) { bidincr *= (double)(pendingasks + sellvol) / ((pendingbids + buyvol) + (pendingasks + sellvol)); @@ -655,8 +661,8 @@ void marketmaker(double minask,double maxbid,char *baseaddr,char *reladdr,double askincr = (int32_t)askincr + 0.777; } //printf("mmbid %.8f %.6f, mmask %.8f %.6f\n",mmbid,bidincr,mmask,askincr); - marketmaker_spread(exchange,base,rel,mmbid,bidincr,mmask,askincr,profitmargin*aveprice*0.5); - sleep(60); + //marketmaker_spread(exchange,base,rel,mmbid,bidincr,mmask,askincr,profitmargin*aveprice*0.5); + sleep(6000); } } } @@ -707,7 +713,7 @@ int main(int argc, const char * argv[]) marketmaker(minask,maxbid,baseaddr,reladdr,start_base,start_rel,profitmargin,maxexposure,incrratio,exchange,name,base,rel); } free_json(addrjson); - } + } else printf("ERROR parsing.(%s)\n",retstr); free(retstr); } free_json(retjson); diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 86f22cb3c..5286d37ef 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -274,7 +274,7 @@ char *iguana_signrawtx(struct supernet_info *myinfo,struct iguana_info *coin,int memset(&msgtx,0,sizeof(msgtx)); if ( V == 0 ) V = calloc(numinputs,sizeof(*V)), flagV = 1; - //printf("SIGN.(%s) priv.(%s) %llx %llx\n",jprint(vins,0),jprint(privkeys,0),(long long)V->signers[0].privkey.txid,(long long)V->signers[1].privkey.txid); + //printf("SIGN.(%s) priv.(%s) %llx %llx V.%p\n",jprint(vins,0),jprint(privkeys,0),(long long)V->signers[0].privkey.txid,(long long)V->signers[1].privkey.txid,V); if ( V != 0 ) { if ( iguana_signrawtransaction(myinfo,coin,height,&msgtx,&signedtx,signedtxidp,V,numinputs,rawtx,vins,privkeys) > 0 ) @@ -289,7 +289,7 @@ char *iguana_signrawtx(struct supernet_info *myinfo,struct iguana_info *coin,int if ( flag != 0 ) free_json(privkeys); } - //char str[65]; printf("completed.%d %s signed.(%s)\n",*completedp,bits256_str(str,*signedtxidp),signedtx!=0?signedtx:""); + char str[65]; printf("completed.%d %s signed.(%s)\n",*completedp,bits256_str(str,*signedtxidp),signedtx!=0?signedtx:""); return(signedtx); } diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 3ef8338c6..ca2dfd181 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -581,7 +581,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ sigser = calloc(1,maxsize*2); //printf("json.%p array.%p sigser.%p\n",json,vinarray,sigser); } - //printf("version.%d\n",msg->version); + printf("version.%d\n",msg->version); if ( coin->chain->isPoS != 0 ) { len += iguana_rwnum(rwflag,&serialized[len],sizeof(msg->timestamp),&msg->timestamp); @@ -606,7 +606,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ } for (i=0; itx_in; i++) { - //printf("vin.%d starts offset.%d\n",i,len); + printf("vin.%d starts offset.%d\n",i,len); if ( vins != 0 && jitem(vins,i) != 0 ) iguana_vinobjset(&msg->vins[i],jitem(vins,i),spendscript,sizeof(spendscript)); if ( (n= iguana_vinparse(coin,rwflag,&serialized[len],&msg->vins[i])) < 0 ) @@ -614,7 +614,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ //printf("serialized vin.[%02x %02x %02x]\n",serialized[len],serialized[len+1],serialized[len+2]); if ( msg->vins[i].spendscript == spendscript ) msg->vins[i].spendscript = 0; - //printf("vin.%d n.%d len.%d\n",i,n,len); + printf("vin.%d n.%d len.%d\n",i,n,len); len += n; if ( len > maxsize ) { @@ -624,7 +624,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ } //for (i=-3; i<7; i++) // printf("%02x",serialized[len+i]); - //printf(" prev 3 bytes before tx_out rw.%d\n",rwflag); + printf(" prev 3 bytes before tx_out rw.%d\n",rwflag); len += iguana_rwvarint32(rwflag,&serialized[len],&msg->tx_out); if ( rwflag == 0 ) { @@ -644,7 +644,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ } for (i=0; itx_out; i++) { - //printf("rwflag.%d vout.%d starts %d\n",rwflag,i,len); + printf("rwflag.%d vout.%d starts %d\n",rwflag,i,len); if ( (n= iguana_voutparse(rwflag,&serialized[len],&msg->vouts[i])) < 0 ) return(-1); len += n; @@ -657,7 +657,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ jaddi(voutarray,iguana_voutjson(coin,&msg->vouts[i],i,*txidp)); } len += iguana_rwnum(rwflag,&serialized[len],sizeof(msg->lock_time),&msg->lock_time); - //printf("lock_time.%08x len.%d\n",msg->lock_time,len); + printf("lock_time.%08x len.%d\n",msg->lock_time,len); if ( strcmp(coin->symbol,"VPN") == 0 ) { uint16_t ddosflag = 0; @@ -687,7 +687,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ { iguana_vinobjset(&msg->vins[i],jitem(vins,i),spendscript,sizeof(spendscript)); sigtxid = bitcoin_sigtxid(coin,height,sigser,maxsize*2,msg,i,msg->vins[i].spendscript,msg->vins[i].spendlen,SIGHASH_ALL,vpnstr,suppress_pubkeys); - //printf("after vini.%d vinscript.%p spendscript.%p spendlen.%d (%s)\n",i,msg->vins[i].vinscript,msg->vins[i].spendscript,msg->vins[i].spendlen,jprint(jitem(vins,i),0)); + printf("after vini.%d vinscript.%p spendscript.%p spendlen.%d (%s)\n",i,msg->vins[i].vinscript,msg->vins[i].spendscript,msg->vins[i].spendlen,jprint(jitem(vins,i),0)); jaddi(vinarray,iguana_vinjson(coin,&msg->vins[i],sigtxid)); if ( msg->vins[i].spendscript == spendscript ) msg->vins[i].spendscript = 0; @@ -708,7 +708,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ jaddnum(json,"locktime",msg->lock_time); jaddnum(json,"size",len); jaddbits256(json,"txid",*txidp); - //printf("TX.(%s) %p\n",jprint(json,0),json); + printf("TX.(%s) %p\n",jprint(json,0),json); } msg->allocsize = len; return(len); @@ -825,6 +825,7 @@ cJSON *bitcoin_data2json(struct iguana_info *coin,int32_t height,bits256 *txidp, memset(msgtx,0,sizeof(M)); vpnstr[0] = 0; memset(txidp,0,sizeof(*txidp)); + printf("call rwmsgtx\n"); if ( (n= iguana_rwmsgtx(coin,height,0,txobj,serialized,len,msgtx,txidp,vpnstr,extraspace,extralen,vins,suppress_pubkeys)) <= 0 ) { printf("errortxobj.(%s)\n",jprint(txobj,0)); @@ -852,7 +853,9 @@ cJSON *bitcoin_hex2json(struct iguana_info *coin,int32_t height,bits256 *txidp,s if ( (serialized= origserialized) == 0 ) serialized = calloc(1,len+4096); decode_hex(serialized,len,txbytes); + printf("call data2json\n"); txobj = bitcoin_data2json(coin,height,txidp,msgtx,extraspace,extralen,serialized,len,vins,suppress_pubkeys); + printf("back data2json %p\n",txobj); if ( serialized != origserialized ) free(serialized); return(txobj); @@ -1420,33 +1423,18 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf extraspace = malloc(extralen); memset(msgtx,0,sizeof(*msgtx)); decode_hex(serialized,len,rawtx); + printf("call hex2json.(%s) vins.(%s)\n",rawtx,jprint(vins,0)); if ( (txobj= bitcoin_hex2json(coin,height,&txid,msgtx,rawtx,extraspace,extralen,serialized4,vins,V->suppress_pubkeys)) != 0 ) { - if ( (0) && vins != 0 ) - printf("txobj.(%s)\n",jprint(txobj,0)); - if ( jobj(txobj,"error") != 0 ) - { - printf("txobj.(%s)\n",jprint(txobj,0)); - } - if ( (0) && (checkstr= bitcoin_json2hex(myinfo,coin,&txid,txobj,V)) != 0 ) // no guarantee of identical regen - { - if ( strcmp(rawtx,checkstr) != 0 ) - { - printf("RAW.(%s) ->\nNEW.(%s)\n",rawtx,checkstr); - //free_json(txobj); - //free(checkstr); - //free(serialized), free(serialized2), free(serialized3), free(serialized4); - //free(extraspace); - //return(-2); - } - free(checkstr); - } + printf("back from bitcoin_hex2json\n"); } else fprintf(stderr,"no txobj from bitcoin_hex2json\n"); if ( (numinputs= cJSON_GetArraySize(vins)) > 0 ) { memset(msgtx,0,sizeof(*msgtx)); + printf("call rwmsgtx vin0.scriptlen %d\n",msgtx->vins[0].scriptlen); if ( iguana_rwmsgtx(coin,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,vins,V->suppress_pubkeys) > 0 && numinputs == msgtx->tx_in ) { + printf("back rwmsgtx\n"); memset(pubkeys,0,sizeof(pubkeys)); memset(privkeys,0,sizeof(privkeys)); if ( (n= cJSON_GetArraySize(privkeysjson)) > 0 ) @@ -1463,6 +1451,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf iguana_ensure_privkey(myinfo,coin,privkey); } } + printf("after privkeys tx_in.%d\n",msgtx->tx_in); for (i=0; itx_in; i++) { if ( msgtx->vins[i].p2shlen != 0 ) @@ -1473,6 +1462,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf sigsize = 0; flag = (msgtx->vins[i].vinscript[0] == 0); type = bitcoin_scriptget(coin,&hashtype,&sigsize,&pubkeysize,&userdata,&userdatalen,&mainvin,msgtx->vins[i].vinscript+flag,msgtx->vins[i].scriptlen-flag,0); + printf("i.%d flag.%d type.%d scriptlen.%d\n",i,flag,type,msgtx->vins[i].scriptlen); if ( flag != 0 && pubkeysize == 33 ) // jl777: need to generalize this { for (k=0; kvins[i].p2shlen; j++) // printf("%02x",msgtx->vins[i].redeemscript[j]); bitcoin_address(coinaddr,coin->chain->p2shtype,msgtx->vins[i].redeemscript,msgtx->vins[i].p2shlen); - type = iguana_calcrmd160(coin,0,&mvin,msgtx->vins[i].redeemscript,msgtx->vins[i].p2shlen,zero,0,01); + type = iguana_calcrmd160(coin,0,&mvin,msgtx->vins[i].redeemscript,msgtx->vins[i].p2shlen,zero,0,0); for (j=0; jsuppress_pubkeys == 0 ) @@ -1520,6 +1510,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf printf("type.%d p2sh.[%d] -> %s M.%d N.%d\n",type,i,mvin.coinaddr,mvin.M,mvin.N); } } + printf("tail end\n"); if ( i < V->N ) V->signers[i].privkey = privkey; if ( i < numinputs ) From 69fdad64a4b0f54c9ede5a0ef758bf29f2a4d4b3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Mar 2017 21:23:00 +0200 Subject: [PATCH 406/495] Test --- iguana/iguana_sign.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index ca2dfd181..043f0d827 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -1431,10 +1431,9 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf if ( (numinputs= cJSON_GetArraySize(vins)) > 0 ) { memset(msgtx,0,sizeof(*msgtx)); - printf("call rwmsgtx vin0.scriptlen %d\n",msgtx->vins[0].scriptlen); if ( iguana_rwmsgtx(coin,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,vins,V->suppress_pubkeys) > 0 && numinputs == msgtx->tx_in ) { - printf("back rwmsgtx\n"); + printf("back rwmsgtx vins.%p\n",msgtx->vins); memset(pubkeys,0,sizeof(pubkeys)); memset(privkeys,0,sizeof(privkeys)); if ( (n= cJSON_GetArraySize(privkeysjson)) > 0 ) From 3a0ad358cc3f31d1d6899dc36d9a5c928fb70433 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Mar 2017 21:29:59 +0200 Subject: [PATCH 407/495] Test --- iguana/iguana_sign.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 043f0d827..b45ff6938 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -1462,12 +1462,6 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf flag = (msgtx->vins[i].vinscript[0] == 0); type = bitcoin_scriptget(coin,&hashtype,&sigsize,&pubkeysize,&userdata,&userdatalen,&mainvin,msgtx->vins[i].vinscript+flag,msgtx->vins[i].scriptlen-flag,0); printf("i.%d flag.%d type.%d scriptlen.%d\n",i,flag,type,msgtx->vins[i].scriptlen); - if ( flag != 0 && pubkeysize == 33 ) // jl777: need to generalize this - { - for (k=0; kvins[i].redeemscript != 0 ) { //for (j=0; jvins[i].p2shlen; j++) From 627852b04dbbf0514052c2badf877e794675fa98 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Mar 2017 21:47:20 +0200 Subject: [PATCH 408/495] Test --- iguana/iguana_scripts.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/iguana_scripts.c b/iguana/iguana_scripts.c index 2b8d9f21e..57e8181d1 100755 --- a/iguana/iguana_scripts.c +++ b/iguana/iguana_scripts.c @@ -487,7 +487,7 @@ char *iguana_scriptaddress(struct iguana_info *coin,char *coinaddr,uint8_t *scri int32_t bitcoin_scriptget(struct iguana_info *coin,int32_t *hashtypep,uint32_t *sigsizep,uint32_t *pubkeysizep,uint8_t **userdatap,uint32_t *userdatalenp,struct vin_info *vp,uint8_t *scriptsig,int32_t len,int32_t spendtype) { - char asmstr[IGUANA_MAXSCRIPTSIZE*3]; int32_t j,n,siglen,plen; uint8_t *p2shscript; + int32_t j,n,siglen,plen; uint8_t *p2shscript; j = n = 0; *userdatap = 0; *userdatalenp = *pubkeysizep = *sigsizep = 0; @@ -559,7 +559,7 @@ int32_t bitcoin_scriptget(struct iguana_info *coin,int32_t *hashtypep,uint32_t * decode_hex(vp->rmd160,20,"010966776006953d5567439e5e39f86a0d273bee");//3564a74f9ddb4372301c49154605573d7d1a88fe"); vp->type = IGUANA_SCRIPT_76A988AC; }*/ - vp->spendlen = iguana_scriptgen(coin,&vp->M,&vp->N,vp->coinaddr,vp->spendscript,asmstr,vp->rmd160,vp->type,(const struct vin_info *)vp,vp->vin.prev_vout); + vp->spendlen = iguana_scriptgen(coin,&vp->M,&vp->N,vp->coinaddr,vp->spendscript,0,vp->rmd160,vp->type,(const struct vin_info *)vp,vp->vin.prev_vout); //printf("type.%d asmstr.(%s) spendlen.%d\n",vp->type,asmstr,vp->spendlen); return(vp->spendlen); } From adac1ead6ba7a1d2a950129098a94127c8b487ef Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Mar 2017 21:52:11 +0200 Subject: [PATCH 409/495] Test --- iguana/iguana_sign.c | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index b45ff6938..6af99c203 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -581,7 +581,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ sigser = calloc(1,maxsize*2); //printf("json.%p array.%p sigser.%p\n",json,vinarray,sigser); } - printf("version.%d\n",msg->version); + //printf("version.%d\n",msg->version); if ( coin->chain->isPoS != 0 ) { len += iguana_rwnum(rwflag,&serialized[len],sizeof(msg->timestamp),&msg->timestamp); @@ -606,7 +606,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ } for (i=0; itx_in; i++) { - printf("vin.%d starts offset.%d\n",i,len); + //printf("vin.%d starts offset.%d\n",i,len); if ( vins != 0 && jitem(vins,i) != 0 ) iguana_vinobjset(&msg->vins[i],jitem(vins,i),spendscript,sizeof(spendscript)); if ( (n= iguana_vinparse(coin,rwflag,&serialized[len],&msg->vins[i])) < 0 ) @@ -614,7 +614,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ //printf("serialized vin.[%02x %02x %02x]\n",serialized[len],serialized[len+1],serialized[len+2]); if ( msg->vins[i].spendscript == spendscript ) msg->vins[i].spendscript = 0; - printf("vin.%d n.%d len.%d\n",i,n,len); + //printf("vin.%d n.%d len.%d\n",i,n,len); len += n; if ( len > maxsize ) { @@ -624,7 +624,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ } //for (i=-3; i<7; i++) // printf("%02x",serialized[len+i]); - printf(" prev 3 bytes before tx_out rw.%d\n",rwflag); + //printf(" prev 3 bytes before tx_out rw.%d\n",rwflag); len += iguana_rwvarint32(rwflag,&serialized[len],&msg->tx_out); if ( rwflag == 0 ) { @@ -644,7 +644,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ } for (i=0; itx_out; i++) { - printf("rwflag.%d vout.%d starts %d\n",rwflag,i,len); + //printf("rwflag.%d vout.%d starts %d\n",rwflag,i,len); if ( (n= iguana_voutparse(rwflag,&serialized[len],&msg->vouts[i])) < 0 ) return(-1); len += n; @@ -657,7 +657,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ jaddi(voutarray,iguana_voutjson(coin,&msg->vouts[i],i,*txidp)); } len += iguana_rwnum(rwflag,&serialized[len],sizeof(msg->lock_time),&msg->lock_time); - printf("lock_time.%08x len.%d\n",msg->lock_time,len); + //printf("lock_time.%08x len.%d\n",msg->lock_time,len); if ( strcmp(coin->symbol,"VPN") == 0 ) { uint16_t ddosflag = 0; @@ -708,7 +708,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ jaddnum(json,"locktime",msg->lock_time); jaddnum(json,"size",len); jaddbits256(json,"txid",*txidp); - printf("TX.(%s) %p\n",jprint(json,0),json); + //printf("TX.(%s) %p\n",jprint(json,0),json); } msg->allocsize = len; return(len); @@ -825,7 +825,6 @@ cJSON *bitcoin_data2json(struct iguana_info *coin,int32_t height,bits256 *txidp, memset(msgtx,0,sizeof(M)); vpnstr[0] = 0; memset(txidp,0,sizeof(*txidp)); - printf("call rwmsgtx\n"); if ( (n= iguana_rwmsgtx(coin,height,0,txobj,serialized,len,msgtx,txidp,vpnstr,extraspace,extralen,vins,suppress_pubkeys)) <= 0 ) { printf("errortxobj.(%s)\n",jprint(txobj,0)); @@ -853,9 +852,7 @@ cJSON *bitcoin_hex2json(struct iguana_info *coin,int32_t height,bits256 *txidp,s if ( (serialized= origserialized) == 0 ) serialized = calloc(1,len+4096); decode_hex(serialized,len,txbytes); - printf("call data2json\n"); txobj = bitcoin_data2json(coin,height,txidp,msgtx,extraspace,extralen,serialized,len,vins,suppress_pubkeys); - printf("back data2json %p\n",txobj); if ( serialized != origserialized ) free(serialized); return(txobj); @@ -1423,17 +1420,17 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf extraspace = malloc(extralen); memset(msgtx,0,sizeof(*msgtx)); decode_hex(serialized,len,rawtx); - printf("call hex2json.(%s) vins.(%s)\n",rawtx,jprint(vins,0)); + //printf("call hex2json.(%s) vins.(%s)\n",rawtx,jprint(vins,0)); if ( (txobj= bitcoin_hex2json(coin,height,&txid,msgtx,rawtx,extraspace,extralen,serialized4,vins,V->suppress_pubkeys)) != 0 ) { - printf("back from bitcoin_hex2json\n"); + //printf("back from bitcoin_hex2json\n"); } else fprintf(stderr,"no txobj from bitcoin_hex2json\n"); if ( (numinputs= cJSON_GetArraySize(vins)) > 0 ) { memset(msgtx,0,sizeof(*msgtx)); if ( iguana_rwmsgtx(coin,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,vins,V->suppress_pubkeys) > 0 && numinputs == msgtx->tx_in ) { - printf("back rwmsgtx vins.%p\n",msgtx->vins); + //printf("back rwmsgtx vins.%p\n",msgtx->vins); memset(pubkeys,0,sizeof(pubkeys)); memset(privkeys,0,sizeof(privkeys)); if ( (n= cJSON_GetArraySize(privkeysjson)) > 0 ) @@ -1450,7 +1447,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf iguana_ensure_privkey(myinfo,coin,privkey); } } - printf("after privkeys tx_in.%d\n",msgtx->tx_in); + //printf("after privkeys tx_in.%d\n",msgtx->tx_in); for (i=0; itx_in; i++) { if ( msgtx->vins[i].p2shlen != 0 ) @@ -1461,7 +1458,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf sigsize = 0; flag = (msgtx->vins[i].vinscript[0] == 0); type = bitcoin_scriptget(coin,&hashtype,&sigsize,&pubkeysize,&userdata,&userdatalen,&mainvin,msgtx->vins[i].vinscript+flag,msgtx->vins[i].scriptlen-flag,0); - printf("i.%d flag.%d type.%d scriptlen.%d\n",i,flag,type,msgtx->vins[i].scriptlen); + //printf("i.%d flag.%d type.%d scriptlen.%d\n",i,flag,type,msgtx->vins[i].scriptlen); if ( msgtx->vins[i].redeemscript != 0 ) { //for (j=0; jvins[i].p2shlen; j++) @@ -1503,7 +1500,6 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf printf("type.%d p2sh.[%d] -> %s M.%d N.%d\n",type,i,mvin.coinaddr,mvin.M,mvin.N); } } - printf("tail end\n"); if ( i < V->N ) V->signers[i].privkey = privkey; if ( i < numinputs ) From 0468083a7b5ab45ff908dffe69c399ff864327a3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Mar 2017 09:04:59 +0200 Subject: [PATCH 410/495] Test --- basilisk/basilisk_swap.c | 127 +++++++++++++++++++++------------------ iguana/iguana_sign.c | 2 +- 2 files changed, 69 insertions(+), 60 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 1ee664552..2946b1b61 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1103,7 +1103,7 @@ void basilisk_swaps_init(struct supernet_info *myinfo) } } -void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap,char *pushaddr,char *subaddr); +void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t amlp); int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,int32_t (*basilisk_verify_func)(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen)) { @@ -1130,24 +1130,28 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap if ( ptr != 0 ) nn_freemsg(ptr), ptr = 0; } - if ( swap->I.iambob == 0 && swap->lasttime != 0 && time(NULL) > swap->lasttime+360 ) - { - printf("nothing received for a while from Bob, try new sockets\n"); - if ( swap->pushsock >= 0 ) - nn_close(swap->pushsock), swap->pushsock = -1; - if ( swap->subsock >= 0 ) - nn_close(swap->subsock), swap->subsock = -1; - basilisk_psockinit(myinfo,swap,0,0); - } //char str[65],str2[65]; for (i=0; inummessages; i++) { //printf("%d: %s vs %s\n",i,bits256_str(str,swap->messages[i].srchash),bits256_str(str2,swap->messages[i].desthash)); - if ( swap->messages[i].msgbits == msgbits && bits256_cmp(swap->messages[i].desthash,swap->I.myhash) == 0 ) + if ( bits256_cmp(swap->messages[i].desthash,swap->I.myhash) == 0 ) { - mp = &swap->messages[i]; - if ( msgbits != 0x80000000 ) - break; + if ( swap->messages[i].msgbits == msgbits ) + { + if ( swap->I.iambob == 0 && swap->lasttime != 0 && time(NULL) > swap->lasttime+360 ) + { + printf("nothing received for a while from Bob, try new sockets\n"); + if ( swap->pushsock >= 0 ) + nn_close(swap->pushsock), swap->pushsock = -1; + if ( swap->subsock >= 0 ) + nn_close(swap->subsock), swap->subsock = -1; + swap->connected = 0; + basilisk_psockinit(myinfo,swap,0); + } + mp = &swap->messages[i]; + if ( msgbits != 0x80000000 ) + break; + } } } if ( mp != 0 ) @@ -1824,7 +1828,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap { if ( basilisk_swapget(myinfo,swap,0x40000,data,maxlen,basilisk_verify_privi) == 0 || basilisk_privAm_extract(myinfo,swap) == 0 ) // divulges privAm { - printf("got privi spend alicepayment\n"); + printf("got privi spend alicepayment, dont divulge privBn until bobspend propagated\n"); basilisk_alicepayment_spend(myinfo,swap,&swap->bobspend); if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobspend,0x40000) == 0 ) printf("Bob error spending alice payment\n"); @@ -1980,9 +1984,9 @@ cJSON *swapjson(struct supernet_info *myinfo,struct basilisk_swap *swap) return(retjson); } -void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap,char *pushaddr,char *subaddr) +void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t amlp) { - char keystr[64],databuf[1024],*retstr,*datastr; cJSON *retjson,*addrjson; uint8_t data[512]; int32_t datalen,timeout,pushsock = -1,subsock = -1; + char keystr[64],databuf[1024],*retstr,*retstr2,*datastr,*pushaddr=0,*subaddr=0; cJSON *retjson,*addrjson; uint8_t data[512]; int32_t datalen,timeout,pushsock = -1,subsock = -1; if ( swap->connected == 1 ) return; if ( swap->pushsock < 0 && swap->subsock < 0 && (pushsock= nn_socket(AF_SP,NN_PUSH)) >= 0 && (subsock= nn_socket(AF_SP,NN_SUB)) >= 0 ) @@ -1995,49 +1999,66 @@ void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap, swap->pushsock = pushsock; swap->subsock = subsock; } + if ( swap->subsock < 0 || swap->pushsock < 0 ) + { + printf("error getting nn_sockets\n"); + return; + } sprintf(keystr,"%08x-%08x",swap->I.req.requestid,swap->I.req.quoteid); - if ( pushaddr != 0 && subaddr != 0 ) - { - if ( nn_connect(pushsock,pushaddr) >= 0 && nn_connect(subsock,subaddr) >= 0 ) - swap->connected = 1; - sprintf((char *)data,"{\"push\":\"%s\",\"sub\":\"%s\"}",pushaddr,subaddr); - datalen = (int32_t)strlen((char *)data) + 1; - printf("datalen.%d (%s)\n",datalen,(char *)data); - init_hexbytes_noT(databuf,data,datalen); - printf("%s -> %s\n",keystr,databuf); - if ( (retstr= _dex_kvupdate(myinfo,"KV",keystr,databuf,1)) != 0 ) + if ( (retstr= _dex_kvsearch(myinfo,"KV",keystr)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) { - printf("KVupdate.(%s)\n",retstr); - free(retstr); + if ( (datastr= jstr(retjson,"value")) != 0 ) + { + datalen = (int32_t)strlen(datastr) >> 1; + decode_hex((uint8_t *)databuf,datalen,datastr); + if ( (addrjson= cJSON_Parse(databuf)) != 0 ) + { + pushaddr = jstr(addrjson,"push"); + subaddr = jstr(addrjson,"sub"); + if ( pushaddr != 0 && subaddr != 0 ) + { + printf("KV decoded (%s and %s) %d %d\n",pushaddr,subaddr,swap->pushsock,swap->subsock); + if ( nn_connect(swap->pushsock,pushaddr) >= 0 && nn_connect(swap->subsock,subaddr) >= 0 ) + swap->connected = 1; + } + free_json(addrjson); + } + } + free_json(retjson); } + printf("KVsearch.(%s) connected.%d socks.(%d %d)\n",retstr,swap->connected,swap->pushsock,swap->subsock); + free(retstr); } - else + if ( swap->connected == 0 && amlp != 0 ) { - printf("connected.%d\n",swap->connected); - if ( (retstr= _dex_kvsearch(myinfo,"KV",keystr)) != 0 ) + if ( (retstr= _dex_psock(myinfo,"{}")) != 0 ) { + // {"result":"success","pushaddr":"tcp://5.9.102.210:30002","subaddr":"tcp://5.9.102.210:30003","randipbits":3606291758,"coin":"KMD","tag":"6952562460568228137"} if ( (retjson= cJSON_Parse(retstr)) != 0 ) { - if ( (datastr= jstr(retjson,"value")) != 0 ) + pushaddr = jstr(retjson,"pushaddr"); + subaddr = jstr(retjson,"subaddr"); + if ( pushaddr != 0 && subaddr != 0 ) { - datalen = (int32_t)strlen(datastr) >> 1; - decode_hex((uint8_t *)databuf,datalen,datastr); - if ( (addrjson= cJSON_Parse(databuf)) != 0 ) + if ( nn_connect(pushsock,pushaddr) >= 0 && nn_connect(subsock,subaddr) >= 0 ) { - pushaddr = jstr(addrjson,"push"); - subaddr = jstr(addrjson,"sub"); - if ( pushaddr != 0 && subaddr != 0 ) + swap->connected = 1; + sprintf((char *)data,"{\"push\":\"%s\",\"sub\":\"%s\"}",pushaddr,subaddr); + datalen = (int32_t)strlen((char *)data) + 1; + printf("datalen.%d (%s)\n",datalen,(char *)data); + init_hexbytes_noT(databuf,data,datalen); + printf("%s -> %s\n",keystr,databuf); + if ( (retstr2= _dex_kvupdate(myinfo,"KV",keystr,databuf,1)) != 0 ) { - printf("KV decoded (%s and %s) %d %d\n",pushaddr,subaddr,swap->pushsock,swap->subsock); - if ( nn_connect(swap->pushsock,pushaddr) >= 0 && nn_connect(swap->subsock,subaddr) >= 0 ) - swap->connected = 1; + printf("KVupdate.(%s)\n",retstr2); + free(retstr2); } - free_json(addrjson); } } free_json(retjson); } - printf("KVsearch.(%s) connected.%d socks.(%d %d)\n",retstr,swap->connected,swap->pushsock,swap->subsock); free(retstr); } } @@ -2057,7 +2078,7 @@ void basilisk_swaploop(void *_swap) { dex_channelsend(myinfo,swap->I.req.srchash,swap->I.req.desthash,channel,0x4000000,(void *)&swap->I.req.requestid,sizeof(swap->I.req.requestid)); //,60); if ( swap->I.iambob == 0 && swap->connected == 0 ) - basilisk_psockinit(myinfo,swap,0,0); + basilisk_psockinit(myinfo,swap,0); if ( swap->connected != 0 ) { printf("A r%u/q%u swapstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits); @@ -2246,7 +2267,7 @@ void basilisk_swaploop(void *_swap) struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *rp,uint32_t statebits,int32_t optionduration,int32_t reinit) { - int32_t i,m,n; char *retstr; uint8_t pubkey33[33]; bits256 pubkey25519; uint32_t channel,starttime; cJSON *retarray,*item,*msgobj,*retjson; struct basilisk_swap *swap = 0; + int32_t i,m,n; uint8_t pubkey33[33]; bits256 pubkey25519; uint32_t channel,starttime; cJSON *retarray,*item,*msgobj; struct basilisk_swap *swap = 0; // statebits 1 -> client, 0 -> LP portable_mutex_lock(&myinfo->DEX_swapmutex); for (i=0; inumswaps; i++) @@ -2271,19 +2292,7 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 m = n = 0; if ( bitcoin_swapinit(myinfo,privkey,pubkey33,pubkey25519,swap,optionduration,statebits,reinit) != 0 ) { - if ( statebits == 0 )//&& (swap->subsock < 0 || swap->pushsock < 0) ) - { - if ( (retstr= _dex_psock(myinfo,"{}")) != 0 ) - { - // {"result":"success","pushaddr":"tcp://5.9.102.210:30002","subaddr":"tcp://5.9.102.210:30003","randipbits":3606291758,"coin":"KMD","tag":"6952562460568228137"} - if ( (retjson= cJSON_Parse(retstr)) != 0 ) - { - basilisk_psockinit(myinfo,swap,jstr(retjson,"pushaddr"),jstr(retjson,"subaddr")); - free_json(retjson); - } - free(retstr); - } - } else basilisk_psockinit(myinfo,swap,0,0); + basilisk_psockinit(myinfo,swap,statebits == 0); if ( reinit != 0 ) { if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)basilisk_swaploop,(void *)swap) != 0 ) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 6af99c203..1d8a18ded 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -1408,7 +1408,7 @@ P2SH_SPENDAPI(iguana,spendmsig,activecoin,vintxid,vinvout,destaddress,destamount int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_info *coin,int32_t height,struct iguana_msgtx *msgtx,char **signedtxp,bits256 *signedtxidp,struct vin_info *V,int32_t numinputs,char *rawtx,cJSON *vins,cJSON *privkeysjson) { - uint8_t *serialized,*serialized2,*serialized3,*serialized4,*extraspace,pubkeys[64][33]; int32_t finalized,i,len,n,z,plen,maxsize,complete = 0,extralen = 65536; char *checkstr,*privkeystr,*signedtx = 0; bits256 privkeys[64],privkey,txid; cJSON *item; cJSON *txobj = 0; + uint8_t *serialized,*serialized2,*serialized3,*serialized4,*extraspace,pubkeys[64][33]; int32_t finalized,i,len,n,z,plen,maxsize,complete = 0,extralen = 65536; char *privkeystr,*signedtx = 0; bits256 privkeys[64],privkey,txid; cJSON *item; cJSON *txobj = 0; maxsize = 1000000; memset(privkey.bytes,0,sizeof(privkey)); if ( rawtx != 0 && rawtx[0] != 0 && (len= (int32_t)strlen(rawtx)>>1) < maxsize ) From f7d545e3b51baa067484e02a1834fc2d5a8e0820 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Mar 2017 10:03:32 +0200 Subject: [PATCH 411/495] Test --- iguana/SuperNET_keys.c | 3 ++- iguana/iguana_wallet.c | 3 +++ iguana/main.c | 5 +++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/iguana/SuperNET_keys.c b/iguana/SuperNET_keys.c index b44fc1b18..6eb315550 100755 --- a/iguana/SuperNET_keys.c +++ b/iguana/SuperNET_keys.c @@ -364,6 +364,7 @@ void SuperNET_parsemyinfo(struct supernet_info *myinfo,cJSON *msgjson) SuperNET_setkeys(myinfo,myinfo->persistent_priv.bytes,sizeof(myinfo->persistent_priv),0); } +int32_t Encryptwallet; char *SuperNET_keysinit(struct supernet_info *myinfo,char *argjsonstr) { long allocsize; cJSON *msgjson,*json=0; uint32_t r; bits256 wallethash,wallet2priv; int32_t len,c; @@ -376,7 +377,7 @@ char *SuperNET_keysinit(struct supernet_info *myinfo,char *argjsonstr) SuperNET_parsemyinfo(myinfo,msgjson); free_json(msgjson); } - else + else if ( Encryptwallet != 0 ) { if ( bits256_nonz(myinfo->persistent_priv) == 0 ) { diff --git a/iguana/iguana_wallet.c b/iguana/iguana_wallet.c index 90303ae80..bdb940621 100755 --- a/iguana/iguana_wallet.c +++ b/iguana/iguana_wallet.c @@ -15,6 +15,7 @@ #include "iguana777.h" #include "exchanges/bitcoin.h" +extern int32_t EncryptWallet; void scrubfree(char *sensitivestr) { @@ -1392,6 +1393,7 @@ THREE_STRINGS(bitcoinrpc,encryptwallet,passphrase,password,permanentfile) strcpy(myinfo->password,password); if ( permanentfile != 0 ) strcpy(myinfo->permanentfile,permanentfile); + EncryptWallet = 1; retstr = SuperNET_login(IGUANA_CALLARGS,myinfo->handle,myinfo->secret,myinfo->permanentfile,myinfo->password); //myinfo->expiration = (uint32_t)time(NULL) + 3600*24; struct iguana_waddress waddr; struct iguana_waccount *wacct; @@ -1434,6 +1436,7 @@ THREE_STRINGS(bitcoinrpc,encryptwallet,passphrase,password,permanentfile) //iguana_walletinitcheck(myinfo,coin); myinfo->dirty = (uint32_t)time(NULL); myinfo->expiration = 0; + EncryptWallet = 0; return(retstr); } diff --git a/iguana/main.c b/iguana/main.c index ac883a401..f40b7076c 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1535,6 +1535,7 @@ struct supernet_info *SuperNET_accountfind(cJSON *json) FOUR_STRINGS(SuperNET,login,handle,password,permanentfile,passphrase) { + extern int32_t EncryptWallet; char *str,*decryptstr = 0; cJSON *argjson,*item,*walletitem; if ( remoteaddr != 0 ) return(clonestr("{\"error\":\"no remote\"}")); @@ -1585,7 +1586,7 @@ FOUR_STRINGS(SuperNET,login,handle,password,permanentfile,passphrase) free(myinfo->decryptstr); myinfo->decryptstr = 0; } - if ( passphrase != 0 && passphrase[0] != 0 ) + if ( passphrase != 0 && passphrase[0] != 0 && EncryptWallet != 0 ) { SuperNET_setkeys(myinfo,passphrase,(int32_t)strlen(passphrase),1); if ( myinfo->decryptstr != 0 && (argjson= cJSON_Parse(myinfo->decryptstr)) != 0 ) @@ -1613,7 +1614,7 @@ FOUR_STRINGS(SuperNET,login,handle,password,permanentfile,passphrase) free(str); myinfo->expiration = (uint32_t)(time(NULL) + 3600); return(SuperNET_activehandle(IGUANA_CALLARGS)); - } else return(clonestr("{\"error\":\"need passphrase\"}")); + } else return(clonestr("{\"error\":\"need passphrase or wallet doesnt exist\"}")); return(SuperNET_activehandle(IGUANA_CALLARGS)); } From 3690ff54b43e41d5b13323066bd118084eb0332a Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Mar 2017 10:09:20 +0200 Subject: [PATCH 412/495] Test --- iguana/SuperNET_keys.c | 4 ++-- iguana/main.c | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/iguana/SuperNET_keys.c b/iguana/SuperNET_keys.c index 6eb315550..62fdb1b34 100755 --- a/iguana/SuperNET_keys.c +++ b/iguana/SuperNET_keys.c @@ -22,6 +22,7 @@ #include "../includes/curve25519.h" #include "../includes/cJSON.h" +extern int32_t EncryptWallet; /* if ( 0 ) @@ -364,7 +365,6 @@ void SuperNET_parsemyinfo(struct supernet_info *myinfo,cJSON *msgjson) SuperNET_setkeys(myinfo,myinfo->persistent_priv.bytes,sizeof(myinfo->persistent_priv),0); } -int32_t Encryptwallet; char *SuperNET_keysinit(struct supernet_info *myinfo,char *argjsonstr) { long allocsize; cJSON *msgjson,*json=0; uint32_t r; bits256 wallethash,wallet2priv; int32_t len,c; @@ -377,7 +377,7 @@ char *SuperNET_keysinit(struct supernet_info *myinfo,char *argjsonstr) SuperNET_parsemyinfo(myinfo,msgjson); free_json(msgjson); } - else if ( Encryptwallet != 0 ) + else if ( EncryptWallet != 0 ) { if ( bits256_nonz(myinfo->persistent_priv) == 0 ) { diff --git a/iguana/main.c b/iguana/main.c index f40b7076c..61caaa28f 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -24,6 +24,8 @@ #include "../pnacl_main.h" #include "iguana777.h" +int32_t EncryptWallet; + struct iguana_jsonitem { struct queueitem DL; struct supernet_info *myinfo; uint32_t fallback,expired,allocsize; char *retjsonstr; char remoteaddr[64]; uint16_t port; char jsonstr[]; }; uint16_t SuperNET_API2num(char *agent,char *method) @@ -1535,7 +1537,6 @@ struct supernet_info *SuperNET_accountfind(cJSON *json) FOUR_STRINGS(SuperNET,login,handle,password,permanentfile,passphrase) { - extern int32_t EncryptWallet; char *str,*decryptstr = 0; cJSON *argjson,*item,*walletitem; if ( remoteaddr != 0 ) return(clonestr("{\"error\":\"no remote\"}")); From 3c61c0668fc3a2700201a6d1b51a962d192d484a Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Mar 2017 10:10:53 +0200 Subject: [PATCH 413/495] Test --- iguana/dPoW.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index dcde86599..278e7a2d8 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -23,7 +23,7 @@ //#define DPOW_M(bp) ((bp)->minsigs) // (((bp)->numnotaries >> 1) + 1) #define DPOW_MODIND(bp,offset) (((((bp)->height / DPOW_CHECKPOINTFREQ) % (bp)->numnotaries) + (offset)) % (bp)->numnotaries) #define DPOW_VERSION 0x0781 -#define DPOW_UTXOSIZE 10000 +#define DPOW_UTXOSIZE 30000 #define DPOW_MINOUTPUT 6000 #define DPOW_DURATION 600 #define DPOW_RATIFYDURATION (3600 * 24) From b87928993417554107fb95947cb199ebb1ac3d68 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Mar 2017 10:19:47 +0200 Subject: [PATCH 414/495] Test --- basilisk/basilisk_swap.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 2946b1b61..516509e15 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1173,7 +1173,11 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw if ( datalen > 0 ) memcpy(&buf[offset],data,datalen), offset += datalen; if ( (sentbytes= nn_send(swap->pushsock,buf,offset,0)) != offset ) + { printf("sentbytes.%d vs offset.%d\n",sentbytes,offset); + if ( sentbytes < 0 ) + swap->connected = 0; + } //else printf("send.[%d] %x offset.%d datalen.%d [%llx]\n",sentbytes,msgbits,offset,datalen,*(long long *)data); free(buf); return(0); @@ -1767,6 +1771,8 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap int32_t j,datalen,retval = 0; while ( ((swap->I.otherstatebits & 0x80) == 0 || (swap->I.statebits & 0x80) == 0) && retval == 0 && time(NULL) < swap->I.expiration ) { + if ( swap->connected == 0 ) + basilisk_psockinit(myinfo,swap,swap->I.iambob != 0); printf("D r%u/q%u swapstate.%x otherstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits,swap->I.otherstatebits); if ( (swap->I.statebits & 0x80) == 0 ) // wait for fee { @@ -1789,6 +1795,8 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap } while ( retval == 0 && time(NULL) < swap->I.expiration ) // both sides have setup required data and paid txfee { + if ( swap->connected == 0 ) + basilisk_psockinit(myinfo,swap,swap->I.iambob != 0); //if ( (rand() % 30) == 0 ) printf("E r%u/q%u swapstate.%x otherstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits,swap->I.otherstatebits); if ( swap->I.iambob != 0 ) @@ -2077,8 +2085,8 @@ void basilisk_swaploop(void *_swap) while ( (swap->I.statebits & (0x08|0x02)) != (0x08|0x02) && time(NULL) < expiration ) { dex_channelsend(myinfo,swap->I.req.srchash,swap->I.req.desthash,channel,0x4000000,(void *)&swap->I.req.requestid,sizeof(swap->I.req.requestid)); //,60); - if ( swap->I.iambob == 0 && swap->connected == 0 ) - basilisk_psockinit(myinfo,swap,0); + if ( swap->connected == 0 ) + basilisk_psockinit(myinfo,swap,swap->I.iambob != 0); if ( swap->connected != 0 ) { printf("A r%u/q%u swapstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits); @@ -2101,6 +2109,8 @@ void basilisk_swaploop(void *_swap) } while ( retval == 0 && (swap->I.statebits & 0x20) == 0 && time(NULL) < expiration ) { + if ( swap->connected == 0 ) + basilisk_psockinit(myinfo,swap,swap->I.iambob != 0); printf("B r%u/q%u swapstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits); basilisk_sendstate(myinfo,swap,data,maxlen); basilisk_sendchoosei(myinfo,swap,data,maxlen); @@ -2132,6 +2142,8 @@ void basilisk_swaploop(void *_swap) } while ( retval == 0 && (swap->I.statebits & 0x40) == 0 ) // send fee { + if ( swap->connected == 0 ) + basilisk_psockinit(myinfo,swap,swap->I.iambob != 0); //dpow_nanomsg_update(myinfo); //dex_updateclient(myinfo); //printf("sendstate.%x\n",swap->I.statebits); From 8b137c57c5043848d6e611833cea5e3638bada9f Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Mar 2017 10:21:29 +0200 Subject: [PATCH 415/495] Test --- basilisk/basilisk_swap.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 516509e15..7dd4c70eb 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1176,7 +1176,13 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw { printf("sentbytes.%d vs offset.%d\n",sentbytes,offset); if ( sentbytes < 0 ) + { + if ( swap->pushsock >= 0 ) + nn_close(swap->pushsock), swap->pushsock = -1; + if ( swap->subsock >= 0 ) + nn_close(swap->subsock), swap->subsock = -1; swap->connected = 0; + } } //else printf("send.[%d] %x offset.%d datalen.%d [%llx]\n",sentbytes,msgbits,offset,datalen,*(long long *)data); free(buf); From 0f2a167e8d6edd71cfd4986c0ebfadccf02b61de Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Mar 2017 10:56:08 +0200 Subject: [PATCH 416/495] Test --- basilisk/basilisk_swap.c | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 7dd4c70eb..2aa853b64 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -13,7 +13,8 @@ * * ******************************************************************************/ -/*use external privkey to sign +/* + resume handling: list of tx broadcast, tx pending + required items, reconnect state machine or have statemachine assume off by one or state/otherstate specific handling make sure to broadcast deposit before claiming refund, or to just skip it if neither is done */ @@ -1434,7 +1435,7 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv swap->I.bobconfirms = swap->bobcoin->chain->minconfirms; if ( swap->I.aliceconfirms == 0 ) swap->I.aliceconfirms = swap->alicecoin->chain->minconfirms; - jumblrflag = bits256_cmp(privkey,myinfo->persistent_priv) != 0; + jumblrflag = (bits256_cmp(pubkey25519,myinfo->jumblr_pubkey) == 0 || bits256_cmp(pubkey25519,myinfo->jumblr_depositkey) == 0); if ( swap->I.iambob != 0 ) { basilisk_rawtx_setparms("myfee",swap->I.req.quoteid,&swap->myfee,swap->bobcoin,0,0,swap->I.bobsatoshis/INSTANTDEX_DECKSIZE,0,0,jumblrflag); @@ -1623,7 +1624,7 @@ int32_t basilisk_verify_privkeys(struct supernet_info *myinfo,void *ptr,uint8_t return(errs); } -uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,struct basilisk_rawtx *rawtx,uint32_t nextbits) +uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,struct basilisk_rawtx *rawtx,uint32_t nextbits,int32_t suppress_swapsend) { uint8_t sendbuf[32768]; int32_t sendlen; if ( basilisk_swapdata_rawtx(myinfo,swap,data,maxlen,rawtx) != 0 ) @@ -1647,7 +1648,9 @@ uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilis sendlen += rawtx->I.redeemlen; } //printf("sendlen.%d datalen.%d redeemlen.%d\n",sendlen,rawtx->datalen,rawtx->redeemlen); - return(basilisk_swapsend(myinfo,swap,msgbits,sendbuf,sendlen,nextbits,rawtx->I.crcs)); + if ( suppress_swapsend == 0 ) + return(basilisk_swapsend(myinfo,swap,msgbits,sendbuf,sendlen,nextbits,rawtx->I.crcs)); + else return(0); } } return(nextbits); @@ -1797,7 +1800,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); basilisk_sendstate(myinfo,swap,data,maxlen); if ( (swap->I.otherstatebits & 0x80) == 0 ) - basilisk_swapdata_rawtxsend(myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40); + basilisk_swapdata_rawtxsend(myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40,0); } while ( retval == 0 && time(NULL) < swap->I.expiration ) // both sides have setup required data and paid txfee { @@ -1811,7 +1814,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap if ( (swap->I.statebits & 0x100) == 0 ) { printf("send bobdeposit\n"); - swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x200,data,maxlen,&swap->bobdeposit,0x100); + swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x200,data,maxlen,&swap->bobdeposit,0x100,0); } // [BLOCKING: altfound] make sure altpayment is confirmed and send payment else if ( (swap->I.statebits & 0x1000) == 0 ) @@ -1835,7 +1838,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap { basilisk_bobscripts_set(myinfo,swap,0,1); printf("send bobpayment\n"); - swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x8000,data,maxlen,&swap->bobpayment,0x4000); + swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x8000,data,maxlen,&swap->bobpayment,0x4000,0); } // [BLOCKING: privM] Bob waits for privAm either from Alice or alice blockchain else if ( (swap->I.statebits & 0x40000) == 0 ) @@ -1844,7 +1847,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap { printf("got privi spend alicepayment, dont divulge privBn until bobspend propagated\n"); basilisk_alicepayment_spend(myinfo,swap,&swap->bobspend); - if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobspend,0x40000) == 0 ) + if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobspend,0x40000,1) == 0 ) printf("Bob error spending alice payment\n"); else { @@ -1867,7 +1870,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap // submit reclaim of payment printf("bob reclaims bobpayment\n"); swap->I.statebits |= (0x40000 | 0x80000); - if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobreclaim,0) == 0 ) + if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobreclaim,0,0) == 0 ) printf("Bob error reclaiming own payment after alice timed out\n"); else { @@ -1911,7 +1914,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap else if ( (swap->I.statebits & 0x800) == 0 ) { printf("send alicepayment\n"); - swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x1000,data,maxlen,&swap->alicepayment,0x800); + swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x1000,data,maxlen,&swap->alicepayment,0x800,0); } // [BLOCKING: payfound] make sure payment is confrmed and send in spend or see bob's reclaim and claim else if ( (swap->I.statebits & 0x8000) == 0 ) @@ -1935,7 +1938,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap else if ( (swap->I.statebits & 0x20000) == 0 ) { printf("alicespend bobpayment\n"); - if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->alicespend,0x20000) != 0 && basilisk_numconfirms(myinfo,swap,&swap->alicespend) > 0 ) + if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->alicespend,0x20000,0) != 0 && basilisk_numconfirms(myinfo,swap,&swap->alicespend) > 0 ) { for (j=datalen=0; j<32; j++) data[datalen++] = swap->I.privAm.bytes[j]; @@ -1955,7 +1958,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap if ( swap->bobdeposit.I.locktime != 0 && time(NULL) > swap->bobdeposit.I.locktime ) { printf("Alice claims deposit\n"); - if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->aliceclaim,0) == 0 ) + if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->aliceclaim,0,0) == 0 ) printf("Alice couldnt claim deposit\n"); else { @@ -1967,7 +1970,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap { printf("Alice reclaims her payment\n"); swap->I.statebits |= 0x40000000; - if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->alicereclaim,0x40000000) == 0 ) + if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->alicereclaim,0x40000000,0) == 0 ) printf("Alice error sending alicereclaim\n"); else { @@ -2228,7 +2231,7 @@ void basilisk_swaploop(void *_swap) if ( basilisk_rawtx_gen("myfee",myinfo,swap->I.started,swap->persistent_pubkey33,swap->I.iambob,1,&swap->myfee,0,swap->myfee.spendscript,swap->myfee.I.spendlen,swap->myfee.coin->chain->txfee,1,0) == 0 ) { printf("done generate fee\n"); - swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40); + swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40,0); iguana_unspents_mark(myinfo,swap->I.iambob!=0?swap->bobcoin:swap->alicecoin,swap->myfee.vins); basilisk_txlog(myinfo,swap,&swap->myfee,-1); for (i=0; imyfee.I.spendlen; i++) @@ -2260,7 +2263,7 @@ void basilisk_swaploop(void *_swap) { printf("BOB reclaims refund\n"); basilisk_bobdeposit_refund(myinfo,swap,0); - if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobrefund,0x40000000) == 0 ) // use secretBn + if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobrefund,0x40000000,0) == 0 ) // use secretBn { printf("Bob submit error getting refund of deposit\n"); } From f89bc4dff642f450ce88904d81f3aea3f501f092 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Mar 2017 11:07:54 +0200 Subject: [PATCH 417/495] Test --- basilisk/basilisk_swap.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 2aa853b64..b33cdf1d0 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -333,7 +333,7 @@ int32_t _basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,uint32_ bitcoin_priv2wif(wifstr,*privkey2,rawtx->coin->chain->wiftype); jaddistr(privkeys,wifstr); V[0].N = V[0].M = 2; - char str[65]; printf("add second privkey.(%s) %s\n",jprint(privkeys,0),bits256_str(str,*privkey2)); + //char str[65]; printf("add second privkey.(%s) %s\n",jprint(privkeys,0),bits256_str(str,*privkey2)); } else V[0].N = V[0].M = 1; V[0].suppress_pubkeys = dest->I.suppress_pubkeys; V[0].ignore_cltverr = ignore_cltverr; @@ -372,11 +372,11 @@ int32_t _basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,uint32_ jaddi(vins,item); jdelete(txobj,"vin"); jadd(txobj,"vin",vins); - printf("basilisk_rawtx_sign locktime.%u/%u for %s spendscript.%s -> %s, suppress.%d\n",rawtx->I.locktime,dest->I.locktime,rawtx->name,hexstr,dest->name,dest->I.suppress_pubkeys); + //printf("basilisk_rawtx_sign locktime.%u/%u for %s spendscript.%s -> %s, suppress.%d\n",rawtx->I.locktime,dest->I.locktime,rawtx->name,hexstr,dest->name,dest->I.suppress_pubkeys); txobj = bitcoin_txoutput(txobj,dest->spendscript,dest->I.spendlen,dest->I.amount); if ( (rawtxbytes= bitcoin_json2hex(myinfo,rawtx->coin,&dest->I.txid,txobj,V)) != 0 ) { - printf("rawtx.(%s) vins.%p\n",rawtxbytes,vins); + //printf("rawtx.(%s) vins.%p\n",rawtxbytes,vins); if ( needsig == 0 ) signedtx = rawtxbytes; if ( signedtx != 0 || (signedtx= iguana_signrawtx(myinfo,rawtx->coin,height,&dest->I.signedtxid,&dest->I.completed,vins,rawtxbytes,privkeys,V)) != 0 ) @@ -1216,7 +1216,7 @@ int32_t basilisk_privBn_extract(struct supernet_info *myinfo,struct basilisk_swa { if ( basilisk_priviextract(myinfo,swap->bobcoin,"privBn",&swap->I.privBn,swap->I.secretBn,swap->bobrefund.I.actualtxid,0) == 0 ) { - + printf("extracted privBn from blockchain\n"); } if ( basilisk_swapget(myinfo,swap,0x40000000,data,maxlen,basilisk_verify_privi) == 0 ) { @@ -1650,7 +1650,11 @@ uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilis //printf("sendlen.%d datalen.%d redeemlen.%d\n",sendlen,rawtx->datalen,rawtx->redeemlen); if ( suppress_swapsend == 0 ) return(basilisk_swapsend(myinfo,swap,msgbits,sendbuf,sendlen,nextbits,rawtx->I.crcs)); - else return(0); + else + { + printf("suppress swapsend %x\n",msgbits); + return(0); + } } } return(nextbits); @@ -2261,6 +2265,7 @@ void basilisk_swaploop(void *_swap) printf("end of atomic swap\n"); if ( swap->I.iambob != 0 && swap->bobdeposit.txbytes != 0 ) { + sleep(300); // wait for confirm of msig printf("BOB reclaims refund\n"); basilisk_bobdeposit_refund(myinfo,swap,0); if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobrefund,0x40000000,0) == 0 ) // use secretBn From 932a461abc690977fbe61cc312f430502adfd1d2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Mar 2017 11:13:38 +0200 Subject: [PATCH 418/495] Test --- basilisk/basilisk_swap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index b33cdf1d0..18e41e56f 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1187,7 +1187,7 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw } //else printf("send.[%d] %x offset.%d datalen.%d [%llx]\n",sentbytes,msgbits,offset,datalen,*(long long *)data); free(buf); - return(0); + return(nextbits); } int32_t basilisk_priviextract(struct supernet_info *myinfo,struct iguana_info *coin,char *name,bits256 *destp,uint8_t secret160[20],bits256 srctxid,int32_t srcvout) @@ -1946,8 +1946,8 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap { for (j=datalen=0; j<32; j++) data[datalen++] = swap->I.privAm.bytes[j]; - printf("send privAm\n"); swap->I.statebits |= basilisk_swapsend(myinfo,swap,0x40000,data,datalen,0x20000,swap->I.crcs_mypriv); + printf("send privAm %x\n",swap->I.statebits); } } else if ( (swap->I.statebits & 0x40000) == 0 ) From c091a58ffe86ffadfbd14b824d44e5eb4f6328bd Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Mar 2017 19:17:39 +0200 Subject: [PATCH 419/495] Revert walletpassphrase change --- iguana/SuperNET_keys.c | 4 +--- iguana/iguana_rpc.c | 3 ++- iguana/iguana_wallet.c | 3 --- iguana/main.c | 3 +-- 4 files changed, 4 insertions(+), 9 deletions(-) diff --git a/iguana/SuperNET_keys.c b/iguana/SuperNET_keys.c index 62fdb1b34..7ecab7989 100755 --- a/iguana/SuperNET_keys.c +++ b/iguana/SuperNET_keys.c @@ -22,8 +22,6 @@ #include "../includes/curve25519.h" #include "../includes/cJSON.h" -extern int32_t EncryptWallet; - /* if ( 0 ) { @@ -377,7 +375,7 @@ char *SuperNET_keysinit(struct supernet_info *myinfo,char *argjsonstr) SuperNET_parsemyinfo(myinfo,msgjson); free_json(msgjson); } - else if ( EncryptWallet != 0 ) + else { if ( bits256_nonz(myinfo->persistent_priv) == 0 ) { diff --git a/iguana/iguana_rpc.c b/iguana/iguana_rpc.c index 771ca66c6..19d546676 100755 --- a/iguana/iguana_rpc.c +++ b/iguana/iguana_rpc.c @@ -31,7 +31,8 @@ char *sglue(GLUEARGS,char *agent,char *method) //printf("userpass.(%s)\n",userpass); jaddstr(json,"agent",agent); jaddstr(json,"method",method); - jaddstr(json,"coin",coin->symbol); + if ( coin != 0 ) + jaddstr(json,"coin",coin->symbol); if ( userpass != 0 ) jaddstr(json,"userpass",userpass); if ( coin != 0 && coin->FULLNODE >= 0 && coin->chain->userpass[0] != 0 ) diff --git a/iguana/iguana_wallet.c b/iguana/iguana_wallet.c index bdb940621..90303ae80 100755 --- a/iguana/iguana_wallet.c +++ b/iguana/iguana_wallet.c @@ -15,7 +15,6 @@ #include "iguana777.h" #include "exchanges/bitcoin.h" -extern int32_t EncryptWallet; void scrubfree(char *sensitivestr) { @@ -1393,7 +1392,6 @@ THREE_STRINGS(bitcoinrpc,encryptwallet,passphrase,password,permanentfile) strcpy(myinfo->password,password); if ( permanentfile != 0 ) strcpy(myinfo->permanentfile,permanentfile); - EncryptWallet = 1; retstr = SuperNET_login(IGUANA_CALLARGS,myinfo->handle,myinfo->secret,myinfo->permanentfile,myinfo->password); //myinfo->expiration = (uint32_t)time(NULL) + 3600*24; struct iguana_waddress waddr; struct iguana_waccount *wacct; @@ -1436,7 +1434,6 @@ THREE_STRINGS(bitcoinrpc,encryptwallet,passphrase,password,permanentfile) //iguana_walletinitcheck(myinfo,coin); myinfo->dirty = (uint32_t)time(NULL); myinfo->expiration = 0; - EncryptWallet = 0; return(retstr); } diff --git a/iguana/main.c b/iguana/main.c index 61caaa28f..ca2439b97 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -24,7 +24,6 @@ #include "../pnacl_main.h" #include "iguana777.h" -int32_t EncryptWallet; struct iguana_jsonitem { struct queueitem DL; struct supernet_info *myinfo; uint32_t fallback,expired,allocsize; char *retjsonstr; char remoteaddr[64]; uint16_t port; char jsonstr[]; }; @@ -1587,7 +1586,7 @@ FOUR_STRINGS(SuperNET,login,handle,password,permanentfile,passphrase) free(myinfo->decryptstr); myinfo->decryptstr = 0; } - if ( passphrase != 0 && passphrase[0] != 0 && EncryptWallet != 0 ) + if ( passphrase != 0 && passphrase[0] != 0 ) { SuperNET_setkeys(myinfo,passphrase,(int32_t)strlen(passphrase),1); if ( myinfo->decryptstr != 0 && (argjson= cJSON_Parse(myinfo->decryptstr)) != 0 ) From 395f6521c45bcb7ace4e188abd46b75fda3240b0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Mar 2017 20:30:53 +0200 Subject: [PATCH 420/495] batch13 --- iguana/main.c | 6 +- iguana/tests/KMD.batch12.listunspent | 54 +++++----- iguana/tests/KMD.batch13 | 146 +++++++++++++++++++++++++++ iguana/tests/KMD.batch13.listunspent | 118 ++++++++++++++++++++++ iguana/tests/LPinit | 5 +- iguana/tests/dexgetbalance | 3 +- 6 files changed, 298 insertions(+), 34 deletions(-) create mode 100755 iguana/tests/KMD.batch13 create mode 100755 iguana/tests/KMD.batch13.listunspent diff --git a/iguana/main.c b/iguana/main.c index ca2439b97..458d63537 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1626,7 +1626,7 @@ void komodo_ICO_batch(cJSON *array,int32_t batchid) if ( (n= cJSON_GetArraySize(array)) > 0 ) { totalKMD = totalREVS = 0; - for (iter=3; iter<4; iter++) + for (iter=0; iter<1; iter++) for (i=0; i Date: Fri, 10 Mar 2017 21:09:57 +0200 Subject: [PATCH 421/495] Reduce include nesting a bit --- basilisk/basilisk.c | 550 +++++++++++++++++++++++++++++++ basilisk/basilisk_DEX.c | 243 -------------- basilisk/basilisk_MSG.c | 61 ---- basilisk/basilisk_bitcoin.c | 169 ---------- basilisk/jumblr.c | 97 ------ basilisk/smartaddress.c | 5 - basilisk/tradebots_liquidity.c | 90 +++++ basilisk/tradebots_marketmaker.c | 94 ------ gecko/gecko.c | 46 --- iguana/SuperNET_keys.c | 48 --- iguana/iguana_bitmap.c | 39 --- iguana/iguana_payments.c | 95 ++++++ iguana/iguana_sign.c | 101 ------ iguana/main.c | 120 +++++++ includes/iguana_funcs.h | 6 + 15 files changed, 861 insertions(+), 903 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 47c997c14..b6ca2cf51 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -954,6 +954,319 @@ void basilisks_init(struct supernet_info *myinfo) #include "../includes/iguana_apidefs.h" #include "../includes/iguana_apideclares.h" +HASH_ARRAY_STRING(basilisk,getmessage,hash,vals,hexstr) +{ + uint32_t msgid,width,channel; char *retstr; + if ( bits256_cmp(GENESIS_PUBKEY,jbits256(vals,"srchash")) == 0 ) + jaddbits256(vals,"srchash",hash); + if ( bits256_cmp(GENESIS_PUBKEY,jbits256(vals,"desthash")) == 0 ) + jaddbits256(vals,"desthash",myinfo->myaddr.persistent); + if ( (msgid= juint(vals,"msgid")) == 0 ) + { + msgid = (uint32_t)time(NULL); + jdelete(vals,"msgid"); + jaddnum(vals,"msgid",msgid); + } + if ( myinfo->NOTARY.RELAYID >= 0 || myinfo->dexsock >= 0 || myinfo->subsock >= 0 ) + { + channel = juint(vals,"channel"); + width = juint(vals,"width"); + retstr = basilisk_iterate_MSG(myinfo,channel,msgid,jbits256(vals,"srchash"),jbits256(vals,"desthash"),width); + //printf("getmessage.(%s)\n",retstr); + return(retstr); + } + //printf("getmessage not relay.%d dexsock.%d subsock.%d\n",myinfo->NOTARY.RELAYID,myinfo->dexsock,myinfo->subsock); + return(basilisk_standardservice("MSG",myinfo,0,jbits256(vals,"desthash"),vals,hexstr,1)); +} + +HASH_ARRAY_STRING(basilisk,sendmessage,hash,vals,hexstr) +{ + int32_t keylen,datalen,allocsize = 65536; uint8_t key[BASILISK_KEYSIZE],*space,*space2,*data,*ptr = 0; char *retstr=0; + space = calloc(1,allocsize); + space2 = calloc(1,allocsize); + data = get_dataptr(BASILISK_HDROFFSET,&ptr,&datalen,&space[BASILISK_KEYSIZE],allocsize-BASILISK_KEYSIZE,hexstr); + if ( myinfo->subsock >= 0 || myinfo->dexsock >= 0 || (myinfo->IAMNOTARY != 0 && myinfo->NOTARY.RELAYID >= 0) ) + { + keylen = basilisk_messagekey(key,juint(vals,"channel"),juint(vals,"msgid"),jbits256(vals,"srchash"),jbits256(vals,"desthash")); + if ( data != 0 ) + { + retstr = basilisk_respond_addmessage(myinfo,key,keylen,data,datalen,0,juint(vals,"duration")); + } else printf("no get_dataptr\n"); + if ( retstr != 0 ) + free(retstr); + } //else printf("not notary.%d relayid.%d\n",myinfo->IAMNOTARY,myinfo->NOTARY.RELAYID); + if ( vals != 0 && juint(vals,"fanout") == 0 ) + jaddnum(vals,"fanout",MAX(8,(int32_t)sqrt(myinfo->NOTARY.NUMRELAYS)+2)); + if ( BASILISK_KEYSIZE+datalen < allocsize ) + { + memcpy(space2,key,BASILISK_KEYSIZE); + if ( data != 0 && datalen != 0 ) + memcpy(&space2[BASILISK_KEYSIZE],data,datalen); + dex_reqsend(myinfo,"DEX",space2,datalen+BASILISK_KEYSIZE,1,""); + } else printf("sendmessage space too small error for %d\n",datalen); + free(space); + free(space2); + if ( ptr != 0 ) + free(ptr); + return(basilisk_standardservice("OUT",myinfo,0,jbits256(vals,"desthash"),vals,hexstr,0)); +} + +HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr) +{ + char *retstr=0,*symbol,*coinaddr,*infostr; cJSON *retjson,*sobj,*info,*addrs,*txoutjson,*txjson,*array; uint32_t basilisktag,blocktime; bits256 txid,blockhash; struct basilisk_item *ptr,Lptr; uint64_t value; int32_t timeoutmillis,vout,height,n,m; + if ( vals == 0 ) + return(clonestr("{\"error\":\"null valsobj\"}")); + //if ( myinfo->IAMNOTARY != 0 || myinfo->NOTARY.RELAYID >= 0 ) + // return(clonestr("{\"error\":\"special relays only do OUT and MSG\"}")); + //if ( coin == 0 ) + { + if ( (symbol= jstr(vals,"symbol")) != 0 || (symbol= jstr(vals,"coin")) != 0 ) + coin = iguana_coinfind(symbol); + } + if ( jobj(vals,"fanout") == 0 ) + jaddnum(vals,"fanout",MAX(5,(int32_t)sqrt(myinfo->NOTARY.NUMRELAYS)+1)); + txid = jbits256(vals,"txid"); + vout = jint(vals,"vout"); + if ( coin != 0 ) + { + if ( coin->FULLNODE < 0 ) + { + if ( (txoutjson= dpow_gettxout(myinfo,coin,txid,vout)) != 0 ) + { + if ( (coinaddr= jstr(txoutjson,"address")) != 0 && (value= SATOSHIDEN*jdouble(txoutjson,"value")) != 0 ) + { + retjson = cJSON_CreateObject(); + jaddstr(retjson,"result","success"); + jaddstr(retjson,"address",coinaddr); + jadd64bits(retjson,"satoshis",value); + jaddnum(retjson,"value",dstr(value)); + jaddnum(retjson,"amount",dstr(value)); + height = dpow_getchaintip(myinfo,&blockhash,&blocktime,0,0,coin); + jaddnum(retjson,"height",height); + jaddnum(retjson,"numconfirms",jint(txoutjson,"confirmations")); + jaddbits256(retjson,"txid",txid); + jaddnum(retjson,"vout",vout); + jaddstr(retjson,"coin",coin->symbol); + } + else + { + free_json(txoutjson); + return(clonestr("{\"error\":\"return from gettxout missing fields\"}")); + } + free_json(txoutjson); + return(jprint(retjson,1)); + } else return(clonestr("{\"error\":\"null return from gettxout\"}")); + } + if ( (basilisktag= juint(vals,"basilisktag")) == 0 ) + basilisktag = rand(); + if ( (timeoutmillis= juint(vals,"timeout")) <= 0 ) + timeoutmillis = BASILISK_TIMEOUT; + if ( coin->FULLNODE > 0 && (ptr= basilisk_bitcoinvalue(&Lptr,myinfo,coin,remoteaddr,basilisktag,timeoutmillis,vals)) != 0 ) + { + retstr = ptr->retstr, ptr->retstr = 0; + ptr->finished = OS_milliseconds() + 10000; + return(retstr); + } + } + if ( myinfo->reqsock >= 0 ) + { + if ( (retstr= _dex_getrawtransaction(myinfo,symbol,txid)) != 0 ) + { + if ( (txoutjson= cJSON_Parse(retstr)) != 0 ) + { + //printf("TX.(%s)\n",jprint(txoutjson,0)); + retjson = cJSON_CreateObject(); + jaddstr(retjson,"result","success"); + jaddnum(retjson,"numconfirms",jint(txoutjson,"confirmations")); + if ( (array= jarray(&n,txoutjson,"vout")) != 0 && vout < n && (txjson= jitem(array,vout)) != 0 ) + { + //printf("txjson.(%s)\n",jprint(txjson,0)); + if ( (value= jdouble(txjson,"value") * SATOSHIDEN) != 0 ) + { + if ( (sobj= jobj(txjson,"scriptPubKey")) != 0 && (addrs= jarray(&m,sobj,"addresses")) != 0 && (coinaddr= jstri(addrs,0)) != 0 ) + jaddstr(retjson,"address",coinaddr); + jadd64bits(retjson,"satoshis",value); + jaddnum(retjson,"value",dstr(value)); + if ( (infostr= _dex_getinfo(myinfo,symbol)) != 0 ) + { + if ( (info= cJSON_Parse(infostr)) != 0 ) + { + if ( (height= jint(info,"blocks")) > 0 ) + { + height -= jint(txoutjson,"confirmations"); + jaddnum(retjson,"height",height); + } + free_json(info); + } + free(infostr); + } + jaddbits256(retjson,"txid",txid); + jaddnum(retjson,"vout",vout); + jaddstr(retjson,"coin",symbol); + free(retstr); + free_json(txoutjson); + return(jprint(retjson,1)); + } + } + free_json(txoutjson); + return(jprint(retjson,1)); + } + return(retstr); + } + } + return(basilisk_standardservice("VAL",myinfo,0,hash,vals,hexstr,1)); +} + +HASH_ARRAY_STRING(basilisk,rawtx,hash,vals,hexstr) +{ + char *retstr=0,*symbol; uint32_t basilisktag; int32_t timeoutmillis,i,retval = -1; uint64_t amount,txfee; cJSON *retarray; + if ( vals == 0 ) + return(clonestr("{\"error\":\"null valsobj\"}")); + //if ( coin == 0 ) + { + if ( (symbol= jstr(vals,"symbol")) != 0 || (symbol= jstr(vals,"coin")) != 0 ) + coin = iguana_coinfind(symbol); + } + if ( jobj(vals,"numrequired") == 0 ) + jaddnum(vals,"numrequired",MIN(3,(int32_t)sqrt(myinfo->NOTARY.NUMRELAYS)+1)); + if ( jobj(vals,"fanout") == 0 ) + jaddnum(vals,"fanout",MAX(3,(int32_t)sqrt(myinfo->NOTARY.NUMRELAYS)+1)); + if ( coin != 0 ) + { + //if ( juint(vals,"burn") == 0 ) + // jaddnum(vals,"burn",0.0001); + if ( (basilisktag= juint(vals,"basilisktag")) == 0 ) + basilisktag = rand(); + if ( (timeoutmillis= juint(vals,"timeout")) <= 0 ) + timeoutmillis = BASILISK_TIMEOUT; + if ( (retstr= basilisk_bitcoinrawtx(myinfo,coin,remoteaddr,basilisktag,timeoutmillis,vals,0)) != 0 ) + { + printf("rawtx.(%s)\n",retstr); + if ( (amount= j64bits(vals,"satoshis")) == 0 ) + amount = jdouble(vals,"value") * SATOSHIDEN; + if ( (txfee= j64bits(vals,"txfee")) == 0 ) + txfee = coin->chain->txfee; + if ( txfee == 0 ) + txfee = 10000; + retval = -1; + if ( (retarray= cJSON_Parse(retstr)) != 0 ) + { + if ( is_cJSON_Array(retarray) != 0 ) + { + for (i=0; iFULLNODE >= 0 ) + return(clonestr("{\"error\":\"no passphrase or no native komodod\"}")); + else + { + safecopy(myinfo->jumblr_passphrase,passphrase,sizeof(myinfo->jumblr_passphrase)); + retjson = cJSON_CreateObject(); + jaddstr(retjson,"result","success"); + privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + smartaddress_add(myinfo,privkey,BTCaddr,KMDaddr); + myinfo->jumblr_depositkey = curve25519(privkey,curve25519_basepoint9()); + bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); + if ( coin->FULLNODE < 0 ) + jumblr_importprivkey(myinfo,coin,wifstr); + jaddstr(retjson,"KMDdeposit",KMDaddr); + jaddstr(retjson,"BTCdeposit",BTCaddr); + if ( (coinbtc= iguana_coinfind("BTC")) != 0 ) + { + bitcoin_priv2wif(wifstr,privkey,coinbtc->chain->wiftype); + if ( coinbtc->FULLNODE < 0 ) + jumblr_importprivkey(myinfo,coinbtc,wifstr); + jaddnum(retjson,"BTCdeposits",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); + } + privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); + smartaddress_add(myinfo,privkey,BTCaddr,KMDaddr); + myinfo->jumblr_pubkey = curve25519(privkey,curve25519_basepoint9()); + jaddstr(retjson,"KMDjumblr",KMDaddr); + jaddstr(retjson,"BTCjumblr",BTCaddr); + if ( coinbtc != 0 ) + jaddnum(retjson,"BTCjumbled",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); + return(jprint(retjson,1)); + } +} + +ZERO_ARGS(jumblr,status) +{ + cJSON *retjson; char KMDaddr[64],BTCaddr[64]; struct jumblr_item *ptr,*tmp; struct iguana_info *coinbtc; int64_t received,deposited,jumblred,step_t2z,step_z2z,step_z2t,finished,pending,maxval,minval; + if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 ) + { + jumblr_opidsupdate(myinfo,coin); + retjson = cJSON_CreateObject(); + step_t2z = step_z2z = step_z2t = deposited = finished = pending = 0; + jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + jaddstr(retjson,"KMDdeposit",KMDaddr); + jaddstr(retjson,"BTCdeposit",BTCaddr); + if ( (coinbtc= iguana_coinfind("BTC")) != 0 ) + jaddnum(retjson,"BTCdeposits",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); + received = jumblr_receivedby(myinfo,coin,KMDaddr); + deposited = jumblr_balance(myinfo,coin,KMDaddr); + jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); + jaddstr(retjson,"KMDjumblr",KMDaddr); + jaddstr(retjson,"BTCjumblr",BTCaddr); + if ( coinbtc != 0 ) + jaddnum(retjson,"BTCjumbled",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); + finished = jumblr_receivedby(myinfo,coin,KMDaddr); + jumblred = jumblr_balance(myinfo,coin,KMDaddr); + HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) + { + if ( strlen(ptr->src) >= 40 ) + { + if ( strlen(ptr->dest) >= 40 ) + step_z2z += ptr->amount; + else step_z2t += ptr->amount; + } else step_t2z += ptr->amount; + } + jaddstr(retjson,"result","success"); + jaddnum(retjson,"deposits",dstr(deposited)); + jaddnum(retjson,"t_to_z",dstr(step_t2z)); + jaddnum(retjson,"z_to_z",dstr(step_z2z)); + jaddnum(retjson,"z_to_t",dstr(step_z2t)); + maxval = MAX(step_t2z,MAX(step_z2z,step_z2t)); + minval = MIN(step_t2z,MIN(step_z2z,step_z2t)); + if ( maxval > minval ) + { + pending = (maxval - minval); + if ( pending < finished*.1 ) + pending = 0; + } + jaddnum(retjson,"pending",dstr(pending)); + jaddnum(retjson,"jumbled",dstr(jumblred)); + jaddnum(retjson,"received",dstr(received)); + jaddnum(retjson,"finished",dstr(finished)); + return(jprint(retjson,1)); + } + else + { + printf("(%s) (%s) %d\n",coin->symbol,myinfo->jumblr_passphrase,coin->FULLNODE); + return(clonestr("{\"error\":\"jumblr status no passphrase or no native komodod\"}")); + } +} + HASH_ARRAY_STRING(basilisk,balances,hash,vals,hexstr) { char *retstr=0,*symbol; uint32_t basilisktag; struct basilisk_item *ptr,Lptr; int32_t timeoutmillis; @@ -1189,5 +1502,242 @@ STRING_ARRAY_OBJ_STRING(basilisk,utxorawtx,symbol,utxos,vals,ignore) //int64_t iguana_verifytimelock(struct supernet_info *myinfo,struct iguana_info *coin,uint32_t timelocked,char *destaddr,bits256 txid,int32_t vout) +THREE_STRINGS_AND_DOUBLE(tradebot,aveprice,comment,base,rel,basevolume) +{ + double retvals[4],aveprice; cJSON *retjson = cJSON_CreateObject(); + aveprice = instantdex_avehbla(myinfo,retvals,base,rel,basevolume); + jaddstr(retjson,"result","success"); + jaddnum(retjson,"aveprice",aveprice); + jaddnum(retjson,"avebid",retvals[0]); + jaddnum(retjson,"bidvol",retvals[1]); + jaddnum(retjson,"aveask",retvals[2]); + jaddnum(retjson,"askvol",retvals[3]); + return(jprint(retjson,1)); +} + +ZERO_ARGS(InstantDEX,allcoins) +{ + struct iguana_info *tmp; cJSON *native,*notarychains,*basilisk,*virtual,*full,*retjson = cJSON_CreateObject(); + full = cJSON_CreateArray(); + native = cJSON_CreateArray(); + basilisk = cJSON_CreateArray(); + virtual = cJSON_CreateArray(); + notarychains = cJSON_CreateArray(); + HASH_ITER(hh,myinfo->allcoins,coin,tmp) + { + if ( coin->FULLNODE < 0 ) + jaddistr(native,coin->symbol); + //else if ( coin->virtualchain != 0 ) + // jaddistr(virtual,coin->symbol); + else if ( coin->FULLNODE > 0 )//|| coin->VALIDATENODE > 0 ) + jaddistr(full,coin->symbol); + //else if ( coin->notarychain >= 0 ) + // jaddistr(notarychains,coin->symbol); + else jaddistr(basilisk,coin->symbol); + } + jadd(retjson,"native",native); + jadd(retjson,"basilisk",basilisk); + jadd(retjson,"full",full); + //jadd(retjson,"virtual",virtual); + //jadd(retjson,"notarychains",notarychains); + return(jprint(retjson,1)); +} + +STRING_ARG(InstantDEX,available,source) +{ + uint64_t total = 0; int32_t i,n=0; char coinaddr[64]; cJSON *item,*unspents,*retjson = 0; + if ( source != 0 && source[0] != 0 && (coin= iguana_coinfind(source)) != 0 ) + { + if ( myinfo->expiration != 0 ) + { + bitcoin_address(coinaddr,coin->chain->pubtype,myinfo->persistent_pubkey33,33); + if ( (unspents= basilisk_unspents(myinfo,coin,coinaddr)) != 0 ) + { + //printf("available.(%s)\n",jprint(unspents,0)); + if ( (n= cJSON_GetArraySize(unspents)) > 0 ) + { + for (i=0; i %.8f\n",jprint(item,0),dstr(total)); + } + } + free_json(unspents); + } + retjson = cJSON_CreateObject(); + jaddnum(retjson,"result",dstr(total)); + printf(" n.%d total %.8f (%s)\n",n,dstr(total),jprint(retjson,0)); + return(jprint(retjson,1)); + } + printf("InstantDEX_available: need to unlock wallet\n"); + return(clonestr("{\"error\":\"need to unlock wallet\"}")); + } + printf("InstantDEX_available: %s is not active\n",source!=0?source:""); + return(clonestr("{\"error\":\"specified coin is not active\"}")); +} + +HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr) +{ + uint8_t serialized[512]; bits256 privkey; char buf[512],BTCaddr[64],KMDaddr[64]; struct basilisk_request R; int32_t jumblr,iambob,optionhours; cJSON *reqjson; uint32_t datalen=0,DEX_channel; struct iguana_info *bobcoin,*alicecoin; + myinfo->DEXactive = (uint32_t)time(NULL) + 3*BASILISK_TIMEOUT + 60; + jadd64bits(vals,"minamount",jdouble(vals,"minprice") * jdouble(vals,"amount") * SATOSHIDEN * SATOSHIDEN); + if ( jobj(vals,"desthash") == 0 ) + jaddbits256(vals,"desthash",hash); + jadd64bits(vals,"satoshis",jdouble(vals,"amount") * SATOSHIDEN); + jadd64bits(vals,"destsatoshis",jdouble(vals,"destamount") * SATOSHIDEN); + jaddnum(vals,"timestamp",time(NULL)); + if ( (jumblr= jint(vals,"usejumblr")) != 0 ) + privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,jumblr == 1 ? JUMBLR_DEPOSITPREFIX : ""); + else privkey = myinfo->persistent_priv; + hash = curve25519(privkey,curve25519_basepoint9()); + if ( jobj(vals,"srchash") == 0 ) + jaddbits256(vals,"srchash",hash); + printf("service.(%s)\n",jprint(vals,0)); + memset(&R,0,sizeof(R)); + if ( basilisk_request_create(&R,vals,hash,juint(vals,"timestamp")) == 0 ) + { + iambob = bitcoin_coinptrs(hash,&bobcoin,&alicecoin,R.src,R.dest,privkey,GENESIS_PUBKEY); + if ( (optionhours= jint(vals,"optionhours")) != 0 ) + { + printf("iambob.%d optionhours.%d R.requestid.%u vs calc %u, q.%u\n",iambob,R.optionhours,R.requestid,basilisk_requestid(&R),R.quoteid); + if ( iambob != 0 && optionhours > 0 ) + { + sprintf(buf,"{\"error\":\"illegal call option request hours.%d when iambob.%d\"}",optionhours,iambob); + printf("ERROR.(%s)\n",buf); + return(clonestr(buf)); + } + else if ( iambob == 0 && optionhours < 0 ) + { + sprintf(buf,"{\"error\":\"illegal put option request hours.%d when iambob.%d\"}",optionhours,iambob); + printf("ERROR.(%s)\n",buf); + return(clonestr(buf)); + } + } + //if ( myinfo->IAMNOTARY != 0 || myinfo->NOTARY.RELAYID >= 0 ) + // R.relaybits = myinfo->myaddr.myipbits; + if ( (reqjson= basilisk_requestjson(&R)) != 0 ) + free_json(reqjson); + datalen = basilisk_rwDEXquote(1,serialized,&R); + //int32_t i; for (i=0; i 0 ) + { + uint32_t msgid;//,crc=0,crcs[2],numiters = 0; uint8_t buf[4096]; + memset(hash.bytes,0,sizeof(hash)); + msgid = (uint32_t)time(NULL); + DEX_channel = 'D' + ((uint32_t)'E' << 8) + ((uint32_t)'X' << 16); + basilisk_channelsend(myinfo,hash,hash,DEX_channel,msgid,serialized,datalen,60); + sleep(3); + /*while ( numiters < 10 && (crc= basilisk_crcsend(myinfo,0,buf,sizeof(buf),hash,myinfo->myaddr.persistent,DEX_channel,msgid,serialized,datalen,crcs)) == 0 ) + { + //printf("didnt get back what was sent\n"); + sleep(3); + basilisk_channelsend(myinfo,myinfo->myaddr.persistent,hash,DEX_channel,msgid,serialized,datalen,60); + numiters++; + }*/ + //if ( crc != 0 )//basilisk_channelsend(myinfo,R.srchash,R.desthash,DEX_channel,(uint32_t)time(NULL),serialized,datalen,30) == 0 ) + return(clonestr("{\"result\":\"DEX message sent\"}")); + //else return(clonestr("{\"error\":\"DEX message couldnt be sent\"}")); + } + return(clonestr("{\"error\":\"DEX message not sent\"}")); +} + +INT_ARG(InstantDEX,automatched,requestid) +{ + // return quoteid + myinfo->DEXactive = (uint32_t)time(NULL) + INSTANTDEX_LOCKTIME; + return(clonestr("{\"result\":\"automatched not yet\"}")); +} + +int32_t InstantDEX_incoming_func(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) +{ + //int32_t i; + //for (i=0; iDEXpoll) + 2*drift; + if ( width < (drift+1) ) + width = 2*drift+1; + else if ( width > 64 ) + width = 64; + myinfo->DEXpoll = now; + retjson = cJSON_CreateObject(); + DEX_channel = 'D' + ((uint32_t)'E' << 8) + ((uint32_t)'X' << 16); + msgid = (uint32_t)time(NULL) + drift; + if ( (retarray= basilisk_channelget(myinfo,zero,myinfo->myaddr.persistent,DEX_channel,msgid,width)) != 0 ) + { + //printf("GOT.(%s)\n",jprint(retarray,0)); + if ( (retval= basilisk_process_retarray(myinfo,0,InstantDEX_process_channelget,data,sizeof(data),DEX_channel,msgid,retarray,InstantDEX_incoming_func)) > 0 ) + { + jaddstr(retjson,"result","success"); + } else jaddstr(retjson,"error","cant process InstantDEX retarray"); + jadd(retjson,"responses",retarray); + } + else + { + jaddstr(retjson,"error","cant do InstantDEX channelget"); + printf("error channelget\n"); + } + return(jprint(retjson,1)); +} + +/*TWO_INTS(InstantDEX,swapstatus,requestid,quoteid) + { + cJSON *vals; char *retstr; + myinfo->DEXactive = (uint32_t)time(NULL) + INSTANTDEX_LOCKTIME; + //if ( myinfo->IAMLP != 0 ) + // return(basilisk_respond_swapstatus(myinfo,myinfo->myaddr.persistent,requestid,quoteid)); + //else + { + vals = cJSON_CreateObject(); + jaddnum(vals,"requestid",(uint32_t)requestid); + jaddnum(vals,"quoteid",(uint32_t)quoteid); + jaddbits256(vals,"hash",myinfo->myaddr.persistent); + retstr = basilisk_standardservice("SWP",myinfo,0,myinfo->myaddr.persistent,vals,"",1); + free_json(vals); + return(retstr); + } + }*/ + +TWO_INTS(InstantDEX,accept,requestid,quoteid) +{ + cJSON *vals; char *retstr; + myinfo->DEXactive = (uint32_t)time(NULL) + INSTANTDEX_LOCKTIME; + if ( myinfo->IAMLP != 0 || myinfo->dexsock >= 0 || myinfo->subsock >= 0 ) + return(basilisk_respond_accept(myinfo,myinfo->persistent_priv,requestid,quoteid,&myinfo->DEXaccept)); + else + { + vals = cJSON_CreateObject(); + jaddnum(vals,"quoteid",(uint32_t)quoteid); + jaddnum(vals,"requestid",(uint32_t)requestid); + retstr = basilisk_standardservice("ACC",myinfo,0,myinfo->myaddr.persistent,vals,"",1); + free_json(vals); + return(retstr); + } +} + +ZERO_ARGS(InstantDEX,init) +{ + basilisk_swaps_init(myinfo); + return(clonestr("{\"result\":\"success\"}")); +} #include "../includes/iguana_apiundefs.h" diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 3e3aaf8ea..5ec6fcaed 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -471,51 +471,6 @@ char *basilisk_respond_accept(struct supernet_info *myinfo,bits256 privkey,uint3 retstr = clonestr("{\"error\":\"couldnt find to requestid to choose\"}"); return(retstr); } - -#include "../includes/iguana_apidefs.h" -#include "../includes/iguana_apideclares.h" - -THREE_STRINGS_AND_DOUBLE(tradebot,aveprice,comment,base,rel,basevolume) -{ - double retvals[4],aveprice; cJSON *retjson = cJSON_CreateObject(); - aveprice = instantdex_avehbla(myinfo,retvals,base,rel,basevolume); - jaddstr(retjson,"result","success"); - jaddnum(retjson,"aveprice",aveprice); - jaddnum(retjson,"avebid",retvals[0]); - jaddnum(retjson,"bidvol",retvals[1]); - jaddnum(retjson,"aveask",retvals[2]); - jaddnum(retjson,"askvol",retvals[3]); - return(jprint(retjson,1)); -} - -ZERO_ARGS(InstantDEX,allcoins) -{ - struct iguana_info *tmp; cJSON *native,*notarychains,*basilisk,*virtual,*full,*retjson = cJSON_CreateObject(); - full = cJSON_CreateArray(); - native = cJSON_CreateArray(); - basilisk = cJSON_CreateArray(); - virtual = cJSON_CreateArray(); - notarychains = cJSON_CreateArray(); - HASH_ITER(hh,myinfo->allcoins,coin,tmp) - { - if ( coin->FULLNODE < 0 ) - jaddistr(native,coin->symbol); - //else if ( coin->virtualchain != 0 ) - // jaddistr(virtual,coin->symbol); - else if ( coin->FULLNODE > 0 )//|| coin->VALIDATENODE > 0 ) - jaddistr(full,coin->symbol); - //else if ( coin->notarychain >= 0 ) - // jaddistr(notarychains,coin->symbol); - else jaddistr(basilisk,coin->symbol); - } - jadd(retjson,"native",native); - jadd(retjson,"basilisk",basilisk); - jadd(retjson,"full",full); - //jadd(retjson,"virtual",virtual); - //jadd(retjson,"notarychains",notarychains); - return(jprint(retjson,1)); -} - cJSON *basilisk_unspents(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr) { cJSON *unspents=0,*array=0; char *retstr; @@ -558,201 +513,3 @@ char *basilisk_sendrawtransaction(struct supernet_info *myinfo,struct iguana_inf return(retstr); } -STRING_ARG(InstantDEX,available,source) -{ - uint64_t total = 0; int32_t i,n=0; char coinaddr[64]; cJSON *item,*unspents,*retjson = 0; - if ( source != 0 && source[0] != 0 && (coin= iguana_coinfind(source)) != 0 ) - { - if ( myinfo->expiration != 0 ) - { - bitcoin_address(coinaddr,coin->chain->pubtype,myinfo->persistent_pubkey33,33); - if ( (unspents= basilisk_unspents(myinfo,coin,coinaddr)) != 0 ) - { - //printf("available.(%s)\n",jprint(unspents,0)); - if ( (n= cJSON_GetArraySize(unspents)) > 0 ) - { - for (i=0; i %.8f\n",jprint(item,0),dstr(total)); - } - } - free_json(unspents); - } - retjson = cJSON_CreateObject(); - jaddnum(retjson,"result",dstr(total)); - printf(" n.%d total %.8f (%s)\n",n,dstr(total),jprint(retjson,0)); - return(jprint(retjson,1)); - } - printf("InstantDEX_available: need to unlock wallet\n"); - return(clonestr("{\"error\":\"need to unlock wallet\"}")); - } - printf("InstantDEX_available: %s is not active\n",source!=0?source:""); - return(clonestr("{\"error\":\"specified coin is not active\"}")); -} - -HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr) -{ - uint8_t serialized[512]; bits256 privkey; char buf[512],BTCaddr[64],KMDaddr[64]; struct basilisk_request R; int32_t jumblr,iambob,optionhours; cJSON *reqjson; uint32_t datalen=0,DEX_channel; struct iguana_info *bobcoin,*alicecoin; - myinfo->DEXactive = (uint32_t)time(NULL) + 3*BASILISK_TIMEOUT + 60; - jadd64bits(vals,"minamount",jdouble(vals,"minprice") * jdouble(vals,"amount") * SATOSHIDEN * SATOSHIDEN); - if ( jobj(vals,"desthash") == 0 ) - jaddbits256(vals,"desthash",hash); - jadd64bits(vals,"satoshis",jdouble(vals,"amount") * SATOSHIDEN); - jadd64bits(vals,"destsatoshis",jdouble(vals,"destamount") * SATOSHIDEN); - jaddnum(vals,"timestamp",time(NULL)); - if ( (jumblr= jint(vals,"usejumblr")) != 0 ) - privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,jumblr == 1 ? JUMBLR_DEPOSITPREFIX : ""); - else privkey = myinfo->persistent_priv; - hash = curve25519(privkey,curve25519_basepoint9()); - if ( jobj(vals,"srchash") == 0 ) - jaddbits256(vals,"srchash",hash); - printf("service.(%s)\n",jprint(vals,0)); - memset(&R,0,sizeof(R)); - if ( basilisk_request_create(&R,vals,hash,juint(vals,"timestamp")) == 0 ) - { - iambob = bitcoin_coinptrs(hash,&bobcoin,&alicecoin,R.src,R.dest,privkey,GENESIS_PUBKEY); - if ( (optionhours= jint(vals,"optionhours")) != 0 ) - { - printf("iambob.%d optionhours.%d R.requestid.%u vs calc %u, q.%u\n",iambob,R.optionhours,R.requestid,basilisk_requestid(&R),R.quoteid); - if ( iambob != 0 && optionhours > 0 ) - { - sprintf(buf,"{\"error\":\"illegal call option request hours.%d when iambob.%d\"}",optionhours,iambob); - printf("ERROR.(%s)\n",buf); - return(clonestr(buf)); - } - else if ( iambob == 0 && optionhours < 0 ) - { - sprintf(buf,"{\"error\":\"illegal put option request hours.%d when iambob.%d\"}",optionhours,iambob); - printf("ERROR.(%s)\n",buf); - return(clonestr(buf)); - } - } - //if ( myinfo->IAMNOTARY != 0 || myinfo->NOTARY.RELAYID >= 0 ) - // R.relaybits = myinfo->myaddr.myipbits; - if ( (reqjson= basilisk_requestjson(&R)) != 0 ) - free_json(reqjson); - datalen = basilisk_rwDEXquote(1,serialized,&R); - //int32_t i; for (i=0; i 0 ) - { - uint32_t msgid;//,crc=0,crcs[2],numiters = 0; uint8_t buf[4096]; - memset(hash.bytes,0,sizeof(hash)); - msgid = (uint32_t)time(NULL); - DEX_channel = 'D' + ((uint32_t)'E' << 8) + ((uint32_t)'X' << 16); - basilisk_channelsend(myinfo,hash,hash,DEX_channel,msgid,serialized,datalen,60); - sleep(3); - /*while ( numiters < 10 && (crc= basilisk_crcsend(myinfo,0,buf,sizeof(buf),hash,myinfo->myaddr.persistent,DEX_channel,msgid,serialized,datalen,crcs)) == 0 ) - { - //printf("didnt get back what was sent\n"); - sleep(3); - basilisk_channelsend(myinfo,myinfo->myaddr.persistent,hash,DEX_channel,msgid,serialized,datalen,60); - numiters++; - }*/ - //if ( crc != 0 )//basilisk_channelsend(myinfo,R.srchash,R.desthash,DEX_channel,(uint32_t)time(NULL),serialized,datalen,30) == 0 ) - return(clonestr("{\"result\":\"DEX message sent\"}")); - //else return(clonestr("{\"error\":\"DEX message couldnt be sent\"}")); - } - return(clonestr("{\"error\":\"DEX message not sent\"}")); -} - -INT_ARG(InstantDEX,automatched,requestid) -{ - // return quoteid - myinfo->DEXactive = (uint32_t)time(NULL) + INSTANTDEX_LOCKTIME; - return(clonestr("{\"result\":\"automatched not yet\"}")); -} - -int32_t InstantDEX_incoming_func(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) -{ - //int32_t i; - //for (i=0; iDEXpoll) + 2*drift; - if ( width < (drift+1) ) - width = 2*drift+1; - else if ( width > 64 ) - width = 64; - myinfo->DEXpoll = now; - retjson = cJSON_CreateObject(); - DEX_channel = 'D' + ((uint32_t)'E' << 8) + ((uint32_t)'X' << 16); - msgid = (uint32_t)time(NULL) + drift; - if ( (retarray= basilisk_channelget(myinfo,zero,myinfo->myaddr.persistent,DEX_channel,msgid,width)) != 0 ) - { - //printf("GOT.(%s)\n",jprint(retarray,0)); - if ( (retval= basilisk_process_retarray(myinfo,0,InstantDEX_process_channelget,data,sizeof(data),DEX_channel,msgid,retarray,InstantDEX_incoming_func)) > 0 ) - { - jaddstr(retjson,"result","success"); - } else jaddstr(retjson,"error","cant process InstantDEX retarray"); - jadd(retjson,"responses",retarray); - } - else - { - jaddstr(retjson,"error","cant do InstantDEX channelget"); - printf("error channelget\n"); - } - return(jprint(retjson,1)); -} - -/*TWO_INTS(InstantDEX,swapstatus,requestid,quoteid) -{ - cJSON *vals; char *retstr; - myinfo->DEXactive = (uint32_t)time(NULL) + INSTANTDEX_LOCKTIME; - //if ( myinfo->IAMLP != 0 ) - // return(basilisk_respond_swapstatus(myinfo,myinfo->myaddr.persistent,requestid,quoteid)); - //else - { - vals = cJSON_CreateObject(); - jaddnum(vals,"requestid",(uint32_t)requestid); - jaddnum(vals,"quoteid",(uint32_t)quoteid); - jaddbits256(vals,"hash",myinfo->myaddr.persistent); - retstr = basilisk_standardservice("SWP",myinfo,0,myinfo->myaddr.persistent,vals,"",1); - free_json(vals); - return(retstr); - } -}*/ - -TWO_INTS(InstantDEX,accept,requestid,quoteid) -{ - cJSON *vals; char *retstr; - myinfo->DEXactive = (uint32_t)time(NULL) + INSTANTDEX_LOCKTIME; - if ( myinfo->IAMLP != 0 || myinfo->dexsock >= 0 || myinfo->subsock >= 0 ) - return(basilisk_respond_accept(myinfo,myinfo->persistent_priv,requestid,quoteid,&myinfo->DEXaccept)); - else - { - vals = cJSON_CreateObject(); - jaddnum(vals,"quoteid",(uint32_t)quoteid); - jaddnum(vals,"requestid",(uint32_t)requestid); - retstr = basilisk_standardservice("ACC",myinfo,0,myinfo->myaddr.persistent,vals,"",1); - free_json(vals); - return(retstr); - } -} - -ZERO_ARGS(InstantDEX,init) -{ - basilisk_swaps_init(myinfo); - return(clonestr("{\"result\":\"success\"}")); -} - -#include "../includes/iguana_apiundefs.h" diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index 3af06c656..6619c4db0 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -319,67 +319,6 @@ cJSON *dpow_addmessage(struct supernet_info *myinfo,char *jsonstr) return(retjson); } -#include "../includes/iguana_apidefs.h" -#include "../includes/iguana_apideclares.h" - -HASH_ARRAY_STRING(basilisk,getmessage,hash,vals,hexstr) -{ - uint32_t msgid,width,channel; char *retstr; - if ( bits256_cmp(GENESIS_PUBKEY,jbits256(vals,"srchash")) == 0 ) - jaddbits256(vals,"srchash",hash); - if ( bits256_cmp(GENESIS_PUBKEY,jbits256(vals,"desthash")) == 0 ) - jaddbits256(vals,"desthash",myinfo->myaddr.persistent); - if ( (msgid= juint(vals,"msgid")) == 0 ) - { - msgid = (uint32_t)time(NULL); - jdelete(vals,"msgid"); - jaddnum(vals,"msgid",msgid); - } - if ( myinfo->NOTARY.RELAYID >= 0 || myinfo->dexsock >= 0 || myinfo->subsock >= 0 ) - { - channel = juint(vals,"channel"); - width = juint(vals,"width"); - retstr = basilisk_iterate_MSG(myinfo,channel,msgid,jbits256(vals,"srchash"),jbits256(vals,"desthash"),width); - //printf("getmessage.(%s)\n",retstr); - return(retstr); - } - //printf("getmessage not relay.%d dexsock.%d subsock.%d\n",myinfo->NOTARY.RELAYID,myinfo->dexsock,myinfo->subsock); - return(basilisk_standardservice("MSG",myinfo,0,jbits256(vals,"desthash"),vals,hexstr,1)); -} - -HASH_ARRAY_STRING(basilisk,sendmessage,hash,vals,hexstr) -{ - int32_t keylen,datalen,allocsize = 65536; uint8_t key[BASILISK_KEYSIZE],*space,*space2,*data,*ptr = 0; char *retstr=0; - space = calloc(1,allocsize); - space2 = calloc(1,allocsize); - data = get_dataptr(BASILISK_HDROFFSET,&ptr,&datalen,&space[BASILISK_KEYSIZE],allocsize-BASILISK_KEYSIZE,hexstr); - if ( myinfo->subsock >= 0 || myinfo->dexsock >= 0 || (myinfo->IAMNOTARY != 0 && myinfo->NOTARY.RELAYID >= 0) ) - { - keylen = basilisk_messagekey(key,juint(vals,"channel"),juint(vals,"msgid"),jbits256(vals,"srchash"),jbits256(vals,"desthash")); - if ( data != 0 ) - { - retstr = basilisk_respond_addmessage(myinfo,key,keylen,data,datalen,0,juint(vals,"duration")); - } else printf("no get_dataptr\n"); - if ( retstr != 0 ) - free(retstr); - } //else printf("not notary.%d relayid.%d\n",myinfo->IAMNOTARY,myinfo->NOTARY.RELAYID); - if ( vals != 0 && juint(vals,"fanout") == 0 ) - jaddnum(vals,"fanout",MAX(8,(int32_t)sqrt(myinfo->NOTARY.NUMRELAYS)+2)); - if ( BASILISK_KEYSIZE+datalen < allocsize ) - { - memcpy(space2,key,BASILISK_KEYSIZE); - if ( data != 0 && datalen != 0 ) - memcpy(&space2[BASILISK_KEYSIZE],data,datalen); - dex_reqsend(myinfo,"DEX",space2,datalen+BASILISK_KEYSIZE,1,""); - } else printf("sendmessage space too small error for %d\n",datalen); - free(space); - free(space2); - if ( ptr != 0 ) - free(ptr); - return(basilisk_standardservice("OUT",myinfo,0,jbits256(vals,"desthash"),vals,hexstr,0)); -} -#include "../includes/iguana_apiundefs.h" - int32_t basilisk_channelsend(struct supernet_info *myinfo,bits256 srchash,bits256 desthash,uint32_t channel,uint32_t msgid,uint8_t *data,int32_t datalen,uint32_t duration) { char *retstr,*hexstr,strbuf[4096],*ptr = 0; int32_t retval = -1; cJSON *valsobj; diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index e601c1e64..3e5aae41b 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -1049,175 +1049,6 @@ cJSON *BTC_makeclaimfunc(struct supernet_info *myinfo,struct exchange_info *exch } #endif - -#include "../includes/iguana_apidefs.h" -#include "../includes/iguana_apideclares.h" - -HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr) -{ - char *retstr=0,*symbol,*coinaddr,*infostr; cJSON *retjson,*sobj,*info,*addrs,*txoutjson,*txjson,*array; uint32_t basilisktag,blocktime; bits256 txid,blockhash; struct basilisk_item *ptr,Lptr; uint64_t value; int32_t timeoutmillis,vout,height,n,m; - if ( vals == 0 ) - return(clonestr("{\"error\":\"null valsobj\"}")); - //if ( myinfo->IAMNOTARY != 0 || myinfo->NOTARY.RELAYID >= 0 ) - // return(clonestr("{\"error\":\"special relays only do OUT and MSG\"}")); - //if ( coin == 0 ) - { - if ( (symbol= jstr(vals,"symbol")) != 0 || (symbol= jstr(vals,"coin")) != 0 ) - coin = iguana_coinfind(symbol); - } - if ( jobj(vals,"fanout") == 0 ) - jaddnum(vals,"fanout",MAX(5,(int32_t)sqrt(myinfo->NOTARY.NUMRELAYS)+1)); - txid = jbits256(vals,"txid"); - vout = jint(vals,"vout"); - if ( coin != 0 ) - { - if ( coin->FULLNODE < 0 ) - { - if ( (txoutjson= dpow_gettxout(myinfo,coin,txid,vout)) != 0 ) - { - if ( (coinaddr= jstr(txoutjson,"address")) != 0 && (value= SATOSHIDEN*jdouble(txoutjson,"value")) != 0 ) - { - retjson = cJSON_CreateObject(); - jaddstr(retjson,"result","success"); - jaddstr(retjson,"address",coinaddr); - jadd64bits(retjson,"satoshis",value); - jaddnum(retjson,"value",dstr(value)); - jaddnum(retjson,"amount",dstr(value)); - height = dpow_getchaintip(myinfo,&blockhash,&blocktime,0,0,coin); - jaddnum(retjson,"height",height); - jaddnum(retjson,"numconfirms",jint(txoutjson,"confirmations")); - jaddbits256(retjson,"txid",txid); - jaddnum(retjson,"vout",vout); - jaddstr(retjson,"coin",coin->symbol); - } - else - { - free_json(txoutjson); - return(clonestr("{\"error\":\"return from gettxout missing fields\"}")); - } - free_json(txoutjson); - return(jprint(retjson,1)); - } else return(clonestr("{\"error\":\"null return from gettxout\"}")); - } - if ( (basilisktag= juint(vals,"basilisktag")) == 0 ) - basilisktag = rand(); - if ( (timeoutmillis= juint(vals,"timeout")) <= 0 ) - timeoutmillis = BASILISK_TIMEOUT; - if ( coin->FULLNODE > 0 && (ptr= basilisk_bitcoinvalue(&Lptr,myinfo,coin,remoteaddr,basilisktag,timeoutmillis,vals)) != 0 ) - { - retstr = ptr->retstr, ptr->retstr = 0; - ptr->finished = OS_milliseconds() + 10000; - return(retstr); - } - } - if ( myinfo->reqsock >= 0 ) - { - if ( (retstr= _dex_getrawtransaction(myinfo,symbol,txid)) != 0 ) - { - if ( (txoutjson= cJSON_Parse(retstr)) != 0 ) - { - //printf("TX.(%s)\n",jprint(txoutjson,0)); - retjson = cJSON_CreateObject(); - jaddstr(retjson,"result","success"); - jaddnum(retjson,"numconfirms",jint(txoutjson,"confirmations")); - if ( (array= jarray(&n,txoutjson,"vout")) != 0 && vout < n && (txjson= jitem(array,vout)) != 0 ) - { - //printf("txjson.(%s)\n",jprint(txjson,0)); - if ( (value= jdouble(txjson,"value") * SATOSHIDEN) != 0 ) - { - if ( (sobj= jobj(txjson,"scriptPubKey")) != 0 && (addrs= jarray(&m,sobj,"addresses")) != 0 && (coinaddr= jstri(addrs,0)) != 0 ) - jaddstr(retjson,"address",coinaddr); - jadd64bits(retjson,"satoshis",value); - jaddnum(retjson,"value",dstr(value)); - if ( (infostr= _dex_getinfo(myinfo,symbol)) != 0 ) - { - if ( (info= cJSON_Parse(infostr)) != 0 ) - { - if ( (height= jint(info,"blocks")) > 0 ) - { - height -= jint(txoutjson,"confirmations"); - jaddnum(retjson,"height",height); - } - free_json(info); - } - free(infostr); - } - jaddbits256(retjson,"txid",txid); - jaddnum(retjson,"vout",vout); - jaddstr(retjson,"coin",symbol); - free(retstr); - free_json(txoutjson); - return(jprint(retjson,1)); - } - } - free_json(txoutjson); - return(jprint(retjson,1)); - } - return(retstr); - } - } - return(basilisk_standardservice("VAL",myinfo,0,hash,vals,hexstr,1)); -} - -HASH_ARRAY_STRING(basilisk,rawtx,hash,vals,hexstr) -{ - char *retstr=0,*symbol; uint32_t basilisktag; int32_t timeoutmillis,i,retval = -1; uint64_t amount,txfee; cJSON *retarray; - if ( vals == 0 ) - return(clonestr("{\"error\":\"null valsobj\"}")); - //if ( coin == 0 ) - { - if ( (symbol= jstr(vals,"symbol")) != 0 || (symbol= jstr(vals,"coin")) != 0 ) - coin = iguana_coinfind(symbol); - } - if ( jobj(vals,"numrequired") == 0 ) - jaddnum(vals,"numrequired",MIN(3,(int32_t)sqrt(myinfo->NOTARY.NUMRELAYS)+1)); - if ( jobj(vals,"fanout") == 0 ) - jaddnum(vals,"fanout",MAX(3,(int32_t)sqrt(myinfo->NOTARY.NUMRELAYS)+1)); - if ( coin != 0 ) - { - //if ( juint(vals,"burn") == 0 ) - // jaddnum(vals,"burn",0.0001); - if ( (basilisktag= juint(vals,"basilisktag")) == 0 ) - basilisktag = rand(); - if ( (timeoutmillis= juint(vals,"timeout")) <= 0 ) - timeoutmillis = BASILISK_TIMEOUT; - if ( (retstr= basilisk_bitcoinrawtx(myinfo,coin,remoteaddr,basilisktag,timeoutmillis,vals,0)) != 0 ) - { - printf("rawtx.(%s)\n",retstr); - if ( (amount= j64bits(vals,"satoshis")) == 0 ) - amount = jdouble(vals,"value") * SATOSHIDEN; - if ( (txfee= j64bits(vals,"txfee")) == 0 ) - txfee = coin->chain->txfee; - if ( txfee == 0 ) - txfee = 10000; - retval = -1; - if ( (retarray= cJSON_Parse(retstr)) != 0 ) - { - if ( is_cJSON_Array(retarray) != 0 ) - { - for (i=0; iFULLNODE >= 0 ) - return(clonestr("{\"error\":\"no passphrase or no native komodod\"}")); - else - { - safecopy(myinfo->jumblr_passphrase,passphrase,sizeof(myinfo->jumblr_passphrase)); - retjson = cJSON_CreateObject(); - jaddstr(retjson,"result","success"); - privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); - smartaddress_add(myinfo,privkey,BTCaddr,KMDaddr); - myinfo->jumblr_depositkey = curve25519(privkey,curve25519_basepoint9()); - bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); - if ( coin->FULLNODE < 0 ) - jumblr_importprivkey(myinfo,coin,wifstr); - jaddstr(retjson,"KMDdeposit",KMDaddr); - jaddstr(retjson,"BTCdeposit",BTCaddr); - if ( (coinbtc= iguana_coinfind("BTC")) != 0 ) - { - bitcoin_priv2wif(wifstr,privkey,coinbtc->chain->wiftype); - if ( coinbtc->FULLNODE < 0 ) - jumblr_importprivkey(myinfo,coinbtc,wifstr); - jaddnum(retjson,"BTCdeposits",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); - } - privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); - smartaddress_add(myinfo,privkey,BTCaddr,KMDaddr); - myinfo->jumblr_pubkey = curve25519(privkey,curve25519_basepoint9()); - jaddstr(retjson,"KMDjumblr",KMDaddr); - jaddstr(retjson,"BTCjumblr",BTCaddr); - if ( coinbtc != 0 ) - jaddnum(retjson,"BTCjumbled",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); - return(jprint(retjson,1)); - } -} - -ZERO_ARGS(jumblr,status) -{ - cJSON *retjson; char KMDaddr[64],BTCaddr[64]; struct jumblr_item *ptr,*tmp; struct iguana_info *coinbtc; int64_t received,deposited,jumblred,step_t2z,step_z2z,step_z2t,finished,pending,maxval,minval; - if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 ) - { - jumblr_opidsupdate(myinfo,coin); - retjson = cJSON_CreateObject(); - step_t2z = step_z2z = step_z2t = deposited = finished = pending = 0; - jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); - jaddstr(retjson,"KMDdeposit",KMDaddr); - jaddstr(retjson,"BTCdeposit",BTCaddr); - if ( (coinbtc= iguana_coinfind("BTC")) != 0 ) - jaddnum(retjson,"BTCdeposits",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); - received = jumblr_receivedby(myinfo,coin,KMDaddr); - deposited = jumblr_balance(myinfo,coin,KMDaddr); - jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); - jaddstr(retjson,"KMDjumblr",KMDaddr); - jaddstr(retjson,"BTCjumblr",BTCaddr); - if ( coinbtc != 0 ) - jaddnum(retjson,"BTCjumbled",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); - finished = jumblr_receivedby(myinfo,coin,KMDaddr); - jumblred = jumblr_balance(myinfo,coin,KMDaddr); - HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) - { - if ( strlen(ptr->src) >= 40 ) - { - if ( strlen(ptr->dest) >= 40 ) - step_z2z += ptr->amount; - else step_z2t += ptr->amount; - } else step_t2z += ptr->amount; - } - jaddstr(retjson,"result","success"); - jaddnum(retjson,"deposits",dstr(deposited)); - jaddnum(retjson,"t_to_z",dstr(step_t2z)); - jaddnum(retjson,"z_to_z",dstr(step_z2z)); - jaddnum(retjson,"z_to_t",dstr(step_z2t)); - maxval = MAX(step_t2z,MAX(step_z2z,step_z2t)); - minval = MIN(step_t2z,MIN(step_z2z,step_z2t)); - if ( maxval > minval ) - { - pending = (maxval - minval); - if ( pending < finished*.1 ) - pending = 0; - } - jaddnum(retjson,"pending",dstr(pending)); - jaddnum(retjson,"jumbled",dstr(jumblred)); - jaddnum(retjson,"received",dstr(received)); - jaddnum(retjson,"finished",dstr(finished)); - return(jprint(retjson,1)); - } - else - { - printf("(%s) (%s) %d\n",coin->symbol,myinfo->jumblr_passphrase,coin->FULLNODE); - return(clonestr("{\"error\":\"jumblr status no passphrase or no native komodod\"}")); - } -} - -#include "../includes/iguana_apiundefs.h" diff --git a/basilisk/smartaddress.c b/basilisk/smartaddress.c index 95b15c6e9..ff9707b0c 100755 --- a/basilisk/smartaddress.c +++ b/basilisk/smartaddress.c @@ -88,8 +88,3 @@ int32_t smartaddress_pubkey33(struct supernet_info *myinfo,bits256 *privkeyp,uin return(0); } -#include "../includes/iguana_apidefs.h" -#include "../includes/iguana_apideclares.h" - - -#include "../includes/iguana_apiundefs.h" diff --git a/basilisk/tradebots_liquidity.c b/basilisk/tradebots_liquidity.c index c87cea550..9ce61549b 100755 --- a/basilisk/tradebots_liquidity.c +++ b/basilisk/tradebots_liquidity.c @@ -1238,4 +1238,94 @@ ZERO_ARGS(tradebot,openliquidity) return(jprint(array,1)); } +ZERO_ARGS(tradebot,allbalances) +{ + int32_t i,n; double value,pending; char *base; cJSON *item,*balances = cJSON_CreateObject(); + if ( myinfo->liquidity_currencies == 0 ) + myinfo->liquidity_currencies = cJSON_Parse("[\"KMD\", \"BTC\"]"); + if ( myinfo->liquidity_currencies != 0 && (n= cJSON_GetArraySize(myinfo->liquidity_currencies)) > 0 ) + { + for (i=0; iliquidity_currencies,i); + value = tradebot_balance(myinfo,base); + pending = tradebot_pending(myinfo,base); + item = cJSON_CreateObject(); + jaddnum(item,"value",value); + jaddnum(item,"pending",pending); + jadd(balances,base,item); + } + } + return(jprint(balances,1)); +} + +ZERO_ARGS(tradebot,anchor) +{ + FILE *fp; char *anchorstr,fname[512]; cJSON *anchor; int32_t retval = -1; + if ( (anchorstr= tradebot_allbalances(myinfo,0,0,0)) != 0 ) + { + if ( (anchor= cJSON_Parse(anchorstr)) != 0 ) + { + if ( jobj(anchor,"error") == 0 ) + { + sprintf(fname,"%s/anchor",GLOBAL_DBDIR), OS_compatible_path(fname); + if ( (fp= fopen(fname,"wb")) != 0 ) + { + if ( fwrite(anchorstr,1,strlen(anchorstr)+1,fp) == strlen(anchorstr)+1 ) + retval = 0; + fclose(fp); + } + } + } + free(anchorstr); + } + if ( retval == 0 ) + return(clonestr("{\"result\":\"success\"}")); + else return(clonestr("{\"error\":\"couldnt make anchor file\"}")); +} + +ZERO_ARGS(tradebot,portfolio) +{ + char *currentstr,*anchorstr,fname[512]; long fsize; cJSON *current,*anchor=0,*portfolio=0; + if ( (currentstr= tradebot_allbalances(myinfo,0,0,0)) != 0 ) + { + if ( (current= cJSON_Parse(currentstr)) != 0 ) + { + sprintf(fname,"%s/anchor",GLOBAL_DBDIR), OS_compatible_path(fname); + if ( (anchorstr= OS_filestr(&fsize,fname)) != 0 ) + { + anchor = cJSON_Parse(anchorstr); + free(anchorstr); + } + if ( anchor == 0 ) + anchor = cJSON_Parse("{}"); + portfolio = tradebot_balancesdiff(myinfo,current,anchor); + free_json(current); + } + free(currentstr); + } + if ( portfolio == 0 ) + return(clonestr("{\"result\":\"success\"}")); + else return(jprint(portfolio,1)); +} + +ARRAY_OBJ_INT(tradebot,goals,currencies,vals,targettime) +{ + static bits256 zero; char *targetcoin; int32_t i,n; + if ( currencies != 0 && vals != 0 ) + { + // init things so automatically updates refli.bid and refli.ask + // volume range with margin + // currency percentage value in BTC? target distribution, max percentage, min percentage` + // min price to sell, max price to buy, max volume + n = cJSON_GetArraySize(currencies); + for (i=0; iliquidity_currencies == 0 ) - myinfo->liquidity_currencies = cJSON_Parse("[\"KMD\", \"BTC\"]"); - if ( myinfo->liquidity_currencies != 0 && (n= cJSON_GetArraySize(myinfo->liquidity_currencies)) > 0 ) - { - for (i=0; iliquidity_currencies,i); - value = tradebot_balance(myinfo,base); - pending = tradebot_pending(myinfo,base); - item = cJSON_CreateObject(); - jaddnum(item,"value",value); - jaddnum(item,"pending",pending); - jadd(balances,base,item); - } - } - return(jprint(balances,1)); -} - -ZERO_ARGS(tradebot,anchor) -{ - FILE *fp; char *anchorstr,fname[512]; cJSON *anchor; int32_t retval = -1; - if ( (anchorstr= tradebot_allbalances(myinfo,0,0,0)) != 0 ) - { - if ( (anchor= cJSON_Parse(anchorstr)) != 0 ) - { - if ( jobj(anchor,"error") == 0 ) - { - sprintf(fname,"%s/anchor",GLOBAL_DBDIR), OS_compatible_path(fname); - if ( (fp= fopen(fname,"wb")) != 0 ) - { - if ( fwrite(anchorstr,1,strlen(anchorstr)+1,fp) == strlen(anchorstr)+1 ) - retval = 0; - fclose(fp); - } - } - } - free(anchorstr); - } - if ( retval == 0 ) - return(clonestr("{\"result\":\"success\"}")); - else return(clonestr("{\"error\":\"couldnt make anchor file\"}")); -} - -ZERO_ARGS(tradebot,portfolio) -{ - char *currentstr,*anchorstr,fname[512]; long fsize; cJSON *current,*anchor=0,*portfolio=0; - if ( (currentstr= tradebot_allbalances(myinfo,0,0,0)) != 0 ) - { - if ( (current= cJSON_Parse(currentstr)) != 0 ) - { - sprintf(fname,"%s/anchor",GLOBAL_DBDIR), OS_compatible_path(fname); - if ( (anchorstr= OS_filestr(&fsize,fname)) != 0 ) - { - anchor = cJSON_Parse(anchorstr); - free(anchorstr); - } - if ( anchor == 0 ) - anchor = cJSON_Parse("{}"); - portfolio = tradebot_balancesdiff(myinfo,current,anchor); - free_json(current); - } - free(currentstr); - } - if ( portfolio == 0 ) - return(clonestr("{\"result\":\"success\"}")); - else return(jprint(portfolio,1)); -} - -ARRAY_OBJ_INT(tradebot,goals,currencies,vals,targettime) -{ - static bits256 zero; char *targetcoin; int32_t i,n; - if ( currencies != 0 && vals != 0 ) - { - // init things so automatically updates refli.bid and refli.ask - // volume range with margin - // currency percentage value in BTC? target distribution, max percentage, min percentage` - // min price to sell, max price to buy, max volume - n = cJSON_GetArraySize(currencies); - for (i=0; iinternaladdr,remoteaddr,0,vals,0,0,hash,0)); - } else return(clonestr("{\"error\":\"geckoget needs virtualchain\"}")); - } - return(clonestr("{\"error\":\"geckoget needs BTCD\"}")); -} - -#include "../includes/iguana_apiundefs.h" diff --git a/iguana/SuperNET_keys.c b/iguana/SuperNET_keys.c index 7ecab7989..31cbe6869 100755 --- a/iguana/SuperNET_keys.c +++ b/iguana/SuperNET_keys.c @@ -420,52 +420,4 @@ char *SuperNET_keysinit(struct supernet_info *myinfo,char *argjsonstr) return(coinargs); } -#include "../includes/iguana_apidefs.h" -#include "../includes/iguana_apideclares.h" - -TWO_STRINGS(SuperNET,decryptjson,password,permanentfile) -{ - char pass[8192],fname2[1023],destfname[1024]; cJSON *retjson; bits256 wallethash,wallet2priv; - safecopy(pass,password,sizeof(pass)); - safecopy(fname2,permanentfile,sizeof(fname2)); - wallethash = wallet2priv = GENESIS_PRIVKEY; - if ( strlen(pass) == sizeof(wallethash)*2 && is_hexstr(pass,(int32_t)sizeof(bits256)*2) > 0 ) - wallethash = bits256_conv(pass); - if ( strlen(fname2) == sizeof(wallet2priv)*2 && is_hexstr(fname2,(int32_t)sizeof(bits256)*2) > 0 ) - wallet2priv = bits256_conv(fname2); - if ( (retjson= SuperNET_decryptedjson(destfname,pass,sizeof(pass),wallethash,fname2,sizeof(fname2),wallet2priv)) != 0 ) - { - //printf("decrypt pass.(%s) fname2.(%s) -> destfname.(%s)\n",pass,fname2,destfname); - //obj = jduplicate(jobj(retjson,"payload")); - //jdelete(retjson,"payload"); - //jadd(retjson,"result",obj); - return(jprint(retjson,1)); - } else return(clonestr("{\"error\":\"couldnt decrypt json file\"}")); -} - -THREE_STRINGS(SuperNET,encryptjson,password,permanentfile,payload) -{ - char destfname[4096],pass[8192],fname2[1023]; cJSON *argjson,*retjson = cJSON_CreateObject(); - safecopy(pass,password,sizeof(pass)); - safecopy(fname2,permanentfile,sizeof(fname2)); - argjson = jduplicate(json); - //printf("argjson.(%s)\n",jprint(argjson,0)); - jdelete(argjson,"agent"); - jdelete(argjson,"method"); - jdelete(argjson,"password"); - jdelete(argjson,"permanentfile"); - jdelete(argjson,"timestamp"); - jdelete(argjson,"tag"); - if ( _SuperNET_encryptjson(myinfo,destfname,pass,sizeof(pass),fname2,sizeof(fname2),argjson) == 0 ) - { - jaddstr(retjson,"result","success"); - jaddstr(retjson,"filename",destfname); - } else jaddstr(retjson,"error","couldnt encrypt json file"); - free_json(argjson); - return(jprint(retjson,1)); -} - - -#include "../includes/iguana_apiundefs.h" - diff --git a/iguana/iguana_bitmap.c b/iguana/iguana_bitmap.c index ec1ce5484..89effe210 100755 --- a/iguana/iguana_bitmap.c +++ b/iguana/iguana_bitmap.c @@ -1162,42 +1162,3 @@ void iguana_bitmap(char *space,int32_t max,char *name) } } -#include "../includes/iguana_apidefs.h" -#include "../includes/iguana_apideclares.h" - -STRING_AND_TWOINTS(mouse,change,name,x,y) -{ - printf("mouse (%s) x.%d y.%d\n",name,x,y); - return(clonestr("{\"result\":\"changed\"}")); -} - -STRING_ARG(mouse,leave,name) -{ - printf("mouse (%s) leave\n",name); - return(clonestr("{\"result\":\"left\"}")); -} - -STRING_AND_TWOINTS(mouse,click,name,x,y) -{ - printf("mouse (%s) x.%d y.%d click\n",name,x,y); - return(clonestr("{\"result\":\"click\"}")); -} - -STRING_AND_INT(keyboard,key,name,c) -{ - printf(" KEY.(%s) c.%d (%c)\n",name,c,c); - return(clonestr("{\"result\":\"key\"}")); -} - -STRING_AND_TWOINTS(mouse,image,name,x,y) -{ - printf("mouse CREATE (%s) x.%d y.%d\n",name,x,y); - return(clonestr("{\"result\":\"opened\"}")); -} - -STRING_ARG(mouse,close,name) -{ - printf("mouse CLOSE (%s)\n",name); - return(clonestr("{\"result\":\"closed\"}")); -} -#include "../includes/iguana_apiundefs.h" diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 5286d37ef..8e7aacf20 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -1685,4 +1685,99 @@ THREE_INTS(iguana,splitfunds,satoshis,duplicates,sendflag) return(jprint(retjson,1)); } +P2SH_SPENDAPI(iguana,spendmsig,activecoin,vintxid,vinvout,destaddress,destamount,destaddress2,destamount2,M,N,pubA,wifA,pubB,wifB,pubC,wifC) +{ + struct vin_info V; uint8_t p2sh_rmd160[20],serialized[2096],spendscript[32],pubkeys[3][65],*pubkeyptrs[3]; int32_t spendlen,height = 0; + char msigaddr[64],*retstr; cJSON *retjson,*txobj; struct iguana_info *active; + bits256 signedtxid; char *signedtx; + struct iguana_msgtx msgtx; + if ( remoteaddr != 0 ) + return(clonestr("{\"error\":\"no remote\"}")); + if ( myinfo->expiration == 0 ) + return(clonestr("{\"error\":\"need to unlock wallet\"}")); + if ( (active= iguana_coinfind(activecoin)) == 0 ) + return(clonestr("{\"error\":\"activecoin isnt active\"}")); + if ( M > N || N > 3 ) + return(clonestr("{\"error\":\"illegal M or N\"}")); + memset(&V,0,sizeof(V)); + txobj = bitcoin_txcreate(active->symbol,active->chain->isPoS,0,coin->chain->normal_txversion,0); + if ( destaddress[0] != 0 && destamount > 0. ) + bitcoin_txaddspend(active,txobj,destaddress,destamount * SATOSHIDEN); + if ( destaddress2[0] != 0 && destamount2 > 0. ) + bitcoin_txaddspend(active,txobj,destaddress2,destamount2 * SATOSHIDEN); + if ( pubA[0] != 0 && (retstr= _setVsigner(active,&V,0,pubA,wifA)) != 0 ) + return(retstr); + if ( N >= 2 && pubB[0] != 0 && (retstr= _setVsigner(active,&V,1,pubB,wifB)) != 0 ) + return(retstr); + if ( N == 3 && pubC[0] != 0 && (retstr= _setVsigner(active,&V,2,pubC,wifC)) != 0 ) + return(retstr); + V.M = M, V.N = N, V.type = IGUANA_SCRIPT_P2SH; + V.p2shlen = bitcoin_MofNspendscript(p2sh_rmd160,V.p2shscript,0,&V); + spendlen = bitcoin_p2shspend(spendscript,0,p2sh_rmd160); + if ( pubA[0] != 0 ) + { + decode_hex(pubkeys[0],(int32_t)strlen(pubA)>>1,pubA); + pubkeyptrs[0] = pubkeys[0]; + } + if ( pubB[0] != 0 ) + { + decode_hex(pubkeys[1],(int32_t)strlen(pubB)>>1,pubB); + pubkeyptrs[1] = pubkeys[1]; + } + if ( pubC[0] != 0 ) + { + decode_hex(pubkeys[2],(int32_t)strlen(pubC)>>1,pubC); + pubkeyptrs[2] = pubkeys[2]; + } + bitcoin_txinput(active,txobj,vintxid,vinvout,0xffffffff,spendscript,spendlen,V.p2shscript,V.p2shlen,pubkeyptrs,N,0,0); + bitcoin_address(msigaddr,active->chain->p2shtype,V.p2shscript,V.p2shlen); + retjson = cJSON_CreateObject(); + if ( bitcoin_verifyvins(active,height,&signedtxid,&signedtx,&msgtx,serialized,sizeof(serialized),&V,SIGHASH_ALL,1,V.suppress_pubkeys) == 0 ) + { + jaddstr(retjson,"result","msigtx"); + if ( signedtx != 0 ) + jaddstr(retjson,"signedtx",signedtx), free(signedtx); + jaddbits256(retjson,"txid",signedtxid); + } else jaddstr(retjson,"error","couldnt sign tx"); + jaddstr(retjson,"msigaddr",msigaddr); + return(jprint(retjson,1)); +} + +STRING_ARRAY_OBJ_STRING(bitcoinrpc,signrawtransaction,rawtx,vins,privkeys,sighash) +{ + char *signedtx = 0; struct vin_info *V; bits256 signedtxid; int32_t complete,numinputs = 1; struct iguana_msgtx msgtx; cJSON *retjson; int uselessbitcoin_error = 0; + retjson = cJSON_CreateObject(); + if ( remoteaddr != 0 ) + return(clonestr("{\"error\":\"no remote\"}")); + if ( myinfo->expiration == 0 ) + return(clonestr("{\"error\":\"need to unlock wallet\"}")); + //printf("rawtx.(%s) vins.(%s) privkeys.(%s) sighash.(%s)\n",rawtx,jprint(vins,0),jprint(privkeys,0),sighash); + if ( sighash == 0 || sighash[0] == 0 ) + sighash = "ALL"; + if ( strcmp(sighash,"ALL") != 0 ) + jaddstr(retjson,"error","only sighash all (ALL) supported for now"); + if ( (numinputs= cJSON_GetArraySize(vins)) > 0 ) + { + V = calloc(numinputs,sizeof(*V)); + memset(&msgtx,0,sizeof(msgtx)); + if ( (complete= iguana_signrawtransaction(myinfo,coin,coin->blocks.hwmchain.height,&msgtx,&signedtx,&signedtxid,V,numinputs,rawtx,vins,privkeys)) >= 0 ) + { + if ( signedtx != 0 ) + { + jaddstr(retjson,"result",signedtx); + jadd(retjson,"complete",complete!=0?jtrue():jfalse()); + free(signedtx); + } else jaddstr(retjson,"error",uselessbitcoin_error != 0 ? "-22" : "no transaction from verifyvins"); + } + else if ( complete == -2 ) + jaddstr(retjson,"error",uselessbitcoin_error != 0 ? "-22" : "hex2json -> json2hex error"); + else if ( complete == -1 ) + jaddstr(retjson,"error",uselessbitcoin_error != 0 ? "-22" : "couldnt load serialized tx or mismatched numinputs"); + free(V); + //for (i=0; iexpiration == 0 ) - return(clonestr("{\"error\":\"need to unlock wallet\"}")); - if ( (active= iguana_coinfind(activecoin)) == 0 ) - return(clonestr("{\"error\":\"activecoin isnt active\"}")); - if ( M > N || N > 3 ) - return(clonestr("{\"error\":\"illegal M or N\"}")); - memset(&V,0,sizeof(V)); - txobj = bitcoin_txcreate(active->symbol,active->chain->isPoS,0,coin->chain->normal_txversion,0); - if ( destaddress[0] != 0 && destamount > 0. ) - bitcoin_txaddspend(active,txobj,destaddress,destamount * SATOSHIDEN); - if ( destaddress2[0] != 0 && destamount2 > 0. ) - bitcoin_txaddspend(active,txobj,destaddress2,destamount2 * SATOSHIDEN); - if ( pubA[0] != 0 && (retstr= _setVsigner(active,&V,0,pubA,wifA)) != 0 ) - return(retstr); - if ( N >= 2 && pubB[0] != 0 && (retstr= _setVsigner(active,&V,1,pubB,wifB)) != 0 ) - return(retstr); - if ( N == 3 && pubC[0] != 0 && (retstr= _setVsigner(active,&V,2,pubC,wifC)) != 0 ) - return(retstr); - V.M = M, V.N = N, V.type = IGUANA_SCRIPT_P2SH; - V.p2shlen = bitcoin_MofNspendscript(p2sh_rmd160,V.p2shscript,0,&V); - spendlen = bitcoin_p2shspend(spendscript,0,p2sh_rmd160); - if ( pubA[0] != 0 ) - { - decode_hex(pubkeys[0],(int32_t)strlen(pubA)>>1,pubA); - pubkeyptrs[0] = pubkeys[0]; - } - if ( pubB[0] != 0 ) - { - decode_hex(pubkeys[1],(int32_t)strlen(pubB)>>1,pubB); - pubkeyptrs[1] = pubkeys[1]; - } - if ( pubC[0] != 0 ) - { - decode_hex(pubkeys[2],(int32_t)strlen(pubC)>>1,pubC); - pubkeyptrs[2] = pubkeys[2]; - } - bitcoin_txinput(active,txobj,vintxid,vinvout,0xffffffff,spendscript,spendlen,V.p2shscript,V.p2shlen,pubkeyptrs,N,0,0); - bitcoin_address(msigaddr,active->chain->p2shtype,V.p2shscript,V.p2shlen); - retjson = cJSON_CreateObject(); - if ( bitcoin_verifyvins(active,height,&signedtxid,&signedtx,&msgtx,serialized,sizeof(serialized),&V,SIGHASH_ALL,1,V.suppress_pubkeys) == 0 ) - { - jaddstr(retjson,"result","msigtx"); - if ( signedtx != 0 ) - jaddstr(retjson,"signedtx",signedtx), free(signedtx); - jaddbits256(retjson,"txid",signedtxid); - } else jaddstr(retjson,"error","couldnt sign tx"); - jaddstr(retjson,"msigaddr",msigaddr); - return(jprint(retjson,1)); -} - int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_info *coin,int32_t height,struct iguana_msgtx *msgtx,char **signedtxp,bits256 *signedtxidp,struct vin_info *V,int32_t numinputs,char *rawtx,cJSON *vins,cJSON *privkeysjson) { uint8_t *serialized,*serialized2,*serialized3,*serialized4,*extraspace,pubkeys[64][33]; int32_t finalized,i,len,n,z,plen,maxsize,complete = 0,extralen = 65536; char *privkeystr,*signedtx = 0; bits256 privkeys[64],privkey,txid; cJSON *item; cJSON *txobj = 0; @@ -1535,43 +1473,4 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf return(complete); } -STRING_ARRAY_OBJ_STRING(bitcoinrpc,signrawtransaction,rawtx,vins,privkeys,sighash) -{ - char *signedtx = 0; struct vin_info *V; bits256 signedtxid; int32_t complete,numinputs = 1; struct iguana_msgtx msgtx; cJSON *retjson; int uselessbitcoin_error = 0; - retjson = cJSON_CreateObject(); - if ( remoteaddr != 0 ) - return(clonestr("{\"error\":\"no remote\"}")); - if ( myinfo->expiration == 0 ) - return(clonestr("{\"error\":\"need to unlock wallet\"}")); - //printf("rawtx.(%s) vins.(%s) privkeys.(%s) sighash.(%s)\n",rawtx,jprint(vins,0),jprint(privkeys,0),sighash); - if ( sighash == 0 || sighash[0] == 0 ) - sighash = "ALL"; - if ( strcmp(sighash,"ALL") != 0 ) - jaddstr(retjson,"error","only sighash all (ALL) supported for now"); - if ( (numinputs= cJSON_GetArraySize(vins)) > 0 ) - { - V = calloc(numinputs,sizeof(*V)); - memset(&msgtx,0,sizeof(msgtx)); - if ( (complete= iguana_signrawtransaction(myinfo,coin,coin->blocks.hwmchain.height,&msgtx,&signedtx,&signedtxid,V,numinputs,rawtx,vins,privkeys)) >= 0 ) - { - if ( signedtx != 0 ) - { - jaddstr(retjson,"result",signedtx); - jadd(retjson,"complete",complete!=0?jtrue():jfalse()); - free(signedtx); - } else jaddstr(retjson,"error",uselessbitcoin_error != 0 ? "-22" : "no transaction from verifyvins"); - } - else if ( complete == -2 ) - jaddstr(retjson,"error",uselessbitcoin_error != 0 ? "-22" : "hex2json -> json2hex error"); - else if ( complete == -1 ) - jaddstr(retjson,"error",uselessbitcoin_error != 0 ? "-22" : "couldnt load serialized tx or mismatched numinputs"); - free(V); - //for (i=0; iinternaladdr,remoteaddr,0,vals,0,0,hash,0)); + } else return(clonestr("{\"error\":\"geckoget needs virtualchain\"}")); + } + return(clonestr("{\"error\":\"geckoget needs BTCD\"}")); +} + +TWO_STRINGS(SuperNET,decryptjson,password,permanentfile) +{ + char pass[8192],fname2[1023],destfname[1024]; cJSON *retjson; bits256 wallethash,wallet2priv; + safecopy(pass,password,sizeof(pass)); + safecopy(fname2,permanentfile,sizeof(fname2)); + wallethash = wallet2priv = GENESIS_PRIVKEY; + if ( strlen(pass) == sizeof(wallethash)*2 && is_hexstr(pass,(int32_t)sizeof(bits256)*2) > 0 ) + wallethash = bits256_conv(pass); + if ( strlen(fname2) == sizeof(wallet2priv)*2 && is_hexstr(fname2,(int32_t)sizeof(bits256)*2) > 0 ) + wallet2priv = bits256_conv(fname2); + if ( (retjson= SuperNET_decryptedjson(destfname,pass,sizeof(pass),wallethash,fname2,sizeof(fname2),wallet2priv)) != 0 ) + { + //printf("decrypt pass.(%s) fname2.(%s) -> destfname.(%s)\n",pass,fname2,destfname); + //obj = jduplicate(jobj(retjson,"payload")); + //jdelete(retjson,"payload"); + //jadd(retjson,"result",obj); + return(jprint(retjson,1)); + } else return(clonestr("{\"error\":\"couldnt decrypt json file\"}")); +} + +THREE_STRINGS(SuperNET,encryptjson,password,permanentfile,payload) +{ + char destfname[4096],pass[8192],fname2[1023]; cJSON *argjson,*retjson = cJSON_CreateObject(); + safecopy(pass,password,sizeof(pass)); + safecopy(fname2,permanentfile,sizeof(fname2)); + argjson = jduplicate(json); + //printf("argjson.(%s)\n",jprint(argjson,0)); + jdelete(argjson,"agent"); + jdelete(argjson,"method"); + jdelete(argjson,"password"); + jdelete(argjson,"permanentfile"); + jdelete(argjson,"timestamp"); + jdelete(argjson,"tag"); + if ( _SuperNET_encryptjson(myinfo,destfname,pass,sizeof(pass),fname2,sizeof(fname2),argjson) == 0 ) + { + jaddstr(retjson,"result","success"); + jaddstr(retjson,"filename",destfname); + } else jaddstr(retjson,"error","couldnt encrypt json file"); + free_json(argjson); + return(jprint(retjson,1)); +} + STRING_ARG(SuperNET,addr2rmd160,address) { diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index f36ea10e4..0dec6a079 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -15,6 +15,8 @@ #ifndef H_IGUANAFUNCS_H #define H_IGUANAFUNCS_H +#define SIGHASH_ALL 1 + // peers int32_t iguana_verifypeer(struct iguana_info *coin,void *key,void *value,int32_t itemind,int32_t itemsize); int32_t iguana_peermetrics(struct supernet_info *myinfo,struct iguana_info *coin); @@ -316,6 +318,10 @@ int32_t bitcoin_changescript(struct iguana_info *coin,uint8_t *changescript,int3 //cJSON *bitcoin_addinput(struct iguana_info *coin,cJSON *txobj,bits256 txid,int32_t vout,uint32_t sequenceid,uint8_t *spendscript,int32_t spendlen,uint8_t *redeemscript,int32_t p2shlen,uint8_t *pubkeys[],int32_t numpubkeys); int32_t bitcoin_verifytx(struct iguana_info *coin,bits256 *signedtxidp,char **signedtx,char *rawtxstr,struct vin_info *V,int32_t numinputs); int32_t bitcoin_verify(void *ctx,uint8_t *sig,int32_t siglen,bits256 txhash2,uint8_t *pubkey,int32_t plen); +cJSON *SuperNET_decryptedjson(char *destfname,char *passphrase,int32_t passsize,bits256 wallethash,char *fname2fa,int32_t fnamesize,bits256 wallet2priv); +int32_t bitcoin_txaddspend(struct iguana_info *coin,cJSON *txobj,char *destaddress,uint64_t satoshis); +char *_setVsigner(struct iguana_info *coin,struct vin_info *V,int32_t ind,char *pubstr,char *wifstr); + char *bitcoin_json2hex(struct supernet_info *myinfo,struct iguana_info *coin,bits256 *txidp,cJSON *txjson,struct vin_info *V); int32_t bitcoin_addr2rmd160(uint8_t *addrtypep,uint8_t rmd160[20],char *coinaddr); char *issue_startForging(struct supernet_info *myinfo,char *secret); From 0a5c71ccc701e904f7e05e5f75cd9c0c5a6499bd Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Mar 2017 21:17:34 +0200 Subject: [PATCH 422/495] Test --- basilisk/basilisk.c | 116 ++++++++++++ basilisk/tradebots_liquidity.c | 122 ------------- iguana/main.c | 308 ++++++++++++++++++++++++++++++++ iguana/ramchain_api.c | 314 +-------------------------------- 4 files changed, 425 insertions(+), 435 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index b6ca2cf51..8610f2d66 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -954,6 +954,122 @@ void basilisks_init(struct supernet_info *myinfo) #include "../includes/iguana_apidefs.h" #include "../includes/iguana_apideclares.h" +TWO_STRINGS(tradebot,gensvm,base,rel) +{ +#ifdef _WIN + return(clonestr("{\"error\":\"windows doesnt support SVM\"}")); +#else + int32_t numfeatures = 317*61; + struct tradebot_arbpair *pair; + if ( base[0] != 0 && rel[0] != 0 && (pair= tradebots_arbpair_find(base,rel)) != 0 && pair->fp != 0 ) + { + tradebots_calcanswers(pair); + ocas_gen(pair->refc,numfeatures,0,(int32_t)(ftell(pair->fp) / sizeof(pair->rawfeatures))); + return(clonestr("{\"result\":\"success\"}")); + } else return(clonestr("{\"error\":\"cant find arbpair\"}")); +#endif +} + +ZERO_ARGS(tradebot,openliquidity) +{ + int32_t i; cJSON *array = cJSON_CreateArray(); + for (i=0; ilinfos)/sizeof(*myinfo->linfos); i++) + { + if ( myinfo->linfos[i].base[0] != 0 ) + jaddi(array,linfo_json(&myinfo->linfos[i])); + } + return(jprint(array,1)); +} + +ZERO_ARGS(tradebot,allbalances) +{ + int32_t i,n; double value,pending; char *base; cJSON *item,*balances = cJSON_CreateObject(); + if ( myinfo->liquidity_currencies == 0 ) + myinfo->liquidity_currencies = cJSON_Parse("[\"KMD\", \"BTC\"]"); + if ( myinfo->liquidity_currencies != 0 && (n= cJSON_GetArraySize(myinfo->liquidity_currencies)) > 0 ) + { + for (i=0; iliquidity_currencies,i); + value = tradebot_balance(myinfo,base); + pending = tradebot_pending(myinfo,base); + item = cJSON_CreateObject(); + jaddnum(item,"value",value); + jaddnum(item,"pending",pending); + jadd(balances,base,item); + } + } + return(jprint(balances,1)); +} + +ZERO_ARGS(tradebot,anchor) +{ + FILE *fp; char *anchorstr,fname[512]; cJSON *anchor; int32_t retval = -1; + if ( (anchorstr= tradebot_allbalances(myinfo,0,0,0)) != 0 ) + { + if ( (anchor= cJSON_Parse(anchorstr)) != 0 ) + { + if ( jobj(anchor,"error") == 0 ) + { + sprintf(fname,"%s/anchor",GLOBAL_DBDIR), OS_compatible_path(fname); + if ( (fp= fopen(fname,"wb")) != 0 ) + { + if ( fwrite(anchorstr,1,strlen(anchorstr)+1,fp) == strlen(anchorstr)+1 ) + retval = 0; + fclose(fp); + } + } + } + free(anchorstr); + } + if ( retval == 0 ) + return(clonestr("{\"result\":\"success\"}")); + else return(clonestr("{\"error\":\"couldnt make anchor file\"}")); +} + +ZERO_ARGS(tradebot,portfolio) +{ + char *currentstr,*anchorstr,fname[512]; long fsize; cJSON *current,*anchor=0,*portfolio=0; + if ( (currentstr= tradebot_allbalances(myinfo,0,0,0)) != 0 ) + { + if ( (current= cJSON_Parse(currentstr)) != 0 ) + { + sprintf(fname,"%s/anchor",GLOBAL_DBDIR), OS_compatible_path(fname); + if ( (anchorstr= OS_filestr(&fsize,fname)) != 0 ) + { + anchor = cJSON_Parse(anchorstr); + free(anchorstr); + } + if ( anchor == 0 ) + anchor = cJSON_Parse("{}"); + portfolio = tradebot_balancesdiff(myinfo,current,anchor); + free_json(current); + } + free(currentstr); + } + if ( portfolio == 0 ) + return(clonestr("{\"result\":\"success\"}")); + else return(jprint(portfolio,1)); +} + +ARRAY_OBJ_INT(tradebot,goals,currencies,vals,targettime) +{ + static bits256 zero; char *targetcoin; int32_t i,n; + if ( currencies != 0 && vals != 0 ) + { + // init things so automatically updates refli.bid and refli.ask + // volume range with margin + // currency percentage value in BTC? target distribution, max percentage, min percentage` + // min price to sell, max price to buy, max volume + n = cJSON_GetArraySize(currencies); + for (i=0; ifp != 0 ) - { - tradebots_calcanswers(pair); - ocas_gen(pair->refc,numfeatures,0,(int32_t)(ftell(pair->fp) / sizeof(pair->rawfeatures))); - return(clonestr("{\"result\":\"success\"}")); - } else return(clonestr("{\"error\":\"cant find arbpair\"}")); -#endif -} - -ZERO_ARGS(tradebot,openliquidity) -{ - int32_t i; cJSON *array = cJSON_CreateArray(); - for (i=0; ilinfos)/sizeof(*myinfo->linfos); i++) - { - if ( myinfo->linfos[i].base[0] != 0 ) - jaddi(array,linfo_json(&myinfo->linfos[i])); - } - return(jprint(array,1)); -} - -ZERO_ARGS(tradebot,allbalances) -{ - int32_t i,n; double value,pending; char *base; cJSON *item,*balances = cJSON_CreateObject(); - if ( myinfo->liquidity_currencies == 0 ) - myinfo->liquidity_currencies = cJSON_Parse("[\"KMD\", \"BTC\"]"); - if ( myinfo->liquidity_currencies != 0 && (n= cJSON_GetArraySize(myinfo->liquidity_currencies)) > 0 ) - { - for (i=0; iliquidity_currencies,i); - value = tradebot_balance(myinfo,base); - pending = tradebot_pending(myinfo,base); - item = cJSON_CreateObject(); - jaddnum(item,"value",value); - jaddnum(item,"pending",pending); - jadd(balances,base,item); - } - } - return(jprint(balances,1)); -} - -ZERO_ARGS(tradebot,anchor) -{ - FILE *fp; char *anchorstr,fname[512]; cJSON *anchor; int32_t retval = -1; - if ( (anchorstr= tradebot_allbalances(myinfo,0,0,0)) != 0 ) - { - if ( (anchor= cJSON_Parse(anchorstr)) != 0 ) - { - if ( jobj(anchor,"error") == 0 ) - { - sprintf(fname,"%s/anchor",GLOBAL_DBDIR), OS_compatible_path(fname); - if ( (fp= fopen(fname,"wb")) != 0 ) - { - if ( fwrite(anchorstr,1,strlen(anchorstr)+1,fp) == strlen(anchorstr)+1 ) - retval = 0; - fclose(fp); - } - } - } - free(anchorstr); - } - if ( retval == 0 ) - return(clonestr("{\"result\":\"success\"}")); - else return(clonestr("{\"error\":\"couldnt make anchor file\"}")); -} - -ZERO_ARGS(tradebot,portfolio) -{ - char *currentstr,*anchorstr,fname[512]; long fsize; cJSON *current,*anchor=0,*portfolio=0; - if ( (currentstr= tradebot_allbalances(myinfo,0,0,0)) != 0 ) - { - if ( (current= cJSON_Parse(currentstr)) != 0 ) - { - sprintf(fname,"%s/anchor",GLOBAL_DBDIR), OS_compatible_path(fname); - if ( (anchorstr= OS_filestr(&fsize,fname)) != 0 ) - { - anchor = cJSON_Parse(anchorstr); - free(anchorstr); - } - if ( anchor == 0 ) - anchor = cJSON_Parse("{}"); - portfolio = tradebot_balancesdiff(myinfo,current,anchor); - free_json(current); - } - free(currentstr); - } - if ( portfolio == 0 ) - return(clonestr("{\"result\":\"success\"}")); - else return(jprint(portfolio,1)); -} - -ARRAY_OBJ_INT(tradebot,goals,currencies,vals,targettime) -{ - static bits256 zero; char *targetcoin; int32_t i,n; - if ( currencies != 0 && vals != 0 ) - { - // init things so automatically updates refli.bid and refli.ask - // volume range with margin - // currency percentage value in BTC? target distribution, max percentage, min percentage` - // min price to sell, max price to buy, max volume - n = cJSON_GetArraySize(currencies); - for (i=0; i 0 ) + jaddnum(retjson,"RTheight",coin->RTheight); + } + return(jprint(retjson,1)); +} + +STRING_ARG(iguana,validate,activecoin) +{ + int32_t i,total,validated; struct iguana_bundle *bp; cJSON *retjson; + if ( (coin= iguana_coinfind(activecoin)) != 0 ) + { + for (i=total=validated=0; ibundlescount; i++) + if ( (bp= coin->bundles[i]) != 0 ) + { + validated += iguana_bundlevalidate(myinfo,coin,bp,1); + total += bp->n; + } + retjson = cJSON_CreateObject(); + jaddstr(retjson,"result","validation run"); + jaddstr(retjson,"coin",coin->symbol); + jaddnum(retjson,"validated",validated); + jaddnum(retjson,"total",total); + jaddnum(retjson,"bundles",coin->bundlescount); + jaddnum(retjson,"accuracy",(double)validated/total); + return(jprint(retjson,1)); + } else return(clonestr("{\"error\":\"no active coin\"}")); +} + +STRING_ARG(iguana,removecoin,activecoin) +{ + struct iguana_bundle *bp; int32_t i,height; char fname[1024]; + if ( (coin= iguana_coinfind(activecoin)) != 0 ) + { + coin->active = 0; + coin->started = 0; + if ( (0) ) + { + for (i=0; isymbol,i), OS_removefile(fname,0); + sprintf(fname,"%s/%s/%04d.vins",coin->VALIDATEDIR,coin->symbol,i), OS_removefile(fname,0); + } + sprintf(fname,"%s/%s/vouts/*",GLOBAL_DBDIR,coin->symbol), OS_removefile(fname,0); + sprintf(fname,"%s/%s/*",coin->VALIDATEDIR,coin->symbol), OS_removefile(fname,0); + for (i=0; ibundlescount; i++) + { + sprintf(fname,"%s/%s/balancecrc.%d",GLOBAL_DBDIR,coin->symbol,i), OS_removefile(fname,0); + if ( (bp= coin->bundles[i]) != 0 ) + { + iguana_bundlepurgefiles(coin,bp); + iguana_bundleremove(coin,bp->hdrsi,1); + } + } + for (height=0; heightlongestchain; height+=IGUANA_SUBDIRDIVISOR) + { + sprintf(fname,"%s/%s/%d",GLOBAL_DBDIR,coin->symbol,height/IGUANA_SUBDIRDIVISOR); + OS_remove_directory(fname); + } + sprintf(fname,"%s/%s/*",GLOBAL_DBDIR,coin->symbol), OS_remove_directory(fname); + } + return(clonestr("{\"result\":\"success\"}")); + } + return(clonestr("{\"error\":\"no active coin\"}")); +} + +INT_ARG(bitcoinrpc,getblockhash,height) +{ + cJSON *retjson; + if ( coin->notarychain >= 0 && coin->FULLNODE == 0 ) + return(_dex_getblockhash(myinfo,coin->symbol,height)); + retjson = cJSON_CreateObject(); + jaddbits256(retjson,"result",iguana_blockhash(coin,height)); + return(jprint(retjson,1)); +} + +HASH_AND_TWOINTS(bitcoinrpc,getblock,blockhash,verbose,remoteonly) +{ + char *blockstr,*datastr; struct iguana_msgblock msg; struct iguana_block *block; cJSON *retjson; bits256 txid; int32_t len; + if ( coin->notarychain >= 0 && coin->FULLNODE == 0 ) + return(_dex_getblock(myinfo,coin->symbol,blockhash)); + retjson = cJSON_CreateObject(); + memset(&msg,0,sizeof(msg)); + if ( remoteonly == 0 && (block= iguana_blockfind("getblockRPC",coin,blockhash)) != 0 ) + { + if ( verbose != 0 ) + return(jprint(iguana_blockjson(myinfo,coin,block,1),1)); + else + { + if ( (len= iguana_peerblockrequest(myinfo,coin,coin->blockspace,coin->blockspacesize,0,blockhash,0)) > 0 ) + { + datastr = malloc(len*2 + 1); + init_hexbytes_noT(datastr,coin->blockspace,len); + jaddstr(retjson,"result",datastr); + free(datastr); + return(jprint(retjson,1)); + } + jaddstr(retjson,"error","error getting rawblock"); + } + } + else if ( coin->APIblockstr != 0 ) + jaddstr(retjson,"error","already have pending request"); + else + { + memset(txid.bytes,0,sizeof(txid)); + if ( (blockstr= iguana_APIrequest(coin,blockhash,txid,5)) != 0 ) + { + jaddstr(retjson,"result",blockstr); + free(blockstr); + } else jaddstr(retjson,"error","cant find blockhash"); + } + return(jprint(retjson,1)); +} + +ZERO_ARGS(bitcoinrpc,getbestblockhash) +{ + cJSON *retjson; + if ( coin->notarychain >= 0 && coin->FULLNODE == 0 ) + return(_dex_getbestblockhash(myinfo,coin->symbol)); + retjson = cJSON_CreateObject(); + char str[65]; jaddstr(retjson,"result",bits256_str(str,coin->blocks.hwmchain.RO.hash2)); + return(jprint(retjson,1)); +} + +ZERO_ARGS(bitcoinrpc,getblockcount) +{ + cJSON *retjson = cJSON_CreateObject(); + //printf("result %d\n",coin->blocks.hwmchain.height); + jaddnum(retjson,"result",coin->blocks.hwmchain.height); + return(jprint(retjson,1)); +} + +STRING_AND_INT(iguana,bundleaddresses,activecoin,height) +{ + struct iguana_info *ptr; + if ( (ptr= iguana_coinfind(activecoin)) != 0 ) + return(iguana_bundleaddrs(ptr,height / coin->chain->bundlesize)); + else return(clonestr("{\"error\":\"activecoin is not active\"}")); +} + +STRING_AND_INT(iguana,PoSweights,activecoin,height) +{ + struct iguana_info *ptr; int32_t num,nonz,errs,bundleheight; struct iguana_pkhash *refP; uint64_t *weights,supply; cJSON *retjson; + if ( (ptr= iguana_coinfind(activecoin)) != 0 ) + { + //for (bundleheight=coin->chain->bundlesize; bundleheightchain->bundlesize) + { + bundleheight = (height / ptr->chain->bundlesize) * ptr->chain->bundlesize; + if ( (weights= iguana_PoS_weights(myinfo,ptr,&refP,&supply,&num,&nonz,&errs,bundleheight)) != 0 ) + { + retjson = cJSON_CreateObject(); + jaddstr(retjson,"result",errs == 0 ? "success" : "error"); + jaddnum(retjson,"bundleheight",bundleheight); + jaddnum(retjson,"numaddresses",num); + jaddnum(retjson,"nonzero",nonz); + jaddnum(retjson,"errors",errs); + jaddnum(retjson,"supply",dstr(supply)); + free(weights); + return(jprint(retjson,1)); + } else return(clonestr("{\"error\":\"iguana_PoS_weights returned null\"}")); + } + } + return(clonestr("{\"error\":\"activecoin is not active\"}")); +} + +STRING_ARG(iguana,stakers,activecoin) +{ + struct iguana_info *ptr; int32_t i,datalen,pkind,hdrsi; bits256 hash2; struct iguana_bundle *bp; cJSON *retjson,*array; struct iguana_pkhash *refP; struct iguana_ramchaindata *rdata; char coinaddr[64]; uint8_t refrmd160[20]; bits256 *sortbuf; + if ( (ptr= iguana_coinfind(activecoin)) != 0 && ptr->RTheight > ptr->chain->bundlesize ) + { + hdrsi = (ptr->RTheight / ptr->chain->bundlesize) - 1; + if ( (bp= ptr->bundles[hdrsi]) != 0 && bp->weights != 0 && (rdata= bp->ramchain.H.data) != 0 && bp->weights != 0 ) + { + sortbuf = calloc(bp->numweights,2 * sizeof(*sortbuf)); + for (i=datalen=0; inumweights; i++) + datalen += iguana_rwnum(1,&((uint8_t *)sortbuf)[datalen],sizeof(bp->weights[i]),(void *)&bp->weights[i]); + hash2 = bits256_doublesha256(0,(uint8_t *)sortbuf,datalen); + refP = RAMCHAIN_PTR(rdata,Poffset); + retjson = cJSON_CreateObject(); + array = cJSON_CreateArray(); + memset(refrmd160,0,sizeof(refrmd160)); + for (i=0; ichain->bundlesize; i++) + { + if ( (pkind= iguana_staker_sort(ptr,&hash2,refrmd160,refP,bp->weights,bp->numweights,sortbuf)) > 0 ) + { + bitcoin_address(coinaddr,ptr->chain->pubtype,refP[pkind].rmd160,sizeof(refP[pkind].rmd160)); + jaddistr(array,coinaddr); + } else jaddistr(array,"error"); + } + jaddstr(retjson,"result","success"); + jadd(retjson,"stakers",array); + return(jprint(retjson,1)); + } else return(clonestr("{\"error\":\"iguana_stakers needs PoSweights and weights\"}")); + } + return(clonestr("{\"error\":\"activecoin is not active\"}")); +} + +STRING_AND_INT(iguana,bundlehashes,activecoin,height) +{ + struct iguana_info *ptr; struct iguana_bundle *bp; int32_t i,hdrsi; cJSON *retjson,*array; struct iguana_ramchaindata *rdata; + if ( (ptr= iguana_coinfind(activecoin)) != 0 ) + { + hdrsi = height / coin->chain->bundlesize; + if ( hdrsi < coin->bundlescount && hdrsi >= 0 && (bp= coin->bundles[hdrsi]) != 0 ) + { + if ( (rdata= bp->ramchain.H.data) != 0 ) + { + array = cJSON_CreateArray(); + for (i=0; ilhashes[i].txid); + retjson = cJSON_CreateObject(); + jaddstr(retjson,"result","success"); + jaddbits256(retjson,"sha256",rdata->sha256); + jadd(retjson,"bundlehashes",array); + return(jprint(retjson,1)); + } else return(clonestr("{\"error\":\"ramchain not there\"}")); + } else return(clonestr("{\"error\":\"height is too big\"}")); + } else return(clonestr("{\"error\":\"activecoin is not active\"}")); +} + +// low priority RPC + +HASH_AND_TWOINTS(bitcoinrpc,listsinceblock,blockhash,target,flag) +{ + /*"transactions" : [ + { + "account" : "doc test", + "address" : "mmXgiR6KAhZCyQ8ndr2BCfEq1wNG2UnyG6", + "category" : "receive", + "amount" : 0.10000000, + "vout" : 0, + "confirmations" : 76478, + "blockhash" : "000000000017c84015f254498c62a7c884a51ccd75d4dd6dbdcb6434aa3bd44d", + "blockindex" : 1, + "blocktime" : 1399294967, + "txid" : "85a98fdf1529f7d5156483ad020a51b7f3340e47448cf932f470b72ff01a6821", + "walletconflicts" : [ + ], + "time" : 1399294967, + "timereceived" : 1418924714 + },*/ + cJSON *retjson = cJSON_CreateObject(); + jaddstr(retjson,"error","low priority RPC not implemented"); + return(jprint(retjson,1)); +} + +ZERO_ARGS(bitcoinrpc,gettxoutsetinfo) +{ + cJSON *retjson = cJSON_CreateObject(); + jaddstr(retjson,"error","low priority RPC not implemented"); + return(jprint(retjson,1)); +} + +ZERO_ARGS(bitcoinrpc,listaddressgroupings) +{ + if ( remoteaddr != 0 ) + return(clonestr("{\"error\":\"no remote\"}")); + return(clonestr("{\"error\":\"low priority RPC not implemented\"}")); +} + +SS_D_I_S(bitcoinrpc,move,fromaccount,toaccount,amount,minconf,comment) +{ + cJSON *retjson; + if ( remoteaddr != 0 ) + return(clonestr("{\"error\":\"no remote\"}")); + if ( myinfo->expiration == 0 ) + return(clonestr("{\"error\":\"need to unlock wallet\"}")); + retjson = cJSON_CreateObject(); + return(jprint(retjson,1)); +} + +ZERO_ARGS(pax,start) +{ + void PAX_init(); + PAX_init(); + return(clonestr("{\"result\":\"PAX_init called\"}")); +} + STRING_AND_TWOINTS(mouse,change,name,x,y) { printf("mouse (%s) x.%d y.%d\n",name,x,y); diff --git a/iguana/ramchain_api.c b/iguana/ramchain_api.c index 7f4878d62..9c5c4cd2b 100755 --- a/iguana/ramchain_api.c +++ b/iguana/ramchain_api.c @@ -13,316 +13,4 @@ * * ******************************************************************************/ -#include "iguana777.h" -#include "../includes/iguana_apidefs.h" -#include "../includes/iguana_apideclares.h" - -STRING_ARG(iguana,initfastfind,activecoin) -{ - if ( (coin= iguana_coinfind(activecoin)) != 0 ) - { - iguana_fastfindcreate(coin); - return(clonestr("{\"result\":\"fast find initialized\"}")); - } else return(clonestr("{\"error\":\"no coin to initialize\"}")); -} - -TWO_STRINGS_AND_TWO_DOUBLES(iguana,balance,activecoin,address,lastheightd,minconfd) -{ - int32_t lastheight,minconf,maxconf=1<<30; cJSON *array,*retjson = cJSON_CreateObject(); - if ( activecoin != 0 && activecoin[0] != 0 ) - coin = iguana_coinfind(activecoin); - if ( coin != 0 ) - { - if ( (minconf= minconfd) <= 0 ) - minconf = 1; - lastheight = lastheightd; - jaddstr(retjson,"address",address); - if ( bitcoin_validaddress(coin,address) < 0 ) - { - jaddstr(retjson,"error","illegal address"); - return(jprint(retjson,1)); - } - jadd64bits(retjson,"RTbalance",iguana_RTbalance(coin,address)); - array = cJSON_CreateArray(); - jaddistr(array,address); - jadd(retjson,"unspents",iguana_RTlistunspent(myinfo,coin,array,minconf,maxconf,remoteaddr,1)); - free_json(array); - if ( lastheight > 0 ) - jaddnum(retjson,"RTheight",coin->RTheight); - } - return(jprint(retjson,1)); -} - -STRING_ARG(iguana,validate,activecoin) -{ - int32_t i,total,validated; struct iguana_bundle *bp; cJSON *retjson; - if ( (coin= iguana_coinfind(activecoin)) != 0 ) - { - for (i=total=validated=0; ibundlescount; i++) - if ( (bp= coin->bundles[i]) != 0 ) - { - validated += iguana_bundlevalidate(myinfo,coin,bp,1); - total += bp->n; - } - retjson = cJSON_CreateObject(); - jaddstr(retjson,"result","validation run"); - jaddstr(retjson,"coin",coin->symbol); - jaddnum(retjson,"validated",validated); - jaddnum(retjson,"total",total); - jaddnum(retjson,"bundles",coin->bundlescount); - jaddnum(retjson,"accuracy",(double)validated/total); - return(jprint(retjson,1)); - } else return(clonestr("{\"error\":\"no active coin\"}")); -} - -STRING_ARG(iguana,removecoin,activecoin) -{ - struct iguana_bundle *bp; int32_t i,height; char fname[1024]; - if ( (coin= iguana_coinfind(activecoin)) != 0 ) - { - coin->active = 0; - coin->started = 0; - if ( (0) ) - { - for (i=0; isymbol,i), OS_removefile(fname,0); - sprintf(fname,"%s/%s/%04d.vins",coin->VALIDATEDIR,coin->symbol,i), OS_removefile(fname,0); - } - sprintf(fname,"%s/%s/vouts/*",GLOBAL_DBDIR,coin->symbol), OS_removefile(fname,0); - sprintf(fname,"%s/%s/*",coin->VALIDATEDIR,coin->symbol), OS_removefile(fname,0); - for (i=0; ibundlescount; i++) - { - sprintf(fname,"%s/%s/balancecrc.%d",GLOBAL_DBDIR,coin->symbol,i), OS_removefile(fname,0); - if ( (bp= coin->bundles[i]) != 0 ) - { - iguana_bundlepurgefiles(coin,bp); - iguana_bundleremove(coin,bp->hdrsi,1); - } - } - for (height=0; heightlongestchain; height+=IGUANA_SUBDIRDIVISOR) - { - sprintf(fname,"%s/%s/%d",GLOBAL_DBDIR,coin->symbol,height/IGUANA_SUBDIRDIVISOR); - OS_remove_directory(fname); - } - sprintf(fname,"%s/%s/*",GLOBAL_DBDIR,coin->symbol), OS_remove_directory(fname); - } - return(clonestr("{\"result\":\"success\"}")); - } - return(clonestr("{\"error\":\"no active coin\"}")); -} - -INT_ARG(bitcoinrpc,getblockhash,height) -{ - cJSON *retjson; - if ( coin->notarychain >= 0 && coin->FULLNODE == 0 ) - return(_dex_getblockhash(myinfo,coin->symbol,height)); - retjson = cJSON_CreateObject(); - jaddbits256(retjson,"result",iguana_blockhash(coin,height)); - return(jprint(retjson,1)); -} - -HASH_AND_TWOINTS(bitcoinrpc,getblock,blockhash,verbose,remoteonly) -{ - char *blockstr,*datastr; struct iguana_msgblock msg; struct iguana_block *block; cJSON *retjson; bits256 txid; int32_t len; - if ( coin->notarychain >= 0 && coin->FULLNODE == 0 ) - return(_dex_getblock(myinfo,coin->symbol,blockhash)); - retjson = cJSON_CreateObject(); - memset(&msg,0,sizeof(msg)); - if ( remoteonly == 0 && (block= iguana_blockfind("getblockRPC",coin,blockhash)) != 0 ) - { - if ( verbose != 0 ) - return(jprint(iguana_blockjson(myinfo,coin,block,1),1)); - else - { - if ( (len= iguana_peerblockrequest(myinfo,coin,coin->blockspace,coin->blockspacesize,0,blockhash,0)) > 0 ) - { - datastr = malloc(len*2 + 1); - init_hexbytes_noT(datastr,coin->blockspace,len); - jaddstr(retjson,"result",datastr); - free(datastr); - return(jprint(retjson,1)); - } - jaddstr(retjson,"error","error getting rawblock"); - } - } - else if ( coin->APIblockstr != 0 ) - jaddstr(retjson,"error","already have pending request"); - else - { - memset(txid.bytes,0,sizeof(txid)); - if ( (blockstr= iguana_APIrequest(coin,blockhash,txid,5)) != 0 ) - { - jaddstr(retjson,"result",blockstr); - free(blockstr); - } else jaddstr(retjson,"error","cant find blockhash"); - } - return(jprint(retjson,1)); -} - -ZERO_ARGS(bitcoinrpc,getbestblockhash) -{ - cJSON *retjson; - if ( coin->notarychain >= 0 && coin->FULLNODE == 0 ) - return(_dex_getbestblockhash(myinfo,coin->symbol)); - retjson = cJSON_CreateObject(); - char str[65]; jaddstr(retjson,"result",bits256_str(str,coin->blocks.hwmchain.RO.hash2)); - return(jprint(retjson,1)); -} - -ZERO_ARGS(bitcoinrpc,getblockcount) -{ - cJSON *retjson = cJSON_CreateObject(); - //printf("result %d\n",coin->blocks.hwmchain.height); - jaddnum(retjson,"result",coin->blocks.hwmchain.height); - return(jprint(retjson,1)); -} - -STRING_AND_INT(iguana,bundleaddresses,activecoin,height) -{ - struct iguana_info *ptr; - if ( (ptr= iguana_coinfind(activecoin)) != 0 ) - return(iguana_bundleaddrs(ptr,height / coin->chain->bundlesize)); - else return(clonestr("{\"error\":\"activecoin is not active\"}")); -} - -STRING_AND_INT(iguana,PoSweights,activecoin,height) -{ - struct iguana_info *ptr; int32_t num,nonz,errs,bundleheight; struct iguana_pkhash *refP; uint64_t *weights,supply; cJSON *retjson; - if ( (ptr= iguana_coinfind(activecoin)) != 0 ) - { - //for (bundleheight=coin->chain->bundlesize; bundleheightchain->bundlesize) - { - bundleheight = (height / ptr->chain->bundlesize) * ptr->chain->bundlesize; - if ( (weights= iguana_PoS_weights(myinfo,ptr,&refP,&supply,&num,&nonz,&errs,bundleheight)) != 0 ) - { - retjson = cJSON_CreateObject(); - jaddstr(retjson,"result",errs == 0 ? "success" : "error"); - jaddnum(retjson,"bundleheight",bundleheight); - jaddnum(retjson,"numaddresses",num); - jaddnum(retjson,"nonzero",nonz); - jaddnum(retjson,"errors",errs); - jaddnum(retjson,"supply",dstr(supply)); - free(weights); - return(jprint(retjson,1)); - } else return(clonestr("{\"error\":\"iguana_PoS_weights returned null\"}")); - } - } - return(clonestr("{\"error\":\"activecoin is not active\"}")); -} - -STRING_ARG(iguana,stakers,activecoin) -{ - struct iguana_info *ptr; int32_t i,datalen,pkind,hdrsi; bits256 hash2; struct iguana_bundle *bp; cJSON *retjson,*array; struct iguana_pkhash *refP; struct iguana_ramchaindata *rdata; char coinaddr[64]; uint8_t refrmd160[20]; bits256 *sortbuf; - if ( (ptr= iguana_coinfind(activecoin)) != 0 && ptr->RTheight > ptr->chain->bundlesize ) - { - hdrsi = (ptr->RTheight / ptr->chain->bundlesize) - 1; - if ( (bp= ptr->bundles[hdrsi]) != 0 && bp->weights != 0 && (rdata= bp->ramchain.H.data) != 0 && bp->weights != 0 ) - { - sortbuf = calloc(bp->numweights,2 * sizeof(*sortbuf)); - for (i=datalen=0; inumweights; i++) - datalen += iguana_rwnum(1,&((uint8_t *)sortbuf)[datalen],sizeof(bp->weights[i]),(void *)&bp->weights[i]); - hash2 = bits256_doublesha256(0,(uint8_t *)sortbuf,datalen); - refP = RAMCHAIN_PTR(rdata,Poffset); - retjson = cJSON_CreateObject(); - array = cJSON_CreateArray(); - memset(refrmd160,0,sizeof(refrmd160)); - for (i=0; ichain->bundlesize; i++) - { - if ( (pkind= iguana_staker_sort(ptr,&hash2,refrmd160,refP,bp->weights,bp->numweights,sortbuf)) > 0 ) - { - bitcoin_address(coinaddr,ptr->chain->pubtype,refP[pkind].rmd160,sizeof(refP[pkind].rmd160)); - jaddistr(array,coinaddr); - } else jaddistr(array,"error"); - } - jaddstr(retjson,"result","success"); - jadd(retjson,"stakers",array); - return(jprint(retjson,1)); - } else return(clonestr("{\"error\":\"iguana_stakers needs PoSweights and weights\"}")); - } - return(clonestr("{\"error\":\"activecoin is not active\"}")); -} - -STRING_AND_INT(iguana,bundlehashes,activecoin,height) -{ - struct iguana_info *ptr; struct iguana_bundle *bp; int32_t i,hdrsi; cJSON *retjson,*array; struct iguana_ramchaindata *rdata; - if ( (ptr= iguana_coinfind(activecoin)) != 0 ) - { - hdrsi = height / coin->chain->bundlesize; - if ( hdrsi < coin->bundlescount && hdrsi >= 0 && (bp= coin->bundles[hdrsi]) != 0 ) - { - if ( (rdata= bp->ramchain.H.data) != 0 ) - { - array = cJSON_CreateArray(); - for (i=0; ilhashes[i].txid); - retjson = cJSON_CreateObject(); - jaddstr(retjson,"result","success"); - jaddbits256(retjson,"sha256",rdata->sha256); - jadd(retjson,"bundlehashes",array); - return(jprint(retjson,1)); - } else return(clonestr("{\"error\":\"ramchain not there\"}")); - } else return(clonestr("{\"error\":\"height is too big\"}")); - } else return(clonestr("{\"error\":\"activecoin is not active\"}")); -} - -// low priority RPC - -HASH_AND_TWOINTS(bitcoinrpc,listsinceblock,blockhash,target,flag) -{ - /*"transactions" : [ - { - "account" : "doc test", - "address" : "mmXgiR6KAhZCyQ8ndr2BCfEq1wNG2UnyG6", - "category" : "receive", - "amount" : 0.10000000, - "vout" : 0, - "confirmations" : 76478, - "blockhash" : "000000000017c84015f254498c62a7c884a51ccd75d4dd6dbdcb6434aa3bd44d", - "blockindex" : 1, - "blocktime" : 1399294967, - "txid" : "85a98fdf1529f7d5156483ad020a51b7f3340e47448cf932f470b72ff01a6821", - "walletconflicts" : [ - ], - "time" : 1399294967, - "timereceived" : 1418924714 - },*/ - cJSON *retjson = cJSON_CreateObject(); - jaddstr(retjson,"error","low priority RPC not implemented"); - return(jprint(retjson,1)); -} - -ZERO_ARGS(bitcoinrpc,gettxoutsetinfo) -{ - cJSON *retjson = cJSON_CreateObject(); - jaddstr(retjson,"error","low priority RPC not implemented"); - return(jprint(retjson,1)); -} - -ZERO_ARGS(bitcoinrpc,listaddressgroupings) -{ - if ( remoteaddr != 0 ) - return(clonestr("{\"error\":\"no remote\"}")); - return(clonestr("{\"error\":\"low priority RPC not implemented\"}")); -} - -SS_D_I_S(bitcoinrpc,move,fromaccount,toaccount,amount,minconf,comment) -{ - cJSON *retjson; - if ( remoteaddr != 0 ) - return(clonestr("{\"error\":\"no remote\"}")); - if ( myinfo->expiration == 0 ) - return(clonestr("{\"error\":\"need to unlock wallet\"}")); - retjson = cJSON_CreateObject(); - return(jprint(retjson,1)); -} - -ZERO_ARGS(pax,start) -{ - void PAX_init(); - PAX_init(); - return(clonestr("{\"result\":\"PAX_init called\"}")); -} -#undef IGUANA_ARGS -#include "../includes/iguana_apiundefs.h" - +// deprecated From ea46b40241665241a0d182aafa2674a027ad1717 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 10:04:01 +0200 Subject: [PATCH 423/495] Rework include files --- iguana/iguana_json.c | 7 ++++++- includes/iguana_apideclares.h | 8 ++++++++ includes/iguana_apiundefs.h | 2 ++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/iguana/iguana_json.c b/iguana/iguana_json.c index e7febc655..38c6c5b98 100755 --- a/iguana/iguana_json.c +++ b/iguana/iguana_json.c @@ -191,7 +191,10 @@ cJSON *SuperNET_helpjson() #include "../includes/iguana_apideclares.h" +#undef IGUANA_ARGS +#undef _IGUANA_APIDEC_H_ #include "../includes/iguana_apiundefs.h" + if ( array != 0 ) jadd(json,"API",array); jadd(json,"agents",agents); @@ -907,6 +910,7 @@ TWO_STRINGS(SuperNET,html,agentform,htmlfile) } #undef IGUANA_ARGS +#undef _IGUANA_APIDEC_H_ #include "../includes/iguana_apiundefs.h" char *SuperNET_parser(struct supernet_info *myinfo,char *agentstr,char *method,cJSON *json,char *remoteaddr) @@ -1025,8 +1029,9 @@ char *SuperNET_parser(struct supernet_info *myinfo,char *agentstr,char *method,c #define STRING_ARRAY_OBJ_STRING IGUANA_DISPATCH_SAOS #include "../includes/iguana_apideclares.h" -//#undef IGUANA_ARGS +#undef IGUANA_ARGS +#undef _IGUANA_APIDEC_H_ #include "../includes/iguana_apiundefs.h" char errstr[512]; sprintf(errstr,"{\"error\":\"unsupported call\",\"agent\":\"%s\",\"method\":\"%s\"}",agentstr,method); diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index dc8f26e42..955acffe0 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -13,6 +13,12 @@ * * ******************************************************************************/ +#ifdef _IGUANA_APIDEC_H_ +emit compiler error if recursively being included +#endif +#ifndef _IGUANA_APIDEC_H_ +#define _IGUANA_APIDEC_H_ + STRING_ARG(dpow,pending,fiat); ZERO_ARGS(dpow,notarychains); STRING_ARG(dpow,active,maskhex); @@ -358,3 +364,5 @@ TWO_STRINGS(hmac,md4,message,passphrase); TWO_STRINGS(hmac,md5,message,passphrase); TWO_STRINGS(hmac,tiger192_3,message,passphrase); TWO_STRINGS(hmac,whirlpool,message,passphrase); + +#endif diff --git a/includes/iguana_apiundefs.h b/includes/iguana_apiundefs.h index 0b793ee2d..88156175d 100755 --- a/includes/iguana_apiundefs.h +++ b/includes/iguana_apiundefs.h @@ -49,3 +49,5 @@ #undef IGUANA_ARGS #undef IGUANA_CALLARGS +#undef _IGUANA_APIDEC_H_ + From bab313d965819eca508f57c2a5bf8503a28aee00 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 10:16:01 +0200 Subject: [PATCH 424/495] Bigger split fund fees --- basilisk/basilisk_bitcoin.c | 2 +- iguana/dpow/dpow_fsm.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index 3e5aae41b..a5450ea7a 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -585,7 +585,7 @@ char *iguana_utxoduplicates(struct supernet_info *myinfo,struct iguana_info *coi if ( signedtxidp != 0 ) memset(signedtxidp,0,sizeof(*signedtxidp)); bitcoin_address(changeaddr,coin->chain->pubtype,myinfo->persistent_pubkey33,33); - txfee = 10 * (coin->txfee + duplicates*coin->txfee/5); + txfee = 10 * (coin->txfee + duplicates*coin->txfee*2); if ( (txobj= bitcoin_txcreate(coin->symbol,coin->chain->isPoS,0,1,0)) != 0 ) { if ( duplicates <= 0 ) diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index 4d563f9f1..18afb868b 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -126,8 +126,8 @@ int32_t dpow_checkutxo(struct supernet_info *myinfo,struct dpow_info *dp,struct int32_t haveutxo,completed,minutxo,n; bits256 signedtxid; cJSON *addresses; char *rawtx,*sendtx; if ( strcmp("BTC",coin->symbol) == 0 ) { - minutxo = 499; - n = 50; + minutxo = 199; + n = 10; } else { From d4e014ac261c521f80cd1e242f38d583cfcaf219 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 10:35:28 +0200 Subject: [PATCH 425/495] Test --- iguana/kmd_lookup.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 2feabf1cd..7d74315cf 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -395,7 +395,7 @@ cJSON *kmd_listaddress(struct supernet_info *myinfo,struct iguana_info *coin,cha struct kmd_addresshh *addr; struct kmd_transactionhh *ptr=0,*spent,*prev=0; uint8_t type_rmd160[21]; int32_t i; char *retstr; cJSON *retjson; if ( array == 0 ) array = cJSON_CreateArray(); - printf("%s listaddress.(%s)\n",coin->symbol,coinaddr); + //printf("%s listaddress.(%s)\n",coin->symbol,coinaddr); if ( (retstr= bitcoinrpc_validateaddress(myinfo,coin,0,0,coinaddr)) != 0 ) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) @@ -478,7 +478,7 @@ cJSON *kmd_listaddress(struct supernet_info *myinfo,struct iguana_info *coin,cha } ptr = prev; } - } else printf("no valid entry for (%s) %p %p\n",coinaddr,addr,ptr); + } //else printf("no valid entry for (%s) %p %p\n",coinaddr,addr,ptr); return(array); } From 856d63239857bb209e52447afbb597cd91c12430 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 10:54:20 +0200 Subject: [PATCH 426/495] Test --- basilisk/basilisk_bitcoin.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index a5450ea7a..b779027bb 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -585,7 +585,7 @@ char *iguana_utxoduplicates(struct supernet_info *myinfo,struct iguana_info *coi if ( signedtxidp != 0 ) memset(signedtxidp,0,sizeof(*signedtxidp)); bitcoin_address(changeaddr,coin->chain->pubtype,myinfo->persistent_pubkey33,33); - txfee = 10 * (coin->txfee + duplicates*coin->txfee*2); + txfee = (coin->txfee + duplicates*coin->txfee*2); if ( (txobj= bitcoin_txcreate(coin->symbol,coin->chain->isPoS,0,1,0)) != 0 ) { if ( duplicates <= 0 ) From e3b2ebc844702c7fbfc4225bd56866e449605738 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 11:06:37 +0200 Subject: [PATCH 427/495] Test --- basilisk/jumblr.c | 2 +- iguana/kmd_lookup.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 36364026c..67b8c2306 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -407,7 +407,7 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch free(retstr); } // curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"request\",\"vals\":{\"source\":\"KMD\",\"amount\":20,\"dest\":\"USD\",\"minprice\":0.08}}" - } else printf("btcavail %.8f pending %.8f\n",btcavail,pending); + } //else printf("btcavail %.8f pending %.8f\n",btcavail,pending); } else printf("null kmdprice %.8f\n",kmdprice); } diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 7d74315cf..f3abf52d2 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -641,7 +641,7 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) while ( loadheight < height-lag ) { flag = 0; - //if ( (loadheight % 10000) == 0 ) + if ( (loadheight % 10000) == 0 ) printf("loading %s ht.%d vs height.%d - lag.%d kmdheight.%d\n",coin->symbol,loadheight,height,lag,coin->kmd_height);//,jprint(kmd_getbalance(coin,"*"),1)); if ( (blockjson= kmd_blockjson(&h,coin->symbol,coin->chain->serverport,coin->chain->userpass,0,loadheight)) != 0 ) { From 16527340d9d468e4cc5168076067decc00a9327f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 11:29:38 +0200 Subject: [PATCH 428/495] boost utxo to .0005 --- iguana/dPoW.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 278e7a2d8..b773104c8 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -23,7 +23,7 @@ //#define DPOW_M(bp) ((bp)->minsigs) // (((bp)->numnotaries >> 1) + 1) #define DPOW_MODIND(bp,offset) (((((bp)->height / DPOW_CHECKPOINTFREQ) % (bp)->numnotaries) + (offset)) % (bp)->numnotaries) #define DPOW_VERSION 0x0781 -#define DPOW_UTXOSIZE 30000 +#define DPOW_UTXOSIZE 50000 #define DPOW_MINOUTPUT 6000 #define DPOW_DURATION 600 #define DPOW_RATIFYDURATION (3600 * 24) From d3a0e0dc2b2df6228d2a3ddbd4defe5b170401a7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 13:03:45 +0200 Subject: [PATCH 429/495] Test --- basilisk/basilisk.h | 5 +- basilisk/basilisk_swap.c | 136 ++++++++++++++++++++++++----------- basilisk/basilisk_tradebot.c | 4 +- 3 files changed, 98 insertions(+), 47 deletions(-) diff --git a/basilisk/basilisk.h b/basilisk/basilisk.h index a7bb6be4d..c25f11236 100755 --- a/basilisk/basilisk.h +++ b/basilisk/basilisk.h @@ -46,7 +46,7 @@ struct basilisk_swap; struct basilisk_rawtxinfo { - char destaddr[64]; + char destaddr[64],coinstr[16]; bits256 txid,signedtxid,actualtxid; uint64_t amount,change,inputsum; int32_t redeemlen,datalen,completed,vintype,vouttype,numconfirms,spendlen,secretstart,suppress_pubkeys; @@ -60,8 +60,9 @@ struct basilisk_rawtx struct iguana_msgtx msgtx; struct basilisk_rawtxinfo I; struct iguana_info *coin; + char vinstr[4096]; cJSON *vins; - uint8_t *txbytes,spendscript[512],redeemscript[1024],extraspace[1024]; + uint8_t txbytes[8192],spendscript[512],redeemscript[1024],extraspace[1024]; }; struct basilisk_swapinfo diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 18e41e56f..0bf525368 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -382,8 +382,9 @@ int32_t _basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,uint32_ if ( signedtx != 0 || (signedtx= iguana_signrawtx(myinfo,rawtx->coin,height,&dest->I.signedtxid,&dest->I.completed,vins,rawtxbytes,privkeys,V)) != 0 ) { dest->I.datalen = (int32_t)strlen(signedtx) >> 1; - dest->txbytes = calloc(1,dest->I.datalen); - decode_hex(dest->txbytes,dest->I.datalen,signedtx); + if ( dest->I.datalen <= sizeof(dest->txbytes) ) + decode_hex(dest->txbytes,dest->I.datalen,signedtx); + else printf("DEX tx is too big %d vs %d\n",dest->I.datalen,(int32_t)sizeof(dest->txbytes)); if ( signedtx != rawtxbytes ) free(signedtx); if ( dest->I.completed != 0 ) @@ -477,7 +478,7 @@ int32_t basilisk_rawtx_return(struct supernet_info *myinfo,int32_t height,struct } } rawtx->I.datalen = (int32_t)strlen(signedtx) >> 1; - rawtx->txbytes = calloc(1,rawtx->I.datalen); + //rawtx->txbytes = calloc(1,rawtx->I.datalen); decode_hex(rawtx->txbytes,rawtx->I.datalen,signedtx); printf("%s SIGNEDTX.(%s)\n",rawtx->name,signedtx); free(signedtx); @@ -490,7 +491,7 @@ int32_t basilisk_rawtx_return(struct supernet_info *myinfo,int32_t height,struct int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swapstarted,uint8_t *pubkey33,int32_t iambob,int32_t lockinputs,struct basilisk_rawtx *rawtx,uint32_t locktime,uint8_t *script,int32_t scriptlen,int64_t txfee,int32_t minconf,int32_t delay) { - char *retstr,scriptstr[1024],coinaddr[64]; uint32_t basilisktag; int32_t flag,i,n,retval = -1; cJSON *addresses,*valsobj,*retarray=0; struct vin_info *V; + char *retstr,*jsonstr,scriptstr[1024],coinaddr[64]; uint32_t basilisktag; int32_t flag,i,n,retval = -1; cJSON *addresses,*valsobj,*retarray=0; struct vin_info *V; //bitcoin_address(coinaddr,rawtx->coin->chain->pubtype,myinfo->persistent_pubkey33,33); if ( rawtx->coin->changeaddr[0] == 0 ) { @@ -531,7 +532,10 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swaps { if ( (retval= basilisk_rawtx_return(myinfo,rawtx->coin->longestchain,rawtx,jitem(retarray,i),lockinputs,V)) == 0 ) { - rawtx->vins = jobj(jitem(retarray,i),"vins"); + rawtx->vins = jduplicate(jobj(jitem(retarray,i),"vins")); + jsonstr = jprint(rawtx->vins,0); + safecopy(rawtx->vinstr,jsonstr,sizeof(rawtx->vinstr)); + free(jsonstr); break; } } @@ -539,7 +543,10 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swaps else { retval = basilisk_rawtx_return(myinfo,rawtx->coin->longestchain,rawtx,retarray,lockinputs,V); - rawtx->vins = jobj(retarray,"vins"); + rawtx->vins = jduplicate(jobj(retarray,"vins")); + jsonstr = jprint(rawtx->vins,0); + safecopy(rawtx->vinstr,jsonstr,sizeof(rawtx->vinstr)); + free(jsonstr); } free(retarray); } else printf("error parsing.(%s)\n",retstr); @@ -552,7 +559,7 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swaps struct basilisk_rawtx *basilisk_swapdata_rawtx(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen,struct basilisk_rawtx *rawtx) { - if ( rawtx->txbytes != 0 && rawtx->I.datalen <= maxlen ) + if ( rawtx->I.datalen != 0 && rawtx->I.datalen <= maxlen ) { memcpy(data,rawtx->txbytes,rawtx->I.datalen); return(rawtx); @@ -564,8 +571,9 @@ int32_t basilisk_verify_otherfee(struct supernet_info *myinfo,void *ptr,uint8_t { struct basilisk_swap *swap = ptr; // add verification and broadcast - swap->otherfee.txbytes = calloc(1,datalen); + //swap->otherfee.txbytes = calloc(1,datalen); memcpy(swap->otherfee.txbytes,data,datalen); + swap->otherfee.I.datalen = datalen; swap->otherfee.I.actualtxid = swap->otherfee.I.signedtxid = bits256_doublesha256(0,data,datalen); basilisk_txlog(myinfo,swap,&swap->otherfee,-1); return(0); @@ -583,9 +591,9 @@ int32_t basilisk_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,str if ( rawtx->I.redeemlen > 0 && rawtx->I.redeemlen < 0x100 ) memcpy(rawtx->redeemscript,&data[datalen],rawtx->I.redeemlen); //printf("recvlen.%d datalen.%d redeemlen.%d\n",recvlen,datalen,rawtx->redeemlen); - if ( rawtx->txbytes == 0 ) + if ( rawtx->I.datalen == 0 ) { - rawtx->txbytes = calloc(1,datalen); + //rawtx->txbytes = calloc(1,datalen); memcpy(rawtx->txbytes,data,datalen); rawtx->I.datalen = datalen; } @@ -891,14 +899,14 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa //for (i=0; ibobpayment.redeemlen; i++) // printf("%02x",swap->bobpayment.redeemscript[i]); //printf(" <- bobpayment.%d\n",i); - if ( genflag != 0 && bits256_nonz(*(bits256 *)swap->I.secretBn256) != 0 && swap->bobpayment.txbytes == 0 ) + if ( genflag != 0 && bits256_nonz(*(bits256 *)swap->I.secretBn256) != 0 && swap->bobpayment.I.datalen == 0 ) { for (i=0; i<3; i++) { //if ( swap->bobpayment.txbytes != 0 && swap->bobpayment.I.spendlen != 0 ) // break; basilisk_rawtx_gen("payment",myinfo,swap->I.started,swap->persistent_pubkey33,1,1,&swap->bobpayment,swap->bobpayment.I.locktime,swap->bobpayment.spendscript,swap->bobpayment.I.spendlen,swap->bobpayment.coin->chain->txfee,1,0); - if ( swap->bobpayment.txbytes == 0 || swap->bobpayment.I.spendlen == 0 ) + if ( swap->bobpayment.I.spendlen == 0 || swap->bobpayment.I.datalen == 0 ) { printf("error bob generating %p payment.%d\n",swap->bobpayment.txbytes,swap->bobpayment.I.spendlen); sleep(DEX_SLEEP); @@ -924,14 +932,14 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa else { swap->bobdeposit.I.spendlen = basilisk_bobscript(swap->bobdeposit.I.rmd160,swap->bobdeposit.redeemscript,&swap->bobdeposit.I.redeemlen,swap->bobdeposit.spendscript,0,&swap->bobdeposit.I.locktime,&swap->bobdeposit.I.secretstart,&swap->I,1); - if ( genflag != 0 && (swap->bobdeposit.txbytes == 0 || swap->bobrefund.txbytes == 0) ) + if ( genflag != 0 && (swap->bobdeposit.I.datalen == 0 || swap->bobrefund.I.datalen == 0) ) { for (i=0; i<3; i++) { //if ( swap->bobdeposit.txbytes != 0 && swap->bobdeposit.I.spendlen != 0 ) // break; basilisk_rawtx_gen("deposit",myinfo,swap->I.started,swap->persistent_pubkey33,1,1,&swap->bobdeposit,swap->bobdeposit.I.locktime,swap->bobdeposit.spendscript,swap->bobdeposit.I.spendlen,swap->bobdeposit.coin->chain->txfee,1,0); - if ( swap->bobdeposit.txbytes == 0 || swap->bobdeposit.I.spendlen == 0 ) + if ( swap->bobdeposit.I.datalen == 0 || swap->bobdeposit.I.spendlen == 0 ) { printf("error bob generating %p deposit.%d\n",swap->bobdeposit.txbytes,swap->bobdeposit.I.spendlen); sleep(DEX_SLEEP); @@ -1220,7 +1228,7 @@ int32_t basilisk_privBn_extract(struct supernet_info *myinfo,struct basilisk_swa } if ( basilisk_swapget(myinfo,swap,0x40000000,data,maxlen,basilisk_verify_privi) == 0 ) { - if ( bits256_nonz(swap->I.privBn) != 0 && swap->alicereclaim.txbytes == 0 ) + if ( bits256_nonz(swap->I.privBn) != 0 && swap->alicereclaim.I.datalen == 0 ) { char str[65]; printf("have privBn.%s\n",bits256_str(str,swap->I.privBn)); return(basilisk_alicepayment_spend(myinfo,swap,&swap->alicereclaim)); @@ -1235,7 +1243,7 @@ int32_t basilisk_privAm_extract(struct supernet_info *myinfo,struct basilisk_swa { } - if ( bits256_nonz(swap->I.privAm) != 0 && swap->bobspend.txbytes == 0 ) + if ( bits256_nonz(swap->I.privAm) != 0 && swap->bobspend.I.datalen == 0 ) { char str[65]; printf("have privAm.%s\n",bits256_str(str,swap->I.privAm)); return(basilisk_alicepayment_spend(myinfo,swap,&swap->bobspend)); @@ -1312,6 +1320,7 @@ void basilisk_rawtx_setparms(char *name,uint32_t quoteid,struct basilisk_rawtx * { strcpy(rawtx->name,name); rawtx->coin = coin; + strcpy(rawtx->I.coinstr,coin->symbol); rawtx->I.numconfirms = numconfirms; if ( (rawtx->I.amount= satoshis) < 10000 ) rawtx->I.amount = 10000; @@ -1367,6 +1376,48 @@ int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct igu return(0); } +void basilisk_swap_saveupdate(struct supernet_info *myinfo,struct basilisk_swap *swap) +{ + FILE *fp; char fname[512]; + sprintf(fname,"%s/SWAPS/%u-%u.swap",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid); + if ( (fp= fopen(fname,"wb")) != 0 ) + { + fwrite(&swap->I,1,sizeof(swap->I),fp); + fwrite(&swap->bobdeposit,1,sizeof(swap->bobdeposit),fp); + fwrite(&swap->bobpayment,1,sizeof(swap->bobpayment),fp); + fwrite(&swap->alicepayment,1,sizeof(swap->alicepayment),fp); + fwrite(&swap->myfee,1,sizeof(swap->myfee),fp); + fwrite(&swap->otherfee,1,sizeof(swap->otherfee),fp); + fwrite(&swap->aliceclaim,1,sizeof(swap->aliceclaim),fp); + fwrite(&swap->alicespend,1,sizeof(swap->alicespend),fp); + fwrite(&swap->bobreclaim,1,sizeof(swap->bobreclaim),fp); + fwrite(&swap->bobspend,1,sizeof(swap->bobspend),fp); + fwrite(&swap->bobrefund,1,sizeof(swap->bobrefund),fp); + fwrite(&swap->alicereclaim,1,sizeof(swap->alicereclaim),fp); + fwrite(swap->privkeys,1,sizeof(swap->privkeys),fp); + fwrite(swap->otherdeck,1,sizeof(swap->otherdeck),fp); + fwrite(swap->deck,1,sizeof(swap->deck),fp); + fclose(fp); + } +} + +int32_t basilisk_swap_loadtx(struct basilisk_rawtx *rawtx,FILE *fp,char *bobcoinstr,char *alicecoinstr) +{ + if ( fread(rawtx,1,sizeof(*rawtx),fp) == sizeof(*rawtx) ) + { + rawtx->coin = 0; + rawtx->vins = 0; + if ( strcmp(rawtx->I.coinstr,bobcoinstr) == 0 || strcmp(rawtx->I.coinstr,alicecoinstr) == 0 ) + { + rawtx->coin = iguana_coinfind(rawtx->I.coinstr); + if ( rawtx->vinstr[0] != 0 ) + rawtx->vins = cJSON_Parse(rawtx->vinstr); + return(0); + } + } + return(-1); +} + struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 privkey,uint8_t *pubkey33,bits256 pubkey25519,struct basilisk_swap *swap,int32_t optionduration,uint32_t statebits,int32_t reinit) { FILE *fp; char fname[512]; uint8_t *alicepub33=0,*bobpub33=0; int32_t jumblrflag,x = -1; @@ -1376,6 +1427,17 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv if ( (fp= fopen(fname,"rb")) != 0 ) { fread(&swap->I,1,sizeof(swap->I),fp); + basilisk_swap_loadtx(&swap->bobdeposit,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->bobpayment,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->alicepayment,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->myfee,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->otherfee,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->aliceclaim,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->alicespend,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->bobreclaim,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->bobspend,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->bobrefund,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->alicereclaim,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); fread(swap->privkeys,1,sizeof(swap->privkeys),fp); fread(swap->otherdeck,1,sizeof(swap->otherdeck),fp); fread(swap->deck,1,sizeof(swap->deck),fp); @@ -1474,8 +1536,10 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv void basilisk_rawtx_purge(struct basilisk_rawtx *rawtx) { - if ( rawtx->txbytes != 0 ) - free(rawtx->txbytes), rawtx->txbytes = 0; + if ( rawtx->vins != 0 ) + free_json(rawtx->vins); + //if ( rawtx->txbytes != 0 ) + // free(rawtx->txbytes), rawtx->txbytes = 0; } void basilisk_swap_finished(struct supernet_info *myinfo,struct basilisk_swap *swap) @@ -1488,11 +1552,12 @@ void basilisk_swap_finished(struct supernet_info *myinfo,struct basilisk_swap *s basilisk_rawtx_purge(&swap->alicepayment); basilisk_rawtx_purge(&swap->myfee); basilisk_rawtx_purge(&swap->otherfee); - basilisk_rawtx_purge(&swap->alicereclaim); + basilisk_rawtx_purge(&swap->aliceclaim); basilisk_rawtx_purge(&swap->alicespend); basilisk_rawtx_purge(&swap->bobreclaim); basilisk_rawtx_purge(&swap->bobspend); basilisk_rawtx_purge(&swap->bobrefund); + basilisk_rawtx_purge(&swap->alicereclaim); for (i=0; inummessages; i++) if ( swap->messages[i].data != 0 ) free(swap->messages[i].data), swap->messages[i].data = 0; @@ -2087,7 +2152,7 @@ void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap, void basilisk_swaploop(void *_swap) { - uint8_t *data; uint32_t expiration; char fname[512]; uint32_t channel; int32_t retval=0,i,j,datalen,maxlen; FILE *fp; struct supernet_info *myinfo; struct basilisk_swap *swap = _swap; + uint8_t *data; uint32_t expiration; uint32_t channel; int32_t retval=0,i,j,datalen,maxlen; struct supernet_info *myinfo; struct basilisk_swap *swap = _swap; myinfo = swap->myinfoptr; fprintf(stderr,"start swap\n"); maxlen = 1024*1024 + sizeof(*swap); @@ -2112,8 +2177,6 @@ void basilisk_swaploop(void *_swap) break; } sleep(DEX_SLEEP); - //dpow_nanomsg_update(myinfo); - //dex_updateclient(myinfo); } if ( swap->connected == 0 ) { @@ -2134,8 +2197,6 @@ void basilisk_swaploop(void *_swap) break; } sleep(DEX_SLEEP + (swap->I.iambob == 0)*1); - //dpow_nanomsg_update(myinfo); - //dex_updateclient(myinfo); } myinfo->DEXactive = swap->I.expiration; if ( time(NULL) >= expiration ) @@ -2144,27 +2205,17 @@ void basilisk_swaploop(void *_swap) myinfo->DEXactive = 0; } printf("C r%u/q%u swapstate.%x retval.%d\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits,retval); - sprintf(fname,"%s/SWAPS/%u-%u.swap",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid); - if ( (fp= fopen(fname,"wb")) != 0 ) - { - fwrite(&swap->I,1,sizeof(swap->I),fp); - fwrite(swap->privkeys,1,sizeof(swap->privkeys),fp); - fwrite(swap->otherdeck,1,sizeof(swap->otherdeck),fp); - fwrite(swap->deck,1,sizeof(swap->deck),fp); - fclose(fp); - } + basilisk_swap_saveupdate(myinfo,swap); while ( retval == 0 && (swap->I.statebits & 0x40) == 0 ) // send fee { if ( swap->connected == 0 ) basilisk_psockinit(myinfo,swap,swap->I.iambob != 0); - //dpow_nanomsg_update(myinfo); - //dex_updateclient(myinfo); //printf("sendstate.%x\n",swap->I.statebits); basilisk_sendstate(myinfo,swap,data,maxlen); //printf("swapget\n"); basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); //printf("after swapget\n"); - if ( swap->myfee.txbytes == 0 ) + if ( swap->myfee.I.datalen == 0 ) { /*for (i=0; i<20; i++) printf("%02x",swap->secretAm[i]); @@ -2214,7 +2265,7 @@ void basilisk_swaploop(void *_swap) //if ( swap->alicepayment.txbytes != 0 && swap->alicepayment.I.spendlen != 0 ) // break; basilisk_alicepayment(myinfo,swap,swap->alicepayment.coin,&swap->alicepayment,swap->I.pubAm,swap->I.pubBn); - if ( swap->alicepayment.txbytes == 0 || swap->alicepayment.I.spendlen == 0 ) + if ( swap->alicepayment.I.datalen == 0 || swap->alicepayment.I.spendlen == 0 ) { printf("error alice generating payment.%d\n",swap->alicepayment.I.spendlen); sleep(DEX_SLEEP); @@ -2242,7 +2293,7 @@ void basilisk_swaploop(void *_swap) printf("%02x",swap->myfee.txbytes[i]); printf(" fee %p %x\n",swap->myfee.txbytes,swap->I.statebits); swap->I.statebits |= 0x40; - if ( swap->alicepayment.txbytes != 0 && swap->alicepayment.I.spendlen > 0 ) + if ( swap->alicepayment.I.datalen != 0 && swap->alicepayment.I.spendlen > 0 ) break; } else @@ -2252,6 +2303,7 @@ void basilisk_swaploop(void *_swap) } } } + basilisk_swap_saveupdate(myinfo,swap); while ( retval == 0 && basilisk_swapiteration(myinfo,swap,data,maxlen) == 0 ) { sleep(DEX_SLEEP); @@ -2259,11 +2311,10 @@ void basilisk_swaploop(void *_swap) basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); if ( time(NULL) > swap->I.expiration ) break; - //dpow_nanomsg_update(myinfo); - //dex_updateclient(myinfo); } + basilisk_swap_saveupdate(myinfo,swap); printf("end of atomic swap\n"); - if ( swap->I.iambob != 0 && swap->bobdeposit.txbytes != 0 ) + if ( swap->I.iambob != 0 && swap->bobdeposit.I.datalen != 0 ) { sleep(300); // wait for confirm of msig printf("BOB reclaims refund\n"); @@ -2279,6 +2330,7 @@ void basilisk_swaploop(void *_swap) data[datalen++] = swap->I.privBn.bytes[j]; basilisk_swapsend(myinfo,swap,0x40000000,data,datalen,0x40000000,swap->I.crcs_mypriv); } + basilisk_swap_saveupdate(myinfo,swap); } if ( swapcompleted(myinfo,swap) > 0 ) // only if swap completed { @@ -2334,8 +2386,6 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 while ( statebits == 0 && m <= n/2 && time(NULL) < starttime+BASILISK_MSGDURATION ) { m = n = 0; - //dpow_nanomsg_update(myinfo); - //dex_updateclient(myinfo); sleep(DEX_SLEEP); printf("waiting for offer to be accepted\n"); channel = 'D' + ((uint32_t)'E' << 8) + ((uint32_t)'X' << 16); diff --git a/basilisk/basilisk_tradebot.c b/basilisk/basilisk_tradebot.c index 8b66ee5a8..5d16548dc 100755 --- a/basilisk/basilisk_tradebot.c +++ b/basilisk/basilisk_tradebot.c @@ -69,12 +69,12 @@ int32_t basilisk_txitem(struct supernet_info *myinfo,struct basilisk_swap *swap, decode_hex((void *)&rawtx->I,sizeof(rawtx->I),hexstr); if ( (hexstr= jstr(obj,"txbytes")) != 0 && strlen(hexstr) == rawtx->I.datalen*2 ) { - if ( rawtx->txbytes == 0 ) + /*if ( rawtx->txbytes == 0 ) { printf("free (%s) txbytes\n",name); free(rawtx->txbytes); } - rawtx->txbytes = calloc(1,rawtx->I.datalen); + rawtx->txbytes = calloc(1,rawtx->I.datalen);*/ decode_hex((void *)rawtx->txbytes,rawtx->I.datalen,hexstr); } printf("PROCESS.(%s)\n",jprint(obj,0)); From ec925bbd42caf2902d2494c3f7a72cf0b5bba973 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 13:11:45 +0200 Subject: [PATCH 430/495] Test --- iguana/dpow/dpow_network.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 0bd18acf1..cadc11faa 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -256,7 +256,7 @@ void dpow_psockloop(void *_ptr) ptr->lasttime = now; if ( (sentbytes= nn_send(ptr->pubsock,buf,size,0)) > 0 ) { - printf("PSOCKS[%d] of %d (%u %u) -> %d/%d bytes\n",i,myinfo->numpsocks,ptr->pushport,ptr->subport,size,sentbytes); + //printf("PSOCKS[%d] of %d (%u %u) -> %d/%d bytes\n",i,myinfo->numpsocks,ptr->pushport,ptr->subport,size,sentbytes); nonz++; } } From 2b44cc203e916d3ba6adaae2b14395d922bc8903 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 13:41:52 +0200 Subject: [PATCH 431/495] Test --- basilisk/basilisk_swap.c | 39 ++++++++++++++++++++++++--------------- iguana/iguana_json.c | 4 +++- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 0bf525368..2ea0f4055 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1412,6 +1412,7 @@ int32_t basilisk_swap_loadtx(struct basilisk_rawtx *rawtx,FILE *fp,char *bobcoin rawtx->coin = iguana_coinfind(rawtx->I.coinstr); if ( rawtx->vinstr[0] != 0 ) rawtx->vins = cJSON_Parse(rawtx->vinstr); + printf("loaded.%s\n",rawtx->name); return(0); } } @@ -1427,20 +1428,27 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv if ( (fp= fopen(fname,"rb")) != 0 ) { fread(&swap->I,1,sizeof(swap->I),fp); - basilisk_swap_loadtx(&swap->bobdeposit,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); - basilisk_swap_loadtx(&swap->bobpayment,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); - basilisk_swap_loadtx(&swap->alicepayment,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); - basilisk_swap_loadtx(&swap->myfee,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); - basilisk_swap_loadtx(&swap->otherfee,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); - basilisk_swap_loadtx(&swap->aliceclaim,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); - basilisk_swap_loadtx(&swap->alicespend,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); - basilisk_swap_loadtx(&swap->bobreclaim,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); - basilisk_swap_loadtx(&swap->bobspend,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); - basilisk_swap_loadtx(&swap->bobrefund,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); - basilisk_swap_loadtx(&swap->alicereclaim,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); - fread(swap->privkeys,1,sizeof(swap->privkeys),fp); - fread(swap->otherdeck,1,sizeof(swap->otherdeck),fp); - fread(swap->deck,1,sizeof(swap->deck),fp); + if ( swap->bobcoin == 0 ) + swap->bobcoin = iguana_coinfind(swap->I.req.dest); + if ( swap->alicecoin == 0 ) + swap->alicecoin = iguana_coinfind(swap->I.req.src); + if ( swap->alicecoin != 0 && swap->bobcoin == 0 ) + { + basilisk_swap_loadtx(&swap->bobdeposit,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->bobpayment,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->alicepayment,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->myfee,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->otherfee,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->aliceclaim,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->alicespend,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->bobreclaim,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->bobspend,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->bobrefund,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->alicereclaim,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + fread(swap->privkeys,1,sizeof(swap->privkeys),fp); + fread(swap->otherdeck,1,sizeof(swap->otherdeck),fp); + fread(swap->deck,1,sizeof(swap->deck),fp); + } else printf("missing coins (%p %p)\n",swap->bobcoin,swap->alicecoin); fclose(fp); } } @@ -1723,7 +1731,7 @@ uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilis } } return(nextbits); - } else printf("error from basilisk_swapdata_rawtx %p len.%d\n",rawtx->txbytes,rawtx->I.datalen); + } else printf("error from basilisk_swapdata_rawtx.%s %p len.%d\n",rawtx->name,rawtx->txbytes,rawtx->I.datalen); return(0); } @@ -2183,6 +2191,7 @@ void basilisk_swaploop(void *_swap) printf("couldnt establish connection\n"); retval = -1; } + basilisk_swap_saveupdate(myinfo,swap); while ( retval == 0 && (swap->I.statebits & 0x20) == 0 && time(NULL) < expiration ) { if ( swap->connected == 0 ) diff --git a/iguana/iguana_json.c b/iguana/iguana_json.c index 38c6c5b98..3918fb599 100755 --- a/iguana/iguana_json.c +++ b/iguana/iguana_json.c @@ -86,6 +86,7 @@ cJSON *SuperNET_helpjson() cJSON *array=0,*json,*agents; json = cJSON_CreateObject(); agents = cJSON_CreateArray(); +#ifndef WIN32 #define IGUANA_ARGS json,array,agents #define IGUANA_HELP0(agent,name) array = helpjson(IGUANA_ARGS,#agent,#name,0) #define IGUANA_HELP_S(agent,name,str) array = helpjson(IGUANA_ARGS,#agent,#name,helparray(cJSON_CreateArray(),helpitem(#str,"string"))) @@ -194,7 +195,8 @@ cJSON *SuperNET_helpjson() #undef IGUANA_ARGS #undef _IGUANA_APIDEC_H_ #include "../includes/iguana_apiundefs.h" - +#endif + if ( array != 0 ) jadd(json,"API",array); jadd(json,"agents",agents); From 4e554026b6f121ac1c76dbeb1bd76b654316a40b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 13:46:36 +0200 Subject: [PATCH 432/495] Test --- iguana/iguana_json.c | 417 --------------------------------------- iguana/ramchain_api.c | 420 ++++++++++++++++++++++++++++++++++++++++ includes/iguana_funcs.h | 2 + 3 files changed, 422 insertions(+), 417 deletions(-) diff --git a/iguana/iguana_json.c b/iguana/iguana_json.c index 3918fb599..8002aa331 100755 --- a/iguana/iguana_json.c +++ b/iguana/iguana_json.c @@ -498,423 +498,6 @@ char *SuperNET_htmlstr(char *fname,char *htmlstr,int32_t maxsize,char *agentstr) return(OS_filestr(&filesize,"index7778.html")); } -cJSON *iguana_peerjson(struct iguana_info *coin,struct iguana_peer *addr) -{ - cJSON *array,*json = cJSON_CreateObject(); - jaddstr(json,"ipaddr",addr->ipaddr); - if ( addr->supernet != 0 ) - jaddstr(json,"ipaddr",addr->ipaddr); - jaddstr(json,"supernet","yes"); - jaddnum(json,"protover",addr->protover); - jaddnum(json,"relay",addr->relayflag); - jaddnum(json,"height",addr->height); - jaddnum(json,"rank",addr->rank); - jaddnum(json,"usock",addr->usock); - if ( addr->dead != 0 ) - jaddnum(json,"dead",addr->dead); - jaddnum(json,"ready",addr->ready); - jaddnum(json,"recvblocks",addr->recvblocks); - jaddnum(json,"recvtotal",addr->recvtotal); - jaddnum(json,"lastcontact",addr->lastcontact); - if ( addr->numpings > 0 ) - jaddnum(json,"aveping",addr->pingsum/addr->numpings); - array = cJSON_CreateObject(); - jaddnum(array,"version",addr->msgcounts.version); - jaddnum(array,"verack",addr->msgcounts.verack); - jaddnum(array,"getaddr",addr->msgcounts.getaddr); - jaddnum(array,"addr",addr->msgcounts.addr); - jaddnum(array,"inv",addr->msgcounts.inv); - jaddnum(array,"getdata",addr->msgcounts.getdata); - jaddnum(array,"notfound",addr->msgcounts.notfound); - jaddnum(array,"getblocks",addr->msgcounts.getblocks); - jaddnum(array,"getheaders",addr->msgcounts.getheaders); - jaddnum(array,"headers",addr->msgcounts.headers); - jaddnum(array,"tx",addr->msgcounts.tx); - jaddnum(array,"block",addr->msgcounts.block); - jaddnum(array,"mempool",addr->msgcounts.mempool); - jaddnum(array,"ping",addr->msgcounts.ping); - jaddnum(array,"pong",addr->msgcounts.pong); - jaddnum(array,"reject",addr->msgcounts.reject); - jaddnum(array,"filterload",addr->msgcounts.filterload); - jaddnum(array,"filteradd",addr->msgcounts.filteradd); - jaddnum(array,"filterclear",addr->msgcounts.filterclear); - jaddnum(array,"merkleblock",addr->msgcounts.merkleblock); - jaddnum(array,"alert",addr->msgcounts.alert); - jadd(json,"msgcounts",array); - return(json); -} - -cJSON *iguana_peersjson(struct iguana_info *coin,int32_t addronly) -{ - cJSON *retjson,*array; int32_t i; struct iguana_peer *addr; - if ( coin == 0 || coin->peers == 0 ) - return(0); - array = cJSON_CreateArray(); - for (i=0; iMAXPEERS; i++) - { - addr = &coin->peers->active[i]; - if ( addr->usock >= 0 && addr->ipbits != 0 && addr->ipaddr[0] != 0 ) - { - if ( addronly != 0 ) - jaddistr(array,addr->ipaddr); - else jaddi(array,iguana_peerjson(coin,addr)); - } - } - if ( addronly == 0 ) - { - retjson = cJSON_CreateObject(); - jadd(retjson,"peers",array); - jaddnum(retjson,"maxpeers",coin->MAXPEERS); - jaddstr(retjson,"coin",coin->symbol); - return(retjson); - } - else return(array); -} - -#include "../includes/iguana_apidefs.h" -#include "../includes/iguana_apideclares.h" - -STRING_ARG(iguana,peers,activecoin) -{ - if ( coin != 0 ) - return(jprint(iguana_peersjson(coin,0),1)); - else return(clonestr("{\"error\":\"peers needs coin\"}")); -} - -STRING_ARG(iguana,getconnectioncount,activecoin) -{ - int32_t i,num = 0; char buf[512]; - if ( coin != 0 && coin->peers != 0 ) - { - for (i=0; ipeers->active)/sizeof(*coin->peers->active); i++) - if ( coin->peers->active[i].usock >= 0 ) - num++; - sprintf(buf,"{\"result\":\"%d\"}",num); - return(clonestr(buf)); - } else return(clonestr("{\"error\":\"getconnectioncount needs coin\"}")); -} - -ZERO_ARGS(bitcoinrpc,getdifficulty) -{ - char buf[512]; - if ( coin != 0 ) - { - sprintf(buf,"{\"result\":\"success\",\"proof-of-work\":\"%.8f\",\"search-interval\": 0}",PoW_from_compact(coin->blocks.hwmchain.RO.bits,coin->chain->unitval)); - return(clonestr(buf)); - } else return(clonestr("{\"error\":\"getdifficulty needs coin\"}")); -} - -STRING_ARG(iguana,addcoin,newcoin) -{ - char *symbol,*seedip; int32_t retval; - if ( (symbol= newcoin) == 0 && coin != 0 ) - symbol = coin->symbol; - if ( symbol != 0 ) - { - if ( (seedip= jstr(json,"seedipaddr")) != 0 ) - safecopy(myinfo->seedipaddr,seedip,sizeof(myinfo->seedipaddr)); - printf(">> addcoin.%s seedipaddr.%s\n",symbol,myinfo->seedipaddr); -#ifdef __PNACL__ -// if ( strcmp(symbol,"BTC") == 0 ) -// return(clonestr("{\"result\":\"BTC for chrome app is not yet\"}")); -#endif - if ( (retval= iguana_launchcoin(myinfo,symbol,json,0)) > 0 ) - { - if ( myinfo->rpcsymbol[0] == 0 ) - safecopy(myinfo->rpcsymbol,symbol,sizeof(myinfo->rpcsymbol)); - return(clonestr("{\"result\":\"coin added\"}")); - } - else if ( retval == 0 ) - return(clonestr("{\"result\":\"coin already there\"}")); - else return(clonestr("{\"error\":\"error adding coin\"}")); - } else return(clonestr("{\"error\":\"addcoin needs newcoin\"}")); -} - -STRING_ARG(iguana,startcoin,activecoin) -{ - if ( coin != 0 ) - { - coin->active = 1; - return(clonestr("{\"result\":\"coin started\"}")); - } else return(clonestr("{\"error\":\"startcoin needs coin\"}")); -} - -STRING_ARG(iguana,stopcoin,activecoin) -{ - if ( activecoin[0] != 0 ) - coin = iguana_coinfind(activecoin); - if ( coin != 0 ) - { - coin->active = 0; - //iguana_coinpurge(coin); - return(clonestr("{\"result\":\"coin stopped\"}")); - } else return(clonestr("{\"error\":\"stopcoin needs coin\"}")); -} - -STRING_ARG(iguana,pausecoin,activecoin) -{ - if ( coin != 0 ) - { - coin->active = 0; - return(clonestr("{\"result\":\"coin paused\"}")); - } else return(clonestr("{\"error\":\"pausecoin needs coin\"}")); -} - -TWO_STRINGS(iguana,addnode,activecoin,ipaddr) -{ - struct iguana_peer *addr; int32_t i,n; - if ( coin == 0 ) - coin = iguana_coinfind(activecoin); - if ( coin != 0 && strcmp(coin->symbol,"RELAY") == 0 ) - basilisk_addrelay_info(myinfo,0,(uint32_t)calc_ipbits(ipaddr),GENESIS_PUBKEY); - printf("coin.%p.[%s] addnode.%s -> %s\n",coin,coin!=0?coin->symbol:"",activecoin,ipaddr); - if ( coin != 0 && coin->peers != 0 && ipaddr != 0 && is_ipaddr(ipaddr) != 0 ) - { - //iguana_possible_peer(coin,ipaddr); - if ( (addr= iguana_peerslot(coin,(uint32_t)calc_ipbits(ipaddr),1)) != 0 ) - { - addr->supernet = 1; - if ( addr->usock >= 0 ) - { - if ( (n= coin->peers->numranked) != 0 ) - { - for (i=0; ipeers->ranked[i] ) - break; - } - if ( i == n ) - { - if ( i == IGUANA_MAXPEERS ) - i--; - else coin->peers->numranked = n+1; - coin->peers->ranked[i] = addr; - addr->recvblocks = coin->peers->ranked[0]->recvblocks + 100; - addr->recvtotal = coin->peers->ranked[0]->recvtotal*1.1 + 100; - printf("set (%s) -> slot.%d numranked.%d\n",ipaddr,i,coin->peers->numranked); - } else printf("(%s) is already peer.%d\n",ipaddr,i); - } - return(clonestr("{\"result\":\"peer was already connected\"}")); - } - if ( addr->pending == 0 ) - { - addr->pending = (uint32_t)time(NULL); - iguana_launch(coin,"connection",iguana_startconnection,addr,IGUANA_CONNTHREAD); - return(clonestr("{\"result\":\"addnode submitted\"}")); - } else return(clonestr("{\"result\":\"addnode connection was already pending\"}")); - } else return(clonestr("{\"result\":\"addnode cant find peer slot\"}")); - } - else if ( coin == 0 ) - return(clonestr("{\"error\":\"addnode needs active coin, do an addcoin first\"}")); - else return(clonestr("{\"error\":\"addnode needs ipaddr\"}")); -} - -TWO_STRINGS(iguana,persistent,activecoin,ipaddr) -{ - int32_t i; - if ( coin != 0 && coin->peers != 0 && ipaddr != 0 ) - { - for (i=0; ipeers->active[i].ipaddr,ipaddr) == 0 ) - { - coin->peers->active[i].persistent_peer = juint(json,"interval")+3; - return(clonestr("{\"result\":\"node marked as persistent\"}")); - } - } - return(clonestr("{\"result\":\"node wasnt active\"}")); - } else return(clonestr("{\"error\":\"persistent needs coin and ipaddr\"}")); -} - -TWO_STRINGS(iguana,removenode,activecoin,ipaddr) -{ - int32_t i; - if ( coin != 0 && coin->peers != 0 && ipaddr != 0 ) - { - for (i=0; ipeers->active[i].ipaddr,ipaddr) == 0 ) - { - coin->peers->active[i].rank = 0; - coin->peers->active[i].dead = (uint32_t)time(NULL); - return(clonestr("{\"result\":\"node marked as dead\"}")); - } - } - return(clonestr("{\"result\":\"node wasnt active\"}")); - } else return(clonestr("{\"error\":\"removenode needs coin and ipaddr\"}")); -} - -TWO_STRINGS(iguana,oneshot,activecoin,ipaddr) -{ - if ( coin != 0 && ipaddr != 0 ) - { - iguana_possible_peer(coin,ipaddr); - return(clonestr("{\"result\":\"addnode submitted\"}")); - } else return(clonestr("{\"error\":\"addnode needs coin and ipaddr\"}")); -} - -TWO_STRINGS(iguana,nodestatus,activecoin,ipaddr) -{ - int32_t i; struct iguana_peer *addr; - if ( coin != 0 && coin->peers != 0 && ipaddr != 0 ) - { - for (i=0; iMAXPEERS; i++) - { - addr = &coin->peers->active[i]; - if ( strcmp(addr->ipaddr,ipaddr) == 0 ) - return(jprint(iguana_peerjson(coin,addr),1)); - } - return(clonestr("{\"result\":\"nodestatus couldnt find ipaddr\"}")); - } else return(clonestr("{\"error\":\"nodestatus needs ipaddr\"}")); -} - -STRING_AND_INT(iguana,maxpeers,activecoin,max) -{ - cJSON *retjson; int32_t i; struct iguana_peer *addr; - if ( coin != 0 && coin->peers != 0 ) - { - retjson = cJSON_CreateObject(); - if ( max > IGUANA_MAXPEERS ) - max = IGUANA_MAXPEERS; - if ( max > coin->MAXPEERS ) - { - for (i=max; iMAXPEERS; i++) - if ( (addr= coin->peers->ranked[i]) != 0 ) - addr->dead = 1; - } - coin->MAXPEERS = max; - jaddnum(retjson,"maxpeers",coin->MAXPEERS); - jaddstr(retjson,"coin",coin->symbol); - return(jprint(retjson,1)); - } else return(clonestr("{\"error\":\"maxpeers needs coin\"}")); -} - -char *hmac_dispatch(char *(*hmacfunc)(char *dest,char *key,int32_t key_size,char *message),char *name,char *message,char *password) -{ - char hexstr[1025]; cJSON *json; - if ( message != 0 && password != 0 && message[0] != 0 && password[0] != 0 ) - { - memset(hexstr,0,sizeof(hexstr)); - (*hmacfunc)(hexstr,password,password==0?0:(int32_t)strlen(password),message); - json = cJSON_CreateObject(); - jaddstr(json,"result","hmac calculated"); - jaddstr(json,"message",message); - jaddstr(json,name,hexstr); - return(jprint(json,1)); - } else return(clonestr("{\"error\":\"hmac needs message and passphrase\"}")); -} - -char *hash_dispatch(void (*hashfunc)(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len),char *name,char *message) -{ - char hexstr[65537]; uint8_t databuf[32768]; cJSON *json; - if ( message != 0 && message[0] != 0 ) - { - memset(hexstr,0,sizeof(hexstr)); - (*hashfunc)(hexstr,databuf,(uint8_t *)message,(int32_t)strlen(message)); - json = cJSON_CreateObject(); - jaddstr(json,"result","hash calculated"); - jaddstr(json,"message",message); - jaddstr(json,name,hexstr); - return(jprint(json,1)); - } else return(clonestr("{\"error\":\"hash needs message\"}")); -} - -TWO_HASHES(hash,curve25519_pair,element,scalar) -{ - cJSON *retjson = cJSON_CreateObject(); - jaddbits256(retjson,"result",curve25519(element,scalar)); - return(jprint(retjson,1)); -} - -STRING_ARG(hash,NXT,passphrase) { return(hash_dispatch(calc_NXTaddr,"NXT",passphrase)); } -STRING_ARG(hash,curve25519,pubkey) { return(hash_dispatch(calc_curve25519_str,"curve25519",pubkey)); } -STRING_ARG(hash,crc32,message) { return(hash_dispatch(calc_crc32str,"crc32",message)); } -STRING_ARG(hash,base64_encode,message) { return(hash_dispatch(calc_base64_encodestr,"base64_encode",message)); } -STRING_ARG(hash,base64_decode,message) { return(hash_dispatch(calc_base64_decodestr,"base64_decode",message)); } -STRING_ARG(hash,rmd160_sha256,message) { return(hash_dispatch(rmd160ofsha256,"rmd160_sha256",message)); } -STRING_ARG(hash,sha256_sha256,message) { return(hash_dispatch(sha256_sha256,"sha256_sha256",message)); } -STRING_ARG(hash,hex,message) { return(hash_dispatch(calc_hexstr,"hex",message)); } -STRING_ARG(hash,unhex,message) { return(hash_dispatch(calc_unhexstr,"unhex",message)); } - -STRING_ARG(hash,sha224,message) { return(hash_dispatch(calc_sha224,"sha224",message)); } -STRING_ARG(hash,sha256,message) { return(hash_dispatch(vcalc_sha256,"sha256",message)); } -STRING_ARG(hash,sha384,message) { return(hash_dispatch(calc_sha384,"sha384",message)); } -STRING_ARG(hash,sha512,message) { return(hash_dispatch(calc_sha512,"sha512",message)); } -STRING_ARG(hash,rmd128,message) { return(hash_dispatch(calc_rmd128,"rmd128",message)); } -STRING_ARG(hash,rmd160,message) { return(hash_dispatch(calc_rmd160,"rmd160",message)); } -STRING_ARG(hash,rmd256,message) { return(hash_dispatch(calc_rmd256,"rmd256",message)); } -STRING_ARG(hash,rmd320,message) { return(hash_dispatch(calc_rmd320,"rmd320",message)); } -STRING_ARG(hash,sha1,message) { return(hash_dispatch(calc_sha1,"sha1",message)); } -STRING_ARG(hash,md2,message) { return(hash_dispatch(calc_md2str,"md2",message)); } -STRING_ARG(hash,md4,message) { return(hash_dispatch(calc_md4str,"md4",message)); } -STRING_ARG(hash,md5,message) { return(hash_dispatch(calc_md5str,"md5",message)); } -STRING_ARG(hash,tiger192_3,message) { return(hash_dispatch(calc_tiger,"tiger",message)); } -STRING_ARG(hash,whirlpool,message) { return(hash_dispatch(calc_whirlpool,"whirlpool",message)); } -TWO_STRINGS(hmac,sha224,message,passphrase) { return(hmac_dispatch(hmac_sha224_str,"sha224",message,passphrase)); } -TWO_STRINGS(hmac,sha256,message,passphrase) { return(hmac_dispatch(hmac_sha256_str,"sha256",message,passphrase)); } -TWO_STRINGS(hmac,sha384,message,passphrase) { return(hmac_dispatch(hmac_sha384_str,"sha384",message,passphrase)); } -TWO_STRINGS(hmac,sha512,message,passphrase) { return(hmac_dispatch(hmac_sha512_str,"sha512",message,passphrase)); } -TWO_STRINGS(hmac,rmd128,message,passphrase) { return(hmac_dispatch(hmac_rmd128_str,"rmd128",message,passphrase)); } -TWO_STRINGS(hmac,rmd160,message,passphrase) { return(hmac_dispatch(hmac_rmd160_str,"rmd160",message,passphrase)); } -TWO_STRINGS(hmac,rmd256,message,passphrase) { return(hmac_dispatch(hmac_rmd256_str,"rmd256",message,passphrase)); } -TWO_STRINGS(hmac,rmd320,message,passphrase) { return(hmac_dispatch(hmac_rmd320_str,"rmd320",message,passphrase)); } -TWO_STRINGS(hmac,sha1,message,passphrase) { return(hmac_dispatch(hmac_sha1_str,"sha1",message,passphrase)); } -TWO_STRINGS(hmac,md2,message,passphrase) { return(hmac_dispatch(hmac_md2_str,"md2",message,passphrase)); } -TWO_STRINGS(hmac,md4,message,passphrase) { return(hmac_dispatch(hmac_md4_str,"md4",message,passphrase)); } -TWO_STRINGS(hmac,md5,message,passphrase) { return(hmac_dispatch(hmac_md5_str,"md5",message,passphrase)); } -TWO_STRINGS(hmac,tiger192_3,message,passphrase) { return(hmac_dispatch(hmac_tiger_str,"tiger",message,passphrase)); } -TWO_STRINGS(hmac,whirlpool,message,passphrase) { return(hmac_dispatch(hmac_whirlpool_str,"whirlpool",message,passphrase)); } - -STRING_ARG(SuperNET,bitcoinrpc,setcoin) -{ - char buf[1024]; - if ( setcoin != 0 && setcoin[0] != 0 ) - { - strcpy(myinfo->rpcsymbol,setcoin); - touppercase(myinfo->rpcsymbol); - printf("bitcoinrpc.%s\n",myinfo->rpcsymbol); - if ( iguana_launchcoin(myinfo,myinfo->rpcsymbol,json,0) < 0 ) - return(clonestr("{\"error\":\"error creating coin\"}")); - else - { - sprintf(buf,"{\"result\":\"success\",\"setcoin\":\"%s\"}",setcoin); - return(clonestr(buf)); - } - } else return(clonestr("{\"error\":\"bitcoinrpc needs setcoin value\"}")); -} - -ZERO_ARGS(SuperNET,help) -{ - cJSON *helpjson,*retjson; - if ( (helpjson= SuperNET_helpjson()) != 0 ) - { - retjson = cJSON_CreateObject(); - jadd(retjson,"result",helpjson); - return(jprint(retjson,1)); - } else return(clonestr("{\"error\":\"cant get helpjson\"}")); -} - -TWO_STRINGS(SuperNET,html,agentform,htmlfile) -{ - char *htmlstr; cJSON *retjson; int32_t max = 4*1024*1024; - if ( htmlfile == 0 || htmlfile[0] == 0 ) - htmlfile = "forms.html"; - //if ( (fp= fopen(htmlfile,"w")) == 0 ) - // printf("error opening htmlfile.(%s)\n",htmlfile); - htmlstr = malloc(max); - htmlstr = SuperNET_htmlstr(htmlfile,htmlstr,max,agentform); - retjson = cJSON_CreateObject(); - jaddstr(retjson,"result",htmlstr); - free(htmlstr); - //if ( fp != 0 ) - // fclose(fp); - return(jprint(retjson,1)); -} - -#undef IGUANA_ARGS -#undef _IGUANA_APIDEC_H_ -#include "../includes/iguana_apiundefs.h" - char *SuperNET_parser(struct supernet_info *myinfo,char *agentstr,char *method,cJSON *json,char *remoteaddr) { char *coinstr; struct iguana_info *coin = 0; diff --git a/iguana/ramchain_api.c b/iguana/ramchain_api.c index 9c5c4cd2b..267f17ffd 100755 --- a/iguana/ramchain_api.c +++ b/iguana/ramchain_api.c @@ -14,3 +14,423 @@ ******************************************************************************/ // deprecated +#include "iguana777.h" + +#include "../includes/iguana_apidefs.h" +#include "../includes/iguana_apideclares.h" + + +STRING_ARG(iguana,peers,activecoin) +{ + if ( coin != 0 ) + return(jprint(iguana_peersjson(coin,0),1)); + else return(clonestr("{\"error\":\"peers needs coin\"}")); +} + +STRING_ARG(iguana,getconnectioncount,activecoin) +{ + int32_t i,num = 0; char buf[512]; + if ( coin != 0 && coin->peers != 0 ) + { + for (i=0; ipeers->active)/sizeof(*coin->peers->active); i++) + if ( coin->peers->active[i].usock >= 0 ) + num++; + sprintf(buf,"{\"result\":\"%d\"}",num); + return(clonestr(buf)); + } else return(clonestr("{\"error\":\"getconnectioncount needs coin\"}")); +} + +ZERO_ARGS(bitcoinrpc,getdifficulty) +{ + char buf[512]; + if ( coin != 0 ) + { + sprintf(buf,"{\"result\":\"success\",\"proof-of-work\":\"%.8f\",\"search-interval\": 0}",PoW_from_compact(coin->blocks.hwmchain.RO.bits,coin->chain->unitval)); + return(clonestr(buf)); + } else return(clonestr("{\"error\":\"getdifficulty needs coin\"}")); +} + +STRING_ARG(iguana,addcoin,newcoin) +{ + char *symbol,*seedip; int32_t retval; + if ( (symbol= newcoin) == 0 && coin != 0 ) + symbol = coin->symbol; + if ( symbol != 0 ) + { + if ( (seedip= jstr(json,"seedipaddr")) != 0 ) + safecopy(myinfo->seedipaddr,seedip,sizeof(myinfo->seedipaddr)); + printf(">> addcoin.%s seedipaddr.%s\n",symbol,myinfo->seedipaddr); +#ifdef __PNACL__ + // if ( strcmp(symbol,"BTC") == 0 ) + // return(clonestr("{\"result\":\"BTC for chrome app is not yet\"}")); +#endif + if ( (retval= iguana_launchcoin(myinfo,symbol,json,0)) > 0 ) + { + if ( myinfo->rpcsymbol[0] == 0 ) + safecopy(myinfo->rpcsymbol,symbol,sizeof(myinfo->rpcsymbol)); + return(clonestr("{\"result\":\"coin added\"}")); + } + else if ( retval == 0 ) + return(clonestr("{\"result\":\"coin already there\"}")); + else return(clonestr("{\"error\":\"error adding coin\"}")); + } else return(clonestr("{\"error\":\"addcoin needs newcoin\"}")); +} + +STRING_ARG(iguana,startcoin,activecoin) +{ + if ( coin != 0 ) + { + coin->active = 1; + return(clonestr("{\"result\":\"coin started\"}")); + } else return(clonestr("{\"error\":\"startcoin needs coin\"}")); +} + +STRING_ARG(iguana,stopcoin,activecoin) +{ + if ( activecoin[0] != 0 ) + coin = iguana_coinfind(activecoin); + if ( coin != 0 ) + { + coin->active = 0; + //iguana_coinpurge(coin); + return(clonestr("{\"result\":\"coin stopped\"}")); + } else return(clonestr("{\"error\":\"stopcoin needs coin\"}")); +} + +STRING_ARG(iguana,pausecoin,activecoin) +{ + if ( coin != 0 ) + { + coin->active = 0; + return(clonestr("{\"result\":\"coin paused\"}")); + } else return(clonestr("{\"error\":\"pausecoin needs coin\"}")); +} + +TWO_STRINGS(iguana,addnode,activecoin,ipaddr) +{ + struct iguana_peer *addr; int32_t i,n; + if ( coin == 0 ) + coin = iguana_coinfind(activecoin); + if ( coin != 0 && strcmp(coin->symbol,"RELAY") == 0 ) + basilisk_addrelay_info(myinfo,0,(uint32_t)calc_ipbits(ipaddr),GENESIS_PUBKEY); + printf("coin.%p.[%s] addnode.%s -> %s\n",coin,coin!=0?coin->symbol:"",activecoin,ipaddr); + if ( coin != 0 && coin->peers != 0 && ipaddr != 0 && is_ipaddr(ipaddr) != 0 ) + { + //iguana_possible_peer(coin,ipaddr); + if ( (addr= iguana_peerslot(coin,(uint32_t)calc_ipbits(ipaddr),1)) != 0 ) + { + addr->supernet = 1; + if ( addr->usock >= 0 ) + { + if ( (n= coin->peers->numranked) != 0 ) + { + for (i=0; ipeers->ranked[i] ) + break; + } + if ( i == n ) + { + if ( i == IGUANA_MAXPEERS ) + i--; + else coin->peers->numranked = n+1; + coin->peers->ranked[i] = addr; + addr->recvblocks = coin->peers->ranked[0]->recvblocks + 100; + addr->recvtotal = coin->peers->ranked[0]->recvtotal*1.1 + 100; + printf("set (%s) -> slot.%d numranked.%d\n",ipaddr,i,coin->peers->numranked); + } else printf("(%s) is already peer.%d\n",ipaddr,i); + } + return(clonestr("{\"result\":\"peer was already connected\"}")); + } + if ( addr->pending == 0 ) + { + addr->pending = (uint32_t)time(NULL); + iguana_launch(coin,"connection",iguana_startconnection,addr,IGUANA_CONNTHREAD); + return(clonestr("{\"result\":\"addnode submitted\"}")); + } else return(clonestr("{\"result\":\"addnode connection was already pending\"}")); + } else return(clonestr("{\"result\":\"addnode cant find peer slot\"}")); + } + else if ( coin == 0 ) + return(clonestr("{\"error\":\"addnode needs active coin, do an addcoin first\"}")); + else return(clonestr("{\"error\":\"addnode needs ipaddr\"}")); +} + +TWO_STRINGS(iguana,persistent,activecoin,ipaddr) +{ + int32_t i; + if ( coin != 0 && coin->peers != 0 && ipaddr != 0 ) + { + for (i=0; ipeers->active[i].ipaddr,ipaddr) == 0 ) + { + coin->peers->active[i].persistent_peer = juint(json,"interval")+3; + return(clonestr("{\"result\":\"node marked as persistent\"}")); + } + } + return(clonestr("{\"result\":\"node wasnt active\"}")); + } else return(clonestr("{\"error\":\"persistent needs coin and ipaddr\"}")); +} + +TWO_STRINGS(iguana,removenode,activecoin,ipaddr) +{ + int32_t i; + if ( coin != 0 && coin->peers != 0 && ipaddr != 0 ) + { + for (i=0; ipeers->active[i].ipaddr,ipaddr) == 0 ) + { + coin->peers->active[i].rank = 0; + coin->peers->active[i].dead = (uint32_t)time(NULL); + return(clonestr("{\"result\":\"node marked as dead\"}")); + } + } + return(clonestr("{\"result\":\"node wasnt active\"}")); + } else return(clonestr("{\"error\":\"removenode needs coin and ipaddr\"}")); +} + +TWO_STRINGS(iguana,oneshot,activecoin,ipaddr) +{ + if ( coin != 0 && ipaddr != 0 ) + { + iguana_possible_peer(coin,ipaddr); + return(clonestr("{\"result\":\"addnode submitted\"}")); + } else return(clonestr("{\"error\":\"addnode needs coin and ipaddr\"}")); +} + +cJSON *iguana_peerjson(struct iguana_info *coin,struct iguana_peer *addr) +{ + cJSON *array,*json = cJSON_CreateObject(); + jaddstr(json,"ipaddr",addr->ipaddr); + if ( addr->supernet != 0 ) + jaddstr(json,"ipaddr",addr->ipaddr); + jaddstr(json,"supernet","yes"); + jaddnum(json,"protover",addr->protover); + jaddnum(json,"relay",addr->relayflag); + jaddnum(json,"height",addr->height); + jaddnum(json,"rank",addr->rank); + jaddnum(json,"usock",addr->usock); + if ( addr->dead != 0 ) + jaddnum(json,"dead",addr->dead); + jaddnum(json,"ready",addr->ready); + jaddnum(json,"recvblocks",addr->recvblocks); + jaddnum(json,"recvtotal",addr->recvtotal); + jaddnum(json,"lastcontact",addr->lastcontact); + if ( addr->numpings > 0 ) + jaddnum(json,"aveping",addr->pingsum/addr->numpings); + array = cJSON_CreateObject(); + jaddnum(array,"version",addr->msgcounts.version); + jaddnum(array,"verack",addr->msgcounts.verack); + jaddnum(array,"getaddr",addr->msgcounts.getaddr); + jaddnum(array,"addr",addr->msgcounts.addr); + jaddnum(array,"inv",addr->msgcounts.inv); + jaddnum(array,"getdata",addr->msgcounts.getdata); + jaddnum(array,"notfound",addr->msgcounts.notfound); + jaddnum(array,"getblocks",addr->msgcounts.getblocks); + jaddnum(array,"getheaders",addr->msgcounts.getheaders); + jaddnum(array,"headers",addr->msgcounts.headers); + jaddnum(array,"tx",addr->msgcounts.tx); + jaddnum(array,"block",addr->msgcounts.block); + jaddnum(array,"mempool",addr->msgcounts.mempool); + jaddnum(array,"ping",addr->msgcounts.ping); + jaddnum(array,"pong",addr->msgcounts.pong); + jaddnum(array,"reject",addr->msgcounts.reject); + jaddnum(array,"filterload",addr->msgcounts.filterload); + jaddnum(array,"filteradd",addr->msgcounts.filteradd); + jaddnum(array,"filterclear",addr->msgcounts.filterclear); + jaddnum(array,"merkleblock",addr->msgcounts.merkleblock); + jaddnum(array,"alert",addr->msgcounts.alert); + jadd(json,"msgcounts",array); + return(json); +} + +cJSON *iguana_peersjson(struct iguana_info *coin,int32_t addronly) +{ + cJSON *retjson,*array; int32_t i; struct iguana_peer *addr; + if ( coin == 0 || coin->peers == 0 ) + return(0); + array = cJSON_CreateArray(); + for (i=0; iMAXPEERS; i++) + { + addr = &coin->peers->active[i]; + if ( addr->usock >= 0 && addr->ipbits != 0 && addr->ipaddr[0] != 0 ) + { + if ( addronly != 0 ) + jaddistr(array,addr->ipaddr); + else jaddi(array,iguana_peerjson(coin,addr)); + } + } + if ( addronly == 0 ) + { + retjson = cJSON_CreateObject(); + jadd(retjson,"peers",array); + jaddnum(retjson,"maxpeers",coin->MAXPEERS); + jaddstr(retjson,"coin",coin->symbol); + return(retjson); + } + else return(array); +} + +TWO_STRINGS(iguana,nodestatus,activecoin,ipaddr) +{ + int32_t i; struct iguana_peer *addr; + if ( coin != 0 && coin->peers != 0 && ipaddr != 0 ) + { + for (i=0; iMAXPEERS; i++) + { + addr = &coin->peers->active[i]; + if ( strcmp(addr->ipaddr,ipaddr) == 0 ) + return(jprint(iguana_peerjson(coin,addr),1)); + } + return(clonestr("{\"result\":\"nodestatus couldnt find ipaddr\"}")); + } else return(clonestr("{\"error\":\"nodestatus needs ipaddr\"}")); +} + +STRING_AND_INT(iguana,maxpeers,activecoin,max) +{ + cJSON *retjson; int32_t i; struct iguana_peer *addr; + if ( coin != 0 && coin->peers != 0 ) + { + retjson = cJSON_CreateObject(); + if ( max > IGUANA_MAXPEERS ) + max = IGUANA_MAXPEERS; + if ( max > coin->MAXPEERS ) + { + for (i=max; iMAXPEERS; i++) + if ( (addr= coin->peers->ranked[i]) != 0 ) + addr->dead = 1; + } + coin->MAXPEERS = max; + jaddnum(retjson,"maxpeers",coin->MAXPEERS); + jaddstr(retjson,"coin",coin->symbol); + return(jprint(retjson,1)); + } else return(clonestr("{\"error\":\"maxpeers needs coin\"}")); +} + +char *hmac_dispatch(char *(*hmacfunc)(char *dest,char *key,int32_t key_size,char *message),char *name,char *message,char *password) +{ + char hexstr[1025]; cJSON *json; + if ( message != 0 && password != 0 && message[0] != 0 && password[0] != 0 ) + { + memset(hexstr,0,sizeof(hexstr)); + (*hmacfunc)(hexstr,password,password==0?0:(int32_t)strlen(password),message); + json = cJSON_CreateObject(); + jaddstr(json,"result","hmac calculated"); + jaddstr(json,"message",message); + jaddstr(json,name,hexstr); + return(jprint(json,1)); + } else return(clonestr("{\"error\":\"hmac needs message and passphrase\"}")); +} + +char *hash_dispatch(void (*hashfunc)(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len),char *name,char *message) +{ + char hexstr[65537]; uint8_t databuf[32768]; cJSON *json; + if ( message != 0 && message[0] != 0 ) + { + memset(hexstr,0,sizeof(hexstr)); + (*hashfunc)(hexstr,databuf,(uint8_t *)message,(int32_t)strlen(message)); + json = cJSON_CreateObject(); + jaddstr(json,"result","hash calculated"); + jaddstr(json,"message",message); + jaddstr(json,name,hexstr); + return(jprint(json,1)); + } else return(clonestr("{\"error\":\"hash needs message\"}")); +} + +TWO_HASHES(hash,curve25519_pair,element,scalar) +{ + cJSON *retjson = cJSON_CreateObject(); + jaddbits256(retjson,"result",curve25519(element,scalar)); + return(jprint(retjson,1)); +} + +STRING_ARG(hash,NXT,passphrase) { return(hash_dispatch(calc_NXTaddr,"NXT",passphrase)); } +STRING_ARG(hash,curve25519,pubkey) { return(hash_dispatch(calc_curve25519_str,"curve25519",pubkey)); } +STRING_ARG(hash,crc32,message) { return(hash_dispatch(calc_crc32str,"crc32",message)); } +STRING_ARG(hash,base64_encode,message) { return(hash_dispatch(calc_base64_encodestr,"base64_encode",message)); } +STRING_ARG(hash,base64_decode,message) { return(hash_dispatch(calc_base64_decodestr,"base64_decode",message)); } +STRING_ARG(hash,rmd160_sha256,message) { return(hash_dispatch(rmd160ofsha256,"rmd160_sha256",message)); } +STRING_ARG(hash,sha256_sha256,message) { return(hash_dispatch(sha256_sha256,"sha256_sha256",message)); } +STRING_ARG(hash,hex,message) { return(hash_dispatch(calc_hexstr,"hex",message)); } +STRING_ARG(hash,unhex,message) { return(hash_dispatch(calc_unhexstr,"unhex",message)); } + +STRING_ARG(hash,sha224,message) { return(hash_dispatch(calc_sha224,"sha224",message)); } +STRING_ARG(hash,sha256,message) { return(hash_dispatch(vcalc_sha256,"sha256",message)); } +STRING_ARG(hash,sha384,message) { return(hash_dispatch(calc_sha384,"sha384",message)); } +STRING_ARG(hash,sha512,message) { return(hash_dispatch(calc_sha512,"sha512",message)); } +STRING_ARG(hash,rmd128,message) { return(hash_dispatch(calc_rmd128,"rmd128",message)); } +STRING_ARG(hash,rmd160,message) { return(hash_dispatch(calc_rmd160,"rmd160",message)); } +STRING_ARG(hash,rmd256,message) { return(hash_dispatch(calc_rmd256,"rmd256",message)); } +STRING_ARG(hash,rmd320,message) { return(hash_dispatch(calc_rmd320,"rmd320",message)); } +STRING_ARG(hash,sha1,message) { return(hash_dispatch(calc_sha1,"sha1",message)); } +STRING_ARG(hash,md2,message) { return(hash_dispatch(calc_md2str,"md2",message)); } +STRING_ARG(hash,md4,message) { return(hash_dispatch(calc_md4str,"md4",message)); } +STRING_ARG(hash,md5,message) { return(hash_dispatch(calc_md5str,"md5",message)); } +STRING_ARG(hash,tiger192_3,message) { return(hash_dispatch(calc_tiger,"tiger",message)); } +STRING_ARG(hash,whirlpool,message) { return(hash_dispatch(calc_whirlpool,"whirlpool",message)); } +TWO_STRINGS(hmac,sha224,message,passphrase) { return(hmac_dispatch(hmac_sha224_str,"sha224",message,passphrase)); } +TWO_STRINGS(hmac,sha256,message,passphrase) { return(hmac_dispatch(hmac_sha256_str,"sha256",message,passphrase)); } +TWO_STRINGS(hmac,sha384,message,passphrase) { return(hmac_dispatch(hmac_sha384_str,"sha384",message,passphrase)); } +TWO_STRINGS(hmac,sha512,message,passphrase) { return(hmac_dispatch(hmac_sha512_str,"sha512",message,passphrase)); } +TWO_STRINGS(hmac,rmd128,message,passphrase) { return(hmac_dispatch(hmac_rmd128_str,"rmd128",message,passphrase)); } +TWO_STRINGS(hmac,rmd160,message,passphrase) { return(hmac_dispatch(hmac_rmd160_str,"rmd160",message,passphrase)); } +TWO_STRINGS(hmac,rmd256,message,passphrase) { return(hmac_dispatch(hmac_rmd256_str,"rmd256",message,passphrase)); } +TWO_STRINGS(hmac,rmd320,message,passphrase) { return(hmac_dispatch(hmac_rmd320_str,"rmd320",message,passphrase)); } +TWO_STRINGS(hmac,sha1,message,passphrase) { return(hmac_dispatch(hmac_sha1_str,"sha1",message,passphrase)); } +TWO_STRINGS(hmac,md2,message,passphrase) { return(hmac_dispatch(hmac_md2_str,"md2",message,passphrase)); } +TWO_STRINGS(hmac,md4,message,passphrase) { return(hmac_dispatch(hmac_md4_str,"md4",message,passphrase)); } +TWO_STRINGS(hmac,md5,message,passphrase) { return(hmac_dispatch(hmac_md5_str,"md5",message,passphrase)); } +TWO_STRINGS(hmac,tiger192_3,message,passphrase) { return(hmac_dispatch(hmac_tiger_str,"tiger",message,passphrase)); } +TWO_STRINGS(hmac,whirlpool,message,passphrase) { return(hmac_dispatch(hmac_whirlpool_str,"whirlpool",message,passphrase)); } + +STRING_ARG(SuperNET,bitcoinrpc,setcoin) +{ + char buf[1024]; + if ( setcoin != 0 && setcoin[0] != 0 ) + { + strcpy(myinfo->rpcsymbol,setcoin); + touppercase(myinfo->rpcsymbol); + printf("bitcoinrpc.%s\n",myinfo->rpcsymbol); + if ( iguana_launchcoin(myinfo,myinfo->rpcsymbol,json,0) < 0 ) + return(clonestr("{\"error\":\"error creating coin\"}")); + else + { + sprintf(buf,"{\"result\":\"success\",\"setcoin\":\"%s\"}",setcoin); + return(clonestr(buf)); + } + } else return(clonestr("{\"error\":\"bitcoinrpc needs setcoin value\"}")); +} + +ZERO_ARGS(SuperNET,help) +{ + cJSON *helpjson,*retjson; + if ( (helpjson= SuperNET_helpjson()) != 0 ) + { + retjson = cJSON_CreateObject(); + jadd(retjson,"result",helpjson); + return(jprint(retjson,1)); + } else return(clonestr("{\"error\":\"cant get helpjson\"}")); +} + +TWO_STRINGS(SuperNET,html,agentform,htmlfile) +{ + char *htmlstr; cJSON *retjson; int32_t max = 4*1024*1024; + if ( htmlfile == 0 || htmlfile[0] == 0 ) + htmlfile = "forms.html"; + //if ( (fp= fopen(htmlfile,"w")) == 0 ) + // printf("error opening htmlfile.(%s)\n",htmlfile); + htmlstr = malloc(max); + htmlstr = SuperNET_htmlstr(htmlfile,htmlstr,max,agentform); + retjson = cJSON_CreateObject(); + jaddstr(retjson,"result",htmlstr); + free(htmlstr); + //if ( fp != 0 ) + // fclose(fp); + return(jprint(retjson,1)); +} + +#undef IGUANA_ARGS +#undef _IGUANA_APIDEC_H_ +#include "../includes/iguana_apiundefs.h" + diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index 0dec6a079..7496ccd4b 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -17,6 +17,8 @@ #define H_IGUANAFUNCS_H #define SIGHASH_ALL 1 +cJSON *SuperNET_helpjson(); + // peers int32_t iguana_verifypeer(struct iguana_info *coin,void *key,void *value,int32_t itemind,int32_t itemsize); int32_t iguana_peermetrics(struct supernet_info *myinfo,struct iguana_info *coin); From 2cb9e4e81af8fff25c65c2a1525e69a54fe0fadd Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 14:03:24 +0200 Subject: [PATCH 433/495] Test --- basilisk/tradebots_liquidity.c | 4 ++-- iguana/iguana777.h | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/basilisk/tradebots_liquidity.c b/basilisk/tradebots_liquidity.c index 3c4a9075f..7e21127aa 100755 --- a/basilisk/tradebots_liquidity.c +++ b/basilisk/tradebots_liquidity.c @@ -110,7 +110,7 @@ int32_t tradebots_calcrawfeatures(struct tradebot_arbpair *pair) } if ( n > sizeof(pair->rawfeatures)/sizeof(*pair->rawfeatures) ) { - printf("n.%d too many for rawfeatures %ld\n",n,sizeof(pair->rawfeatures)/sizeof(*pair->rawfeatures)); + printf("n.%d too many for rawfeatures %d\n",n,(int32_t)(sizeof(pair->rawfeatures)/sizeof(*pair->rawfeatures))); exit(-1); } return(n); @@ -160,7 +160,7 @@ struct tradebot_arbpair *tradebots_arbpair_create(char *base,char *rel) pair->fp = OS_appendfile(fname); if ( (ftell(pair->fp) % sizeof(pair->rawfeatures)) != 0 ) { - printf("misalinged rawfeatures %ld %ld\n",ftell(pair->fp),(ftell(pair->fp) % sizeof(pair->rawfeatures))); + printf("misalinged rawfeatures %d %d\n",(uint32_t)ftell(pair->fp),(uint32_t)(ftell(pair->fp) % sizeof(pair->rawfeatures))); } fseek(pair->fp,(ftell(pair->fp) / sizeof(pair->rawfeatures)) * sizeof(pair->rawfeatures) - sizeof(pair->rawfeatures),SEEK_SET); if ( fread(pair->rawfeatures,1,sizeof(pair->rawfeatures),pair->fp) == sizeof(pair->rawfeatures) ) diff --git a/iguana/iguana777.h b/iguana/iguana777.h index d39f498b5..682d3da13 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -21,13 +21,17 @@ #define iguana777_net_h #if defined(_WIN32) || defined(_WIN64) +#ifndef WIN32 #define WIN32 #endif +#endif #if (defined(_WIN32) || defined(__WIN32__)) && \ !defined(WIN32) && !defined(__SYMBIAN32__) +#ifndef WIN32 #define WIN32 #endif +#endif #ifdef WIN32 #define __MINGW From bfeb428664c797440d283f0e937ea39d5ae598a0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 14:09:31 +0200 Subject: [PATCH 434/495] Test --- crypto777/curve25519.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto777/curve25519.c b/crypto777/curve25519.c index 5d2c24930..264d59952 100755 --- a/crypto777/curve25519.c +++ b/crypto777/curve25519.c @@ -1792,7 +1792,7 @@ void acct777_rwsig(int32_t rwflag,uint8_t *serialized,struct acct777_sig *sig) int32_t acct777_sigcheck(struct acct777_sig *sig) { #define IGUANA_GENESIS 1453075200 -#define IGUANA_MAXPACKETSIZE (1024 * 1024 * 2) +#define IGUANA_MAXPACKETSIZE (1024 * 1024 * 4) #define TEN_YEARS (10 * 365 * 24 * 3600) if ( sig->allocsize < sizeof(*sig) || sig->allocsize > IGUANA_MAXPACKETSIZE ) { From bc494ecabba23539951ed3621825c322857de49f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 14:23:44 +0200 Subject: [PATCH 435/495] Test --- basilisk/basilisk.h | 4 ++-- basilisk/basilisk_swap.c | 3 ++- iguana/DB/SWAPS/1978010631-1500406169 | Bin 0 -> 101405 bytes iguana/DB/SWAPS/1978010631-1500406169.swap | Bin 0 -> 233496 bytes 4 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 iguana/DB/SWAPS/1978010631-1500406169 create mode 100644 iguana/DB/SWAPS/1978010631-1500406169.swap diff --git a/basilisk/basilisk.h b/basilisk/basilisk.h index c25f11236..b15b9032f 100755 --- a/basilisk/basilisk.h +++ b/basilisk/basilisk.h @@ -60,9 +60,9 @@ struct basilisk_rawtx struct iguana_msgtx msgtx; struct basilisk_rawtxinfo I; struct iguana_info *coin; - char vinstr[4096]; + char vinstr[8192]; cJSON *vins; - uint8_t txbytes[8192],spendscript[512],redeemscript[1024],extraspace[1024]; + uint8_t txbytes[16384],spendscript[512],redeemscript[1024],extraspace[4096]; }; struct basilisk_swapinfo diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 2ea0f4055..f4c24a2db 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -320,7 +320,7 @@ bits256 basilisk_swap_broadcast(char *name,struct supernet_info *myinfo,struct b int32_t _basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,uint32_t timestamp,uint32_t locktime,uint32_t sequenceid,struct basilisk_rawtx *dest,struct basilisk_rawtx *rawtx,bits256 privkey,bits256 *privkey2,uint8_t *userdata,int32_t userdatalen,int32_t ignore_cltverr) { char *rawtxbytes=0,*signedtx=0,hexstr[999],wifstr[128]; cJSON *txobj,*vins,*item,*sobj,*privkeys; int32_t needsig=1,retval = -1; struct vin_info *V; - V = calloc(16,sizeof(*V)); + V = calloc(256,sizeof(*V)); V[0].signers[0].privkey = privkey; bitcoin_pubkey33(myinfo->ctx,V[0].signers[0].pubkey,privkey); privkeys = cJSON_CreateArray(); @@ -395,6 +395,7 @@ int32_t _basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,uint32_ } else printf("error making rawtx\n"); free_json(privkeys); free_json(txobj); + free(V); return(retval); } diff --git a/iguana/DB/SWAPS/1978010631-1500406169 b/iguana/DB/SWAPS/1978010631-1500406169 new file mode 100644 index 0000000000000000000000000000000000000000..70b880155b90d87cb3c2c0277979dafca04194b0 GIT binary patch literal 101405 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�OdgGilGQ5Qiy$D|zsXq?G~tPrMO!_e=TP;Nn!g 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�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 VbMrr-U*Jv60I!4Kj^BTv4*@nhP22zg literal 0 HcmV?d00001 diff --git a/iguana/DB/SWAPS/1978010631-1500406169.swap b/iguana/DB/SWAPS/1978010631-1500406169.swap new file mode 100644 index 0000000000000000000000000000000000000000..39f4c98d066ca6e86a43a9064007ebe440c7352d GIT binary patch literal 233496 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 literal 0 HcmV?d00001 From 3618a01fd71e8e20cae7bc423e3cf4d17210e300 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 14:24:09 +0200 Subject: [PATCH 436/495] Test --- iguana/DB/SWAPS/1978010631-1500406169 | Bin 101405 -> 0 bytes iguana/DB/SWAPS/1978010631-1500406169.swap | Bin 233496 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 iguana/DB/SWAPS/1978010631-1500406169 delete mode 100644 iguana/DB/SWAPS/1978010631-1500406169.swap diff --git a/iguana/DB/SWAPS/1978010631-1500406169 b/iguana/DB/SWAPS/1978010631-1500406169 deleted file mode 100644 index 70b880155b90d87cb3c2c0277979dafca04194b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101405 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�OdgGilGQ5Qiy$D|zsXq?G~tPrMO!_e=TP;Nn!g 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�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 VbMrr-U*Jv60I!4Kj^BTv4*@nhP22zg diff --git a/iguana/DB/SWAPS/1978010631-1500406169.swap b/iguana/DB/SWAPS/1978010631-1500406169.swap deleted file mode 100644 index 39f4c98d066ca6e86a43a9064007ebe440c7352d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233496 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 From 555a37ab0fd45399e2c20b467192fcb3e5c6810d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 15:09:02 +0200 Subject: [PATCH 437/495] Test --- basilisk/basilisk_swap.c | 39 +++++++++++++++++++------------------- iguana/tests/cancelrefresh | 2 ++ 2 files changed, 22 insertions(+), 19 deletions(-) create mode 100755 iguana/tests/cancelrefresh diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index f4c24a2db..e68ea0a39 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1082,7 +1082,7 @@ void basilisk_swaps_init(struct supernet_info *myinfo) while ( fread(&M,1,sizeof(M),fp) == sizeof(M) ) { M.data = 0; - printf("entry iter.%d crc32.%x datalen.%d\n",iter,M.crc32,M.datalen); + //printf("entry iter.%d crc32.%x datalen.%d\n",iter,M.crc32,M.datalen); if ( M.datalen < 100000 ) { M.data = malloc(M.datalen); @@ -1381,10 +1381,10 @@ void basilisk_swap_saveupdate(struct supernet_info *myinfo,struct basilisk_swap { FILE *fp; char fname[512]; sprintf(fname,"%s/SWAPS/%u-%u.swap",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid); - if ( (fp= fopen(fname,"wb")) != 0 ) + if ( 0 && (fp= fopen(fname,"wb")) != 0 ) { fwrite(&swap->I,1,sizeof(swap->I),fp); - fwrite(&swap->bobdeposit,1,sizeof(swap->bobdeposit),fp); + /*fwrite(&swap->bobdeposit,1,sizeof(swap->bobdeposit),fp); fwrite(&swap->bobpayment,1,sizeof(swap->bobpayment),fp); fwrite(&swap->alicepayment,1,sizeof(swap->alicepayment),fp); fwrite(&swap->myfee,1,sizeof(swap->myfee),fp); @@ -1394,7 +1394,7 @@ void basilisk_swap_saveupdate(struct supernet_info *myinfo,struct basilisk_swap fwrite(&swap->bobreclaim,1,sizeof(swap->bobreclaim),fp); fwrite(&swap->bobspend,1,sizeof(swap->bobspend),fp); fwrite(&swap->bobrefund,1,sizeof(swap->bobrefund),fp); - fwrite(&swap->alicereclaim,1,sizeof(swap->alicereclaim),fp); + fwrite(&swap->alicereclaim,1,sizeof(swap->alicereclaim),fp);*/ fwrite(swap->privkeys,1,sizeof(swap->privkeys),fp); fwrite(swap->otherdeck,1,sizeof(swap->otherdeck),fp); fwrite(swap->deck,1,sizeof(swap->deck),fp); @@ -1413,7 +1413,7 @@ int32_t basilisk_swap_loadtx(struct basilisk_rawtx *rawtx,FILE *fp,char *bobcoin rawtx->coin = iguana_coinfind(rawtx->I.coinstr); if ( rawtx->vinstr[0] != 0 ) rawtx->vins = cJSON_Parse(rawtx->vinstr); - printf("loaded.%s\n",rawtx->name); + printf("loaded.%s len.%d\n",rawtx->name,rawtx->I.datalen); return(0); } } @@ -1426,6 +1426,7 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv if ( reinit != 0 ) { sprintf(fname,"%s/SWAPS/%u-%u.swap",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid); + printf("reinit.(%s)\n",fname); if ( (fp= fopen(fname,"rb")) != 0 ) { fread(&swap->I,1,sizeof(swap->I),fp); @@ -1433,9 +1434,9 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv swap->bobcoin = iguana_coinfind(swap->I.req.dest); if ( swap->alicecoin == 0 ) swap->alicecoin = iguana_coinfind(swap->I.req.src); - if ( swap->alicecoin != 0 && swap->bobcoin == 0 ) + if ( swap->alicecoin != 0 && swap->bobcoin != 0 ) { - basilisk_swap_loadtx(&swap->bobdeposit,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + /*basilisk_swap_loadtx(&swap->bobdeposit,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); basilisk_swap_loadtx(&swap->bobpayment,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); basilisk_swap_loadtx(&swap->alicepayment,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); basilisk_swap_loadtx(&swap->myfee,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); @@ -1445,13 +1446,13 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv basilisk_swap_loadtx(&swap->bobreclaim,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); basilisk_swap_loadtx(&swap->bobspend,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); basilisk_swap_loadtx(&swap->bobrefund,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); - basilisk_swap_loadtx(&swap->alicereclaim,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); - fread(swap->privkeys,1,sizeof(swap->privkeys),fp); - fread(swap->otherdeck,1,sizeof(swap->otherdeck),fp); - fread(swap->deck,1,sizeof(swap->deck),fp); + basilisk_swap_loadtx(&swap->alicereclaim,fp,swap->bobcoin->symbol,swap->alicecoin->symbol);*/ } else printf("missing coins (%p %p)\n",swap->bobcoin,swap->alicecoin); + fread(swap->privkeys,1,sizeof(swap->privkeys),fp); + fread(swap->otherdeck,1,sizeof(swap->otherdeck),fp); + fread(swap->deck,1,sizeof(swap->deck),fp); fclose(fp); - } + } else printf("cant find.(%s)\n",fname); } else { @@ -1880,8 +1881,10 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap if ( (swap->I.otherstatebits & 0x80) == 0 ) basilisk_swapdata_rawtxsend(myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40,0); } + basilisk_swap_saveupdate(myinfo,swap); while ( retval == 0 && time(NULL) < swap->I.expiration ) // both sides have setup required data and paid txfee { + basilisk_swap_saveupdate(myinfo,swap); if ( swap->connected == 0 ) basilisk_psockinit(myinfo,swap,swap->I.iambob != 0); //if ( (rand() % 30) == 0 ) @@ -1919,7 +1922,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x8000,data,maxlen,&swap->bobpayment,0x4000,0); } // [BLOCKING: privM] Bob waits for privAm either from Alice or alice blockchain - else if ( (swap->I.statebits & 0x40000) == 0 ) + else if ( (swap->I.statebits & 0xc0000) != 0xc0000 ) { if ( basilisk_swapget(myinfo,swap,0x40000,data,maxlen,basilisk_verify_privi) == 0 || basilisk_privAm_extract(myinfo,swap) == 0 ) // divulges privAm { @@ -2192,7 +2195,6 @@ void basilisk_swaploop(void *_swap) printf("couldnt establish connection\n"); retval = -1; } - basilisk_swap_saveupdate(myinfo,swap); while ( retval == 0 && (swap->I.statebits & 0x20) == 0 && time(NULL) < expiration ) { if ( swap->connected == 0 ) @@ -2215,7 +2217,6 @@ void basilisk_swaploop(void *_swap) myinfo->DEXactive = 0; } printf("C r%u/q%u swapstate.%x retval.%d\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits,retval); - basilisk_swap_saveupdate(myinfo,swap); while ( retval == 0 && (swap->I.statebits & 0x40) == 0 ) // send fee { if ( swap->connected == 0 ) @@ -2313,20 +2314,19 @@ void basilisk_swaploop(void *_swap) } } } - basilisk_swap_saveupdate(myinfo,swap); while ( retval == 0 && basilisk_swapiteration(myinfo,swap,data,maxlen) == 0 ) { sleep(DEX_SLEEP); basilisk_sendstate(myinfo,swap,data,maxlen); basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); + basilisk_swap_saveupdate(myinfo,swap); if ( time(NULL) > swap->I.expiration ) break; } - basilisk_swap_saveupdate(myinfo,swap); - printf("end of atomic swap\n"); if ( swap->I.iambob != 0 && swap->bobdeposit.I.datalen != 0 ) { - sleep(300); // wait for confirm of msig + printf("BOB waiting for confirm\n"); + sleep(60); // wait for confirm/propagation of msig printf("BOB reclaims refund\n"); basilisk_bobdeposit_refund(myinfo,swap,0); if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobrefund,0x40000000,0) == 0 ) // use secretBn @@ -2342,6 +2342,7 @@ void basilisk_swaploop(void *_swap) } basilisk_swap_saveupdate(myinfo,swap); } + printf("end of atomic swap\n"); if ( swapcompleted(myinfo,swap) > 0 ) // only if swap completed { if ( swap->I.iambob != 0 ) diff --git a/iguana/tests/cancelrefresh b/iguana/tests/cancelrefresh new file mode 100755 index 000000000..35c27504d --- /dev/null +++ b/iguana/tests/cancelrefresh @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"cancelrefresh\"}" From 13e29b20ff5a7c8c6ca971a2b3c8ae682995cd3a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 15:17:59 +0200 Subject: [PATCH 438/495] Test --- basilisk/basilisk_swap.c | 2 +- iguana/iguana_payments.c | 4 ++-- iguana/iguana_sign.c | 8 ++++---- iguana/iguana_unspents.c | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index e68ea0a39..d9f17db61 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -352,7 +352,7 @@ int32_t _basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,uint32_ needsig = 0; #endif } - printf("rawtx B\n"); + //printf("rawtx B\n"); if ( bits256_nonz(rawtx->I.actualtxid) != 0 ) jaddbits256(item,"txid",rawtx->I.actualtxid); else jaddbits256(item,"txid",rawtx->I.signedtxid); diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 8e7aacf20..196c3a313 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -175,7 +175,7 @@ int32_t iguana_RTbestunspent(struct supernet_info *myinfo,struct iguana_info *co } if ( iguana_RTunspent_check(myinfo,coin,unspents[i]) != 0 ) { - printf("(%d u%d) %.8f already used\n",unspents[i].hdrsi,unspents[i].unspentind,dstr(atx_value)); + //printf("(%d u%d) %.8f already used\n",unspents[i].hdrsi,unspents[i].unspentind,dstr(atx_value)); continue; } if ( maxmode == 0 ) @@ -289,7 +289,7 @@ char *iguana_signrawtx(struct supernet_info *myinfo,struct iguana_info *coin,int if ( flag != 0 ) free_json(privkeys); } - char str[65]; printf("completed.%d %s signed.(%s)\n",*completedp,bits256_str(str,*signedtxidp),signedtx!=0?signedtx:""); + //char str[65]; printf("completed.%d %s signed.(%s)\n",*completedp,bits256_str(str,*signedtxidp),signedtx!=0?signedtx:""); return(signedtx); } diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index c502e1465..43afba477 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -687,7 +687,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ { iguana_vinobjset(&msg->vins[i],jitem(vins,i),spendscript,sizeof(spendscript)); sigtxid = bitcoin_sigtxid(coin,height,sigser,maxsize*2,msg,i,msg->vins[i].spendscript,msg->vins[i].spendlen,SIGHASH_ALL,vpnstr,suppress_pubkeys); - printf("after vini.%d vinscript.%p spendscript.%p spendlen.%d (%s)\n",i,msg->vins[i].vinscript,msg->vins[i].spendscript,msg->vins[i].spendlen,jprint(jitem(vins,i),0)); + //printf("after vini.%d vinscript.%p spendscript.%p spendlen.%d (%s)\n",i,msg->vins[i].vinscript,msg->vins[i].spendscript,msg->vins[i].spendlen,jprint(jitem(vins,i),0)); jaddi(vinarray,iguana_vinjson(coin,&msg->vins[i],sigtxid)); if ( msg->vins[i].spendscript == spendscript ) msg->vins[i].spendscript = 0; @@ -1013,13 +1013,13 @@ int32_t bitcoin_verifyvins(struct iguana_info *coin,int32_t height,bits256 *sign { flag++; numsigs++; - int32_t z; + /*int32_t z; for (z=0; zsigners[j].pubkey[z]); - printf(" <- pub, SIG.%d.%d VERIFIED numsigs.%d vs M.%d\n",vini,j,numsigs,vp->M); + printf(" <- pub, SIG.%d.%d VERIFIED numsigs.%d vs M.%d\n",vini,j,numsigs,vp->M);*/ } } if ( numsigs >= vp->M ) @@ -1435,7 +1435,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf } } } - printf("type.%d p2sh.[%d] -> %s M.%d N.%d\n",type,i,mvin.coinaddr,mvin.M,mvin.N); + //printf("type.%d p2sh.[%d] -> %s M.%d N.%d\n",type,i,mvin.coinaddr,mvin.M,mvin.N); } } if ( i < V->N ) diff --git a/iguana/iguana_unspents.c b/iguana/iguana_unspents.c index 19db61d54..773f6f431 100755 --- a/iguana/iguana_unspents.c +++ b/iguana/iguana_unspents.c @@ -913,7 +913,7 @@ void iguana_unspents_mark(struct supernet_info *myinfo,struct iguana_info *coin, { if ( firstslot >= 0 ) { - printf("slot.[%d] <- %s/v%d\n",firstslot,bits256_str(str,txid),vout); + //printf("slot.[%d] <- %s/v%d\n",firstslot,bits256_str(str,txid),vout); coin->markedunspents[firstslot] = txid; coin->markedunspents[firstslot].ushorts[15] = vout; if ( (0) && coin->utxofp == 0 ) @@ -949,7 +949,7 @@ return; { if ( firstslot >= 0 ) { - char str[65]; printf("%s slot.[%d] <- %s/v%d\n",fname,firstslot,bits256_str(str,filetxid),filevout); + //char str[65]; printf("%s slot.[%d] <- %s/v%d\n",fname,firstslot,bits256_str(str,filetxid),filevout); coin->markedunspents[firstslot] = filetxid; coin->markedunspents[firstslot].ushorts[15] = filevout; } @@ -975,7 +975,7 @@ return; { if ( firstslot >= 0 ) { - char str[65]; printf("slot.[%d] <- %s/v%d\n",firstslot,bits256_str(str,filetxid),filevout); + //char str[65]; printf("slot.[%d] <- %s/v%d\n",firstslot,bits256_str(str,filetxid),filevout); coin->markedunspents[firstslot] = filetxid; coin->markedunspents[firstslot].ushorts[15] = filevout; } From c30351aa69ac66ccda8e40caf7a4ebd1cbf697f4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 15:26:37 +0200 Subject: [PATCH 439/495] Test --- basilisk/basilisk_swap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index d9f17db61..e8ee6438a 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1037,9 +1037,9 @@ void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swa FILE *basilisk_swap_save(struct supernet_info *myinfo,struct basilisk_swap *swap,bits256 privkey,struct basilisk_request *rp,uint32_t statebits,int32_t optionduration,int32_t reinit) { - FILE *fp; char fname[512]; + FILE *fp=0; char fname[512]; sprintf(fname,"%s/SWAPS/%u-%u",GLOBAL_DBDIR,rp->requestid,rp->quoteid), OS_compatible_path(fname); - if ( (fp= fopen(fname,"rb+")) == 0 ) + if ( 0 && (fp= fopen(fname,"rb+")) == 0 ) { if ( (fp= fopen(fname,"wb+")) != 0 ) { From 25dd833a1e5d03f247b0694677ae5f6dcd8ceb86 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 17:13:03 +0200 Subject: [PATCH 440/495] Test --- basilisk/basilisk_swap.c | 57 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index e8ee6438a..3daeb4acc 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1380,7 +1380,7 @@ int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct igu void basilisk_swap_saveupdate(struct supernet_info *myinfo,struct basilisk_swap *swap) { FILE *fp; char fname[512]; - sprintf(fname,"%s/SWAPS/%u-%u.swap",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid); + sprintf(fname,"%s/SWAPS/%u-%u.swap",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid), OS_compatible_path(fname); if ( 0 && (fp= fopen(fname,"wb")) != 0 ) { fwrite(&swap->I,1,sizeof(swap->I),fp); @@ -1425,7 +1425,7 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv FILE *fp; char fname[512]; uint8_t *alicepub33=0,*bobpub33=0; int32_t jumblrflag,x = -1; if ( reinit != 0 ) { - sprintf(fname,"%s/SWAPS/%u-%u.swap",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid); + sprintf(fname,"%s/SWAPS/%u-%u.swap",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid), OS_compatible_path(fname); printf("reinit.(%s)\n",fname); if ( (fp= fopen(fname,"rb")) != 0 ) { @@ -1699,9 +1699,32 @@ int32_t basilisk_verify_privkeys(struct supernet_info *myinfo,void *ptr,uint8_t return(errs); } +void basilisk_dontforget(struct supernet_info *myinfo,struct basilisk_swap *swap,struct basilisk_rawtx *rawtx,int32_t locktime,bits256 triggertxid) +{ + // bobrefund, bobreclaim, alicereclaim + char fname[512],str[65]; FILE *fp; int32_t i; + sprintf(fname,"%s/SWAPS/%u-%u.%s",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid,rawtx->name), OS_compatible_path(fname); + if ( (fp= fopen(fname,"wb")) != 0 ) + { + printf("{\"name\":\"%s\"",rawtx->name); + if ( rawtx->I.datalen > 0 ) + { + printf(",\"tx\":\""); + for (i=0; iI.datalen; i++) + printf("%02x",rawtx->txbytes[i]); + printf("\""); + } + printf(",\"lock\":%u",locktime); + if ( bits256_nonz(triggertxid) != 0 ) + printf(",\"trigger\":\"%s\"",bits256_str(str,triggertxid)); + printf("}\n"); + fclose(fp); + } +} + uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,struct basilisk_rawtx *rawtx,uint32_t nextbits,int32_t suppress_swapsend) { - uint8_t sendbuf[32768]; int32_t sendlen; + uint8_t sendbuf[32768]; int32_t sendlen; bits256 triggertxid; if ( basilisk_swapdata_rawtx(myinfo,swap,data,maxlen,rawtx) != 0 ) { if ( bits256_nonz(rawtx->I.signedtxid) != 0 && bits256_nonz(rawtx->I.actualtxid) == 0 ) @@ -1722,6 +1745,32 @@ uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilis memcpy(&sendbuf[sendlen],rawtx->redeemscript,rawtx->I.redeemlen); sendlen += rawtx->I.redeemlen; } + memset(triggertxid.bytes,0,sizeof(triggertxid)); + if ( swap->I.iambob != 0 ) + { + if ( rawtx == &swap->bobdeposit ) + { + basilisk_dontforget(myinfo,swap,&swap->bobdeposit,0,triggertxid); + basilisk_dontforget(myinfo,swap,&swap->bobrefund,0,triggertxid); + } + else if ( rawtx == &swap->bobpayment ) + { + basilisk_dontforget(myinfo,swap,&swap->bobpayment,0,triggertxid); + basilisk_dontforget(myinfo,swap,&swap->bobreclaim,swap->bobpayment.I.locktime,triggertxid); + } + else if ( rawtx == &swap->bobspend ) + basilisk_dontforget(myinfo,swap,&swap->bobspend,0,triggertxid); + } + else + { + if ( rawtx == &swap->alicepayment ) + { + basilisk_dontforget(myinfo,swap,&swap->alicepayment,0,triggertxid); + basilisk_dontforget(myinfo,swap,&swap->alicereclaim,0,swap->bobrefund.I.actualtxid); + } + else if ( rawtx == &swap->alicespend ) + basilisk_dontforget(myinfo,swap,&swap->alicespend,0,triggertxid); + } //printf("sendlen.%d datalen.%d redeemlen.%d\n",sendlen,rawtx->datalen,rawtx->redeemlen); if ( suppress_swapsend == 0 ) return(basilisk_swapsend(myinfo,swap,msgbits,sendbuf,sendlen,nextbits,rawtx->I.crcs)); @@ -1926,7 +1975,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap { if ( basilisk_swapget(myinfo,swap,0x40000,data,maxlen,basilisk_verify_privi) == 0 || basilisk_privAm_extract(myinfo,swap) == 0 ) // divulges privAm { - printf("got privi spend alicepayment, dont divulge privBn until bobspend propagated\n"); + //printf("got privi spend alicepayment, dont divulge privBn until bobspend propagated\n"); basilisk_alicepayment_spend(myinfo,swap,&swap->bobspend); if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobspend,0x40000,1) == 0 ) printf("Bob error spending alice payment\n"); From 81857192cd7b811ed2f2950f75099eb4489efbf6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 17:19:24 +0200 Subject: [PATCH 441/495] Test --- basilisk/basilisk_swap.c | 14 +++++++------- iguana/iguana_sign.c | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 3daeb4acc..aad2bf050 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1706,18 +1706,18 @@ void basilisk_dontforget(struct supernet_info *myinfo,struct basilisk_swap *swap sprintf(fname,"%s/SWAPS/%u-%u.%s",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid,rawtx->name), OS_compatible_path(fname); if ( (fp= fopen(fname,"wb")) != 0 ) { - printf("{\"name\":\"%s\"",rawtx->name); + fprintf(fp,"{\"name\":\"%s\"",rawtx->name); if ( rawtx->I.datalen > 0 ) { - printf(",\"tx\":\""); + fprintf(fp,",\"tx\":\""); for (i=0; iI.datalen; i++) - printf("%02x",rawtx->txbytes[i]); - printf("\""); + fprintf(fp,"%02x",rawtx->txbytes[i]); + fprintf(fp,"\""); } - printf(",\"lock\":%u",locktime); + fprintf(fp,",\"lock\":%u",locktime); if ( bits256_nonz(triggertxid) != 0 ) - printf(",\"trigger\":\"%s\"",bits256_str(str,triggertxid)); - printf("}\n"); + fprintf(fp,",\"trigger\":\"%s\"",bits256_str(str,triggertxid)); + fprintf(fp,"}\n"); fclose(fp); } } diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 43afba477..1c5b1efc9 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -1430,7 +1430,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf for (z=0; z<33; z++) V[i].signers[j].pubkey[z] = pubkeys[k][z]; } - printf("%s -> V[%d].signer.[%d] <- privkey.%d\n",mvin.signers[j].coinaddr,i,j,k); + //printf("%s -> V[%d].signer.[%d] <- privkey.%d\n",mvin.signers[j].coinaddr,i,j,k); break; } } From b97515840d2d67ecb64979a6f7110326ff7e26ef Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 17:34:57 +0200 Subject: [PATCH 442/495] Test --- basilisk/basilisk_swap.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index aad2bf050..f3849c118 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1701,18 +1701,17 @@ int32_t basilisk_verify_privkeys(struct supernet_info *myinfo,void *ptr,uint8_t void basilisk_dontforget(struct supernet_info *myinfo,struct basilisk_swap *swap,struct basilisk_rawtx *rawtx,int32_t locktime,bits256 triggertxid) { - // bobrefund, bobreclaim, alicereclaim char fname[512],str[65]; FILE *fp; int32_t i; sprintf(fname,"%s/SWAPS/%u-%u.%s",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid,rawtx->name), OS_compatible_path(fname); if ( (fp= fopen(fname,"wb")) != 0 ) { - fprintf(fp,"{\"name\":\"%s\"",rawtx->name); + fprintf(fp,"{\"name\":\"%s\",\"coin\":\"%s\"",rawtx->name,rawtx->coin->symbol); if ( rawtx->I.datalen > 0 ) { fprintf(fp,",\"tx\":\""); for (i=0; iI.datalen; i++) fprintf(fp,"%02x",rawtx->txbytes[i]); - fprintf(fp,"\""); + fprintf(fp,"\",\"txid\":\"%s\"",bits256_str(str,rawtx->I.actualtxid)); } fprintf(fp,",\"lock\":%u",locktime); if ( bits256_nonz(triggertxid) != 0 ) @@ -1766,6 +1765,7 @@ uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilis if ( rawtx == &swap->alicepayment ) { basilisk_dontforget(myinfo,swap,&swap->alicepayment,0,triggertxid); + basilisk_alicepayment_spend(myinfo,swap,&swap->alicereclaim); basilisk_dontforget(myinfo,swap,&swap->alicereclaim,0,swap->bobrefund.I.actualtxid); } else if ( rawtx == &swap->alicespend ) From 989fae017a3743564e12af568951919e560d0aff Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 18:01:59 +0200 Subject: [PATCH 443/495] Test --- basilisk/basilisk_swap.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index f3849c118..b7c1f3cbb 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -582,7 +582,7 @@ int32_t basilisk_verify_otherfee(struct supernet_info *myinfo,void *ptr,uint8_t int32_t basilisk_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct basilisk_rawtx *rawtx,int32_t v,uint8_t *recvbuf,int32_t recvlen,int32_t suppress_pubkeys) { - int32_t datalen=0,retval=-1,hexlen,n; uint8_t *data; cJSON *txobj,*skey,*vouts,*vout; char *hexstr; + int32_t datalen=0,retval=-1,hexlen,n; uint8_t *data; cJSON *txobj,*skey,*vouts,*vout; char *hexstr; bits256 txid; datalen = recvbuf[0]; datalen += (int32_t)recvbuf[1] << 8; if ( datalen > 65536 ) @@ -609,6 +609,10 @@ int32_t basilisk_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,str printf("%s rawtx data compare error, len %d vs %d <<<<<<<<<< warning\n",rawtx->name,rawtx->I.datalen,datalen); return(-1); } + txid = bits256_doublesha256(0,data,datalen); + char str[65]; printf("rawtx.%s txid %s\n",rawtx->name,bits256_str(str,txid)); + if ( bits256_cmp(txid,rawtx->I.actualtxid) != 0 && bits256_nonz(rawtx->I.actualtxid) == 0 ) + rawtx->I.actualtxid = txid; if ( (txobj= bitcoin_data2json(rawtx->coin,height,&rawtx->I.signedtxid,&rawtx->msgtx,rawtx->extraspace,sizeof(rawtx->extraspace),data,datalen,0,suppress_pubkeys)) != 0 ) { rawtx->I.actualtxid = rawtx->I.signedtxid; From 36835a39a1603ff7ef6275c4f70e9d55f54edf14 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 18:18:51 +0200 Subject: [PATCH 444/495] Test --- basilisk/basilisk_swap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index b7c1f3cbb..f9fe50702 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1715,7 +1715,7 @@ void basilisk_dontforget(struct supernet_info *myinfo,struct basilisk_swap *swap fprintf(fp,",\"tx\":\""); for (i=0; iI.datalen; i++) fprintf(fp,"%02x",rawtx->txbytes[i]); - fprintf(fp,"\",\"txid\":\"%s\"",bits256_str(str,rawtx->I.actualtxid)); + fprintf(fp,"\",\"txid\":\"%s\"",bits256_str(str,bits256_doublesha256(0,rawtx->txbytes,rawtx->I.datalen))); } fprintf(fp,",\"lock\":%u",locktime); if ( bits256_nonz(triggertxid) != 0 ) From dcdf55085878830a8cc5629d0339e62a0daebe27 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 18:53:11 +0200 Subject: [PATCH 445/495] Test --- basilisk/basilisk_bitcoin.c | 2 +- basilisk/basilisk_swap.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index b779027bb..24d0c03d8 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -804,7 +804,7 @@ char *basilisk_bitcoinrawtx(struct supernet_info *myinfo,struct iguana_info *coi rawtx = iguana_calcrawtx(myinfo,coin,&vins,txobj,amount,changeaddr,txfee,addresses,minconf,oplen!=0?buf:0,oplen+offset,burnamount,remoteaddr,V,0); printf("new txfee %.8f\n",dstr(txfee)); } - printf("generated.(%s) vins.(%s)\n",rawtx!=0?rawtx:"",vins!=0?jprint(vins,0):""); + //printf("generated.(%s) vins.(%s)\n",rawtx!=0?rawtx:"",vins!=0?jprint(vins,0):""); } if ( rawtx != 0 ) { diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index f9fe50702..32b1c8144 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -499,8 +499,8 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swaps bitcoin_address(rawtx->coin->changeaddr,rawtx->coin->chain->pubtype,pubkey33,33); printf("set change address.(%s)\n",rawtx->coin->changeaddr); } - //if ( strcmp(rawtx->coin->symbol,"BTC") == 0 ) - // txfee = 0; + if ( strcmp(rawtx->coin->symbol,"BTC") == 0 ) + txfee = 0; init_hexbytes_noT(scriptstr,script,scriptlen); basilisktag = (uint32_t)rand(); valsobj = cJSON_CreateObject(); @@ -732,7 +732,7 @@ int32_t basilisk_verify_bobpaid(struct supernet_info *myinfo,void *ptr,uint8_t * for (i=0; i<32; i++) revAm.bytes[i] = swap->I.privAm.bytes[31-i]; len = basilisk_swapuserdata(userdata,revAm,0,swap->I.myprivs[0],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); - char str[65],str2[65]; printf("bobpaid.(%s) (%s)\n",bits256_str(str,swap->I.privAm),bits256_str(str2,swap->I.myprivs[0])); + char str[65],str2[65]; printf("bobpaid privAm.(%s) myprivs[0].(%s)\n",bits256_str(str,swap->I.privAm),bits256_str(str2,swap->I.myprivs[0])); if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->longestchain,swap,&swap->alicespend,&swap->bobpayment,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) { for (i=0; ibobpayment.I.datalen; i++) From 71bab9e379c0987c07cee976065e44a695b7156d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 19:02:15 +0200 Subject: [PATCH 446/495] Test --- basilisk/basilisk_bitcoin.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index 24d0c03d8..9f1417484 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -758,9 +758,14 @@ char *basilisk_bitcoinrawtx(struct supernet_info *myinfo,struct iguana_info *coi if ( (amount= j64bits(valsobj,"satoshis")) == 0 ) amount = jdouble(valsobj,"value") * SATOSHIDEN; if ( (txfee= j64bits(valsobj,"txfee")) == 0 ) - txfee = coin->chain->txfee; - if ( txfee == 0 ) - txfee = 10000; + { + if ( strcmp(coin->symbol,"BTC") != 0 ) + { + txfee = coin->chain->txfee; + if ( txfee == 0 ) + txfee = 10000; + } + } spendscriptstr = jstr(valsobj,"spendscript"); minconf = juint(valsobj,"minconf"); locktime = jint(valsobj,"locktime"); From edbfcf7dcbcba3d518541424fcbf9857b6a416a4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 19:10:29 +0200 Subject: [PATCH 447/495] Test --- basilisk/basilisk_bitcoin.c | 5 ++++- basilisk/basilisk_swap.c | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index 9f1417484..3a174e3ac 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -806,8 +806,11 @@ char *basilisk_bitcoinrawtx(struct supernet_info *myinfo,struct iguana_info *coi if ( txfee == 0 ) { txfee = iguana_esttxfee(myinfo,coin,rawtx,0,vins != 0 ? cJSON_GetArraySize(vins): 0); + free(rawtx); + if ( vins != 0 ) + free_json(vins), vins = 0; rawtx = iguana_calcrawtx(myinfo,coin,&vins,txobj,amount,changeaddr,txfee,addresses,minconf,oplen!=0?buf:0,oplen+offset,burnamount,remoteaddr,V,0); - printf("new txfee %.8f\n",dstr(txfee)); + printf("new txfee %.8f (%s)\n",dstr(txfee),rawtx); } //printf("generated.(%s) vins.(%s)\n",rawtx!=0?rawtx:"",vins!=0?jprint(vins,0):""); } diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 32b1c8144..0aada0ba4 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -522,7 +522,7 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swaps V = calloc(256,sizeof(*V)); if ( (retstr= basilisk_bitcoinrawtx(myinfo,rawtx->coin,"",basilisktag,jint(valsobj,"timeout"),valsobj,V)) != 0 ) { - //printf("%s %s basilisk_bitcoinrawtx.(%s)\n",rawtx->name,str,retstr); + printf("%s %s basilisk_bitcoinrawtx.(%s)\n",rawtx->name,str,retstr); flag = 0; if ( (retarray= cJSON_Parse(retstr)) != 0 ) { From 625ce9e41236774268bcbb0ae56bf7dc3f0ffaf6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 19:17:56 +0200 Subject: [PATCH 448/495] Test --- basilisk/basilisk_bitcoin.c | 1 - 1 file changed, 1 deletion(-) diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index 3a174e3ac..375371d9e 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -806,7 +806,6 @@ char *basilisk_bitcoinrawtx(struct supernet_info *myinfo,struct iguana_info *coi if ( txfee == 0 ) { txfee = iguana_esttxfee(myinfo,coin,rawtx,0,vins != 0 ? cJSON_GetArraySize(vins): 0); - free(rawtx); if ( vins != 0 ) free_json(vins), vins = 0; rawtx = iguana_calcrawtx(myinfo,coin,&vins,txobj,amount,changeaddr,txfee,addresses,minconf,oplen!=0?buf:0,oplen+offset,burnamount,remoteaddr,V,0); From 35aac668096d366392fa78b2be03e601f7b763be Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 19:25:40 +0200 Subject: [PATCH 449/495] Test --- iguana/iguana_payments.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 196c3a313..e1b39644c 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -274,7 +274,7 @@ char *iguana_signrawtx(struct supernet_info *myinfo,struct iguana_info *coin,int memset(&msgtx,0,sizeof(msgtx)); if ( V == 0 ) V = calloc(numinputs,sizeof(*V)), flagV = 1; - //printf("SIGN.(%s) priv.(%s) %llx %llx V.%p\n",jprint(vins,0),jprint(privkeys,0),(long long)V->signers[0].privkey.txid,(long long)V->signers[1].privkey.txid,V); + printf("SIGN.(%s) priv.(%s) %llx %llx V.%p\n",jprint(vins,0),jprint(privkeys,0),(long long)V->signers[0].privkey.txid,(long long)V->signers[1].privkey.txid,V); if ( V != 0 ) { if ( iguana_signrawtransaction(myinfo,coin,height,&msgtx,&signedtx,signedtxidp,V,numinputs,rawtx,vins,privkeys) > 0 ) From e4be264a0d480f19aa7213520429edd037e75d81 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 19:39:39 +0200 Subject: [PATCH 450/495] Test --- basilisk/basilisk_swap.c | 2 +- iguana/iguana_payments.c | 2 +- iguana/iguana_sign.c | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 0aada0ba4..32b1c8144 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -522,7 +522,7 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swaps V = calloc(256,sizeof(*V)); if ( (retstr= basilisk_bitcoinrawtx(myinfo,rawtx->coin,"",basilisktag,jint(valsobj,"timeout"),valsobj,V)) != 0 ) { - printf("%s %s basilisk_bitcoinrawtx.(%s)\n",rawtx->name,str,retstr); + //printf("%s %s basilisk_bitcoinrawtx.(%s)\n",rawtx->name,str,retstr); flag = 0; if ( (retarray= cJSON_Parse(retstr)) != 0 ) { diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index e1b39644c..bd53b56a7 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -274,7 +274,7 @@ char *iguana_signrawtx(struct supernet_info *myinfo,struct iguana_info *coin,int memset(&msgtx,0,sizeof(msgtx)); if ( V == 0 ) V = calloc(numinputs,sizeof(*V)), flagV = 1; - printf("SIGN.(%s) priv.(%s) %llx %llx V.%p\n",jprint(vins,0),jprint(privkeys,0),(long long)V->signers[0].privkey.txid,(long long)V->signers[1].privkey.txid,V); + printf("SIGN.(%s) priv.(%s) %llx %llx (%s)\n",jprint(vins,0),jprint(privkeys,0),(long long)V->signers[0].privkey.txid,(long long)V->signers[1].privkey.txid,rawtx); if ( V != 0 ) { if ( iguana_signrawtransaction(myinfo,coin,height,&msgtx,&signedtx,signedtxidp,V,numinputs,rawtx,vins,privkeys) > 0 ) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 1c5b1efc9..9777f18e9 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -989,14 +989,14 @@ int32_t bitcoin_verifyvins(struct iguana_info *coin,int32_t height,bits256 *sign bitcoin_pubkey33(coin->ctx,vp->signers[j].pubkey,vp->signers[j].privkey); sig[siglen++] = sighash; vp->signers[j].siglen = siglen; - /*char str[65]; printf("SIGTXID.(%s) ",bits256_str(str,sigtxid)); + char str[65]; printf("SIGTXID.(%s) ",bits256_str(str,sigtxid)); int32_t i; for (i=0; isigners[j].pubkey[i]); // s2 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1; - printf(" SIGNEDTX.[%02x] siglen.%d priv.%s\n",sig[siglen-1],siglen,bits256_str(str,vp->signers[j].privkey));*/ + printf(" SIGNEDTX.[%02x] siglen.%d priv.%s\n",sig[siglen-1],siglen,bits256_str(str,vp->signers[j].privkey)); } if ( sig == 0 || siglen == 0 ) { @@ -1013,13 +1013,13 @@ int32_t bitcoin_verifyvins(struct iguana_info *coin,int32_t height,bits256 *sign { flag++; numsigs++; - /*int32_t z; + int32_t z; for (z=0; zsigners[j].pubkey[z]); - printf(" <- pub, SIG.%d.%d VERIFIED numsigs.%d vs M.%d\n",vini,j,numsigs,vp->M);*/ + printf(" <- pub, SIG.%d.%d VERIFIED numsigs.%d vs M.%d\n",vini,j,numsigs,vp->M); } } if ( numsigs >= vp->M ) @@ -1458,7 +1458,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf int32_t tmp; char str[65]; if ( (tmp= iguana_interpreter(coin,0,iguana_lockval(finalized,jint(txobj,"locktime")),V,numinputs)) < 0 ) { - //printf("iguana_interpreter %d error.(%s)\n",tmp,signedtx); + printf("iguana_interpreter %d error.(%s)\n",tmp,signedtx); complete = 0; } else printf("%s signed\n",bits256_str(str,*signedtxidp)); } From 624f9095d4d240a8f666fac9a5d84f503bd9a42d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 19:46:23 +0200 Subject: [PATCH 451/495] Test --- iguana/iguana_sign.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 9777f18e9..313e0d42e 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -1361,14 +1361,14 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf //printf("call hex2json.(%s) vins.(%s)\n",rawtx,jprint(vins,0)); if ( (txobj= bitcoin_hex2json(coin,height,&txid,msgtx,rawtx,extraspace,extralen,serialized4,vins,V->suppress_pubkeys)) != 0 ) { - //printf("back from bitcoin_hex2json\n"); + printf("back from bitcoin_hex2json\n"); } else fprintf(stderr,"no txobj from bitcoin_hex2json\n"); if ( (numinputs= cJSON_GetArraySize(vins)) > 0 ) { memset(msgtx,0,sizeof(*msgtx)); if ( iguana_rwmsgtx(coin,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,vins,V->suppress_pubkeys) > 0 && numinputs == msgtx->tx_in ) { - //printf("back rwmsgtx vins.%p\n",msgtx->vins); + printf("back rwmsgtx vins.%p\n",msgtx->vins); memset(pubkeys,0,sizeof(pubkeys)); memset(privkeys,0,sizeof(privkeys)); if ( (n= cJSON_GetArraySize(privkeysjson)) > 0 ) @@ -1385,7 +1385,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf iguana_ensure_privkey(myinfo,coin,privkey); } } - //printf("after privkeys tx_in.%d\n",msgtx->tx_in); + printf("after privkeys tx_in.%d\n",msgtx->tx_in); for (i=0; itx_in; i++) { if ( msgtx->vins[i].p2shlen != 0 ) @@ -1453,6 +1453,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf } } finalized = iguana_vininfo_create(myinfo,coin,serialized2,maxsize,msgtx,vins,numinputs,V); + printf("finalized.%d\n",finalized); if ( (complete= bitcoin_verifyvins(coin,height,signedtxidp,&signedtx,msgtx,serialized3,maxsize,V,SIGHASH_ALL,1,V->suppress_pubkeys)) > 0 && signedtx != 0 ) { int32_t tmp; char str[65]; @@ -1461,7 +1462,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf printf("iguana_interpreter %d error.(%s)\n",tmp,signedtx); complete = 0; } else printf("%s signed\n",bits256_str(str,*signedtxidp)); - } + } else printf("complete.%d\n",complete); } } else fprintf(stderr,"no inputs in vins.(%s)\n",vins!=0?jprint(vins,0):"null"); free(extraspace); From a5ffea97741f20d14e1fbb043c927dd0721283e0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 19:53:40 +0200 Subject: [PATCH 452/495] Test --- iguana/iguana_sign.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 313e0d42e..3a7cf2048 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -1361,10 +1361,11 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf //printf("call hex2json.(%s) vins.(%s)\n",rawtx,jprint(vins,0)); if ( (txobj= bitcoin_hex2json(coin,height,&txid,msgtx,rawtx,extraspace,extralen,serialized4,vins,V->suppress_pubkeys)) != 0 ) { - printf("back from bitcoin_hex2json\n"); + printf("back from bitcoin_hex2json (%s)\n",jprint(vins,0)); } else fprintf(stderr,"no txobj from bitcoin_hex2json\n"); if ( (numinputs= cJSON_GetArraySize(vins)) > 0 ) { + printf("numinputs.%d msgtx.%d\n",numinputs,msgtx->tx_in); memset(msgtx,0,sizeof(*msgtx)); if ( iguana_rwmsgtx(coin,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,vins,V->suppress_pubkeys) > 0 && numinputs == msgtx->tx_in ) { @@ -1463,7 +1464,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf complete = 0; } else printf("%s signed\n",bits256_str(str,*signedtxidp)); } else printf("complete.%d\n",complete); - } + } else printf("rwmsgtx error\n"); } else fprintf(stderr,"no inputs in vins.(%s)\n",vins!=0?jprint(vins,0):"null"); free(extraspace); free(serialized), free(serialized2), free(serialized3), free(serialized4); From 3daf63b56b26481a1cb6b3401a7d50bb55cd543a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 20:00:10 +0200 Subject: [PATCH 453/495] Test --- iguana/iguana_sign.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 3a7cf2048..1b221c6a0 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -833,6 +833,7 @@ cJSON *bitcoin_data2json(struct iguana_info *coin,int32_t height,bits256 *txidp, jaddstr(txobj,"error","couldnt decode transaction"); jaddstr(txobj,"coin",coin->symbol); } + printf("msgtx.(%s)\n",jprint(txobj,0)); if ( n != len ) { int32_t i; From b90bf2654aca41e5f96e69292faf7641724c2ff3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 20:08:45 +0200 Subject: [PATCH 454/495] Test --- iguana/iguana_payments.c | 2 +- iguana/iguana_sign.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index bd53b56a7..71797bd53 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -274,7 +274,7 @@ char *iguana_signrawtx(struct supernet_info *myinfo,struct iguana_info *coin,int memset(&msgtx,0,sizeof(msgtx)); if ( V == 0 ) V = calloc(numinputs,sizeof(*V)), flagV = 1; - printf("SIGN.(%s) priv.(%s) %llx %llx (%s)\n",jprint(vins,0),jprint(privkeys,0),(long long)V->signers[0].privkey.txid,(long long)V->signers[1].privkey.txid,rawtx); + printf("SIGN.(%s) priv.(%s) %llx %llx (%s)\n",jprint(vins,0),jprint(privkeys,0),(long long)V->signers[0].privkey.txid,(long long)V->signers[1].privkey.txid,vins!=0?jprint(vins,0):"no vins"); if ( V != 0 ) { if ( iguana_signrawtransaction(myinfo,coin,height,&msgtx,&signedtx,signedtxidp,V,numinputs,rawtx,vins,privkeys) > 0 ) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 1b221c6a0..75256fc29 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -1368,7 +1368,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf { printf("numinputs.%d msgtx.%d\n",numinputs,msgtx->tx_in); memset(msgtx,0,sizeof(*msgtx)); - if ( iguana_rwmsgtx(coin,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,vins,V->suppress_pubkeys) > 0 && numinputs == msgtx->tx_in ) + if ( iguana_rwmsgtx(coin,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,0,V->suppress_pubkeys) > 0 && numinputs == msgtx->tx_in ) { printf("back rwmsgtx vins.%p\n",msgtx->vins); memset(pubkeys,0,sizeof(pubkeys)); From 5d7c34efa08cf0d93ac2691bfcdc4f6d89447629 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 20:21:01 +0200 Subject: [PATCH 455/495] Test --- iguana/iguana_sign.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 75256fc29..193d8e3bd 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -568,6 +568,22 @@ void iguana_vinobjset(struct iguana_msgvin *vin,cJSON *item,uint8_t *spendscript } } +int32_t iguana_vinarray_check(cJSON *vinarray,bits256 txid) +{ + bits256 array_txid; cJSON *item; int32_t i,n = cJSON_GetArraySize(vinarray); + for (i=0; ivins[i],jitem(vins,i),spendscript,sizeof(spendscript)); sigtxid = bitcoin_sigtxid(coin,height,sigser,maxsize*2,msg,i,msg->vins[i].spendscript,msg->vins[i].spendlen,SIGHASH_ALL,vpnstr,suppress_pubkeys); //printf("after vini.%d vinscript.%p spendscript.%p spendlen.%d (%s)\n",i,msg->vins[i].vinscript,msg->vins[i].spendscript,msg->vins[i].spendlen,jprint(jitem(vins,i),0)); - jaddi(vinarray,iguana_vinjson(coin,&msg->vins[i],sigtxid)); + if ( iguana_vinarray_check(vinarray,msg->vins[i].prev_hash) < 0 ) + jaddi(vinarray,iguana_vinjson(coin,&msg->vins[i],sigtxid)); if ( msg->vins[i].spendscript == spendscript ) msg->vins[i].spendscript = 0; - } else jaddi(vinarray,iguana_vinjson(coin,&msg->vins[i],sigtxid)); + } else if ( iguana_vinarray_check(vinarray,msg->vins[i].prev_hash) < 0 ) + jaddi(vinarray,iguana_vinjson(coin,&msg->vins[i],sigtxid)); } free(sigser); jadd(json,"vin",vinarray); @@ -1359,7 +1377,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf extraspace = malloc(extralen); memset(msgtx,0,sizeof(*msgtx)); decode_hex(serialized,len,rawtx); - //printf("call hex2json.(%s) vins.(%s)\n",rawtx,jprint(vins,0)); + printf("call hex2json.(%s) vins.(%s)\n",rawtx,jprint(vins,0)); if ( (txobj= bitcoin_hex2json(coin,height,&txid,msgtx,rawtx,extraspace,extralen,serialized4,vins,V->suppress_pubkeys)) != 0 ) { printf("back from bitcoin_hex2json (%s)\n",jprint(vins,0)); @@ -1368,7 +1386,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf { printf("numinputs.%d msgtx.%d\n",numinputs,msgtx->tx_in); memset(msgtx,0,sizeof(*msgtx)); - if ( iguana_rwmsgtx(coin,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,0,V->suppress_pubkeys) > 0 && numinputs == msgtx->tx_in ) + if ( iguana_rwmsgtx(coin,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,vins,V->suppress_pubkeys) > 0 && numinputs == msgtx->tx_in ) { printf("back rwmsgtx vins.%p\n",msgtx->vins); memset(pubkeys,0,sizeof(pubkeys)); From f02da0c02ce0fd63b36f017cc68b2d38259a500a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 20:26:38 +0200 Subject: [PATCH 456/495] Test --- iguana/iguana_sign.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 193d8e3bd..310499e8f 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -713,6 +713,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ } free(sigser); jadd(json,"vin",vinarray); + msg->tx_in = cJSON_GetArraySize(vinarray); jaddnum(json,"numvins",msg->tx_in); } if ( voutarray != 0 ) From d3832ae69edb3aaa80cea7fe44ae9892246c8d7a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 20:32:01 +0200 Subject: [PATCH 457/495] Test --- iguana/iguana_sign.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 310499e8f..611b307c9 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -673,7 +673,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ jaddi(voutarray,iguana_voutjson(coin,&msg->vouts[i],i,*txidp)); } len += iguana_rwnum(rwflag,&serialized[len],sizeof(msg->lock_time),&msg->lock_time); - //printf("lock_time.%08x len.%d\n",msg->lock_time,len); +printf("lock_time.%08x len.%d\n",msg->lock_time,len); if ( strcmp(coin->symbol,"VPN") == 0 ) { uint16_t ddosflag = 0; @@ -727,7 +727,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ jaddnum(json,"locktime",msg->lock_time); jaddnum(json,"size",len); jaddbits256(json,"txid",*txidp); - //printf("TX.(%s) %p\n",jprint(json,0),json); + printf("TX.(%s) %p\n",jprint(json,0),json); } msg->allocsize = len; return(len); @@ -852,7 +852,7 @@ cJSON *bitcoin_data2json(struct iguana_info *coin,int32_t height,bits256 *txidp, jaddstr(txobj,"error","couldnt decode transaction"); jaddstr(txobj,"coin",coin->symbol); } - printf("msgtx.(%s)\n",jprint(txobj,0)); + //printf("msgtx.(%s)\n",jprint(txobj,0)); if ( n != len ) { int32_t i; @@ -1009,14 +1009,14 @@ int32_t bitcoin_verifyvins(struct iguana_info *coin,int32_t height,bits256 *sign bitcoin_pubkey33(coin->ctx,vp->signers[j].pubkey,vp->signers[j].privkey); sig[siglen++] = sighash; vp->signers[j].siglen = siglen; - char str[65]; printf("SIGTXID.(%s) ",bits256_str(str,sigtxid)); + /*char str[65]; printf("SIGTXID.(%s) ",bits256_str(str,sigtxid)); int32_t i; for (i=0; isigners[j].pubkey[i]); // s2 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1; - printf(" SIGNEDTX.[%02x] siglen.%d priv.%s\n",sig[siglen-1],siglen,bits256_str(str,vp->signers[j].privkey)); + printf(" SIGNEDTX.[%02x] siglen.%d priv.%s\n",sig[siglen-1],siglen,bits256_str(str,vp->signers[j].privkey));*/ } if ( sig == 0 || siglen == 0 ) { @@ -1033,13 +1033,13 @@ int32_t bitcoin_verifyvins(struct iguana_info *coin,int32_t height,bits256 *sign { flag++; numsigs++; - int32_t z; + /*int32_t z; for (z=0; zsigners[j].pubkey[z]); - printf(" <- pub, SIG.%d.%d VERIFIED numsigs.%d vs M.%d\n",vini,j,numsigs,vp->M); + printf(" <- pub, SIG.%d.%d VERIFIED numsigs.%d vs M.%d\n",vini,j,numsigs,vp->M);*/ } } if ( numsigs >= vp->M ) From d3506bbe939352a0ef055ee6852ba8d0d75212c4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 20:39:44 +0200 Subject: [PATCH 458/495] Test --- iguana/iguana_sign.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 611b307c9..0642b54f5 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -1387,7 +1387,8 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf { printf("numinputs.%d msgtx.%d\n",numinputs,msgtx->tx_in); memset(msgtx,0,sizeof(*msgtx)); - if ( iguana_rwmsgtx(coin,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,vins,V->suppress_pubkeys) > 0 && numinputs == msgtx->tx_in ) + iguana_rwmsgtx(coin,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,vins,V->suppress_pubkeys); + if ( numinputs == msgtx->tx_in ) { printf("back rwmsgtx vins.%p\n",msgtx->vins); memset(pubkeys,0,sizeof(pubkeys)); From 2816d159ce66f24ee17608f86ac1a92756fb7b78 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 20:58:41 +0200 Subject: [PATCH 459/495] Test --- basilisk/basilisk_swap.c | 22 +++++++++++++++++++--- iguana/iguana_payments.c | 2 +- iguana/iguana_sign.c | 6 ++---- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 32b1c8144..e06c8f96d 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -490,7 +490,7 @@ int32_t basilisk_rawtx_return(struct supernet_info *myinfo,int32_t height,struct return(retval); } -int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swapstarted,uint8_t *pubkey33,int32_t iambob,int32_t lockinputs,struct basilisk_rawtx *rawtx,uint32_t locktime,uint8_t *script,int32_t scriptlen,int64_t txfee,int32_t minconf,int32_t delay) +int32_t _basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swapstarted,uint8_t *pubkey33,int32_t iambob,int32_t lockinputs,struct basilisk_rawtx *rawtx,uint32_t locktime,uint8_t *script,int32_t scriptlen,int64_t txfee,int32_t minconf,int32_t delay) { char *retstr,*jsonstr,scriptstr[1024],coinaddr[64]; uint32_t basilisktag; int32_t flag,i,n,retval = -1; cJSON *addresses,*valsobj,*retarray=0; struct vin_info *V; //bitcoin_address(coinaddr,rawtx->coin->chain->pubtype,myinfo->persistent_pubkey33,33); @@ -499,8 +499,6 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swaps bitcoin_address(rawtx->coin->changeaddr,rawtx->coin->chain->pubtype,pubkey33,33); printf("set change address.(%s)\n",rawtx->coin->changeaddr); } - if ( strcmp(rawtx->coin->symbol,"BTC") == 0 ) - txfee = 0; init_hexbytes_noT(scriptstr,script,scriptlen); basilisktag = (uint32_t)rand(); valsobj = cJSON_CreateObject(); @@ -558,6 +556,24 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swaps return(retval); } +int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swapstarted,uint8_t *pubkey33,int32_t iambob,int32_t lockinputs,struct basilisk_rawtx *rawtx,uint32_t locktime,uint8_t *script,int32_t scriptlen,int64_t txfee,int32_t minconf,int32_t delay) +{ + int32_t retval,len; uint64_t newtxfee; struct iguana_info *coin; + retval = _basilisk_rawtx_gen(str,myinfo,swapstarted,pubkey33,iambob,lockinputs,rawtx,locktime,script,scriptlen,txfee,minconf,delay); + if ( (coin= rawtx->coin) == 0 || strcmp(coin->symbol,"BTC") != 0 ) + return(retval); + len = rawtx->I.datalen; + if ( coin->estimatedfee == 0 ) + coin->estimatedfee = iguana_getestimatedfee(myinfo,coin); + newtxfee = coin->estimatedfee * len; + if ( newtxfee > txfee ) + { + retval = _basilisk_rawtx_gen(str,myinfo,swapstarted,pubkey33,iambob,lockinputs,rawtx,locktime,script,scriptlen,newtxfee,minconf,delay); + printf("txfee %.8f -> newtxfee %.8f\n",dstr(txfee),dstr(newtxfee)); + } + return(retval); +} + struct basilisk_rawtx *basilisk_swapdata_rawtx(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen,struct basilisk_rawtx *rawtx) { if ( rawtx->I.datalen != 0 && rawtx->I.datalen <= maxlen ) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 71797bd53..8cdb158b9 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -274,7 +274,7 @@ char *iguana_signrawtx(struct supernet_info *myinfo,struct iguana_info *coin,int memset(&msgtx,0,sizeof(msgtx)); if ( V == 0 ) V = calloc(numinputs,sizeof(*V)), flagV = 1; - printf("SIGN.(%s) priv.(%s) %llx %llx (%s)\n",jprint(vins,0),jprint(privkeys,0),(long long)V->signers[0].privkey.txid,(long long)V->signers[1].privkey.txid,vins!=0?jprint(vins,0):"no vins"); + //printf("SIGN.(%s) priv.(%s) %llx %llx (%s)\n",jprint(vins,0),jprint(privkeys,0),(long long)V->signers[0].privkey.txid,(long long)V->signers[1].privkey.txid,vins!=0?jprint(vins,0):"no vins"); if ( V != 0 ) { if ( iguana_signrawtransaction(myinfo,coin,height,&msgtx,&signedtx,signedtxidp,V,numinputs,rawtx,vins,privkeys) > 0 ) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 0642b54f5..1076aee21 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -1378,7 +1378,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf extraspace = malloc(extralen); memset(msgtx,0,sizeof(*msgtx)); decode_hex(serialized,len,rawtx); - printf("call hex2json.(%s) vins.(%s)\n",rawtx,jprint(vins,0)); + //printf("call hex2json.(%s) vins.(%s)\n",rawtx,jprint(vins,0)); if ( (txobj= bitcoin_hex2json(coin,height,&txid,msgtx,rawtx,extraspace,extralen,serialized4,vins,V->suppress_pubkeys)) != 0 ) { printf("back from bitcoin_hex2json (%s)\n",jprint(vins,0)); @@ -1387,10 +1387,8 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf { printf("numinputs.%d msgtx.%d\n",numinputs,msgtx->tx_in); memset(msgtx,0,sizeof(*msgtx)); - iguana_rwmsgtx(coin,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,vins,V->suppress_pubkeys); - if ( numinputs == msgtx->tx_in ) + if ( iguana_rwmsgtx(coin,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,vins,V->suppress_pubkeys) > 0 && numinputs == msgtx->tx_in ) { - printf("back rwmsgtx vins.%p\n",msgtx->vins); memset(pubkeys,0,sizeof(pubkeys)); memset(privkeys,0,sizeof(privkeys)); if ( (n= cJSON_GetArraySize(privkeysjson)) > 0 ) From 19768b1c08f6f3456dcaacac284b40be0ab853fb Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 21:08:55 +0200 Subject: [PATCH 460/495] Test --- basilisk/basilisk_swap.c | 6 +++--- iguana/iguana_sign.c | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index e06c8f96d..1d317ee60 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -481,7 +481,7 @@ int32_t basilisk_rawtx_return(struct supernet_info *myinfo,int32_t height,struct rawtx->I.datalen = (int32_t)strlen(signedtx) >> 1; //rawtx->txbytes = calloc(1,rawtx->I.datalen); decode_hex(rawtx->txbytes,rawtx->I.datalen,signedtx); - printf("%s SIGNEDTX.(%s)\n",rawtx->name,signedtx); + //printf("%s SIGNEDTX.(%s)\n",rawtx->name,signedtx); free(signedtx); retval = 0; } else printf("error signrawtx\n"); //do a very short timeout so it finishes via local poll @@ -559,9 +559,9 @@ int32_t _basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swap int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swapstarted,uint8_t *pubkey33,int32_t iambob,int32_t lockinputs,struct basilisk_rawtx *rawtx,uint32_t locktime,uint8_t *script,int32_t scriptlen,int64_t txfee,int32_t minconf,int32_t delay) { int32_t retval,len; uint64_t newtxfee; struct iguana_info *coin; - retval = _basilisk_rawtx_gen(str,myinfo,swapstarted,pubkey33,iambob,lockinputs,rawtx,locktime,script,scriptlen,txfee,minconf,delay); if ( (coin= rawtx->coin) == 0 || strcmp(coin->symbol,"BTC") != 0 ) - return(retval); + return(_basilisk_rawtx_gen(str,myinfo,swapstarted,pubkey33,iambob,lockinputs,rawtx,locktime,script,scriptlen,txfee,minconf,delay)); + retval = _basilisk_rawtx_gen(str,myinfo,swapstarted,pubkey33,iambob,0,rawtx,locktime,script,scriptlen,txfee,minconf,delay); len = rawtx->I.datalen; if ( coin->estimatedfee == 0 ) coin->estimatedfee = iguana_getestimatedfee(myinfo,coin); diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 1076aee21..97b0b2006 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -673,7 +673,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ jaddi(voutarray,iguana_voutjson(coin,&msg->vouts[i],i,*txidp)); } len += iguana_rwnum(rwflag,&serialized[len],sizeof(msg->lock_time),&msg->lock_time); -printf("lock_time.%08x len.%d\n",msg->lock_time,len); +//printf("lock_time.%08x len.%d\n",msg->lock_time,len); if ( strcmp(coin->symbol,"VPN") == 0 ) { uint16_t ddosflag = 0; @@ -727,7 +727,7 @@ printf("lock_time.%08x len.%d\n",msg->lock_time,len); jaddnum(json,"locktime",msg->lock_time); jaddnum(json,"size",len); jaddbits256(json,"txid",*txidp); - printf("TX.(%s) %p\n",jprint(json,0),json); + //printf("TX.(%s) %p\n",jprint(json,0),json); } msg->allocsize = len; return(len); @@ -1381,11 +1381,11 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf //printf("call hex2json.(%s) vins.(%s)\n",rawtx,jprint(vins,0)); if ( (txobj= bitcoin_hex2json(coin,height,&txid,msgtx,rawtx,extraspace,extralen,serialized4,vins,V->suppress_pubkeys)) != 0 ) { - printf("back from bitcoin_hex2json (%s)\n",jprint(vins,0)); + //printf("back from bitcoin_hex2json (%s)\n",jprint(vins,0)); } else fprintf(stderr,"no txobj from bitcoin_hex2json\n"); if ( (numinputs= cJSON_GetArraySize(vins)) > 0 ) { - printf("numinputs.%d msgtx.%d\n",numinputs,msgtx->tx_in); + //printf("numinputs.%d msgtx.%d\n",numinputs,msgtx->tx_in); memset(msgtx,0,sizeof(*msgtx)); if ( iguana_rwmsgtx(coin,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,vins,V->suppress_pubkeys) > 0 && numinputs == msgtx->tx_in ) { @@ -1405,7 +1405,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf iguana_ensure_privkey(myinfo,coin,privkey); } } - printf("after privkeys tx_in.%d\n",msgtx->tx_in); + //printf("after privkeys tx_in.%d\n",msgtx->tx_in); for (i=0; itx_in; i++) { if ( msgtx->vins[i].p2shlen != 0 ) @@ -1473,7 +1473,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf } } finalized = iguana_vininfo_create(myinfo,coin,serialized2,maxsize,msgtx,vins,numinputs,V); - printf("finalized.%d\n",finalized); + //printf("finalized.%d\n",finalized); if ( (complete= bitcoin_verifyvins(coin,height,signedtxidp,&signedtx,msgtx,serialized3,maxsize,V,SIGHASH_ALL,1,V->suppress_pubkeys)) > 0 && signedtx != 0 ) { int32_t tmp; char str[65]; From 2ad48da3429b20b452aaf7d10ef85332e50a8861 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 21:15:26 +0200 Subject: [PATCH 461/495] Test --- basilisk/basilisk_bitcoin.c | 6 +++--- iguana/iguana_payments.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index 375371d9e..22ec358d1 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -759,11 +759,11 @@ char *basilisk_bitcoinrawtx(struct supernet_info *myinfo,struct iguana_info *coi amount = jdouble(valsobj,"value") * SATOSHIDEN; if ( (txfee= j64bits(valsobj,"txfee")) == 0 ) { - if ( strcmp(coin->symbol,"BTC") != 0 ) + //if ( strcmp(coin->symbol,"BTC") != 0 ) { txfee = coin->chain->txfee; - if ( txfee == 0 ) - txfee = 10000; + if ( txfee < 50000 ) + txfee = 50000; } } spendscriptstr = jstr(valsobj,"spendscript"); diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 8cdb158b9..516bcaf0a 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -426,7 +426,7 @@ char *iguana_calcrawtx(struct supernet_info *myinfo,struct iguana_info *coin,cJS coinaddr = jstri(addresses,i); if ( (array= basilisk_unspents(myinfo,coin,coinaddr)) != 0 ) { - //printf("unspents.(%s) %s\n",coinaddr,jprint(array,0)); + printf("unspents.(%s) %s\n",coinaddr,jprint(array,0)); if ( (m= cJSON_GetArraySize(array)) > 0 ) { for (j=0; j= satoshis+txfee ) { if ( (vins= iguana_RTinputsjson(myinfo,coin,&total,satoshis + txfee,unspents,num,maxmode)) != 0 ) From fae520745008782e07618441c50ca7efaf840e61 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 21:47:39 +0200 Subject: [PATCH 462/495] Test --- basilisk/basilisk_swap.c | 14 +++++++------- iguana/iguana_payments.c | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 1d317ee60..9eab58035 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1343,8 +1343,8 @@ void basilisk_rawtx_setparms(char *name,uint32_t quoteid,struct basilisk_rawtx * rawtx->coin = coin; strcpy(rawtx->I.coinstr,coin->symbol); rawtx->I.numconfirms = numconfirms; - if ( (rawtx->I.amount= satoshis) < 10000 ) - rawtx->I.amount = 10000; + if ( (rawtx->I.amount= satoshis) < 50000 ) + rawtx->I.amount = 50000; rawtx->I.vintype = vintype; // 0 -> std, 2 -> 2of2, 3 -> spend bobpayment, 4 -> spend bobdeposit rawtx->I.vouttype = vouttype; // 0 -> fee, 1 -> std, 2 -> 2of2, 3 -> bobpayment, 4 -> bobdeposit if ( rawtx->I.vouttype == 0 ) @@ -1483,10 +1483,10 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv swap->I.callduration += optionduration; swap->I.bobsatoshis = swap->I.req.destamount; swap->I.alicesatoshis = swap->I.req.srcamount; - if ( (swap->I.bobinsurance= (swap->I.bobsatoshis / INSTANTDEX_INSURANCEDIV)) < 10000 ) - swap->I.bobinsurance = 10000; - if ( (swap->I.aliceinsurance= (swap->I.alicesatoshis / INSTANTDEX_INSURANCEDIV)) < 10000 ) - swap->I.aliceinsurance = 10000; + if ( (swap->I.bobinsurance= (swap->I.bobsatoshis / INSTANTDEX_INSURANCEDIV)) < 50000 ) + swap->I.bobinsurance = 50000; + if ( (swap->I.aliceinsurance= (swap->I.alicesatoshis / INSTANTDEX_INSURANCEDIV)) < 50000 ) + swap->I.aliceinsurance = 50000; strcpy(swap->I.bobstr,swap->I.req.dest); strcpy(swap->I.alicestr,swap->I.req.src); swap->I.started = (uint32_t)time(NULL); @@ -2353,7 +2353,7 @@ void basilisk_swaploop(void *_swap) else { retval = 0; - for (i=0; ialicepayment.I.spendlen; i++) + for (i=0; ialicepayment.I.datalen; i++) printf("%02x",swap->alicepayment.txbytes[i]); printf(" ALICE PAYMENT created\n"); iguana_unspents_mark(myinfo,swap->alicecoin,swap->alicepayment.vins); diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 516bcaf0a..733a16fb3 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -426,7 +426,7 @@ char *iguana_calcrawtx(struct supernet_info *myinfo,struct iguana_info *coin,cJS coinaddr = jstri(addresses,i); if ( (array= basilisk_unspents(myinfo,coin,coinaddr)) != 0 ) { - printf("unspents.(%s) %s\n",coinaddr,jprint(array,0)); + //printf("unspents.(%s) %s\n",coinaddr,jprint(array,0)); if ( (m= cJSON_GetArraySize(array)) > 0 ) { for (j=0; j Date: Sat, 11 Mar 2017 21:53:01 +0200 Subject: [PATCH 463/495] Test --- basilisk/basilisk_bitcoin.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index 22ec358d1..8dec9ae69 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -802,13 +802,13 @@ char *basilisk_bitcoinrawtx(struct supernet_info *myinfo,struct iguana_info *coi oplen = 0; } else oplen = datachain_opreturnscript(coin,buf,opreturn,oplen); } - rawtx = iguana_calcrawtx(myinfo,coin,&vins,txobj,amount,changeaddr,txfee,addresses,minconf,oplen!=0?buf:0,oplen+offset,burnamount,remoteaddr,V,0); + rawtx = iguana_calcrawtx(myinfo,coin,&vins,txobj,amount,changeaddr,txfee,addresses,minconf,oplen!=0?buf:0,oplen+offset,burnamount,remoteaddr,V,1); if ( txfee == 0 ) { txfee = iguana_esttxfee(myinfo,coin,rawtx,0,vins != 0 ? cJSON_GetArraySize(vins): 0); if ( vins != 0 ) free_json(vins), vins = 0; - rawtx = iguana_calcrawtx(myinfo,coin,&vins,txobj,amount,changeaddr,txfee,addresses,minconf,oplen!=0?buf:0,oplen+offset,burnamount,remoteaddr,V,0); + rawtx = iguana_calcrawtx(myinfo,coin,&vins,txobj,amount,changeaddr,txfee,addresses,minconf,oplen!=0?buf:0,oplen+offset,burnamount,remoteaddr,V,1); printf("new txfee %.8f (%s)\n",dstr(txfee),rawtx); } //printf("generated.(%s) vins.(%s)\n",rawtx!=0?rawtx:"",vins!=0?jprint(vins,0):""); From 53904191a8f22f6e1382aa3508c89bd6066abedb Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 22:13:48 +0200 Subject: [PATCH 464/495] Test --- basilisk/basilisk_swap.c | 6 ++++-- iguana/iguana_payments.c | 2 +- iguana/iguana_unspents.c | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 9eab58035..b0159dcdb 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1785,11 +1785,13 @@ uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilis if ( rawtx == &swap->alicepayment ) { basilisk_dontforget(myinfo,swap,&swap->alicepayment,0,triggertxid); - basilisk_alicepayment_spend(myinfo,swap,&swap->alicereclaim); - basilisk_dontforget(myinfo,swap,&swap->alicereclaim,0,swap->bobrefund.I.actualtxid); } else if ( rawtx == &swap->alicespend ) + { basilisk_dontforget(myinfo,swap,&swap->alicespend,0,triggertxid); + //basilisk_alicepayment_spend(myinfo,swap,&swap->alicereclaim); + basilisk_dontforget(myinfo,swap,&swap->alicereclaim,0,swap->bobrefund.I.actualtxid); + } } //printf("sendlen.%d datalen.%d redeemlen.%d\n",sendlen,rawtx->datalen,rawtx->redeemlen); if ( suppress_swapsend == 0 ) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 733a16fb3..55f550354 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -175,7 +175,7 @@ int32_t iguana_RTbestunspent(struct supernet_info *myinfo,struct iguana_info *co } if ( iguana_RTunspent_check(myinfo,coin,unspents[i]) != 0 ) { - //printf("(%d u%d) %.8f already used\n",unspents[i].hdrsi,unspents[i].unspentind,dstr(atx_value)); + printf("(%d u%d) %.8f already used\n",unspents[i].hdrsi,unspents[i].unspentind,dstr(atx_value)); continue; } if ( maxmode == 0 ) diff --git a/iguana/iguana_unspents.c b/iguana/iguana_unspents.c index 773f6f431..b9d0a0ca0 100755 --- a/iguana/iguana_unspents.c +++ b/iguana/iguana_unspents.c @@ -913,7 +913,7 @@ void iguana_unspents_mark(struct supernet_info *myinfo,struct iguana_info *coin, { if ( firstslot >= 0 ) { - //printf("slot.[%d] <- %s/v%d\n",firstslot,bits256_str(str,txid),vout); + printf("slot.[%d] <- %s/v%d\n",firstslot,bits256_str(str,txid),vout); coin->markedunspents[firstslot] = txid; coin->markedunspents[firstslot].ushorts[15] = vout; if ( (0) && coin->utxofp == 0 ) From 7e702281780b4bbb9eb1a18538faff94a5a5309c Mon Sep 17 00:00:00 2001 From: test1 Date: Sun, 12 Mar 2017 07:57:54 +0100 Subject: [PATCH 465/495] fix for msvs compiler bug for handling if-else-if, see: https://connect.microsoft.com/VisualStudio/feedback/details/1572286/program-too-complex-used-to-compile-with-vs-2013-but-not-anymore Signed-off-by: test1 --- basilisk/basilisk.c | 1 + iguana/iguana_exchanges.c | 1 + iguana/iguana_json.c | 28 +++++++++++++++++++++++++++- iguana/iguana_notary.c | 1 + iguana/iguana_payments.c | 1 + iguana/iguana_tradebots.c | 1 + iguana/iguana_unspents.c | 1 + iguana/iguana_wallet.c | 1 + iguana/main.c | 1 + iguana/ramchain_api.c | 1 + includes/iguana_apideclares.h | 4 ++++ includes/iguana_apideclares2.h | 31 +++++++++++++++++++++++++++++++ 12 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 includes/iguana_apideclares2.h diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 8610f2d66..de6ebd330 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -953,6 +953,7 @@ void basilisks_init(struct supernet_info *myinfo) #include "../includes/iguana_apidefs.h" #include "../includes/iguana_apideclares.h" +#include "../includes/iguana_apideclares2.h" TWO_STRINGS(tradebot,gensvm,base,rel) { diff --git a/iguana/iguana_exchanges.c b/iguana/iguana_exchanges.c index 8be8d38c3..d7445f681 100755 --- a/iguana/iguana_exchanges.c +++ b/iguana/iguana_exchanges.c @@ -1176,6 +1176,7 @@ cJSON *iguana_pricesarray(struct supernet_info *myinfo,char *exchange,char *base #include "../includes/iguana_apidefs.h" #include "../includes/iguana_apideclares.h" +#include "../includes/iguana_apideclares2.h" THREE_STRINGS_AND_THREE_INTS(InstantDEX,orderbook,exchange,base,rel,depth,allfields,ignore) { diff --git a/iguana/iguana_json.c b/iguana/iguana_json.c index 8002aa331..743ba3b0b 100755 --- a/iguana/iguana_json.c +++ b/iguana/iguana_json.c @@ -498,6 +498,14 @@ char *SuperNET_htmlstr(char *fname,char *htmlstr,int32_t maxsize,char *agentstr) return(OS_filestr(&filesize,"index7778.html")); } +#ifdef WIN32 +/** +* workaround for MSVS compiler bug - +* instead of going on if-else-if block split the if-else-if into two function +*/ +char *SuperNET_parser2(struct supernet_info *myinfo, char *agentstr, char *method, cJSON *json, char *remoteaddr); +#endif + char *SuperNET_parser(struct supernet_info *myinfo,char *agentstr,char *method,cJSON *json,char *remoteaddr) { char *coinstr; struct iguana_info *coin = 0; @@ -614,13 +622,31 @@ char *SuperNET_parser(struct supernet_info *myinfo,char *agentstr,char *method,c #define STRING_ARRAY_OBJ_STRING IGUANA_DISPATCH_SAOS #include "../includes/iguana_apideclares.h" - +#ifdef WIN32 +return SuperNET_parser2(myinfo, agentstr, method, json, remoteaddr); +#else #undef IGUANA_ARGS #undef _IGUANA_APIDEC_H_ #include "../includes/iguana_apiundefs.h" char errstr[512]; sprintf(errstr,"{\"error\":\"unsupported call\",\"agent\":\"%s\",\"method\":\"%s\"}",agentstr,method); return(clonestr(errstr)); +#endif } +#ifdef WIN32 +char *SuperNET_parser2(struct supernet_info *myinfo, char *agentstr, char *method, cJSON *json, char *remoteaddr) { + char *coinstr; struct iguana_info *coin = 0; + if (remoteaddr != 0 && (remoteaddr[0] == 0 || strcmp(remoteaddr, "127.0.0.1") == 0)) + remoteaddr = 0; +#include "../includes/iguana_apideclares2.h" +#undef IGUANA_ARGS +#undef _IGUANA_APIDEC_H_ +#include "../includes/iguana_apiundefs.h" + char errstr[512]; + sprintf(errstr, "{\"error\":\"unsupported call\",\"agent\":\"%s\",\"method\":\"%s\"}", agentstr, method); + return(clonestr(errstr)); +} + +#endif \ No newline at end of file diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index d4378efd6..dc4d436d8 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -224,6 +224,7 @@ void dpow_addresses() #include "../includes/iguana_apidefs.h" #include "../includes/iguana_apideclares.h" +#include "../includes/iguana_apideclares2.h" TWO_STRINGS(iguana,dpow,symbol,pubkey) { diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 55f550354..1406a47d1 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -700,6 +700,7 @@ char *sendtoaddress(struct supernet_info *myinfo,struct iguana_info *coin,char * #include "../includes/iguana_apidefs.h" #include "../includes/iguana_apideclares.h" +#include "../includes/iguana_apideclares2.h" STRING_AND_INT(bitcoinrpc,sendrawtransaction,rawtx,allowhighfees) { diff --git a/iguana/iguana_tradebots.c b/iguana/iguana_tradebots.c index 0ece4f0e3..c514ed4bd 100755 --- a/iguana/iguana_tradebots.c +++ b/iguana/iguana_tradebots.c @@ -221,6 +221,7 @@ char *tradebot_control(struct supernet_info *myinfo,char *exchangestr,char *boti #include "../includes/iguana_apidefs.h" #include "../includes/iguana_apideclares.h" +#include "../includes/iguana_apideclares2.h" HASH_ARRAY_STRING(tradebot,liquidity,hash,vals,targetcoin) { diff --git a/iguana/iguana_unspents.c b/iguana/iguana_unspents.c index b9d0a0ca0..6534c2431 100755 --- a/iguana/iguana_unspents.c +++ b/iguana/iguana_unspents.c @@ -1799,6 +1799,7 @@ void iguana_utxoaddrs_purge(struct iguana_info *coin) #include "../includes/iguana_apidefs.h" #include "../includes/iguana_apideclares.h" +#include "../includes/iguana_apideclares2.h" STRING_AND_INT(iguana,snapshot,symbol,height) { diff --git a/iguana/iguana_wallet.c b/iguana/iguana_wallet.c index 90303ae80..c73259f29 100755 --- a/iguana/iguana_wallet.c +++ b/iguana/iguana_wallet.c @@ -995,6 +995,7 @@ cJSON *iguana_privkeysjson(struct supernet_info *myinfo,struct iguana_info *coin #include "../includes/iguana_apidefs.h" #include "../includes/iguana_apideclares.h" +#include "../includes/iguana_apideclares2.h" int64_t iguana_addressreceived(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *json,char *remoteaddr,cJSON *txids,cJSON *vouts,cJSON *unspents,cJSON *spends,char *coinaddr,int32_t minconf,int32_t firstheight) { diff --git a/iguana/main.c b/iguana/main.c index fcde8209e..984f2c27a 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1026,6 +1026,7 @@ void SuperNET_parsepeers(struct supernet_info *myinfo,cJSON *array,int32_t n,int #include "../includes/iguana_apidefs.h" #include "../includes/iguana_apideclares.h" +#include "../includes/iguana_apideclares2.h" STRING_ARG(iguana,initfastfind,activecoin) { diff --git a/iguana/ramchain_api.c b/iguana/ramchain_api.c index 267f17ffd..e28a106ff 100755 --- a/iguana/ramchain_api.c +++ b/iguana/ramchain_api.c @@ -18,6 +18,7 @@ #include "../includes/iguana_apidefs.h" #include "../includes/iguana_apideclares.h" +#include "../includes/iguana_apideclares2.h" STRING_ARG(iguana,peers,activecoin) diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 955acffe0..048165ccd 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -335,6 +335,8 @@ STRING_ARG(hash,base64_decode,message); STRING_ARG(hash,rmd160_sha256,message); STRING_ARG(hash,sha256_sha256,message); +#ifndef WIN32 + STRING_ARG(hash,sha224,message); STRING_ARG(hash,sha256,message); STRING_ARG(hash,sha384,message); @@ -366,3 +368,5 @@ TWO_STRINGS(hmac,tiger192_3,message,passphrase); TWO_STRINGS(hmac,whirlpool,message,passphrase); #endif + +#endif diff --git a/includes/iguana_apideclares2.h b/includes/iguana_apideclares2.h new file mode 100644 index 000000000..952301d89 --- /dev/null +++ b/includes/iguana_apideclares2.h @@ -0,0 +1,31 @@ +#ifdef WIN32 +STRING_ARG(hash, sha224, message); +STRING_ARG(hash, sha256, message); +STRING_ARG(hash, sha384, message); +STRING_ARG(hash, sha512, message); +STRING_ARG(hash, rmd128, message); +STRING_ARG(hash, rmd160, message); +STRING_ARG(hash, rmd256, message); +STRING_ARG(hash, rmd320, message); +STRING_ARG(hash, sha1, message); +STRING_ARG(hash, md2, message); +STRING_ARG(hash, md4, message); +STRING_ARG(hash, md5, message); +STRING_ARG(hash, tiger192_3, message); +STRING_ARG(hash, whirlpool, message); + +TWO_STRINGS(hmac, sha224, message, passphrase); +TWO_STRINGS(hmac, sha256, message, passphrase); +TWO_STRINGS(hmac, sha384, message, passphrase); +TWO_STRINGS(hmac, sha512, message, passphrase); +TWO_STRINGS(hmac, rmd128, message, passphrase); +TWO_STRINGS(hmac, rmd160, message, passphrase); +TWO_STRINGS(hmac, rmd256, message, passphrase); +TWO_STRINGS(hmac, rmd320, message, passphrase); +TWO_STRINGS(hmac, sha1, message, passphrase); +TWO_STRINGS(hmac, md2, message, passphrase); +TWO_STRINGS(hmac, md4, message, passphrase); +TWO_STRINGS(hmac, md5, message, passphrase); +TWO_STRINGS(hmac, tiger192_3, message, passphrase); +TWO_STRINGS(hmac, whirlpool, message, passphrase); +#endif \ No newline at end of file From 3736a2f09f8589b5cbcca89db5ed1232b67f9fde Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Mar 2017 09:03:18 +0200 Subject: [PATCH 466/495] Test --- iguana/iguana_json.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/iguana/iguana_json.c b/iguana/iguana_json.c index 743ba3b0b..7e38b1ad7 100755 --- a/iguana/iguana_json.c +++ b/iguana/iguana_json.c @@ -86,7 +86,6 @@ cJSON *SuperNET_helpjson() cJSON *array=0,*json,*agents; json = cJSON_CreateObject(); agents = cJSON_CreateArray(); -#ifndef WIN32 #define IGUANA_ARGS json,array,agents #define IGUANA_HELP0(agent,name) array = helpjson(IGUANA_ARGS,#agent,#name,0) #define IGUANA_HELP_S(agent,name,str) array = helpjson(IGUANA_ARGS,#agent,#name,helparray(cJSON_CreateArray(),helpitem(#str,"string"))) @@ -195,7 +194,6 @@ cJSON *SuperNET_helpjson() #undef IGUANA_ARGS #undef _IGUANA_APIDEC_H_ #include "../includes/iguana_apiundefs.h" -#endif if ( array != 0 ) jadd(json,"API",array); @@ -649,4 +647,4 @@ char *SuperNET_parser2(struct supernet_info *myinfo, char *agentstr, char *metho return(clonestr(errstr)); } -#endif \ No newline at end of file +#endif From be1309d7f39b400659da117ac8320957a6c912ef Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Mar 2017 17:19:24 +0200 Subject: [PATCH 467/495] swaplist API --- .gitignore | 12 +++++++++ basilisk/basilisk.c | 7 +++++ basilisk/basilisk_swap.c | 48 ++++++++++++++++++++++++++++++++--- iguana/tests/dexgetT | 2 +- iguana/tests/swaplist | 2 ++ includes/iguana_apideclares.h | 1 + includes/iguana_funcs.h | 1 + 7 files changed, 68 insertions(+), 5 deletions(-) create mode 100755 iguana/tests/swaplist diff --git a/.gitignore b/.gitignore index 89d21bd7a..11b713d22 100755 --- a/.gitignore +++ b/.gitignore @@ -184,3 +184,15 @@ iguana/DB/SWAPS/667293271-3414303895.swap iguana/DB/SWAPS/548227681-1452262678.swap iguana/DB/SWAPS/548227681-1452262678 + +*.bobdeposit + +*.bobpayment + +*.bobreclaim + +*.bobrefund + +*.swap + +iguana/DB/SWAPS/1268007736-526212866 diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index de6ebd330..ba880e2e6 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -1857,4 +1857,11 @@ ZERO_ARGS(InstantDEX,init) return(clonestr("{\"result\":\"success\"}")); } +ZERO_ARGS(InstantDEX,getswaplist) +{ + return(basilisk_swaplist(myinfo)); +} + + + #include "../includes/iguana_apiundefs.h" diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index b0159dcdb..a267d5c61 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1059,7 +1059,7 @@ FILE *basilisk_swap_save(struct supernet_info *myinfo,struct basilisk_swap *swap { FILE *fp=0; char fname[512]; sprintf(fname,"%s/SWAPS/%u-%u",GLOBAL_DBDIR,rp->requestid,rp->quoteid), OS_compatible_path(fname); - if ( 0 && (fp= fopen(fname,"rb+")) == 0 ) + if ( (fp= fopen(fname,"rb+")) == 0 ) { if ( (fp= fopen(fname,"wb+")) != 0 ) { @@ -1076,6 +1076,22 @@ FILE *basilisk_swap_save(struct supernet_info *myinfo,struct basilisk_swap *swap return(fp); } +int32_t basilisk_swap_load(uint32_t requestid,uint32_t quoteid,bits256 *privkeyp,struct basilisk_request *rp,uint32_t *statebitsp,int32_t *optiondurationp) +{ + FILE *fp=0; char fname[512]; int32_t retval = -1; + sprintf(fname,"%s/SWAPS/%u-%u",GLOBAL_DBDIR,requestid,quoteid), OS_compatible_path(fname); + if ( (fp= fopen(fname,"rb+")) != 0 ) + { + if ( fread(privkeyp,1,sizeof(*privkeyp),fp) == sizeof(*privkeyp) && + fread(rp,1,sizeof(*rp),fp) == sizeof(*rp) && + fread(statebitsp,1,sizeof(*statebitsp),fp) == sizeof(*statebitsp) && + fread(optiondurationp,1,sizeof(*optiondurationp),fp) == sizeof(*optiondurationp) ) + retval = 0; + fclose(fp); + } + return(retval); +} + struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *rp,uint32_t statebits,int32_t optionduration,int32_t reinit); void basilisk_swaps_init(struct supernet_info *myinfo) @@ -1091,7 +1107,7 @@ void basilisk_swaps_init(struct supernet_info *myinfo) if ( (fp= fopen(fname,"rb+")) != 0 ) // check to see if completed { memset(&M,0,sizeof(M)); - swapcompleted = 0; + swapcompleted = 1; for (iter=0; iter<2; iter++) { if ( fread(privkey.bytes,1,sizeof(privkey),fp) == sizeof(privkey) && @@ -1099,7 +1115,7 @@ void basilisk_swaps_init(struct supernet_info *myinfo) fread(&statebits,1,sizeof(statebits),fp) == sizeof(statebits) && fread(&optionduration,1,sizeof(optionduration),fp) == sizeof(optionduration) ) { - while ( fread(&M,1,sizeof(M),fp) == sizeof(M) ) + while ( 0 && fread(&M,1,sizeof(M),fp) == sizeof(M) ) { M.data = 0; //printf("entry iter.%d crc32.%x datalen.%d\n",iter,M.crc32,M.datalen); @@ -1401,7 +1417,7 @@ void basilisk_swap_saveupdate(struct supernet_info *myinfo,struct basilisk_swap { FILE *fp; char fname[512]; sprintf(fname,"%s/SWAPS/%u-%u.swap",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid), OS_compatible_path(fname); - if ( 0 && (fp= fopen(fname,"wb")) != 0 ) + if ( (fp= fopen(fname,"wb")) != 0 ) { fwrite(&swap->I,1,sizeof(swap->I),fp); /*fwrite(&swap->bobdeposit,1,sizeof(swap->bobdeposit),fp); @@ -2527,3 +2543,27 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 portable_mutex_unlock(&myinfo->DEX_swapmutex); return(swap); } + +char *basilisk_swaplist(struct supernet_info *myinfo) +{ + char fname[512]; FILE *fp; struct basilisk_request R; int32_t optionduration; uint32_t quoteid,requestid,statebits; cJSON *retjson,*array; bits256 privkey; + retjson = cJSON_CreateObject(); + array = cJSON_CreateArray(); + sprintf(fname,"%s/SWAPS/list",GLOBAL_DBDIR), OS_compatible_path(fname); + if ( (fp= fopen(fname,"rb")) != 0 ) + { + while ( fread(&requestid,1,sizeof(requestid),fp) == sizeof(requestid) && fread("eid,1,sizeof(quoteid),fp) == sizeof(quoteid) ) + { + if ( basilisk_swap_load(requestid,quoteid,&privkey,&R,&statebits,&optionduration) == 0 ) + { + jaddi(array,basilisk_requestjson(&R)); + } + } + fclose(fp); + } + jaddstr(retjson,"result","success"); + jadd(retjson,"swaps",array); + return(jprint(retjson,1)); +} + + diff --git a/iguana/tests/dexgetT b/iguana/tests/dexgetT index 0cae93716..7483dbd01 100755 --- a/iguana/tests/dexgetT +++ b/iguana/tests/dexgetT @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettransaction\",\"txid\":\"790211d19afd88f00537c2b847772cebe01853617528990e1c1f59eb45d2f1d9\",\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettransaction\",\"txid\":\"3c00ee16d12c6aae81863d1da485cdd6cd2b73847f8ab93de3663adf6c285e3b\",\"symbol\":\"KMD\"}" diff --git a/iguana/tests/swaplist b/iguana/tests/swaplist new file mode 100755 index 000000000..2db29548e --- /dev/null +++ b/iguana/tests/swaplist @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"getswaplist\"}" diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 048165ccd..861e71444 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -224,6 +224,7 @@ ZERO_ARGS(InstantDEX,allexchanges); STRING_ARG(InstantDEX,allpairs,exchange); THREE_STRINGS(InstantDEX,supports,exchange,base,rel); ZERO_ARGS(InstantDEX,init); +ZERO_ARGS(InstantDEX,getswaplist); //THREE_STRINGS(atomic,approve,myorderid,otherid,txname); //THREE_STRINGS(atomic,claim,myorderid,otherid,txname); diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index 7496ccd4b..ac4487c49 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -526,6 +526,7 @@ int32_t iguana_unspentind2txid(struct supernet_info *myinfo,struct iguana_info * int32_t iguana_RTunspent_check(struct supernet_info *myinfo,struct iguana_info *coin,struct iguana_outpoint outpt); char *basilisk_bitcoinrawtx(struct supernet_info *myinfo,struct iguana_info *coin,char *remoteaddr,uint32_t basilisktag,int32_t timeoutmillis,cJSON *valsobj,struct vin_info *V); int32_t iguana_markedunspents_find(struct iguana_info *coin,int32_t *firstslotp,bits256 txid,int32_t vout); +void jumblr_opidsupdate(struct supernet_info *myinfo,struct iguana_info *coin); char *iguana_signrawtx(struct supernet_info *myinfo,struct iguana_info *coin,int32_t height,bits256 *signedtxidp,int32_t *completedp,cJSON *vins,char *rawtx,cJSON *privkey,struct vin_info *V); bits256 scrypt_blockhash(const void *input); From 9c2ec0856c6a5294b10ef04a8383d9160ab7fb2b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Mar 2017 17:34:29 +0200 Subject: [PATCH 468/495] Test --- basilisk/jumblr.c | 4 ++-- iguana/main.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 67b8c2306..c9a9985bb 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -417,10 +417,10 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 char BTCaddr[64],KMDaddr[64],*zaddr,*retstr; bits256 privkey; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r; fee = JUMBLR_INCR * JUMBLR_FEE; OS_randombytes(&r,sizeof(r)); -//r = 0; +r = 0; if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) { - //printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); + printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); switch ( selector ) { case 0: // public -> z, need to importprivkey diff --git a/iguana/main.c b/iguana/main.c index 984f2c27a..64a0e2940 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -749,7 +749,7 @@ void iguana_urlinit(struct supernet_info *myinfo,int32_t ismainnet,int32_t usess void jumblr_loop(void *ptr) { - struct iguana_info *coin; char BTCaddr[64],KMDaddr[64]; bits256 privkey; uint32_t t; struct supernet_info *myinfo = ptr; int32_t mult = 10; + struct iguana_info *coin; char BTCaddr[64],KMDaddr[64]; bits256 privkey; uint32_t t; struct supernet_info *myinfo = ptr; int32_t mult = 1; printf("JUMBLR loop\n"); while ( 1 ) { From fc1f04594ece346f62694dcf208c3fb2549bb84f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Mar 2017 17:40:19 +0200 Subject: [PATCH 469/495] Test --- .gitignore | 2 ++ basilisk/jumblr.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 11b713d22..46e9a0028 100755 --- a/.gitignore +++ b/.gitignore @@ -196,3 +196,5 @@ iguana/DB/SWAPS/548227681-1452262678 *.swap iguana/DB/SWAPS/1268007736-526212866 + +iguana/DB/SWAPS/3111936786-3185288772 diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index c9a9985bb..14acbb0f5 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -443,7 +443,7 @@ r = 0; free(zaddr); } else printf("no zaddr from jumblr_zgetnewaddress\n"); } - } //else printf("%s total %.8f vs %.8f\n",KMDaddr,dstr(total),(JUMBLR_INCR + 3*(fee+JUMBLR_TXFEE))); + } else printf("%s total %.8f vs %.8f\n",KMDaddr,dstr(total),(JUMBLR_INCR + 3*(fee+JUMBLR_TXFEE))); break; case 1: // z -> z jumblr_opidsupdate(myinfo,coin); From b6ff7cd69c267710f082d43e080cbfd457a495d3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Mar 2017 17:44:26 +0200 Subject: [PATCH 470/495] Test --- .gitignore | 2 ++ basilisk/jumblr.c | 1 + 2 files changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 46e9a0028..5ddf8df3e 100755 --- a/.gitignore +++ b/.gitignore @@ -198,3 +198,5 @@ iguana/DB/SWAPS/548227681-1452262678 iguana/DB/SWAPS/1268007736-526212866 iguana/DB/SWAPS/3111936786-3185288772 + +iguana/DB/SWAPS/3368214189-2405641584 diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 14acbb0f5..c0c7defbb 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -424,6 +424,7 @@ r = 0; switch ( selector ) { case 0: // public -> z, need to importprivkey + jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); if ( (total= jumblr_balance(myinfo,coin,KMDaddr)) >= (JUMBLR_INCR + 3*(fee+JUMBLR_TXFEE))*SATOSHIDEN ) { if ( (r & 1) == 0 ) From 0d519de47952f92c9f01d541d0e2b594ea27e309 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Mar 2017 17:45:36 +0200 Subject: [PATCH 471/495] Test --- basilisk/jumblr.c | 4 ++-- iguana/main.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index c0c7defbb..0710007c6 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -417,10 +417,10 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 char BTCaddr[64],KMDaddr[64],*zaddr,*retstr; bits256 privkey; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r; fee = JUMBLR_INCR * JUMBLR_FEE; OS_randombytes(&r,sizeof(r)); -r = 0; +//r = 0; if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) { - printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); + //printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); switch ( selector ) { case 0: // public -> z, need to importprivkey diff --git a/iguana/main.c b/iguana/main.c index 64a0e2940..984f2c27a 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -749,7 +749,7 @@ void iguana_urlinit(struct supernet_info *myinfo,int32_t ismainnet,int32_t usess void jumblr_loop(void *ptr) { - struct iguana_info *coin; char BTCaddr[64],KMDaddr[64]; bits256 privkey; uint32_t t; struct supernet_info *myinfo = ptr; int32_t mult = 1; + struct iguana_info *coin; char BTCaddr[64],KMDaddr[64]; bits256 privkey; uint32_t t; struct supernet_info *myinfo = ptr; int32_t mult = 10; printf("JUMBLR loop\n"); while ( 1 ) { From 30ba915e3c81adbff3b6cde6e48f6cb220676f8d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Mar 2017 17:57:54 +0200 Subject: [PATCH 472/495] Test --- .gitignore | 2 ++ basilisk/basilisk_swap.c | 8 ++++++-- iguana/iguana_payments.c | 4 ++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 5ddf8df3e..0ef4f1eea 100755 --- a/.gitignore +++ b/.gitignore @@ -200,3 +200,5 @@ iguana/DB/SWAPS/1268007736-526212866 iguana/DB/SWAPS/3111936786-3185288772 iguana/DB/SWAPS/3368214189-2405641584 + +iguana/DB/SWAPS/1133671270-1840176506 diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index a267d5c61..d308fa770 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -948,7 +948,7 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa } } } - return(0); + return(-1); } else { @@ -981,7 +981,7 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa } } } - return(0); + return(-1); //for (i=0; ibobdeposit.redeemlen; i++) // printf("%02x",swap->bobdeposit.redeemscript[i]); //printf(" <- bobdeposit.%d\n",i); @@ -2401,6 +2401,10 @@ void basilisk_swaploop(void *_swap) } } } + if ( swap->I.iambob == 0 && (swap->myfee.I.datalen == 0 || swap->alicepayment.I.datalen == 0 || swap->alicepayment.I.datalen == 0) ) + retval = -7; + else if ( swap->I.iambob != 0 && (swap->myfee.I.datalen == 0 || swap->bobpayment.I.datalen == 0 || swap->bobdeposit.I.datalen == 0) ) + retval = -7; while ( retval == 0 && basilisk_swapiteration(myinfo,swap,data,maxlen) == 0 ) { sleep(DEX_SLEEP); diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 1406a47d1..0517b94a3 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -175,7 +175,7 @@ int32_t iguana_RTbestunspent(struct supernet_info *myinfo,struct iguana_info *co } if ( iguana_RTunspent_check(myinfo,coin,unspents[i]) != 0 ) { - printf("(%d u%d) %.8f already used\n",unspents[i].hdrsi,unspents[i].unspentind,dstr(atx_value)); + //printf("(%d u%d) %.8f already used\n",unspents[i].hdrsi,unspents[i].unspentind,dstr(atx_value)); continue; } if ( maxmode == 0 ) @@ -441,7 +441,7 @@ char *iguana_calcrawtx(struct supernet_info *myinfo,struct iguana_info *coin,cJS } unspents = realloc(unspents,(1 + max) * sizeof(*unspents)); value = jdouble(item,"amount") * SATOSHIDEN; - if ( jdouble(item,"interest") != 0 ) + if ( (0) && jdouble(item,"interest") != 0 ) printf("utxo has interest of %.8f\n",jdouble(item,"interest")); iguana_outptset(myinfo,coin,&unspents[max++],jbits256(item,"txid"),jint(item,"vout"),value,spendscriptstr); avail += value; From f34ec10c5e1d62bba40a102d5202d1f5bff7c235 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Mar 2017 18:03:34 +0200 Subject: [PATCH 473/495] Test --- .gitignore | 2 ++ basilisk/basilisk_swap.c | 4 +--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 0ef4f1eea..a4577a1fb 100755 --- a/.gitignore +++ b/.gitignore @@ -202,3 +202,5 @@ iguana/DB/SWAPS/3111936786-3185288772 iguana/DB/SWAPS/3368214189-2405641584 iguana/DB/SWAPS/1133671270-1840176506 + +iguana/DB/SWAPS/467927158-3437055573 diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index d308fa770..88b8e0ab1 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -948,7 +948,6 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa } } } - return(-1); } else { @@ -981,12 +980,11 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa } } } - return(-1); //for (i=0; ibobdeposit.redeemlen; i++) // printf("%02x",swap->bobdeposit.redeemscript[i]); //printf(" <- bobdeposit.%d\n",i); } - return(-1); + return(0); } int32_t basilisk_verify_privi(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) From 9ea07805b9cadf33dc4c5d2010e7cae564ca88a1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Mar 2017 18:05:52 +0200 Subject: [PATCH 474/495] Test --- basilisk/basilisk_swap.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 88b8e0ab1..db02d82c1 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -2302,7 +2302,7 @@ void basilisk_swaploop(void *_swap) myinfo->DEXactive = 0; } printf("C r%u/q%u swapstate.%x retval.%d\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits,retval); - while ( retval == 0 && (swap->I.statebits & 0x40) == 0 ) // send fee + if ( retval == 0 && (swap->I.statebits & 0x40) == 0 ) // send fee { if ( swap->connected == 0 ) basilisk_psockinit(myinfo,swap,swap->I.iambob != 0); @@ -2351,7 +2351,7 @@ void basilisk_swaploop(void *_swap) { sleep(DEX_SLEEP); printf("bobscripts set error\n"); - continue; + //continue; } } else @@ -2389,8 +2389,8 @@ void basilisk_swaploop(void *_swap) printf("%02x",swap->myfee.txbytes[i]); printf(" fee %p %x\n",swap->myfee.txbytes,swap->I.statebits); swap->I.statebits |= 0x40; - if ( swap->alicepayment.I.datalen != 0 && swap->alicepayment.I.spendlen > 0 ) - break; + //if ( swap->alicepayment.I.datalen != 0 && swap->alicepayment.I.spendlen > 0 ) + // break; } else { @@ -2399,10 +2399,15 @@ void basilisk_swaploop(void *_swap) } } } - if ( swap->I.iambob == 0 && (swap->myfee.I.datalen == 0 || swap->alicepayment.I.datalen == 0 || swap->alicepayment.I.datalen == 0) ) - retval = -7; - else if ( swap->I.iambob != 0 && (swap->myfee.I.datalen == 0 || swap->bobpayment.I.datalen == 0 || swap->bobdeposit.I.datalen == 0) ) - retval = -7; + if ( (swap->I.statebits & 0x40) == 0 ) + retval = -8; + if ( retval == 0 ) + { + if ( swap->I.iambob == 0 && (swap->myfee.I.datalen == 0 || swap->alicepayment.I.datalen == 0 || swap->alicepayment.I.datalen == 0) ) + retval = -7; + else if ( swap->I.iambob != 0 && (swap->myfee.I.datalen == 0 || swap->bobpayment.I.datalen == 0 || swap->bobdeposit.I.datalen == 0) ) + retval = -7; + } while ( retval == 0 && basilisk_swapiteration(myinfo,swap,data,maxlen) == 0 ) { sleep(DEX_SLEEP); From dd3203147d424c039ccd5fe64141018b5f9e64f1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Mar 2017 18:12:46 +0200 Subject: [PATCH 475/495] Test --- .gitignore | 2 ++ basilisk/basilisk_swap.c | 11 ++++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index a4577a1fb..ad22f0cd0 100755 --- a/.gitignore +++ b/.gitignore @@ -204,3 +204,5 @@ iguana/DB/SWAPS/3368214189-2405641584 iguana/DB/SWAPS/1133671270-1840176506 iguana/DB/SWAPS/467927158-3437055573 + +iguana/DB/SWAPS/270159951-1269722638 diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index db02d82c1..0f46cf827 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -2249,7 +2249,7 @@ void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap, void basilisk_swaploop(void *_swap) { - uint8_t *data; uint32_t expiration; uint32_t channel; int32_t retval=0,i,j,datalen,maxlen; struct supernet_info *myinfo; struct basilisk_swap *swap = _swap; + uint8_t *data; uint32_t expiration; uint32_t channel; int32_t iters,retval=0,i,j,datalen,maxlen; struct supernet_info *myinfo; struct basilisk_swap *swap = _swap; myinfo = swap->myinfoptr; fprintf(stderr,"start swap\n"); maxlen = 1024*1024 + sizeof(*swap); @@ -2302,7 +2302,8 @@ void basilisk_swaploop(void *_swap) myinfo->DEXactive = 0; } printf("C r%u/q%u swapstate.%x retval.%d\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits,retval); - if ( retval == 0 && (swap->I.statebits & 0x40) == 0 ) // send fee + iters = 0; + while ( retval == 0 && (swap->I.statebits & 0x40) == 0 && iters++ < 10 ) // send fee { if ( swap->connected == 0 ) basilisk_psockinit(myinfo,swap,swap->I.iambob != 0); @@ -2351,7 +2352,7 @@ void basilisk_swaploop(void *_swap) { sleep(DEX_SLEEP); printf("bobscripts set error\n"); - //continue; + continue; } } else @@ -2389,8 +2390,8 @@ void basilisk_swaploop(void *_swap) printf("%02x",swap->myfee.txbytes[i]); printf(" fee %p %x\n",swap->myfee.txbytes,swap->I.statebits); swap->I.statebits |= 0x40; - //if ( swap->alicepayment.I.datalen != 0 && swap->alicepayment.I.spendlen > 0 ) - // break; + if ( swap->alicepayment.I.datalen != 0 && swap->alicepayment.I.spendlen > 0 ) + break; } else { From f41db06af7a50168e336a979e7b4b7c572c193a3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Mar 2017 18:24:30 +0200 Subject: [PATCH 476/495] Test --- .gitignore | 2 ++ basilisk/basilisk_swap.c | 13 +++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index ad22f0cd0..593be70c7 100755 --- a/.gitignore +++ b/.gitignore @@ -206,3 +206,5 @@ iguana/DB/SWAPS/1133671270-1840176506 iguana/DB/SWAPS/467927158-3437055573 iguana/DB/SWAPS/270159951-1269722638 + +iguana/DB/SWAPS/244991424-1008712592 diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 0f46cf827..9b3abc4d5 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -2401,13 +2401,22 @@ void basilisk_swaploop(void *_swap) } } if ( (swap->I.statebits & 0x40) == 0 ) + { + printf("couldnt send fee\n"); retval = -8; + } if ( retval == 0 ) { if ( swap->I.iambob == 0 && (swap->myfee.I.datalen == 0 || swap->alicepayment.I.datalen == 0 || swap->alicepayment.I.datalen == 0) ) + { + printf("ALICE's error %d %d %d\n",swap->myfee.I.datalen,swap->alicepayment.I.datalen,swap->alicepayment.I.datalen); retval = -7; + } else if ( swap->I.iambob != 0 && (swap->myfee.I.datalen == 0 || swap->bobpayment.I.datalen == 0 || swap->bobdeposit.I.datalen == 0) ) + { + printf("BOB's error %d %d %d\n",swap->myfee.I.datalen,swap->bobpayment.I.datalen,swap->bobdeposit.I.datalen); retval = -7; + } } while ( retval == 0 && basilisk_swapiteration(myinfo,swap,data,maxlen) == 0 ) { @@ -2420,7 +2429,7 @@ void basilisk_swaploop(void *_swap) } if ( swap->I.iambob != 0 && swap->bobdeposit.I.datalen != 0 ) { - printf("BOB waiting for confirm\n"); + printf("BOB waiting for confirm state.%x\n",swap->I.statebits); sleep(60); // wait for confirm/propagation of msig printf("BOB reclaims refund\n"); basilisk_bobdeposit_refund(myinfo,swap,0); @@ -2489,7 +2498,7 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 { starttime = (uint32_t)time(NULL); printf("statebits.%x m.%d n.%d\n",statebits,m,n); - while ( statebits == 0 && m <= n/2 && time(NULL) < starttime+BASILISK_MSGDURATION ) + while ( statebits == 0 && m <= n/2 && time(NULL) < starttime+2*BASILISK_MSGDURATION ) { m = n = 0; sleep(DEX_SLEEP); From 656bb007865314aa7a36c9004f121a9d8dfa1f1e Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 13 Mar 2017 20:08:09 +0200 Subject: [PATCH 477/495] Enable curl --- crypto777/bitcoind_RPC.c | 1 + 1 file changed, 1 insertion(+) diff --git a/crypto777/bitcoind_RPC.c b/crypto777/bitcoind_RPC.c index 18ebe16cc..e0d7fca85 100755 --- a/crypto777/bitcoind_RPC.c +++ b/crypto777/bitcoind_RPC.c @@ -14,6 +14,7 @@ ******************************************************************************/ #include "OS_portable.h" +#define LIQUIDITY_PROVIDER 1 #if LIQUIDITY_PROVIDER #ifdef _WIN32 From d4e01f4b8d1cedfa5f89877cb2dc55972707cd20 Mon Sep 17 00:00:00 2001 From: fadedreamz Date: Wed, 15 Mar 2017 04:26:16 -0500 Subject: [PATCH 478/495] libcurl+openssl for x86 built (MSVC-14/VS2015), updated makefile and bitcoind_RPC for header/library Signed-off-by: fadedreamz --- OSlibs/win/libcrypto-1_1.dll | Bin 0 -> 2105856 bytes OSlibs/win/libcurl.dll | Bin 0 -> 320512 bytes OSlibs/win/libcurl.exp | Bin 0 -> 8337 bytes OSlibs/win/libcurl.lib | Bin 0 -> 14376 bytes OSlibs/win/libssl-1_1.dll | Bin 0 -> 430592 bytes crypto777/bitcoind_RPC.c | 5 - iguana.vcxproj | 8 +- includes/curl/.gitignore | 4 + includes/curl/Makefile.am | 53 + includes/curl/curl.h | 2551 +++++++++++++++++++++++++++++++ includes/curl/curlbuild.h.cmake | 197 +++ includes/curl/curlbuild.h.dist | 586 +++++++ includes/curl/curlbuild.h.in | 197 +++ includes/curl/curlrules.h | 262 ++++ includes/curl/curlver.h | 77 + includes/curl/easy.h | 102 ++ includes/curl/mprintf.h | 50 + includes/curl/multi.h | 439 ++++++ includes/curl/stdcheaders.h | 33 + includes/curl/typecheck-gcc.h | 624 ++++++++ 20 files changed, 5181 insertions(+), 7 deletions(-) create mode 100644 OSlibs/win/libcrypto-1_1.dll create mode 100644 OSlibs/win/libcurl.dll create mode 100644 OSlibs/win/libcurl.exp create mode 100644 OSlibs/win/libcurl.lib create mode 100644 OSlibs/win/libssl-1_1.dll create mode 100644 includes/curl/.gitignore create mode 100644 includes/curl/Makefile.am create mode 100644 includes/curl/curl.h create mode 100644 includes/curl/curlbuild.h.cmake create mode 100644 includes/curl/curlbuild.h.dist create mode 100644 includes/curl/curlbuild.h.in create mode 100644 includes/curl/curlrules.h create mode 100644 includes/curl/curlver.h create mode 100644 includes/curl/easy.h create mode 100644 includes/curl/mprintf.h create mode 100644 includes/curl/multi.h create mode 100644 includes/curl/stdcheaders.h create mode 100644 includes/curl/typecheck-gcc.h diff --git a/OSlibs/win/libcrypto-1_1.dll b/OSlibs/win/libcrypto-1_1.dll new file mode 100644 index 0000000000000000000000000000000000000000..4b16b67beb62ca7cd458589d695c35515d73e4ef GIT binary patch literal 2105856 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 z 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