jl777
7 years ago
committed by
GitHub
96 changed files with 10011 additions and 4495 deletions
@ -0,0 +1,2 @@ |
|||
curl --url "http://127.0.0.1:7776" --data "{\"conf\":\"AXO.conf\",\"path\":\"${HOME#"/"}/.komodo/AXO\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":-1,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"AXO\",\"name\":\"AXO\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"ba009d17\",\"p2p\":12926,\"rpc\":12927,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" |
|||
|
@ -0,0 +1,2 @@ |
|||
curl --url "http://127.0.0.1:7778" --data "{\"conf\":\"AXO.conf\",\"path\":\"${HOME#"/"}/.komodo/AXO\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":0,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"AXO\",\"name\":\"AXO\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"ba009d17\",\"p2p\":12926,\"rpc\":12927,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" |
|||
|
@ -0,0 +1 @@ |
|||
curl --url "http://127.0.0.1:7778" --data "{\"conf\":\"BTCH.conf\",\"path\":\"${HOME#"/"}/.komodo/BTCH\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":0,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"BTCH\",\"name\":\"BTCH\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"b0ed1968\",\"p2p\":8799,\"rpc\":8800,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" |
@ -0,0 +1,2 @@ |
|||
curl --url "http://127.0.0.1:7778" --data "{\"conf\":\"ETOMIC.conf\",\"path\":\"${HOME#"/"}/.komodo/ETOMIC\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":0,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"ETOMIC\",\"name\":\"ETOMIC\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"072a90e8\",\"p2p\":10270,\"rpc\":10271,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" |
|||
|
@ -0,0 +1,2 @@ |
|||
curl --url "http://127.0.0.1:7778" --data "{\"conf\":\"SHARK.conf\",\"path\":\"${HOME#"/"}/.komodo/SHARK\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":0,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"SHARK\",\"name\":\"SHARK\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"54a5e30c\",\"p2p\":14103,\"rpc\":14104,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" |
|||
|
@ -0,0 +1,2 @@ |
|||
curl --url "http://127.0.0.1:7776" --data "{\"conf\":\"BTCH.conf\",\"path\":\"${HOME#"/"}/.komodo/BTCH\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":-1,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"BTCH\",\"name\":\"BTCH\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"b0ed1968\",\"p2p\":8799,\"rpc\":8800,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" |
|||
|
@ -0,0 +1,2 @@ |
|||
curl --url "http://127.0.0.1:7776" --data "{\"conf\":\"ETOMIC.conf\",\"path\":\"${HOME#"/"}/.komodo/ETOMIC\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":-1,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"ETOMIC\",\"name\":\"ETOMIC\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"072a90e8\",\"p2p\":10270,\"rpc\":10271,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" |
|||
|
@ -1,2 +1,2 @@ |
|||
curl --url "http://127.0.0.1:7778" --data "{\"conf\":\"SHARK.conf\",\"path\":\"${HOME#"/"}/.komodo/SHARK\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":1,\"VALIDATE\":1,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"SHARK\",\"name\":\"SHARK\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"54a5e30c\",\"p2p\":10113,\"rpc\":10114,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" |
|||
curl --url "http://127.0.0.1:7778" --data "{\"conf\":\"SHARK.conf\",\"path\":\"${HOME#"/"}/.komodo/SHARK\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":1,\"VALIDATE\":1,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"SHARK\",\"name\":\"SHARK\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"54a5e30c\",\"p2p\":14103,\"rpc\":14104,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" |
|||
|
|||
|
@ -0,0 +1,2 @@ |
|||
curl --url "http://127.0.0.1:7776" --data "{\"conf\":\"MSHARK.conf\",\"path\":\"${HOME#"/"}/.komodo/MSHARK\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":-1,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"MSHARK\",\"name\":\"MSHARK\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"54a5e30c\",\"p2p\":8845,\"rpc\":8846,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" |
|||
|
@ -1,2 +1,2 @@ |
|||
curl --url "http://127.0.0.1:7776" --data "{\"conf\":\"SHARK.conf\",\"path\":\"${HOME#"/"}/.komodo/SHARK\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":-1,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"SHARK\",\"name\":\"SHARK\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"54a5e30c\",\"p2p\":10113,\"rpc\":10114,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" |
|||
curl --url "http://127.0.0.1:7776" --data "{\"conf\":\"SHARK.conf\",\"path\":\"${HOME#"/"}/.komodo/SHARK\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":-1,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"SHARK\",\"name\":\"SHARK\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"54a5e30c\",\"p2p\":14103,\"rpc\":14104,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" |
|||
|
|||
|
@ -0,0 +1,344 @@ |
|||
|
|||
/******************************************************************************
|
|||
* 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. * |
|||
* * |
|||
******************************************************************************/ |
|||
//
|
|||
// LP_NXT.c
|
|||
// marketmaker
|
|||
//
|
|||
|
|||
|
|||
char *NXTnodes[] = { "62.75.159.113", "91.44.203.238", "82.114.88.225", "78.63.207.76", "188.174.110.224", "91.235.72.49", "213.144.130.91", "209.222.98.250", "216.155.128.10", "178.33.203.157", "162.243.122.251", "69.163.47.173", "193.151.106.129", "78.94.2.74", "192.3.196.10", "173.33.112.87", "104.198.173.28", "35.184.154.126", "174.140.167.239", "23.88.113.131", "198.71.84.173", "178.150.207.53", "23.88.61.53", "192.157.233.106", "192.157.241.212", "23.89.192.88", "23.89.200.27", "192.157.241.139", "23.89.200.63", "23.89.192.98", "163.172.214.102", "176.9.85.5", "80.150.243.88", "80.150.243.92", "80.150.243.98", "109.70.186.198", "146.148.84.237", "104.155.56.82", "104.197.157.140", "37.48.73.249", "146.148.77.226", "84.57.170.200", "107.161.145.131", "80.150.243.97", "80.150.243.93", "80.150.243.100", "80.150.243.95", "80.150.243.91", "80.150.243.99", "80.150.243.96", "93.231.187.177", "212.237.23.85", "35.158.179.254", "46.36.66.41", "185.170.113.79", "163.172.68.112", "78.47.35.210", "77.90.90.75", "94.177.196.134", "212.237.22.215", "94.177.234.11", "167.160.180.199", "54.68.189.9", "94.159.62.14", "195.181.221.89", "185.33.145.94", "195.181.209.245", "195.181.221.38", "195.181.221.162", "185.33.145.12", "185.33.145.176", "178.79.128.235", "94.177.214.120", "94.177.199.41", "94.177.214.200", "94.177.213.201", "212.237.13.162", "195.181.221.236", "195.181.221.185", "185.28.103.187", "185.33.146.244", "217.61.123.71", "195.181.214.45", "195.181.212.99", "195.181.214.46", "195.181.214.215", "195.181.214.68", "217.61.123.118", "195.181.214.79", "217.61.123.14", "217.61.124.100", "195.181.214.111", "85.255.0.176", "81.2.254.116", "217.61.123.184", "195.181.212.231", "94.177.214.110", "195.181.209.164", "104.129.56.238", "85.255.13.64", "167.160.180.206", "217.61.123.226", "167.160.180.208", "93.186.253.127", "212.237.6.208", "94.177.207.190", "217.61.123.119", "85.255.1.245", "217.61.124.157", "37.59.57.141", "167.160.180.58", "104.223.53.14", "217.61.124.69", "195.181.212.103", "85.255.13.141", "104.207.133.204", "71.90.7.107", "107.150.18.108", "23.94.134.161", "80.150.243.13", "80.150.243.11", "185.81.165.52", "80.150.243.8" }; |
|||
|
|||
static char *assetids[][4] = |
|||
{ |
|||
{ "13502152099823770958", "SUPERNETx2", "10000", "10000" }, |
|||
{ "12071612744977229797", "SUPERNET", "10000", "10000" }, |
|||
{ "12071612744977229797", "UNITY", "10000", "10000" }, |
|||
{ "15344649963748848799", "DEX", "1", "100000000" }, |
|||
{ "6883271355794806507", "PANGEA", "10000", "10000" }, |
|||
{ "17911762572811467637", "JUMBLR", "10000", "10000" }, |
|||
{ "17083334802666450484", "BET", "10000", "10000" }, |
|||
{ "13476425053110940554", "CRYPTO", "1000", "100000" }, |
|||
{ "6932037131189568014", "HODL", "1", "100000000" }, |
|||
//{ "3006420581923704757", "SHARK", "10000", "10000" },
|
|||
{ "3006420581923704757", "MSHARK", "10", "10000000" }, |
|||
{ "17571711292785902558", "BOTS", "1", "100000000" }, |
|||
{ "10524562908394749924", "MGW", "1", "100000000" }, |
|||
{ "8217222248380501882", "MESH", "10000", "10000" }, |
|||
{ "15641806960898178066", "TOKEN", "1", "100000000" }, |
|||
}; |
|||
|
|||
void LP_sendtoaddress_line(char *validaddress,char *assetname,uint64_t satoshis,uint64_t txnum) |
|||
{ |
|||
char line[1024],lowerstr[64]; |
|||
if ( strcmp(assetname,"SUPERNETx2") == 0 ) |
|||
{ |
|||
sprintf(line,"fiat/supernet sendtoaddress %s %.8f # txnum.%llu",validaddress,dstr(satoshis),(long long)txnum); |
|||
printf("%s\n",line); |
|||
sprintf(line,"fiat/revs sendtoaddress %s %.8f # txnum.%llu",validaddress,dstr(satoshis),(long long)txnum); |
|||
} |
|||
else |
|||
{ |
|||
if ( strcmp(assetname,"TOKEN") == 0 ) |
|||
strcpy(lowerstr,"supernet"); |
|||
else strcpy(lowerstr,assetname); |
|||
tolowercase(lowerstr); |
|||
sprintf(line,"sleep 1; fiat/%s sendtoaddress %s %.8f # txnum.%llu",lowerstr,validaddress,dstr(satoshis),(long long)txnum); |
|||
} |
|||
printf("%s\n",line); |
|||
} |
|||
|
|||
uint64_t LP_assetid_mult(int32_t *assetindp,char *name,uint64_t assetid) |
|||
{ |
|||
int32_t i; uint64_t mult = 0; |
|||
name[0] = 0; |
|||
*assetindp = -1; |
|||
for (i=0; i<sizeof(assetids)/sizeof(*assetids); i++) |
|||
{ |
|||
if ( assetid == calc_nxt64bits(assetids[i][0]) ) |
|||
{ |
|||
*assetindp = i; |
|||
mult = atoi(assetids[i][3]); |
|||
strcpy(name,assetids[i][1]); |
|||
break; |
|||
} |
|||
} |
|||
return(mult); |
|||
} |
|||
|
|||
cJSON *LP_NXT_message(char *method,uint64_t txnum,char *passphrase) |
|||
{ |
|||
char url[1024],*retstr; cJSON *retjson = 0; |
|||
sprintf(url,"http://127.0.0.1:7876/nxt?requestType=%s&transaction=%llu&secretPhrase=%s",method,(long long)txnum,passphrase); |
|||
//printf("issue.(%s)\n",url);
|
|||
if ( (retstr= issue_curlt(url,LP_HTTP_TIMEOUT)) != 0 ) |
|||
{ |
|||
if ( (retjson= cJSON_Parse(retstr)) != 0 ) |
|||
{ |
|||
|
|||
} |
|||
free(retstr); |
|||
} |
|||
return(retjson); |
|||
} |
|||
|
|||
cJSON *LP_NXT_decrypt(uint64_t txnum,char *account,char *data,char *nonce,char *passphrase) |
|||
{ |
|||
char url[1024],*retstr; cJSON *retjson = 0; |
|||
if ( account != 0 && data != 0 && nonce != 0 && passphrase != 0 ) |
|||
{ |
|||
sprintf(url,"http://127.0.0.1:7876/nxt?requestType=readMessage&transaction=%llu&secretPhrase=%s",(long long)txnum,passphrase); |
|||
if ( (retstr= issue_curlt(url,LP_HTTP_TIMEOUT)) != 0 ) |
|||
{ |
|||
if ( (retjson= cJSON_Parse(retstr)) != 0 ) |
|||
{ |
|||
|
|||
} |
|||
free(retstr); |
|||
} |
|||
} |
|||
return(retjson); |
|||
} |
|||
|
|||
int64_t NXTventure_qty(uint64_t assetid) |
|||
{ |
|||
char url[1024],*retstr; uint64_t qty=0; cJSON *retjson; |
|||
sprintf(url,"http://127.0.0.1:7876/nxt?requestType=getAccountAssets&account=NXT-XRK4-5HYK-5965-9FH4Z&includeAssetInfo=true"); |
|||
if ( (retstr= issue_curlt(url,LP_HTTP_TIMEOUT)) != 0 ) |
|||
{ |
|||
printf("NXT_venture_qty(%s)\n",retstr); |
|||
if ( (retjson= cJSON_Parse(retstr)) != 0 ) |
|||
{ |
|||
free_json(retjson); |
|||
} |
|||
free(retstr); |
|||
} |
|||
//NXT_venture_qty({"accountAssets":[{"quantityQNT":"3900000000","unconfirmedQuantityQNT":"3900000000","decimals":4,"name":"ATOMIC","asset":"11694807213441909013"},{"quantityQNT":"2900000000","unconfirmedQuantityQNT":"2900000000","decimals":8,"name":"NSC","asset":"6775372232354238105"},{"quantityQNT":"750000000","unconfirmedQuantityQNT":"750000000","decimals":4,"name":"omnigames","asset":"7441230892853180965"},{"quantityQNT":"607438148","unconfirmedQuantityQNT":"607438148","decimals":4,"name":"ARDR","asset":"12422608354438203866"},{"quantityQNT":"451991779","unconfirmedQuantityQNT":"451991779","decimals":4,"name":"SuperNET","asset":"12071612744977229797"},{"quantityQNT":"146960000","unconfirmedQuantityQNT":"146960000","decimals":4,"name":"Privatebet","asset":"17083334802666450484"},{"quantityQNT":"79500188","unconfirmedQuantityQNT":"79500188","decimals":3,"name":"crypto777","asset":"13476425053110940554"},{"quantityQNT":"1495473","unconfirmedQuantityQNT":"1495473","decimals":0,"name":"jl777hodl","asset":"6932037131189568014"},{"quantityQNT":"500000","unconfirmedQuantityQNT":"500000","decimals":0,"name":"Boost","asset":"9719950459730291994"},{"quantityQNT":"200000","unconfirmedQuantityQNT":"200000","decimals":0,"name":"NXTforex","asset":"15245281832566929110"},{"quantityQNT":"150000","unconfirmedQuantityQNT":"150000","decimals":0,"name":"NXTsharks","asset":"8049009002993773168"},{"quantityQNT":"100000","unconfirmedQuantityQNT":"100000","decimals":5,"name":"solarweb","asset":"13604572534081373849"},{"quantityQNT":"75000","unconfirmedQuantityQNT":"75000","decimals":0,"name":"SNN","asset":"15113552914305929842"},{"quantityQNT":"57299","unconfirmedQuantityQNT":"57299","decimals":2,"name":"SLEUTH","asset":"4174874835406708311"},{"quantityQNT":"18801","unconfirmedQuantityQNT":"18801","decimals":2,"name":"BTCDdev","asset":"15131486578879082754"},{"quantityQNT":"18767","unconfirmedQuantityQNT":"18767","decimals":2,"name":"longzai","asset":"10955830010602647139"},{"quantityQNT":"13000","unconfirmedQuantityQNT":"13000","decimals":0,"name":"NXTventure","asset":"16212446818542881180"},{"quantityQNT":"7250","unconfirmedQuantityQNT":"7250","decimals":0,"name":"InstantDEX","asset":"15344649963748848799"},{"quantityQNT":"2873","unconfirmedQuantityQNT":"2873","decimals":4,"name":"EDinar","asset":"17740527756732147253"},{"quantityQNT":"39","unconfirmedQuantityQNT":"39","decimals":0,"name":"JebBush","asset":"1929419574701797581"},{"quantityQNT":"30","unconfirmedQuantityQNT":"30","decimals":0,"name":"Hilary","asset":"11814755740231942504"}],"requestProcessingTime":1})
|
|||
return(qty); |
|||
} |
|||
|
|||
void *curl_post(void **cHandlep,char *url,char *userpass,char *postfields,char *hdr0,char *hdr1,char *hdr2,char *hdr3); |
|||
|
|||
void NXTventure_liquidation() |
|||
{ |
|||
/*{"quantityQNT":"607438148","unconfirmedQuantityQNT":"607438148","decimals":4,"name":"ARDR","asset":""},
|
|||
{"quantityQNT":"451991779","unconfirmedQuantityQNT":"451991779","decimals":4,"name":"SuperNET","asset":"12071612744977229797"}, |
|||
{"quantityQNT":"146960000","unconfirmedQuantityQNT":"146960000","decimals":4,"name":"Privatebet","asset":"17083334802666450484"}, |
|||
{"quantityQNT":"79500188","unconfirmedQuantityQNT":"79500188","decimals":3,"name":"crypto777","asset":"13476425053110940554"}, |
|||
{"quantityQNT":"1495473","unconfirmedQuantityQNT":"1495473","decimals":0,"name":"jl777hodl","asset":"6932037131189568014"}, |
|||
{"quantityQNT":"7250","unconfirmedQuantityQNT":"7250","decimals":0,"name":"InstantDEX","asset":"15344649963748848799"},*/ |
|||
char *assetids[][4] = |
|||
{ |
|||
{ "12422608354438203866", "607438148", "ARDR", "10000" }, |
|||
{ "12071612744977229797", "451991779", "SuperNET", "10000" }, |
|||
{ "17083334802666450484", "146960000", "Privatebet", "10000" }, |
|||
{ "13476425053110940554", "79500188", "crypto777", "1000" }, |
|||
{ "6932037131189568014", "1495473", "jl777hodl", "1" }, |
|||
{ "15344649963748848799", "7250", "InstantDEX", "1" }, |
|||
}; |
|||
void *cHandle=0; char *retstr,*retstr2,url[1024],*account; uint64_t txid,qty,qtyA,assetid,sum; double ratio; cJSON *array,*retjson2,*item,*retjson; int32_t i,j,decimals,numassetids=(int32_t)(sizeof(assetids)/sizeof(*assetids)),n=0; |
|||
char *passphrase = ""; |
|||
sprintf(url,"http://127.0.0.1:7876/nxt?requestType=getAssetAccounts&asset=16212446818542881180"); |
|||
if ( (retstr= issue_curlt(url,LP_HTTP_TIMEOUT)) != 0 ) |
|||
{ |
|||
if ( (retjson= cJSON_Parse(retstr)) != 0 ) |
|||
{ |
|||
if ( (array= jarray(&n,retjson,"accountAssets")) != 0 ) |
|||
{ |
|||
for (j=0; j<numassetids; j++) |
|||
{ |
|||
assetid = calc_nxt64bits(assetids[j][0]); |
|||
qtyA = calc_nxt64bits(assetids[j][1]); |
|||
decimals = (int32_t)calc_nxt64bits(assetids[j][3]); |
|||
printf("distribute %llu QNT of %s assetid %llu %.8f\n",(long long)qtyA,assetids[j][2],(long long)assetid,(double)qtyA / decimals); |
|||
sum = 0; |
|||
for (i=0; i<n; i++) |
|||
{ |
|||
item = jitem(array,i); |
|||
qty = j64bits(item,"quantityQNT"); |
|||
ratio = (double)qty / (1000000. - 13000.); |
|||
if ( (account= jstr(item,"accountRS")) != 0 && qtyA*ratio >= 1 ) |
|||
{ |
|||
if ( strcmp(account,"NXT-XRK4-5HYK-5965-9FH4Z") != 0 ) |
|||
{ |
|||
sum += (long long)(qtyA * ratio); |
|||
sprintf(url,"requestType=transferAsset&secretPhrase=%s&recipient=%s&asset=%llu&quantityQNT=%llu&feeNQT=100000000&deadline=60",passphrase,account,(long long)assetid,(long long)(qtyA * ratio)); |
|||
if ( (retstr2= curl_post(&cHandle,"http://127.0.0.1:7876/nxt","",url,"","","","")) != 0 ) |
|||
{ |
|||
if ( (retjson2= cJSON_Parse(retstr2)) != 0 ) |
|||
{ |
|||
txid = j64bits(retjson2,"transaction"); |
|||
printf("%s %.6f %8llu QNT %s -> %llu %.8f txid %llu\n",account,ratio,(long long)qtyA,assetids[j][2],(long long)(qtyA * ratio),((double)(long long)(qtyA * ratio))/decimals,(long long)txid); |
|||
free_json(retjson2); |
|||
} |
|||
free(retstr2); |
|||
} |
|||
usleep(250000); |
|||
} |
|||
} |
|||
} |
|||
printf("%s distribution total %llu QNT %.8f\n",assetids[j][2],(long long)sum,(double)sum/decimals); |
|||
} |
|||
} |
|||
free_json(retjson); |
|||
} |
|||
printf("NXTventure assethodlers.%d\n",n); |
|||
free(retstr); |
|||
} |
|||
} |
|||
|
|||
cJSON *LP_NXT_redeems() |
|||
{ |
|||
char url[1024],*retstr,*recv,*method,*msgstr,assetname[128]; uint64_t totals[2][sizeof(assetids)/sizeof(*assetids)],mult,txnum,assetid,qty; int32_t i,ind,numtx=0,past_marker=0; cJSON *item,*attach,*decjson,*array,*msgjson,*encjson,*retjson=0; |
|||
//sleep 1; fiat/supernet sendtoaddress RNZZuQYu8xJLZHuekhd96hYfoQuiCMz99T 1001.44150000 # txnum.8537615468620726612
|
|||
//sleep 1; fiat/pangea sendtoaddress RWMdRaUmMZqKkEibwEhY6XS3RLCXJDWHTi 22.10910000 # txnum.2649622877615958504
|
|||
uint64_t txnum_marker = calc_nxt64bits("8537615468620726612"); // 2649622877615958504"); // set to most recent processed
|
|||
uint64_t txnum_marker2 = calc_nxt64bits("7256847492742571143"); // dont change, end marker
|
|||
char *passphrase = ""; |
|||
char *account = "NXT-MRBN-8DFH-PFMK-A4DBM"; |
|||
memset(totals,0,sizeof(totals)); |
|||
sprintf(url,"http://127.0.0.1:7876/nxt?requestType=getBlockchainTransactions&account=%s",account); |
|||
//printf("calling (%s)\n",url);
|
|||
if ( (retstr= issue_curlt(url,LP_HTTP_TIMEOUT)) != 0 ) |
|||
{ |
|||
if ( (retjson= cJSON_Parse(retstr)) != 0 ) |
|||
{ |
|||
if ( (array= jarray(&numtx,retjson,"transactions")) != 0 ) |
|||
{ |
|||
for (i=0; i<numtx; i++) |
|||
{ |
|||
msgjson = encjson = decjson = 0; |
|||
txnum = assetid = qty = 0; |
|||
item = jitem(array,i); |
|||
msgstr = jstr(item,"message"); |
|||
txnum = j64bits(item,"transaction"); |
|||
if ( txnum == txnum_marker ) |
|||
past_marker = 1; |
|||
//printf("%d: %s\n",i,jprint(item,0));
|
|||
if ( (recv= jstr(item,"recipientRS")) != 0 && strcmp(recv,"NXT-MRBN-8DFH-PFMK-A4DBM") == 0 ) |
|||
{ |
|||
if ( (attach= jobj(item,"attachment")) != 0 && jint(attach,"version.AssetTransfer") == 1 ) |
|||
{ |
|||
assetid = j64bits(attach,"asset"); |
|||
qty = j64bits(attach,"quantityQNT"); |
|||
//printf("txnum.%llu (%s)\n",(long long)txnum,jprint(attach,0));
|
|||
if ( (msgstr == 0 || msgstr[0] == 0) && jint(attach,"version.PrunablePlainMessage") == 1 ) |
|||
{ |
|||
method = "getPrunableMessage"; |
|||
if ( (msgjson= LP_NXT_message(method,txnum,"test")) != 0 ) |
|||
{ |
|||
msgstr = jstr(msgjson,"message"); |
|||
//printf("%d method.(%s) (%s)\n",i,method,msgstr);
|
|||
} |
|||
} |
|||
if ( msgstr == 0 || msgstr[0] == 0 ) |
|||
msgstr = jstr(attach,"message"); |
|||
if ( msgstr == 0 || msgstr[0] == 0 ) |
|||
{ |
|||
|
|||
if ( (encjson= jobj(attach,"encryptedMessage")) != 0 ) |
|||
{ |
|||
msgstr = "encryptedMessage";//jstr(encjson,"data");
|
|||
if ( (decjson= LP_NXT_decrypt(txnum,account,jstr(encjson,"data"),jstr(encjson,"nonce"),passphrase)) != 0 ) |
|||
{ |
|||
//printf("%s\n",jprint(decjson,0));
|
|||
if ( jstr(decjson,"decryptedMessage") != 0 ) |
|||
msgstr = jstr(decjson,"decryptedMessage"); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
mult = LP_assetid_mult(&ind,assetname,assetid); |
|||
if ( ind >= 0 ) |
|||
totals[past_marker][ind] += qty * mult; |
|||
if ( msgstr != 0 && assetname[0] != 0 && qty != 0 ) |
|||
{ |
|||
char validaddress[64]; int32_t z,n; |
|||
n = (int32_t)strlen(msgstr); |
|||
for (z=0; z<n; z++) |
|||
{ |
|||
if ( msgstr[z] == 'R' ) |
|||
break; |
|||
} |
|||
memset(validaddress,0,sizeof(validaddress)); |
|||
if ( n-z >= 34 ) |
|||
strncpy(validaddress,&msgstr[z],34); |
|||
if ( txnum == calc_nxt64bits("4545341872872347590") ) |
|||
strcpy(validaddress,"RKuwq4oi4mqQ2V4r54mPEthn3TBrEwu2Ni"); |
|||
if ( past_marker == 0 ) |
|||
{ |
|||
if ( strlen(validaddress) == 34 || strlen(validaddress) == 33 ) |
|||
{ |
|||
//printf("%-4d: (%34s) <- %13.5f %10s tx.%llu past_marker.%d\n",i,validaddress,dstr(qty * mult),assetname,(long long)txnum,past_marker);
|
|||
LP_sendtoaddress_line(validaddress,assetname,(qty * mult),txnum); |
|||
} else printf("%-4d: (%34s) <- %13.5f %10s tx.%llu\n",i,msgstr!=0?msgstr:jprint(item,0),dstr(qty * mult),assetname,(long long)txnum); |
|||
} |
|||
} |
|||
if ( msgjson != 0 ) |
|||
free_json(msgjson); |
|||
if ( decjson != 0 ) |
|||
free_json(decjson); |
|||
} |
|||
if ( txnum == txnum_marker2 ) |
|||
break; |
|||
} |
|||
} |
|||
//free_json(retjson);
|
|||
} |
|||
free(retstr); |
|||
} |
|||
printf("\nTotal redeemed.%d\n",numtx); |
|||
for (past_marker=0; past_marker<2; past_marker++) |
|||
{ |
|||
for (i=0; i<sizeof(totals[0])/sizeof(*totals[0]); i++) |
|||
{ |
|||
if ( totals[past_marker][i] != 0 ) |
|||
printf("%-10s %13.5f past_marker.%d\n",assetids[i][1],dstr(totals[past_marker][i]),past_marker); |
|||
} |
|||
printf("\n>>>>>>>>>> already processed:\n"); |
|||
} |
|||
return(retjson); |
|||
} |
|||
|
|||
cJSON *LP_assethbla(char *assetid) |
|||
{ |
|||
char url[1024],*retstr; int32_t n; cJSON *array,*bid=0,*ask=0,*retjson; |
|||
sprintf(url,"http://%s:7876/nxt?requestType=getBidOrders&asset=%s&firstIndex=0&lastIndex=0",NXTnodes[LP_rand() % (sizeof(NXTnodes)/sizeof(*NXTnodes))],assetid); |
|||
if ( (retstr= issue_curlt(url,LP_HTTP_TIMEOUT)) != 0 ) |
|||
{ |
|||
bid = cJSON_Parse(retstr); |
|||
free(retstr); |
|||
} |
|||
sprintf(url,"http://%s:7876/nxt?requestType=getAskOrders&asset=%s&firstIndex=0&lastIndex=0",NXTnodes[LP_rand() % (sizeof(NXTnodes)/sizeof(*NXTnodes))],assetid); |
|||
if ( (retstr= issue_curlt(url,LP_HTTP_TIMEOUT)) != 0 ) |
|||
{ |
|||
ask = cJSON_Parse(retstr); |
|||
free(retstr); |
|||
} |
|||
retjson = cJSON_CreateObject(); |
|||
if ( bid != 0 && ask != 0 ) |
|||
{ |
|||
if ( (array= jarray(&n,bid,"bidOrders")) != 0 ) |
|||
jadd(retjson,"bid",jduplicate(jitem(array,0))); |
|||
if ( (array= jarray(&n,ask,"askOrders")) != 0 ) |
|||
jadd(retjson,"ask",jduplicate(jitem(array,0))); |
|||
} |
|||
if ( bid != 0 ) |
|||
free_json(bid); |
|||
if ( ask != 0 ) |
|||
free_json(ask); |
|||
return(retjson); |
|||
} |
|||
|
@ -0,0 +1,650 @@ |
|||
|
|||
/******************************************************************************
|
|||
* 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. * |
|||
* * |
|||
******************************************************************************/ |
|||
|
|||
//
|
|||
// LP_instantdex.c
|
|||
// marketmaker
|
|||
//
|
|||
|
|||
void LP_instantdex_txidaddfname(char *fname,char *afname,char *coinaddr) |
|||
{ |
|||
if ( coinaddr == 0 || coinaddr[0] == 0 ) |
|||
{ |
|||
sprintf(fname,"%s/instantdex.json",GLOBAL_DBDIR); |
|||
sprintf(afname,"%s/instantdex_append.json",GLOBAL_DBDIR); |
|||
} |
|||
else |
|||
{ |
|||
sprintf(fname,"%s/instantdex_%s.json",GLOBAL_DBDIR,coinaddr); |
|||
sprintf(afname,"%s/instantdex_%s_append.json",GLOBAL_DBDIR,coinaddr); |
|||
} |
|||
} |
|||
|
|||
cJSON *LP_instantdex_txids(int32_t appendonly,char *coinaddr) |
|||
{ |
|||
char *filestr,fname[1024],afname[1024]; long fsize; cJSON *retjson=0; |
|||
LP_instantdex_txidaddfname(fname,afname,coinaddr); |
|||
if ( (filestr= OS_filestr(&fsize,appendonly != 0 ? afname : fname)) != 0 ) |
|||
{ |
|||
retjson = cJSON_Parse(filestr); |
|||
free(filestr); |
|||
} else printf("couldnt open (%s) or (%s)\n",fname,afname); |
|||
return(retjson); |
|||
} |
|||
|
|||
void LP_instantdex_filewrite(int32_t appendfile,cJSON *array,char *coinaddr) |
|||
{ |
|||
FILE *fp; char *filestr,fname[1024],afname[1024]; |
|||
LP_instantdex_txidaddfname(fname,afname,coinaddr); |
|||
if ( (fp= fopen(appendfile == 0 ? fname : afname,"wb")) != 0 ) |
|||
{ |
|||
filestr = jprint(array,0); |
|||
fwrite(filestr,1,strlen(filestr)+1,fp); |
|||
fclose(fp); |
|||
free(filestr); |
|||
} |
|||
} |
|||
|
|||
void LP_instantdex_deposituniq(FILE *fp,bits256 txid) |
|||
{ |
|||
int32_t i,n; bits256 prevtxid; char str[65]; |
|||
n = (int32_t)(ftell(fp) / sizeof(txid)); |
|||
for (i=0; i<n; i++) |
|||
{ |
|||
fseek(fp,sizeof(prevtxid) * i,SEEK_SET); |
|||
fread(&prevtxid,1,sizeof(prevtxid),fp); |
|||
if ( bits256_cmp(prevtxid,txid) == 0 ) |
|||
{ |
|||
//printf("%s duplicate of deposits[%d]\n",bits256_str(str,prevtxid),i);
|
|||
break; |
|||
} |
|||
} |
|||
if ( i == n ) |
|||
{ |
|||
fwrite(&txid,1,sizeof(txid),fp); |
|||
printf("uniq %s, ftell.%ld\n",bits256_str(str,txid),ftell(fp)); |
|||
} else fseek(fp,n * sizeof(txid),SEEK_SET); |
|||
} |
|||
|
|||
void LP_instantdex_filescreate(char *coinaddr) |
|||
{ |
|||
char fname[512]; FILE *fp; bits256 txid; int32_t i,n; cJSON *array,*newarray,*txobj; |
|||
sprintf(fname,"%s/deposits.%s",GLOBAL_DBDIR,coinaddr), OS_compatible_path(fname); |
|||
if ( (fp= fopen(fname,"rb")) != 0 ) |
|||
{ |
|||
array = cJSON_CreateArray(); |
|||
newarray = cJSON_CreateArray(); |
|||
fseek(fp,0,SEEK_END); |
|||
n = (int32_t)(ftell(fp) / sizeof(txid)); |
|||
for (i=0; i<n; i++) |
|||
{ |
|||
fseek(fp,sizeof(txid) * i,SEEK_SET); |
|||
fread(&txid,1,sizeof(txid),fp); |
|||
jaddibits256(array,txid); |
|||
if ( (txobj= LP_gettxout("KMD",coinaddr,txid,0)) != 0 ) |
|||
free_json(txobj); |
|||
else |
|||
{ |
|||
char str[65]; printf("%s/v%d is already spent\n",bits256_str(str,txid),0); |
|||
continue; |
|||
} |
|||
jaddibits256(newarray,txid); |
|||
} |
|||
fclose(fp); |
|||
LP_instantdex_filewrite(0,newarray,coinaddr); |
|||
free_json(newarray); |
|||
LP_instantdex_filewrite(1,array,coinaddr); |
|||
free_json(array); |
|||
} |
|||
} |
|||
|
|||
void LP_instantdex_depositadd(char *coinaddr,bits256 txid) |
|||
{ |
|||
FILE *fp; struct iguana_info *coin; char fname[512],*addr; bits256 prevtxid; cJSON *array; int32_t i,n,iter; |
|||
coin = LP_coinfind("KMD"); |
|||
sprintf(fname,"%s/deposits.%s",GLOBAL_DBDIR,coinaddr), OS_compatible_path(fname); |
|||
if ( (fp= fopen(fname,"rb+")) == 0 ) |
|||
{ |
|||
if ( (fp= fopen(fname,"wb+")) != 0 ) |
|||
{ |
|||
for (iter=0; iter<4; iter++) |
|||
{ |
|||
if ( iter < 2 ) |
|||
addr = coinaddr; |
|||
else addr = ""; |
|||
if ( coin != 0 && (array= LP_instantdex_txids(iter&1,addr)) != 0 ) |
|||
{ |
|||
if ( (n= cJSON_GetArraySize(array)) > 0 ) |
|||
{ |
|||
for (i=0; i<n; i++) |
|||
{ |
|||
prevtxid = jbits256i(array,i); |
|||
//char str[65]; printf("instantdex iter.%d i.%d check %s\n",iter,i,bits256_str(str,prevtxid));
|
|||
if ( LP_instantdex_creditcalc(coin,0,prevtxid,coinaddr) > 0 ) |
|||
{ |
|||
LP_instantdex_deposituniq(fp,prevtxid); |
|||
fflush(fp); |
|||
} |
|||
} |
|||
} |
|||
free_json(array); |
|||
} |
|||
} |
|||
} |
|||
} else fseek(fp,0,SEEK_END); |
|||
if ( fp != 0 && bits256_nonz(txid) != 0 ) |
|||
{ |
|||
LP_instantdex_deposituniq(fp,txid); |
|||
fclose(fp); |
|||
} |
|||
LP_instantdex_filescreate(coinaddr); |
|||
} |
|||
|
|||
int32_t LP_deposit_addr(char *p2shaddr,uint8_t *script,uint8_t taddr,uint8_t p2shtype,uint32_t timestamp,uint8_t *pubsecp33) |
|||
{ |
|||
uint8_t elsepub33[33],p2sh_rmd160[20]; int32_t n; |
|||
decode_hex(elsepub33,33,BOTS_BONDPUBKEY33); |
|||
n = bitcoin_performancebond(p2sh_rmd160,script,0,timestamp,pubsecp33,elsepub33); |
|||
bitcoin_address(p2shaddr,taddr,p2shtype,script,n); |
|||
return(n); |
|||
} |
|||
|
|||
char *LP_instantdex_deposit(struct iguana_info *coin,int32_t weeks,double amount,int32_t broadcast) |
|||
{ |
|||
char p2shaddr[64],*retstr,*hexstr; uint8_t script[512]; int32_t weeki,scriptlen; cJSON *argjson,*retjson,*array,*item,*obj; uint32_t timestamp; bits256 txid,sendtxid; uint64_t amount64; |
|||
if ( strcmp(coin->symbol,"KMD") != 0 ) |
|||
return(clonestr("{\"error\":\"instantdex deposit must be in KMD\"}")); |
|||
if ( amount < 10.0 ) |
|||
return(clonestr("{\"error\":\"minimum instantdex deposit is 10 KMD\"}")); |
|||
if ( weeks <= 0 || weeks > 52 ) |
|||
return(clonestr("{\"error\":\"weeks must be between 1 and 52\"}")); |
|||
if ( weeks > 0 ) |
|||
{ |
|||
timestamp = (uint32_t)time(NULL); |
|||
timestamp /= LP_WEEKMULT; |
|||
timestamp += weeks+2; |
|||
timestamp *= LP_WEEKMULT; |
|||
weeki = (timestamp - LP_FIRSTWEEKTIME) / LP_WEEKMULT; |
|||
if ( weeks >= 10000 ) |
|||
return(clonestr("{\"error\":\"numweeks must be less than 10000\"}")); |
|||
} else timestamp = (uint32_t)time(NULL) + 300, weeki = 0; |
|||
scriptlen = LP_deposit_addr(p2shaddr,script,coin->taddr,coin->p2shtype,timestamp,G.LP_pubsecp); |
|||
argjson = cJSON_CreateObject(); |
|||
array = cJSON_CreateArray(); |
|||
item = cJSON_CreateObject(); |
|||
jaddnum(item,p2shaddr,amount); |
|||
jaddi(array,item); |
|||
item = cJSON_CreateObject(); |
|||
amount64 = (amount * SATOSHIDEN) / 1000; |
|||
amount64 = (amount64 / 10000) * 10000 + weeki; |
|||
jaddnum(item,BOTS_BONDADDRESS,dstr(amount64)); |
|||
jaddi(array,item); |
|||
item = cJSON_CreateObject(); |
|||
jaddnum(item,coin->smartaddr,0.0001); |
|||
jaddi(array,item); |
|||
jadd(argjson,"outputs",array); |
|||
//printf("deposit.(%s)\n",jprint(argjson,0));
|
|||
if ( (retstr= LP_withdraw(coin,argjson)) != 0 ) |
|||
{ |
|||
if ( (retjson= cJSON_Parse(retstr)) != 0 ) |
|||
{ |
|||
if ( jobj(retjson,"result") != 0 ) |
|||
jdelete(retjson,"result"); |
|||
jaddstr(retjson,"address",p2shaddr); |
|||
jaddnum(retjson,"expiration",timestamp); |
|||
jaddnum(retjson,"deposit",amount); |
|||
if ( (obj= jobj(retjson,"complete")) != 0 && is_cJSON_True(obj) != 0 && (hexstr= jstr(retjson,"hex")) != 0 ) |
|||
{ |
|||
txid = jbits256(retjson,"txid"); |
|||
if ( broadcast != 0 ) |
|||
{ |
|||
if (bits256_nonz(txid) != 0 ) |
|||
{ |
|||
sendtxid = LP_broadcast("deposit","KMD",hexstr,txid); |
|||
if ( bits256_cmp(sendtxid,txid) != 0 ) |
|||
{ |
|||
jaddstr(retjson,"error","broadcast txid mismatch"); |
|||
jaddbits256(retjson,"broadcast",sendtxid); |
|||
free(retstr); |
|||
return(jprint(retjson,1)); |
|||
} |
|||
else |
|||
{ |
|||
jaddstr(retjson,"result","success"); |
|||
jaddbits256(retjson,"broadcast",sendtxid); |
|||
LP_instantdex_depositadd(coin->smartaddr,txid); |
|||
free(retstr); |
|||
return(jprint(retjson,1)); |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
jaddstr(retjson,"error","couldnt broadcast since no txid created"); |
|||
free(retstr); |
|||
return(jprint(retjson,1)); |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
jaddstr(retjson,"result","success"); |
|||
free(retstr); |
|||
return(jprint(retjson,1)); |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
jaddstr(retjson,"error","couldnt create deposit txid"); |
|||
free(retstr); |
|||
return(jprint(retjson,1)); |
|||
} |
|||
free_json(retjson); |
|||
} |
|||
free(retstr); |
|||
} |
|||
return(clonestr("{\"error\":\"error with LP_withdraw for instantdex deposit\"}")); |
|||
} |
|||
|
|||
int64_t LP_claimtx(void *ctx,struct iguana_info *coin,bits256 *claimtxidp,bits256 utxotxid,int32_t utxovout,uint64_t satoshis,char *vinaddr,uint32_t claimtime,uint8_t *redeemscript,int32_t redeemlen) |
|||
{ |
|||
uint8_t userdata[2]; char *signedtx; bits256 signedtxid,sendtxid; int32_t isbots,userdatalen; int64_t destamount,sum = 0; |
|||
if ( strcmp(coin->smartaddr,BOTS_BONDADDRESS) == 0 ) |
|||
isbots = 1; |
|||
else isbots = 0; |
|||
userdata[0] = (isbots == 0) ? 0x51 : 0; |
|||
userdatalen = 1; |
|||
utxovout = 0; |
|||
memset(claimtxidp,0,sizeof(*claimtxidp)); |
|||
char str[65]; printf("LP_claimtx satoshis %.8f %s/v%d\n",dstr(satoshis),bits256_str(str,utxotxid),utxovout); |
|||
if ( (signedtx= basilisk_swap_bobtxspend(&signedtxid,10000,"instantdexclaim",coin->symbol,coin->wiftaddr,coin->taddr,coin->pubtype,coin->p2shtype,coin->isPoS,coin->wiftype,ctx,G.LP_privkey,0,redeemscript,redeemlen,userdata,userdatalen,utxotxid,utxovout,coin->smartaddr,G.LP_pubsecp,0,claimtime,&destamount,0,0,vinaddr,1,coin->zcash)) != 0 ) |
|||
{ |
|||
printf("signedtx.(%s)\n",signedtx); |
|||
sendtxid = LP_broadcast("claim","KMD",signedtx,signedtxid); |
|||
if ( bits256_cmp(sendtxid,signedtxid) == 0 ) |
|||
{ |
|||
*claimtxidp = sendtxid; |
|||
sum += (satoshis - coin->txfee); |
|||
} |
|||
else printf("error sending %s\n",bits256_str(str,signedtxid)); |
|||
free(signedtx); |
|||
} else printf("error claiming instantdex deposit %s/v%d %.8f\n",bits256_str(str,utxotxid),utxovout,dstr(satoshis)); |
|||
return(sum); |
|||
} |
|||
|
|||
int32_t LP_claim_submit(void *ctx,cJSON *txids,int64_t *sump,struct iguana_info *coin,bits256 utxotxid) |
|||
{ |
|||
uint8_t redeemscript[512]; bits256 claimtxid; cJSON *txjson,*vout0,*vout1,*vout2,*vouts,*item; int32_t numvouts; char str[65],vinaddr[64],destaddr[64],checkaddr[64]; int32_t j,utxovout,flagi = 0,redeemlen,weeki,iter; int64_t weeksatoshis,satoshis; uint32_t expiration,claimtime; |
|||
if ( (txjson= LP_gettx(coin->symbol,utxotxid,1)) != 0 ) |
|||
{ |
|||
if ( (vouts= jarray(&numvouts,txjson,"vout")) != 0 && numvouts >= 3 ) |
|||
{ |
|||
vout0 = jitem(vouts,0); |
|||
LP_destaddr(vinaddr,vout0); |
|||
satoshis = LP_value_extract(vout0,1); |
|||
vout2 = jitem(vouts,2); |
|||
LP_destaddr(destaddr,vout2); |
|||
if ( strcmp(destaddr,coin->smartaddr) == 0 ) |
|||
{ |
|||
vout1 = jitem(vouts,1); |
|||
weeksatoshis = LP_value_extract(vout1,0); |
|||
weeki = (int32_t)(weeksatoshis % 10000); |
|||
for (iter=0; iter<2; iter++) |
|||
for (j=-168; j<=168; j++) |
|||
{ |
|||
if ( iter == 1 ) |
|||
expiration = ((weeki * LP_WEEKMULTBAD + j*3600) + LP_FIRSTWEEKTIME); |
|||
else expiration = ((weeki * LP_WEEKMULT + j*3600) + LP_FIRSTWEEKTIME); |
|||
redeemlen = LP_deposit_addr(checkaddr,redeemscript,coin->taddr,coin->p2shtype,expiration,G.LP_pubsecp); |
|||
if ( strcmp(checkaddr,vinaddr) == 0 ) |
|||
{ |
|||
flagi = 1; |
|||
claimtime = (uint32_t)time(NULL)-777; |
|||
item = cJSON_CreateObject(); |
|||
jaddbits256(item,"txid",utxotxid); |
|||
jaddnum(item,"deposit",dstr(LP_value_extract(vout0,0))); |
|||
if ( coin->electrum == 0 ) |
|||
jaddnum(item,"interest",dstr(satoshis)-dstr(LP_value_extract(vout0,0))); |
|||
else jaddnum(item,"interest",dstr(LP_komodo_interest(utxotxid,satoshis))); |
|||
if ( claimtime <= expiration ) |
|||
{ |
|||
printf("iter.%d j.%d claimtime.%u vs %u, wait %d seconds to %s claim %.8f\n",iter,j,claimtime,expiration,(int32_t)expiration-claimtime,bits256_str(str,utxotxid),dstr(satoshis)); |
|||
jaddnum(item,"waittime",(int32_t)expiration-claimtime); |
|||
jaddi(txids,item); |
|||
break; |
|||
} |
|||
else |
|||
{ |
|||
utxovout = 0; |
|||
*sump += LP_claimtx(ctx,coin,&claimtxid,utxotxid,utxovout,satoshis,vinaddr,claimtime,redeemscript,redeemlen); |
|||
if ( bits256_nonz(claimtxid) != 0 ) |
|||
{ |
|||
jaddbits256(item,"claimtxid",claimtxid); |
|||
jaddi(txids,item); |
|||
} |
|||
} |
|||
} //else printf("expiration.%u j.%d checkaddr.(%s) != vinaddr.%s\n",expiration,j,checkaddr,vinaddr);
|
|||
if ( flagi != 0 ) |
|||
break; |
|||
} |
|||
} else printf("vout2 dest.(%s) != %s\n",destaddr,coin->smartaddr); |
|||
} else printf("numvouts %d != 3\n",numvouts); |
|||
free_json(txjson); |
|||
} else printf("cant get transaction flagi.%d\n",flagi); |
|||
return(flagi); |
|||
} |
|||
|
|||
char *LP_instantdex_claim(struct iguana_info *coin) |
|||
{ |
|||
static void *ctx; static int32_t firsttime = 1; |
|||
int32_t i,n; cJSON *array,*txids,*newarray,*retjson; int64_t sum; bits256 utxotxid; |
|||
if ( ctx == 0 ) |
|||
ctx = bitcoin_ctx(); |
|||
if ( strcmp(coin->symbol,"KMD") != 0 ) |
|||
return(clonestr("{\"error\":\"instantdex deposit must be in KMD\"}")); |
|||
sum = 0; |
|||
txids = cJSON_CreateArray(); |
|||
newarray = cJSON_CreateArray(); |
|||
if ( (array= LP_instantdex_txids(firsttime,coin->smartaddr)) != 0 ) |
|||
{ |
|||
printf("claiming from.(%s)\n",jprint(array,0)); |
|||
if ( (n= cJSON_GetArraySize(array)) > 0 ) |
|||
{ |
|||
for (i=0; i<n; i++) |
|||
{ |
|||
utxotxid = jbits256i(array,i); |
|||
//char str[65]; printf("%s\n",bits256_str(str,utxotxid));
|
|||
if ( LP_claim_submit(ctx,txids,&sum,coin,utxotxid) == 0 ) |
|||
jaddibits256(newarray,utxotxid); |
|||
} |
|||
} |
|||
free_json(array); |
|||
} |
|||
firsttime = 0; |
|||
if ( cJSON_GetArraySize(newarray) > 0 ) |
|||
LP_instantdex_filewrite(0,newarray,coin->smartaddr); |
|||
free_json(newarray); |
|||
retjson = cJSON_CreateObject(); |
|||
jaddstr(retjson,"result","success"); |
|||
jaddnum(retjson,"claimed",dstr(sum)); |
|||
jadd(retjson,"txids",txids); |
|||
return(jprint(retjson,1)); |
|||
} |
|||
|
|||
int64_t LP_instantdex_credit(int32_t dispflag,char *coinaddr,int64_t satoshis,int32_t weeki,char *p2shaddr,bits256 txid) |
|||
{ |
|||
uint32_t timestamp; struct LP_address *ap; struct iguana_info *coin = LP_coinfind("KMD"); |
|||
if ( coin != 0 ) |
|||
{ |
|||
timestamp = LP_FIRSTWEEKTIME + weeki*LP_WEEKMULT; |
|||
if ( (ap= LP_address(coin,coinaddr)) != 0 && time(NULL) < timestamp-60*3600 ) |
|||
{ |
|||
ap->instantdex_credits += satoshis; |
|||
ap->didinstantdex = 1; |
|||
if ( 0 && dispflag != 0 ) |
|||
printf("InstantDEX credit.(%s) %.8f weeki.%d (%s) -> sum %.8f\n",coinaddr,dstr(satoshis),weeki,p2shaddr,dstr(ap->instantdex_credits)); |
|||
return(satoshis); |
|||
} //else printf("null ap.%p or expired %ld\n",ap,time(NULL) - (timestamp-60*3600));
|
|||
} |
|||
return(0); |
|||
} |
|||
|
|||
int64_t LP_instantdex_creditcalc(struct iguana_info *coin,int32_t dispflag,bits256 txid,char *refaddr) |
|||
{ |
|||
cJSON *txjson,*vouts,*txobj,*item; int64_t satoshis=0,amount64; int32_t weeki,numvouts; char destaddr[64],p2shaddr[64]; |
|||
if ( (txjson= LP_gettx(coin->symbol,txid,0)) != 0 ) |
|||
{ |
|||
// vout0 deposit, vout1 botsfee, vout2 smartaddress
|
|||
if ( (vouts= jarray(&numvouts,txjson,"vout")) > 0 && numvouts >= 3 && LP_destaddr(destaddr,jitem(vouts,2)) == 0 ) |
|||
{ |
|||
if ( refaddr != 0 && strcmp(refaddr,destaddr) != 0 ) |
|||
{ |
|||
printf("LP_instantdex_creditcalc for (%s) but deposit sent for (%s)\n",refaddr,destaddr); |
|||
} |
|||
else |
|||
{ |
|||
amount64 = LP_value_extract(jitem(vouts,1),0); |
|||
weeki = (amount64 % 10000); |
|||
item = jitem(vouts,0); |
|||
satoshis = LP_value_extract(item,0); |
|||
//char str[65]; printf("%s %s funded %.8f weeki.%d (%s)\n",bits256_str(str,txid),destaddr,dstr(satoshis),weeki,jprint(item,0));
|
|||
if ( LP_destaddr(p2shaddr,item) == 0 ) |
|||
{ |
|||
if ( (txobj= LP_gettxout(coin->symbol,p2shaddr,txid,0)) != 0 ) |
|||
{ |
|||
free_json(txobj); |
|||
LP_instantdex_credit(dispflag,destaddr,satoshis,weeki,p2shaddr,txid); |
|||
} //else printf("already spent\n");
|
|||
} else printf("error getting p2shaddr.(%s)\n",p2shaddr); |
|||
} |
|||
} |
|||
free_json(txjson); |
|||
} |
|||
return(satoshis); |
|||
} |
|||
|
|||
#ifdef bruteforce |
|||
void LP_instantdex_deposits(struct iguana_info *coin) |
|||
{ |
|||
static int dispflag = 1; |
|||
cJSON *array,*item; int32_t i,n,height,vout; bits256 txid; struct LP_address *ap,*tmp; |
|||
if ( coin->electrum != 0 )//&& coin->electruminstantdex != 0 )
|
|||
return; |
|||
HASH_ITER(hh,coin->addresses,ap,tmp) |
|||
{ |
|||
ap->instantdex_credits = 0; |
|||
} |
|||
if ( (array= LP_listreceivedbyaddress("KMD",BOTS_BONDADDRESS)) != 0 ) |
|||
{ |
|||
//printf("instantdex.(%s)\n",jprint(array,0));
|
|||
if ( (n= cJSON_GetArraySize(array)) > 0 ) |
|||
{ |
|||
for (i=0; i<n; i++) |
|||
{ |
|||
if ( coin->electrum != 0 ) |
|||
{ |
|||
item = jitem(array,i); |
|||
LP_listunspent_parseitem(coin,&txid,&vout,&height,item); |
|||
} else txid = jbits256i(array,i); |
|||
LP_instantdex_creditcalc(coin,dispflag,txid,0); |
|||
} |
|||
} |
|||
free_json(array); |
|||
} |
|||
dispflag = 0; |
|||
} |
|||
#endif |
|||
|
|||
int64_t LP_dynamictrust(int64_t credits,bits256 pubkey,int64_t kmdvalue) |
|||
{ |
|||
struct LP_pubswap *ptr,*tmp; struct LP_swapstats *sp; struct LP_pubkey_info *pubp; struct LP_address *ap; char coinaddr[64]; struct iguana_info *coin; int64_t swaps_kmdvalue = 0; |
|||
if ( (coin= LP_coinfind("KMD")) != 0 && (pubp= LP_pubkeyfind(pubkey)) != 0 ) |
|||
{ |
|||
bitcoin_address(coinaddr,coin->taddr,coin->pubtype,pubp->pubsecp,33); |
|||
DL_FOREACH_SAFE(pubp->bobswaps,ptr,tmp) |
|||
{ |
|||
if ( (sp= ptr->swap) != 0 && LP_swap_finished(sp,1) == 0 ) |
|||
swaps_kmdvalue += LP_kmdvalue(sp->Q.srccoin,sp->Q.satoshis); |
|||
} |
|||
DL_FOREACH_SAFE(pubp->aliceswaps,ptr,tmp) |
|||
{ |
|||
if ( (sp= ptr->swap) != 0 && LP_swap_finished(sp,1) == 0 ) |
|||
swaps_kmdvalue += LP_kmdvalue(sp->Q.destcoin,sp->Q.destsatoshis); |
|||
} |
|||
if ( credits == 0 && (ap= LP_address(coin,coinaddr)) != 0 ) |
|||
credits = ap->instantdex_credits; |
|||
if ( credits != 0 && (swaps_kmdvalue+kmdvalue) > credits ) |
|||
{ |
|||
if ( 0 ) |
|||
{ |
|||
DL_FOREACH_SAFE(pubp->bobswaps,ptr,tmp) |
|||
{ |
|||
if ( (sp= ptr->swap) != 0 && LP_swap_finished(sp,1) == 0 ) |
|||
printf("unfinished bob %llu r%u-r%u src.%s %.8f dest.%s %.8f -> price %.8f value %.8f\n",(long long)sp->aliceid,sp->Q.R.requestid,sp->Q.R.quoteid,sp->Q.srccoin,dstr(sp->Q.satoshis),sp->Q.destcoin,dstr(sp->Q.destsatoshis),(double)sp->Q.destsatoshis/(sp->Q.satoshis+1),dstr(LP_kmdvalue(sp->Q.destcoin,sp->Q.destsatoshis))); |
|||
} |
|||
DL_FOREACH_SAFE(pubp->aliceswaps,ptr,tmp) |
|||
{ |
|||
if ( (sp= ptr->swap) != 0 && LP_swap_finished(sp,1) == 0 ) |
|||
printf("unfinished alice %llu r%u-r%u src.%s %.8f dest.%s %.8f -> price %.8f value %.8f\n",(long long)sp->aliceid,sp->Q.R.requestid,sp->Q.R.quoteid,sp->Q.srccoin,dstr(sp->Q.satoshis),sp->Q.destcoin,dstr(sp->Q.destsatoshis),(double)sp->Q.destsatoshis/(sp->Q.satoshis+1),dstr(LP_kmdvalue(sp->Q.destcoin,sp->Q.destsatoshis))); |
|||
} |
|||
} |
|||
printf("REJECT: %s instantdex_credits %.8f vs (%.8f + current %.8f)\n",coinaddr,dstr(credits),dstr(swaps_kmdvalue),dstr(kmdvalue)); |
|||
} |
|||
if ( 0 && credits != 0 ) |
|||
printf("%s %s othercredits %.8f debits %.8f + %.8f -> %.8f\n",coin->symbol,coinaddr,dstr(credits),dstr(swaps_kmdvalue),dstr(kmdvalue),dstr(credits - (swaps_kmdvalue+kmdvalue))); |
|||
return(credits - (swaps_kmdvalue+kmdvalue)); |
|||
} |
|||
return(0); |
|||
} |
|||
|
|||
int64_t LP_instantdex_proofcheck(char *coinaddr,cJSON *proof,int32_t num) |
|||
{ |
|||
uint8_t rmd160[20],addrtype; int64_t credits=0; int32_t i,j; bits256 prevtxid,txid; char othersmartaddr[64]; struct iguana_info *coin; struct LP_address *ap = 0; |
|||
if ( (coin= LP_coinfind("KMD")) != 0 ) |
|||
{ |
|||
bitcoin_addr2rmd160(0,&addrtype,rmd160,coinaddr); |
|||
bitcoin_address(othersmartaddr,0,60,rmd160,20); |
|||
//printf("proofcheck addrtype.%d (%s) -> %s\n",addrtype,coinaddr,othersmartaddr);
|
|||
if ((ap= LP_address(coin,othersmartaddr)) != 0 ) |
|||
{ |
|||
ap->instantdex_credits = 0; |
|||
for (i=0; i<num; i++) |
|||
{ |
|||
txid = jbits256i(proof,i); |
|||
for (j=0; j<i; j++) |
|||
{ |
|||
prevtxid = jbits256i(proof,j); |
|||
if ( bits256_cmp(prevtxid,txid) == 0 ) |
|||
break; |
|||
} |
|||
if ( j == i ) |
|||
LP_instantdex_creditcalc(coin,1,txid,othersmartaddr); |
|||
} |
|||
credits = ap->instantdex_credits; |
|||
ap->didinstantdex = 1; |
|||
if ( 0 && ap->instantdex_credits > 0 ) |
|||
printf("validated instantdex %s.[%d] proof.(%s) credits %.8f\n",othersmartaddr,num,jprint(proof,0),dstr(ap->instantdex_credits)); |
|||
} //else printf("cant find ap.%p or already did %d %.8f\n",ap,ap!=0?ap->didinstantdex:-1,ap!=0?dstr(ap->instantdex_credits):-1);
|
|||
} |
|||
return(credits); |
|||
} |
|||
|
|||
int64_t LP_myzcredits() |
|||
{ |
|||
cJSON *proof; struct iguana_info *coin; int64_t zcredits; |
|||
if ( (coin= LP_coinfind("KMD")) != 0 ) |
|||
{ |
|||
if ( (proof= LP_instantdex_txids(0,coin->smartaddr)) != 0 ) |
|||
{ |
|||
zcredits = LP_instantdex_proofcheck(coin->smartaddr,proof,cJSON_GetArraySize(proof)); |
|||
free_json(proof); |
|||
return(zcredits); |
|||
} |
|||
} |
|||
return(0); |
|||
} |
|||
|
|||
cJSON *LP_swapstats_item(struct LP_swapstats *sp,int32_t iambob) |
|||
{ |
|||
struct iguana_info *bob,*alice; int32_t flag = 0; char *retstr,*swapstr; bits256 zero; cJSON *item,*reqjson,*swapjson; |
|||
item = cJSON_CreateObject(); |
|||
jaddnum(item,"iambob",iambob); |
|||
jaddnum(item,"aliceid",sp->aliceid); |
|||
jaddnum(item,"requestid",sp->Q.R.requestid); |
|||
jaddnum(item,"quoteid",sp->Q.R.quoteid); |
|||
jaddstr(item,"base",sp->Q.srccoin); |
|||
jaddnum(item,"satoshis",sp->Q.satoshis); |
|||
jaddstr(item,"rel",sp->Q.destcoin); |
|||
jaddnum(item,"destsatoshis",sp->Q.destsatoshis); |
|||
jaddnum(item,"price",sp->Q.destsatoshis/((double)sp->Q.satoshis+1)); |
|||
if ( LP_swap_finished(sp,1) == 0 ) |
|||
{ |
|||
jaddnum(item,"finished",sp->finished); |
|||
if ( sp->bobneeds_dPoW != 0 && (bob= LP_coinfind(sp->Q.srccoin)) != 0 ) |
|||
{ |
|||
jaddnum(item,"bobneeds_dPoW",sp->bobneeds_dPoW); |
|||
jaddnum(item,"bob_dPoWheight",bob->notarized); |
|||
if ( sp->bobneeds_dPoW == 1 ) |
|||
flag = 1; |
|||
if ( bob->notarized == 0 ) |
|||
LP_dPoW_request(bob); |
|||
} |
|||
if ( sp->aliceneeds_dPoW != 0 && (alice= LP_coinfind(sp->Q.destcoin)) != 0 ) |
|||
{ |
|||
jaddnum(item,"aliceneeds_dPoW",sp->aliceneeds_dPoW); |
|||
jaddnum(item,"alice_dPoWheight",alice->notarized); |
|||
if ( sp->aliceneeds_dPoW == 1 ) |
|||
flag = 1; |
|||
if ( alice->notarized == 0 ) |
|||
LP_dPoW_request(alice); |
|||
} |
|||
if ( flag != 0 ) |
|||
{ |
|||
reqjson = cJSON_CreateObject(); |
|||
jaddstr(reqjson,"method","gettradestatus"); |
|||
jadd64bits(reqjson,"aliceid",sp->aliceid); |
|||
memset(zero.bytes,0,sizeof(zero)); |
|||
LP_reserved_msg(0,"","",zero,jprint(reqjson,1)); |
|||
if ( (swapstr= basilisk_swapentry(sp->Q.R.requestid,sp->Q.R.quoteid,0)) != 0 ) |
|||
{ |
|||
if ( (swapjson= cJSON_Parse(swapstr)) != 0 ) |
|||
{ |
|||
if ( (retstr= LP_swapstatus_recv(swapjson)) != 0 ) |
|||
free(retstr); |
|||
free_json(swapjson); |
|||
} |
|||
free(swapstr); |
|||
} |
|||
} |
|||
} |
|||
return(item); |
|||
} |
|||
|
|||
cJSON *LP_myzdebits() |
|||
{ |
|||
struct LP_pubswap *ptr,*tmp; struct LP_pubkey_info *pubp; struct LP_swapstats *sp; int64_t kmdvalue,swaps_kmdvalue = 0; struct iguana_info *coin; cJSON *retjson,*array,*item; |
|||
array = cJSON_CreateArray(); |
|||
if ( (coin= LP_coinfind("KMD")) != 0 ) |
|||
{ |
|||
if ( (pubp= LP_pubkeyfind(G.LP_mypub25519)) != 0 ) |
|||
{ |
|||
DL_FOREACH_SAFE(pubp->bobswaps,ptr,tmp) |
|||
{ |
|||
if ( (sp= ptr->swap) != 0 && LP_swap_finished(sp,1) == 0 ) |
|||
{ |
|||
kmdvalue = LP_kmdvalue(sp->Q.srccoin,sp->Q.satoshis); |
|||
item = LP_swapstats_item(sp,1); |
|||
jaddnum(item,"kmdvalue",dstr(kmdvalue)); |
|||
jaddi(array,item); |
|||
swaps_kmdvalue += kmdvalue; |
|||
} |
|||
} |
|||
DL_FOREACH_SAFE(pubp->aliceswaps,ptr,tmp) |
|||
{ |
|||
if ( (sp= ptr->swap) != 0 && LP_swap_finished(sp,1) == 0 ) |
|||
{ |
|||
kmdvalue = LP_kmdvalue(sp->Q.destcoin,sp->Q.destsatoshis); |
|||
item = LP_swapstats_item(sp,0); |
|||
jaddnum(item,"kmdvalue",dstr(kmdvalue)); |
|||
jaddi(array,item); |
|||
swaps_kmdvalue += kmdvalue; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
retjson = cJSON_CreateObject(); |
|||
jadd(retjson,"swaps",array); |
|||
jaddnum(retjson,"pendingswaps",dstr(swaps_kmdvalue)); |
|||
return(retjson); |
|||
} |
@ -0,0 +1,708 @@ |
|||
/******************************************************************************
|
|||
* 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. * |
|||
* * |
|||
******************************************************************************/ |
|||
//
|
|||
// LP_mmjson.c
|
|||
// marketmaker
|
|||
//
|
|||
#define MMJSON_IPADDR 255 |
|||
#define MMJSON_BITS256 254 |
|||
#define MMJSON_SECP33 253 |
|||
#define MMJSON_SIG 252 |
|||
#define MMJSON_RMD160 251 |
|||
#define MMJSON_DECIMAL8 250 |
|||
#define MMJSON_DECIMAL8STR 249 |
|||
#define MMJSON_DECIMAL16 248 |
|||
#define MMJSON_DECIMAL16STR 247 |
|||
#define MMJSON_DECIMAL24 246 |
|||
#define MMJSON_DECIMAL24STR 245 |
|||
#define MMJSON_DECIMAL32 244 |
|||
#define MMJSON_DECIMAL32STR 243 |
|||
#define MMJSON_DECIMAL40 242 |
|||
#define MMJSON_DECIMAL40STR 241 |
|||
#define MMJSON_DECIMAL48 240 |
|||
#define MMJSON_DECIMAL48STR 239 |
|||
#define MMJSON_DOUBLE 238 |
|||
#define MMJSON_DECIMAL64 237 |
|||
#define MMJSON_DECIMAL64STR 236 |
|||
#define MMJSON_TIMESTAMP 235 |
|||
#define MMJSON_TIMEDIFF8 234 |
|||
#define MMJSON_TIMEDIFF16 233 |
|||
#define MMJSON_ZERO 232 |
|||
#define MMJSON_ZEROSTR 231 |
|||
#define MMJSON_COIN 230 |
|||
#define MMJSON_STRING 229 |
|||
#define MMJSON_ARRAY8 228 |
|||
#define MMJSON_ARRAY16 227 |
|||
#define MMJSON_ARRAY32 226 |
|||
#define MMJSON_BOUNDARY 98 |
|||
|
|||
int32_t MM_numfields; |
|||
char *MM_fields[256] = |
|||
{ |
|||
"timestamp", "getdPoW", "dPoW", "aliceid", "src", "base", "basevol", "dest", "rel", "relvol", "price", "requestid", "quoteid", "finished", "expired", "bobdeposit", "alicepayment", "bobpayment", "paymentspent", "Apaymentspent", "depositspent", "ind", "method", "swapstatus", "method2", "gettradestatus", "coin", "rmd160", "pub", "pubsecp", "sig", "session", "notify", "pubkey", "price64", "credits", "utxocoin", "n", "bal", "min", "max", "postprice", "notarized", "notarizedhash", "notarizationtxid", "wantnotify", "isLP", "gui", "nogui", "tradeid", "address", "txid", "vout", "srchash", "txfee", "quotetime", "satoshis", "desthash", "txid2", "vout2", "destaddr", "desttxid", "destvout", "feetxid", "feevout", "desttxfee", "destsatoshis", "pending", "reserved", "broadcast", "ismine", "simplegui", "request", "proof", "connect", "expiration", "iambob", "Bgui", "", "Agui", "bob", "srcamount", "bobtxfee", "alice", "destamount", "alicetxfee", "sentflags", "values", "result", "success", "status", "finishtime", "tradestatus", "pair", "connected", "warning", "critical", "endcritical", |
|||
}; |
|||
|
|||
char *MM_coins[256] = |
|||
{ |
|||
"KMD", "BTC", "CRC", "VOT", "INN", "MOON", "CRW", "EFL", "GBX", "BCO", "BLK", "BTG", "BCH", "ABY", "STAK", "XZC", "QTUM", "PURA", "DSR", "MNZ", "BTCZ", "MAGA", "BSD", "IOP", "BLOCK", "CHIPS", "888", "ARG", "GLT", "ZER", "HODLC", "UIS", "HUC", "PIVX", "BDL", "ARC", "ZCL", "VIA", "ERC", "FAIR", "FLO", "SXC", "CREA", "TRC", "BTA", "SMC", "NMC", "NAV", "EMC2", "SYS", "I0C", "DASH", "STRAT", "MUE", "MONA", "XMY", "MAC", "BTX", "XRE", "LBC", "SIB", "VTC", "REVS", "JUMBLR", "DOGE", "HUSH", "ZEC", "DGB", "ZET", "GAME", "LTC", "SUPERNET", "WLC", "PANGEA", "DEX", "BET", "CRYPTO", "HODL", "MSHARK", "BOTS", "MGW", "COQUI", "KV", "CEAL", "MESH", |
|||
}; |
|||
|
|||
int32_t mmjson_coinfind(char *symbol) |
|||
{ |
|||
int32_t i; |
|||
for (i=0; i<sizeof(MM_coins)/sizeof(*MM_coins); i++) |
|||
{ |
|||
if ( MM_coins[i] == 0 ) |
|||
return(-1); |
|||
if ( strcmp(MM_coins[i],symbol) == 0 ) |
|||
return(i); |
|||
} |
|||
return(-1); |
|||
}; |
|||
|
|||
int32_t mmadd(char *field) |
|||
{ |
|||
MM_fields[MM_numfields] = calloc(1,strlen(field)+1); |
|||
strcpy(MM_fields[MM_numfields],field); |
|||
return(MM_numfields++); |
|||
} |
|||
|
|||
int32_t mmfind(char *field) |
|||
{ |
|||
int32_t i; |
|||
if ( MM_numfields == 0 ) |
|||
{ |
|||
for (i=0; i<sizeof(MM_fields)/sizeof(*MM_fields); i++) |
|||
if ( MM_fields[i] == 0 ) |
|||
break; |
|||
MM_numfields = i; |
|||
} |
|||
for (i=0; i<MM_numfields; i++) |
|||
{ |
|||
if ( strcmp(MM_fields[i],field) == 0 ) |
|||
return(i); |
|||
} |
|||
return(-1); |
|||
} |
|||
|
|||
int32_t MMJSON_rwnum(int32_t rwflag,uint8_t *buf,uint64_t *longp,int32_t n) |
|||
{ |
|||
int32_t i; uint64_t l = 0; |
|||
if ( rwflag != 0 ) |
|||
{ |
|||
l = *longp; |
|||
for (i=0; i<n; i++) |
|||
{ |
|||
buf[i] = (uint8_t)l; |
|||
l >>= 8; |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
for (i=n-1; i>=0; i--) |
|||
{ |
|||
l <<= 8; |
|||
l |= buf[i]; |
|||
} |
|||
*longp = l; |
|||
} |
|||
return(n); |
|||
} |
|||
|
|||
int32_t MMJSON_decodeitem(cJSON *lineobj,uint8_t *linebuf,int32_t i,int32_t len,char *fieldstr,uint32_t *timestampp) |
|||
{ |
|||
int32_t c,valind,j; char tmpstr[64],ipaddr[64],hexstr[256],arbstr[8192]; uint64_t l; |
|||
switch ( (valind= linebuf[i++]) ) |
|||
{ |
|||
case MMJSON_IPADDR: |
|||
i += MMJSON_rwnum(0,&linebuf[i],&l,4); |
|||
expand_ipbits(ipaddr,(uint32_t)l); |
|||
jaddstr(lineobj,fieldstr,ipaddr); |
|||
break; |
|||
case MMJSON_BITS256: |
|||
init_hexbytes_noT(hexstr,&linebuf[i],32); |
|||
i += 32; |
|||
jaddstr(lineobj,fieldstr,hexstr); |
|||
break; |
|||
case MMJSON_SECP33: |
|||
init_hexbytes_noT(hexstr,&linebuf[i],33); |
|||
i += 33; |
|||
jaddstr(lineobj,fieldstr,hexstr); |
|||
break; |
|||
case MMJSON_SIG: |
|||
init_hexbytes_noT(hexstr,&linebuf[i],65); |
|||
i += 65; |
|||
jaddstr(lineobj,fieldstr,hexstr); |
|||
break; |
|||
case MMJSON_RMD160: |
|||
init_hexbytes_noT(hexstr,&linebuf[i],20); |
|||
i += 20; |
|||
jaddstr(lineobj,fieldstr,hexstr); |
|||
break; |
|||
case MMJSON_DECIMAL8: |
|||
l = linebuf[i++]; |
|||
jaddnum(lineobj,fieldstr,l); |
|||
break; |
|||
case MMJSON_DECIMAL8STR: |
|||
l = linebuf[i++]; |
|||
jadd64bits(lineobj,fieldstr,l); |
|||
break; |
|||
case MMJSON_DECIMAL16: |
|||
i += MMJSON_rwnum(0,&linebuf[i],&l,2); |
|||
jaddnum(lineobj,fieldstr,l); |
|||
break; |
|||
case MMJSON_DECIMAL16STR: |
|||
i += MMJSON_rwnum(0,&linebuf[i],&l,2); |
|||
jadd64bits(lineobj,fieldstr,l); |
|||
break; |
|||
case MMJSON_DECIMAL24: |
|||
i += MMJSON_rwnum(0,&linebuf[i],&l,3); |
|||
jaddnum(lineobj,fieldstr,l); |
|||
break; |
|||
case MMJSON_DECIMAL24STR: |
|||
i += MMJSON_rwnum(0,&linebuf[i],&l,3); |
|||
sprintf(tmpstr,"%llu",(long long)l); |
|||
jaddstr(lineobj,fieldstr,tmpstr); |
|||
break; |
|||
case MMJSON_DECIMAL32: |
|||
i += MMJSON_rwnum(0,&linebuf[i],&l,4); |
|||
//printf("decimal32.%u %08x\n",(uint32_t)l,(uint32_t)l);
|
|||
jaddnum(lineobj,fieldstr,l); |
|||
break; |
|||
case MMJSON_DECIMAL32STR: |
|||
i += MMJSON_rwnum(0,&linebuf[i],&l,4); |
|||
//printf("decimal32.%u %08x\n",(uint32_t)l,(uint32_t)l);
|
|||
jadd64bits(lineobj,fieldstr,l); |
|||
break; |
|||
case MMJSON_DECIMAL40: |
|||
i += MMJSON_rwnum(0,&linebuf[i],&l,5); |
|||
jaddnum(lineobj,fieldstr,l); |
|||
break; |
|||
case MMJSON_DECIMAL40STR: |
|||
i += MMJSON_rwnum(0,&linebuf[i],&l,5); |
|||
jadd64bits(lineobj,fieldstr,l); |
|||
break; |
|||
case MMJSON_DECIMAL48: |
|||
i += MMJSON_rwnum(0,&linebuf[i],&l,6); |
|||
jaddnum(lineobj,fieldstr,l); |
|||
break; |
|||
case MMJSON_DECIMAL48STR: |
|||
i += MMJSON_rwnum(0,&linebuf[i],&l,6); |
|||
jadd64bits(lineobj,fieldstr,l); |
|||
break; |
|||
case MMJSON_DOUBLE: |
|||
i += MMJSON_rwnum(0,&linebuf[i],&l,8); |
|||
//printf("double %llu -> %.8f\n",(long long)l,dstr(l));
|
|||
jaddnum(lineobj,fieldstr,dstr(l)); |
|||
break; |
|||
case MMJSON_DECIMAL64: |
|||
i += MMJSON_rwnum(0,&linebuf[i],&l,8); |
|||
jadd64bits(lineobj,fieldstr,l); |
|||
break; |
|||
case MMJSON_DECIMAL64STR: |
|||
i += MMJSON_rwnum(0,&linebuf[i],&l,8); |
|||
jadd64bits(lineobj,fieldstr,l); |
|||
break; |
|||
case MMJSON_TIMESTAMP: |
|||
if ( *timestampp == 0 ) |
|||
{ |
|||
i += MMJSON_rwnum(0,&linebuf[i],&l,4); |
|||
*timestampp = (uint32_t)l; |
|||
jaddnum(lineobj,fieldstr,l); |
|||
} |
|||
else |
|||
{ |
|||
printf("timestamp %u already exists\n",*timestampp); |
|||
free_json(lineobj); |
|||
return(-1); |
|||
} |
|||
break; |
|||
case MMJSON_TIMEDIFF8: |
|||
jaddnum(lineobj,fieldstr,*timestampp + linebuf[i++]); |
|||
break; |
|||
case MMJSON_TIMEDIFF16: |
|||
i += MMJSON_rwnum(0,&linebuf[i],&l,2); |
|||
jaddnum(lineobj,fieldstr,*timestampp + l); |
|||
break; |
|||
case MMJSON_ZERO: |
|||
jaddnum(lineobj,fieldstr,0); |
|||
break; |
|||
case MMJSON_ZEROSTR: |
|||
//printf("%s.zerostr\n",fieldstr);
|
|||
jadd64bits(lineobj,fieldstr,0); |
|||
break; |
|||
case MMJSON_COIN: |
|||
jaddstr(lineobj,fieldstr,MM_coins[linebuf[i++]]); |
|||
break; |
|||
case MMJSON_STRING: |
|||
j = 0; |
|||
while ( (c= linebuf[i++]) != 0 ) |
|||
{ |
|||
if ( i > len ) |
|||
{ |
|||
printf("string overflow i.%d vs len.%d\n",i,len); |
|||
free_json(lineobj); |
|||
return(-1); |
|||
} |
|||
arbstr[j++] = c; |
|||
} |
|||
arbstr[j] = 0; |
|||
jaddstr(lineobj,fieldstr,arbstr); |
|||
break; |
|||
default: |
|||
if ( valind < MMJSON_BOUNDARY ) |
|||
jaddstr(lineobj,fieldstr,MM_fields[valind]); |
|||
else |
|||
{ |
|||
printf("%s unhandled valind.%d k.%d len.%d (%s)\n",fieldstr,valind,i,len,jprint(lineobj,0)); |
|||
free_json(lineobj); |
|||
return(-1); |
|||
} |
|||
break; |
|||
} |
|||
return(i); |
|||
} |
|||
|
|||
char *MMJSON_decode(uint8_t *linebuf,int32_t len) |
|||
{ |
|||
uint32_t timestamp = 0; char *fieldstr; uint64_t l; int32_t ind,i=0,j,m=-1; cJSON *obj,*item,*array,*lineobj = cJSON_CreateObject(); |
|||
while ( i+1 < len ) |
|||
{ |
|||
//printf("ind.%d i.%d vs len.%d\n",linebuf[i],i,len);
|
|||
if ( (ind= linebuf[i++]) >= MMJSON_BOUNDARY ) |
|||
{ |
|||
if ( ind != MMJSON_STRING ) |
|||
{ |
|||
printf("illegal field ind.%d (%s)\n",ind,jprint(lineobj,0)); |
|||
free_json(lineobj); |
|||
return(0); |
|||
} |
|||
else |
|||
{ |
|||
fieldstr = (char *)&linebuf[i++]; |
|||
while ( linebuf[i] != 0 ) |
|||
i++; |
|||
i++; |
|||
} |
|||
} else fieldstr = MM_fields[ind]; |
|||
if ( linebuf[i] == MMJSON_ARRAY8 ) |
|||
{ |
|||
i++; |
|||
m = linebuf[i++]; |
|||
} |
|||
else if ( linebuf[i] == MMJSON_ARRAY16 ) |
|||
{ |
|||
i++; |
|||
i += MMJSON_rwnum(0,&linebuf[i],&l,2); |
|||
m = (int32_t)l; |
|||
} |
|||
else if ( linebuf[i] == MMJSON_ARRAY32 ) |
|||
{ |
|||
i++; |
|||
i += MMJSON_rwnum(0,&linebuf[i],&l,4); |
|||
m = (int32_t)l; |
|||
} else m = -1; |
|||
if ( m >= 0 ) |
|||
{ |
|||
//printf("%s i.%d m.%d\n",fieldstr,i,m);
|
|||
array = cJSON_CreateArray(); |
|||
for (j=0; j<m; j++) |
|||
{ |
|||
item = cJSON_CreateObject(); |
|||
if ( (i= MMJSON_decodeitem(item,linebuf,i,len,fieldstr,×tamp)) < 0 ) |
|||
{ |
|||
printf("error decoding item ind.%s (%s)\n",fieldstr,jprint(lineobj,0)); |
|||
free_json(array); |
|||
free_json(lineobj); |
|||
return(0); |
|||
} |
|||
obj = jobj(item,fieldstr); |
|||
jaddi(array,jduplicate(obj)); |
|||
free_json(item); |
|||
} |
|||
jadd(lineobj,fieldstr,array); |
|||
} |
|||
else if ( (i= MMJSON_decodeitem(lineobj,linebuf,i,len,fieldstr,×tamp)) < 0 ) |
|||
{ |
|||
printf("error decoding item ind.%s (%s)\n",fieldstr,jprint(lineobj,0)); |
|||
free_json(lineobj); |
|||
return(0); |
|||
} |
|||
//printf("i.%d/%d ind.%d %s valind.%d\n",i,len,ind,MM_fields[ind],linebuf[i]);
|
|||
} |
|||
return(jprint(lineobj,1)); |
|||
} |
|||
|
|||
int32_t MMJSON_encodeval(uint8_t *linebuf,int32_t k,int32_t ind,char *v,uint32_t *timestampp,cJSON *ptr,char *fieldstr) |
|||
{ |
|||
double val; char checkstr[512]; uint64_t l; int32_t valind,len,isstr=0,coinind,j,dots,diff; |
|||
if ( ind >= 0 ) |
|||
{ |
|||
fieldstr = MM_fields[ind]; |
|||
if ( strcmp("utxocoin",fieldstr) == 0 || strcmp("alice",fieldstr) == 0 || strcmp("bob",fieldstr) == 0 || strcmp("base",fieldstr) == 0 || strcmp("rel",fieldstr) == 0 || strcmp("coin",fieldstr) == 0 || strcmp("txfee",fieldstr) == 0 || strcmp("desttxfee",fieldstr) == 0 || strcmp("price64",fieldstr) == 0 || strcmp("satoshis",fieldstr) == 0 || strcmp("destsatoshis",fieldstr) == 0 ) |
|||
isstr = 1; |
|||
else isstr = 0; |
|||
} |
|||
//printf("%s.(%s) k.%d\n",fieldstr,v,k);
|
|||
if ( (valind= mmfind(v)) >= 0 ) |
|||
{ |
|||
linebuf[k++] = valind; |
|||
return(k); |
|||
} |
|||
else if ( strcmp("0",v) == 0 ) |
|||
{ |
|||
if ( isstr != 0 ) |
|||
linebuf[k++] = MMJSON_ZEROSTR; |
|||
else linebuf[k++] = MMJSON_ZERO; |
|||
return(k); |
|||
} |
|||
for (j=dots=0; v[j]!=0; j++) |
|||
{ |
|||
if ( (v[j] < '0' || v[j] > '9') && v[j] != '.' ) |
|||
break; |
|||
else if ( v[j] == '.' ) |
|||
dots++; |
|||
} |
|||
if ( dots == 3 && v[j] == 0 && strlen(v) < 17 && is_ipaddr(v) != 0 ) |
|||
{ |
|||
//printf("<ipaddr> ");
|
|||
linebuf[k++] = MMJSON_IPADDR; |
|||
l = calc_ipbits(v); |
|||
k += MMJSON_rwnum(1,&linebuf[k],&l,4); |
|||
} |
|||
else if ( dots == 1 && v[j] == 0 ) |
|||
{ |
|||
if ( (val= atof(v)) > SMALLVAL ) |
|||
{ |
|||
l = SATOSHIDEN * (val + 0.000000005); |
|||
sprintf(checkstr,"%.8f",dstr(l)); |
|||
if ( strcmp(checkstr,v) == 0 ) |
|||
{ |
|||
//printf("<double> ");
|
|||
linebuf[k++] = MMJSON_DOUBLE; |
|||
k += MMJSON_rwnum(1,&linebuf[k],&l,8); |
|||
} else printf("ERR.<%s %s> ",v,checkstr); |
|||
} |
|||
} |
|||
else if ( (len= is_hexstr(v,0)) == 64 ) |
|||
{ |
|||
//printf("<bits256> ");
|
|||
linebuf[k++] = MMJSON_BITS256; |
|||
decode_hex(&linebuf[k],32,v), k += 32; |
|||
} |
|||
else if ( len == 66 ) |
|||
{ |
|||
//printf("<secp33> ");
|
|||
linebuf[k++] = MMJSON_SECP33; |
|||
decode_hex(&linebuf[k],33,v), k += 33; |
|||
} |
|||
else if ( len == 65*2 ) |
|||
{ |
|||
//printf("<sig> ");
|
|||
linebuf[k++] = MMJSON_SIG; |
|||
decode_hex(&linebuf[k],65,v), k += 65; |
|||
} |
|||
else if ( len == 40 ) |
|||
{ |
|||
//printf("<rmd160> ");
|
|||
linebuf[k++] = MMJSON_RMD160; |
|||
decode_hex(&linebuf[k],20,v), k += 20; |
|||
} |
|||
else if ( len > 40 ) |
|||
{ |
|||
printf("ERR.<hex.%d> ",len/2); |
|||
} |
|||
else if ( is_decimalstr(v) != 0 && (l= calc_nxt64bits(v)) > 0 ) |
|||
{ |
|||
if ( l < 0x100 ) |
|||
{ |
|||
//printf("<decimal8> ");
|
|||
if ( l == 0 ) |
|||
{ |
|||
linebuf[k++] = isstr != 0 ? MMJSON_ZEROSTR : MMJSON_ZERO; |
|||
} |
|||
else |
|||
{ |
|||
linebuf[k++] = isstr != 0 ? MMJSON_DECIMAL8STR : MMJSON_DECIMAL8; |
|||
linebuf[k++] = (uint8_t)l; |
|||
} |
|||
} |
|||
else if ( l < 0x10000 ) |
|||
{ |
|||
//printf("<decimal16> ");
|
|||
linebuf[k++] = isstr != 0 ? MMJSON_DECIMAL16STR : MMJSON_DECIMAL16; |
|||
k += MMJSON_rwnum(1,&linebuf[k],&l,2); |
|||
} |
|||
else if ( l < 0x1000000 ) |
|||
{ |
|||
linebuf[k++] = isstr != 0 ? MMJSON_DECIMAL24STR : MMJSON_DECIMAL24; |
|||
//printf("decimal24 %llu %s (%s) %d\n",(long long)l,v,fieldstr,linebuf[k-1]);
|
|||
k += MMJSON_rwnum(1,&linebuf[k],&l,3); |
|||
} |
|||
else if ( l < 0x100000000LL ) |
|||
{ |
|||
if ( v[0] != '"' && *timestampp == 0 && strcmp(fieldstr,"timestamp") == 0 ) |
|||
{ |
|||
*timestampp = (uint32_t)atol(v); |
|||
//printf("<timestamp> ");
|
|||
linebuf[k++] = MMJSON_TIMESTAMP; |
|||
l = *timestampp; |
|||
k += MMJSON_rwnum(1,&linebuf[k],&l,4); |
|||
} |
|||
else if ( v[0] != '"' && *timestampp != 0 && (diff= ((uint32_t)atol(v)-*timestampp)) < 0x100 && diff >= 0 ) |
|||
{ |
|||
//printf("<timediff.8> ");
|
|||
linebuf[k++] = MMJSON_TIMEDIFF8; |
|||
linebuf[k++] = (uint8_t)diff; |
|||
} |
|||
else if ( v[0] != '"' && *timestampp != 0 && (diff= ((uint32_t)atol(v)-*timestampp)) < 0x10000 && diff >= 0 ) |
|||
{ |
|||
//printf("<timediff.16> ");
|
|||
linebuf[k++] = MMJSON_TIMEDIFF16; |
|||
l = diff; |
|||
k += MMJSON_rwnum(1,&linebuf[k],&l,2); |
|||
} |
|||
else |
|||
{ |
|||
//printf("<decimal32>.%u %08x\n",(uint32_t)l,(uint32_t)l);
|
|||
linebuf[k++] = isstr != 0 ? MMJSON_DECIMAL32STR : MMJSON_DECIMAL32; |
|||
k += MMJSON_rwnum(1,&linebuf[k],&l,4); |
|||
} |
|||
} |
|||
else if ( l < 0x10000000000LL ) |
|||
{ |
|||
//printf("<decimal40> ");
|
|||
linebuf[k++] = isstr != 0 ? MMJSON_DECIMAL40STR : MMJSON_DECIMAL40; |
|||
k += MMJSON_rwnum(1,&linebuf[k],&l,5); |
|||
} |
|||
else if ( l < 0x1000000000000LL ) |
|||
{ |
|||
//printf("<decimal48> ");
|
|||
linebuf[k++] = isstr != 0 ? MMJSON_DECIMAL48STR : MMJSON_DECIMAL48; |
|||
k += MMJSON_rwnum(1,&linebuf[k],&l,6); |
|||
} |
|||
//else if ( l < 0x100000000000000LL )
|
|||
// printf("<decimal56> ");
|
|||
else |
|||
{ |
|||
//printf("<decimal64> ");
|
|||
linebuf[k++] = isstr != 0 ? MMJSON_DECIMAL64STR : MMJSON_DECIMAL64; |
|||
k += MMJSON_rwnum(1,&linebuf[k],&l,8); |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
if ( (ind= mmfind(v)) >= 0 ) |
|||
linebuf[k++] = ind; |
|||
else |
|||
{ |
|||
for (j=0; v[j]!=0; j++) |
|||
{ |
|||
if ( v[j] >= 'a' && v[j] <= 'z' ) |
|||
continue; |
|||
else break; |
|||
} |
|||
if ( v[j] == 0 ) |
|||
{ |
|||
printf("unexpected missing string value.(%s)\n",v); |
|||
//ind = mmadd(v);
|
|||
//printf("%s.<%s>.%d ",s,v,ind);
|
|||
//linebuf[k++] = ind;
|
|||
linebuf[k++] = MMJSON_STRING; |
|||
memcpy(&linebuf[k],v,strlen(v)+1); |
|||
k += (int32_t)strlen(v) + 1; |
|||
} |
|||
else |
|||
{ |
|||
for (j=0; v[j]!=0; j++) |
|||
{ |
|||
if ( v[j] >= 'A' && v[j] <= 'Z' ) |
|||
continue; |
|||
else break; |
|||
} |
|||
if ( v[j] == 0 && (coinind= mmjson_coinfind(v)) >= 0 ) |
|||
{ |
|||
//printf("<coin> ");
|
|||
linebuf[k++] = MMJSON_COIN; |
|||
linebuf[k++] = coinind; |
|||
} |
|||
/*else if ( strlen(v) == 34 )
|
|||
{ |
|||
printf("<coinaddr> "); |
|||
k += 22; |
|||
}*/ |
|||
else |
|||
{ |
|||
linebuf[k++] = MMJSON_STRING; |
|||
if ( v[0] == '"' ) |
|||
{ |
|||
v++; |
|||
v[strlen(v)-1] = 0; |
|||
} |
|||
//printf("str.<%s> ",v);
|
|||
memcpy(&linebuf[k],v,strlen(v)+1); |
|||
k += (int32_t)strlen(v) + 1; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
return(k); |
|||
} |
|||
|
|||
int32_t MMJSON_encode(uint8_t *linebuf,char *line) |
|||
{ |
|||
uint32_t timestamp; uint64_t l; char *decodestr,*s,*v=0; cJSON *lineobj,*array,*ptr; int32_t k=0,m,i,asize,ind,z,allocv_flag; |
|||
timestamp = 0; |
|||
if ( (lineobj= cJSON_Parse(line)) != 0 ) |
|||
{ |
|||
if ( line[strlen(line)-1] == '\n' ) |
|||
line[strlen(line)-1] = 0; |
|||
//printf("%s\n",jprint(lineobj,0));
|
|||
if ( (m= cJSON_GetArraySize(lineobj)) > 0 ) |
|||
{ |
|||
ptr = lineobj->child; |
|||
for (i=0; i<m; i++,ptr=ptr->next) |
|||
{ |
|||
allocv_flag = 0; |
|||
s = jfieldname(ptr); |
|||
if ( (ind= mmfind(s)) < 0 ) |
|||
{ |
|||
printf("missing field.(%s) add to MM_fields[]\n",s); |
|||
linebuf[k++] = MMJSON_STRING; |
|||
memcpy(&linebuf[k],s,strlen(s)+1); |
|||
k += (int32_t)strlen(s) + 1; |
|||
//ind = mmadd(s);
|
|||
} else linebuf[k++] = ind; |
|||
//printf("%s ",s);
|
|||
if ( (array= jobj(lineobj,s)) != 0 && is_cJSON_Array(array) != 0 ) |
|||
{ |
|||
asize = cJSON_GetArraySize(array); |
|||
if ( asize < 0x100 ) |
|||
{ |
|||
linebuf[k++] = MMJSON_ARRAY8; |
|||
linebuf[k++] = asize; |
|||
} |
|||
else if ( asize < 0x10000 ) |
|||
{ |
|||
linebuf[k++] = MMJSON_ARRAY16; |
|||
l = asize; |
|||
k += MMJSON_rwnum(1,&linebuf[k],&l,2); |
|||
} |
|||
else |
|||
{ |
|||
linebuf[k++] = MMJSON_ARRAY32; |
|||
l = asize; |
|||
k += MMJSON_rwnum(1,&linebuf[k],&l,4); |
|||
} |
|||
for (z=0; z<asize; z++) |
|||
{ |
|||
if ( (v= jprint(jitem(array,z),0)) != 0 ) |
|||
{ |
|||
//printf("%d.(%s k.%d).%d ",z,v,k,asize);
|
|||
k = MMJSON_encodeval(linebuf,k,ind,v,×tamp,ptr,s); |
|||
free(v); |
|||
} else printf("ERROR.(%s) ",jprint(jitem(array,z),0)); |
|||
} |
|||
//printf("%s array.%d k.%d\n",fieldstr,asize,k);
|
|||
continue; |
|||
} |
|||
else if ( (v= jstr(lineobj,s)) == 0 ) |
|||
{ |
|||
v = jprint(jobj(lineobj,s),0); |
|||
//printf("allocate v.%p\n",v);
|
|||
allocv_flag = 1; |
|||
} |
|||
if ( v != 0 ) |
|||
{ |
|||
//printf("%s\n",v);
|
|||
k = MMJSON_encodeval(linebuf,k,ind,v,×tamp,ptr,s); |
|||
} |
|||
else printf("ERROR.(%s) ",jprint(jobj(lineobj,s),0)); |
|||
if ( allocv_flag != 0 && v != 0 ) |
|||
{ |
|||
//printf("free allocated v\n");
|
|||
free(v); |
|||
} |
|||
//printf("m.%d values\n",m);
|
|||
} |
|||
} |
|||
free_json(lineobj); |
|||
if ( (decodestr= MMJSON_decode(linebuf,k)) == 0 || strcmp(decodestr,line) != 0 ) |
|||
{ |
|||
for (i=0; i<k; i++) |
|||
printf("%d ",linebuf[i]); |
|||
printf(" k.%d error decoding (%s) -> (%s)\n",k,line,decodestr==0?"":decodestr); |
|||
if ( decodestr != 0 ) |
|||
free(decodestr); |
|||
return(-1); |
|||
} //else printf("decoded\n");
|
|||
free(decodestr); |
|||
} |
|||
return(k); |
|||
} |
|||
|
|||
#ifndef FROM_MARKETMAKER |
|||
#define packetout "/Users/mac/mmjson/packet.out" |
|||
#define packetlog "/Users/mac/mmjson/packet.log" |
|||
|
|||
int main(int argc, const char * argv[]) |
|||
{ |
|||
FILE *fp,*outfp; uint8_t linebuf[8192]; char line[8192],str[65]; int32_t i,k,compressed=0,n=0,total = 0; |
|||
outfp = fopen(packetout,"wb"); |
|||
if ( (fp= fopen(packetlog,"rb")) != 0 ) |
|||
{ |
|||
while ( fgets(line,sizeof(line),fp) > 0 ) |
|||
{ |
|||
n++; |
|||
total += strlen(line); |
|||
if ( (k= MMJSON_encode(linebuf,line)) > 0 ) |
|||
{ |
|||
//printf("\n");
|
|||
if ( outfp != 0 ) |
|||
fwrite(linebuf,1,k,outfp); |
|||
compressed += k; |
|||
} |
|||
else |
|||
{ |
|||
compressed += strlen(line); |
|||
//printf("error parsing.(%s)\n",line);
|
|||
} |
|||
} |
|||
fclose(fp); |
|||
if ( outfp != 0 ) |
|||
{ |
|||
uint8_t *data,*bits; int32_t numbits; bits256 seed; long fsize = ftell(outfp); |
|||
fclose(outfp); |
|||
if ( (0) && (outfp= fopen(packetout,"rb")) != 0 ) |
|||
{ |
|||
data = calloc(1,fsize); |
|||
bits = calloc(1,fsize); |
|||
if ( fread(data,1,fsize,outfp) == fsize ) |
|||
{ |
|||
memset(seed.bytes,0,sizeof(seed)); |
|||
decode_hex(seed.bytes,32,"ffffff070000810478800084000800b200101400002001400404844402d29fc4"); |
|||
numbits = ramcoder_compress(bits,(int32_t)fsize,data,(int32_t)fsize,seed); |
|||
fclose(outfp); |
|||
printf("numbits.%d %d bytes %.1f seed.%s\n",numbits,numbits/8+1,(double)compressed/(numbits/8),bits256_str(str,seed)); |
|||
} |
|||
} |
|||
} |
|||
} else printf("cant find packet.log\n"); |
|||
printf("char *MM_fields[256] = \n{\n"); |
|||
for (i=0; i<MM_numfields; i++) |
|||
printf("\"%s\", ",MM_fields[i]); |
|||
printf("\n};\nnumlines.%d size %d compressed.%d %.3f maxind.%d\n",n,total,compressed,(double)total/compressed,MM_numfields); |
|||
} |
|||
#endif |
File diff suppressed because it is too large
@ -0,0 +1,575 @@ |
|||
|
|||
/******************************************************************************
|
|||
* 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. * |
|||
* * |
|||
******************************************************************************/ |
|||
//
|
|||
// LP_utxos.c
|
|||
// marketmaker
|
|||
//
|
|||
|
|||
int32_t LP_privkey_init(int32_t mypubsock,struct iguana_info *coin,bits256 myprivkey,bits256 mypub) |
|||
{ |
|||
int32_t enable_utxos = 0; |
|||
char *script,destaddr[64]; cJSON *array,*item; bits256 txid,deposittxid,zero; int32_t used,i,flag=0,height,n,cmpflag,iambob,vout,depositvout; uint64_t *values=0,satoshis,txfee,biggerval,value,total = 0; int64_t targetval; //struct LP_utxoinfo *utxo;
|
|||
if ( coin == 0 || (IAMLP == 0 && coin->inactive != 0) ) |
|||
{ |
|||
//printf("coin not active\n");
|
|||
return(0); |
|||
} |
|||
if ( coin->privkeydepth > 0 ) |
|||
return(0); |
|||
coin->privkeydepth++; |
|||
LP_address(coin,coin->smartaddr); |
|||
//if ( coin->inactive == 0 )
|
|||
// LP_listunspent_issue(coin->symbol,coin->smartaddr,0);
|
|||
memset(zero.bytes,0,sizeof(zero)); |
|||
array = LP_listunspent(coin->symbol,coin->smartaddr,zero,zero); |
|||
if ( array != 0 ) |
|||
{ |
|||
txfee = LP_txfeecalc(coin,0,0); |
|||
if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) |
|||
{ |
|||
coin->numutxos = n; |
|||
//printf("LP_privkey_init %s %d\n",coin->symbol,n);
|
|||
for (iambob=0; iambob<=1; iambob++) |
|||
{ |
|||
if ( iambob == 0 ) |
|||
values = calloc(n,sizeof(*values)); |
|||
else memset(values,0,n * sizeof(*values)); |
|||
used = 0; |
|||
for (i=0; i<n; i++) |
|||
{ |
|||
item = jitem(array,i); |
|||
value = LP_listunspent_parseitem(coin,&txid,&vout,&height,item); |
|||
satoshis = LP_txvalue(destaddr,coin->symbol,txid,vout); |
|||
if ( satoshis != 0 && satoshis != value ) |
|||
printf("%s %s privkey_init value %.8f vs %.8f (%s) %.8f %.8f\n",coin->symbol,coin->smartaddr,dstr(satoshis),dstr(value),jprint(item,0),jdouble(item,"amount"),jdouble(item,"interest")); |
|||
if ( coin->electrum != 0 || LP_inventory_prevent(iambob,coin->symbol,txid,vout) == 0 )//&& height > 0 )
|
|||
{ |
|||
values[i] = satoshis; |
|||
//flag += LP_address_utxoadd(coin,destaddr,txid,vout,satoshis,height,-1);
|
|||
} else used++; |
|||
} |
|||
//printf("array.%d\n",n);
|
|||
while ( used < n-1 ) |
|||
{ |
|||
//for (i=0; i<n; i++)
|
|||
// printf("%.8f ",dstr(values[i]));
|
|||
//printf("used.%d of n.%d\n",used,n);
|
|||
if ( (i= LP_maxvalue(values,n)) >= 0 ) |
|||
{ |
|||
item = jitem(array,i); |
|||
if ( coin->electrum == 0 ) |
|||
{ |
|||
deposittxid = jbits256(item,"txid"); |
|||
depositvout = juint(item,"vout"); |
|||
script = jstr(item,"scriptPubKey"); |
|||
} |
|||
else |
|||
{ |
|||
deposittxid = jbits256(item,"tx_hash"); |
|||
depositvout = juint(item,"tx_pos"); |
|||
script = coin->smartaddr; |
|||
} |
|||
biggerval = values[i]; |
|||
values[i] = 0, used++; |
|||
if ( iambob == 0 ) |
|||
targetval = (biggerval / 776) + txfee; |
|||
else targetval = (biggerval / 9) * 8 + 2*txfee; |
|||
if ( targetval < txfee*2 ) |
|||
targetval = txfee*2; |
|||
//printf("iambob.%d i.%d deposit %.8f min %.8f target %.8f\n",iambob,i,dstr(biggerval),dstr((1+LP_MINSIZE_TXFEEMULT)*txfee),dstr(targetval));
|
|||
if ( biggerval < (1+LP_MINSIZE_TXFEEMULT)*txfee ) |
|||
continue; |
|||
i = -1; |
|||
if ( iambob != 0 ) |
|||
{ |
|||
if ( (i= LP_nearestvalue(iambob,values,n,targetval)) < 0 ) |
|||
targetval /= 4; |
|||
if ( targetval < txfee*(1+LP_MINSIZE_TXFEEMULT) ) |
|||
continue; |
|||
} |
|||
if ( i >= 0 || (i= LP_nearestvalue(iambob,values,n,targetval)) >= 0 ) |
|||
{ |
|||
//printf("iambob.%d i.%d %.8f target %.8f\n",iambob,i,dstr(biggerval),dstr(targetval));
|
|||
item = jitem(array,i); |
|||
cmpflag = 0; |
|||
if ( coin->electrum == 0 ) |
|||
{ |
|||
txid = jbits256(item,"txid"); |
|||
vout = juint(item,"vout"); |
|||
if ( jstr(item,"scriptPubKey") != 0 && strcmp(script,jstr(item,"scriptPubKey")) == 0 ) |
|||
cmpflag = 1; |
|||
} |
|||
else |
|||
{ |
|||
txid = jbits256(item,"tx_hash"); |
|||
vout = juint(item,"tx_pos"); |
|||
cmpflag = 1; |
|||
} |
|||
if ( cmpflag != 0 ) |
|||
{ |
|||
value = values[i]; |
|||
values[i] = 0, used++; |
|||
/*portable_mutex_lock(&LP_UTXOmutex);
|
|||
if ( iambob != 0 ) |
|||
{ |
|||
if ( (utxo= LP_utxoadd(1,coin->symbol,txid,vout,value,deposittxid,depositvout,biggerval,coin->smartaddr,mypub,LP_gui,G.LP_sessionid,value)) != 0 ) |
|||
{ |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
//printf("call utxoadd\n");
|
|||
if ( (utxo= LP_utxoadd(0,coin->symbol,deposittxid,depositvout,biggerval,txid,vout,value,coin->smartaddr,mypub,LP_gui,G.LP_sessionid,biggerval)) != 0 ) |
|||
{ |
|||
} |
|||
} |
|||
portable_mutex_unlock(&LP_UTXOmutex);*/ |
|||
total += value; |
|||
} // else printf("scriptmismatch.(%s) vs %s\n",script,jprint(item,0));
|
|||
} //else printf("nothing near i.%d\n",i);
|
|||
} else break; |
|||
} |
|||
if ( enable_utxos == 0 ) |
|||
break; |
|||
} |
|||
} |
|||
free_json(array); |
|||
if ( 0 && flag != 0 ) |
|||
LP_postutxos(coin->symbol,coin->smartaddr); |
|||
} |
|||
if ( values != 0 ) |
|||
free(values); |
|||
if ( coin->privkeydepth > 0 ) |
|||
coin->privkeydepth--; |
|||
//printf("privkey.%s %.8f\n",symbol,dstr(total));
|
|||
return(flag); |
|||
} |
|||
|
|||
char *LP_secretaddresses(void *ctx,char *prefix,char *passphrase,int32_t n,uint8_t taddr,uint8_t pubtype) |
|||
{ |
|||
int32_t i; uint8_t tmptype,pubkey33[33],rmd160[20]; char output[777*45],str[65],str2[65],buf[8192],wifstr[128],coinaddr[64]; bits256 checkprivkey,privkey,pubkey; cJSON *retjson; |
|||
retjson = cJSON_CreateObject(); |
|||
if ( prefix == 0 || prefix[0] == 0 ) |
|||
prefix = "secretaddress"; |
|||
if ( passphrase == 0 || passphrase[0] == 0 ) |
|||
passphrase = "password"; |
|||
if ( n <= 0 ) |
|||
n = 16; |
|||
else if ( n > 777 ) |
|||
n = 777; |
|||
conv_NXTpassword(privkey.bytes,pubkey.bytes,(uint8_t *)passphrase,(int32_t)strlen(passphrase)); |
|||
bitcoin_priv2pub(ctx,pubkey33,coinaddr,privkey,taddr,pubtype); |
|||
printf("generator (%s) secrets.[%d] <%s> t.%u p.%u\n",coinaddr,n,passphrase,taddr,pubtype); |
|||
sprintf(output,"\"addresses\":["); |
|||
for (i=0; i<n; i++) |
|||
{ |
|||
sprintf(buf,"%s %s %03d",prefix,passphrase,i); |
|||
conv_NXTpassword(privkey.bytes,pubkey.bytes,(uint8_t *)buf,(int32_t)strlen(buf)); |
|||
bitcoin_priv2pub(ctx,pubkey33,coinaddr,privkey,taddr,pubtype); |
|||
bitcoin_priv2wif(0,wifstr,privkey,188); |
|||
bitcoin_wif2priv(0,&tmptype,&checkprivkey,wifstr); |
|||
bitcoin_addr2rmd160(taddr,&tmptype,rmd160,coinaddr); |
|||
if ( bits256_cmp(checkprivkey,privkey) != 0 ) |
|||
{ |
|||
printf("WIF.(%s) error -> %s vs %s?\n",wifstr,bits256_str(str,privkey),bits256_str(str2,checkprivkey)); |
|||
free_json(retjson); |
|||
return(clonestr("{\"error\":\"couldnt validate wifstr\"}")); |
|||
} |
|||
else if ( tmptype != pubtype ) |
|||
{ |
|||
printf("checktype.%d != pubtype.%d\n",tmptype,pubtype); |
|||
free_json(retjson); |
|||
return(clonestr("{\"error\":\"couldnt validate pubtype\"}")); |
|||
} |
|||
jaddstr(retjson,coinaddr,wifstr); |
|||
sprintf(output+strlen(output),"\\\"%s\\\"%c ",coinaddr,i<n-1?',':' '); |
|||
printf("./komodo-cli jumblr_secret %s\n",coinaddr); |
|||
} |
|||
printf("%s]\n",output); |
|||
return(jprint(retjson,1)); |
|||
} |
|||
|
|||
static const char base58_chars[] = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; |
|||
|
|||
int32_t LP_wifstr_valid(char *wifstr) |
|||
{ |
|||
bits256 privkey,cmpkey; uint8_t wiftype; char cmpstr[128],cmpstr2[128]; int32_t i; |
|||
memset(privkey.bytes,0,sizeof(privkey)); |
|||
memset(cmpkey.bytes,0,sizeof(cmpkey)); |
|||
for (i=0; wifstr[i]!=0; i++) |
|||
if ( strchr(base58_chars,wifstr[i]) == 0 ) |
|||
return(0); |
|||
bitcoin_wif2priv(0,&wiftype,&privkey,wifstr); |
|||
bitcoin_priv2wif(0,cmpstr,privkey,wiftype); |
|||
if ( strcmp(cmpstr,wifstr) == 0 ) |
|||
{ |
|||
printf("%s is valid wif\n",wifstr); |
|||
return(1); |
|||
} |
|||
else if ( bits256_nonz(privkey) != 0 ) |
|||
{ |
|||
bitcoin_wif2priv(0,&wiftype,&cmpkey,cmpstr); |
|||
bitcoin_priv2wiflong(0,cmpstr2,privkey,wiftype); |
|||
char str[65],str2[65]; printf("mismatched wifstr %s -> %s -> %s %s %s\n",wifstr,bits256_str(str,privkey),cmpstr,bits256_str(str2,cmpkey),cmpstr2); |
|||
if ( bits256_cmp(privkey,cmpkey) == 0 ) |
|||
return(1); |
|||
} |
|||
return(0); |
|||
} |
|||
|
|||
bits256 LP_privkeycalc(void *ctx,uint8_t *pubkey33,bits256 *pubkeyp,struct iguana_info *coin,char *passphrase,char *wifstr) |
|||
{ |
|||
//static uint32_t counter;
|
|||
bits256 privkey,userpub,zero,userpass,checkkey,tmpkey; char tmpstr[128]; cJSON *retjson; uint8_t tmptype; int32_t notarized; uint64_t nxtaddr; |
|||
if ( (wifstr == 0 || wifstr[0] == 0) && LP_wifstr_valid(passphrase) > 0 ) |
|||
{ |
|||
wifstr = passphrase; |
|||
passphrase = 0; |
|||
} |
|||
if ( passphrase != 0 && passphrase[0] != 0 ) |
|||
{ |
|||
calc_NXTaddr(G.LP_NXTaddr,userpub.bytes,(uint8_t *)passphrase,(int32_t)strlen(passphrase)); |
|||
conv_NXTpassword(privkey.bytes,pubkeyp->bytes,(uint8_t *)passphrase,(int32_t)strlen(passphrase)); |
|||
privkey.bytes[0] &= 248, privkey.bytes[31] &= 127, privkey.bytes[31] |= 64; |
|||
//vcalc_sha256(0,checkkey.bytes,(uint8_t *)passphrase,(int32_t)strlen(passphrase));
|
|||
//printf("SHA256.(%s) ",bits256_str(pstr,checkkey));
|
|||
//printf("privkey.(%s)\n",bits256_str(pstr,privkey));
|
|||
bitcoin_priv2wif(coin->wiftaddr,tmpstr,privkey,coin->wiftype); |
|||
bitcoin_wif2priv(coin->wiftaddr,&tmptype,&checkkey,tmpstr); |
|||
if ( bits256_cmp(privkey,checkkey) != 0 ) |
|||
{ |
|||
char str[65],str2[65]; printf("mismatched privkeys from wif conversion: %s -> %s -> %s\n",bits256_str(str,privkey),tmpstr,bits256_str(str2,checkkey)); |
|||
exit(1); |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
bitcoin_wif2priv(coin->wiftaddr,&tmptype,&privkey,wifstr); |
|||
bitcoin_priv2wif(coin->wiftaddr,tmpstr,privkey,tmptype); |
|||
if ( strcmp(tmpstr,wifstr) != 0 ) |
|||
{ |
|||
printf("error reproducing the wifstr, likely edge case like non-supported uncompressed pubkey\n"); |
|||
exit(1); |
|||
} |
|||
tmpkey = privkey; |
|||
nxtaddr = conv_NXTpassword(tmpkey.bytes,pubkeyp->bytes,0,0); |
|||
RS_encode(G.LP_NXTaddr,nxtaddr); |
|||
} |
|||
bitcoin_priv2pub(ctx,coin->pubkey33,coin->smartaddr,privkey,coin->taddr,coin->pubtype); |
|||
if ( coin->counter == 0 ) |
|||
{ |
|||
coin->counter++; |
|||
memcpy(G.LP_pubsecp,coin->pubkey33,33); |
|||
bitcoin_priv2wif(coin->wiftaddr,tmpstr,privkey,coin->wiftype); |
|||
bitcoin_addr2rmd160(coin->taddr,&tmptype,G.LP_myrmd160,coin->smartaddr); |
|||
LP_privkeyadd(privkey,G.LP_myrmd160); |
|||
G.LP_privkey = privkey; |
|||
if ( G.counter++ == 0 ) |
|||
{ |
|||
bitcoin_priv2wif(coin->wiftaddr,G.USERPASS_WIFSTR,privkey,188); |
|||
bitcoin_wif2priv(coin->wiftaddr,&tmptype,&checkkey,G.USERPASS_WIFSTR); |
|||
if ( bits256_cmp(checkkey,privkey) != 0 ) |
|||
{ |
|||
char str[65],str2[65]; |
|||
printf("FATAL ERROR converting USERPASS_WIFSTR %s -> %s != %s\n",G.USERPASS_WIFSTR,bits256_str(str,checkkey),bits256_str(str2,privkey)); |
|||
exit(-1); |
|||
} |
|||
conv_NXTpassword(userpass.bytes,pubkeyp->bytes,(uint8_t *)G.USERPASS_WIFSTR,(int32_t)strlen(G.USERPASS_WIFSTR)); |
|||
userpub = curve25519(userpass,curve25519_basepoint9()); |
|||
printf("userpass.(%s)\n",bits256_str(G.USERPASS,userpub)); |
|||
} |
|||
} |
|||
if ( coin->importedprivkey == 0 && coin->electrum == 0 && coin->userpass[0] != 0 && LP_getheight(¬arized,coin) > 0 ) |
|||
{ |
|||
memset(zero.bytes,0,sizeof(zero)); |
|||
LP_listunspent_issue(coin->symbol,coin->smartaddr,0,zero,zero); |
|||
if ( (retjson= LP_importprivkey(coin->symbol,tmpstr,coin->smartaddr,-1)) != 0 ) |
|||
{ |
|||
if ( jobj(retjson,"error") != 0 ) |
|||
{ |
|||
printf("cant importprivkey.%s %s -> (%s), abort session\n",coin->symbol,coin->smartaddr,jprint(retjson,1)); |
|||
exit(-1); |
|||
} |
|||
free_json(retjson); |
|||
} |
|||
coin->importedprivkey = (uint32_t)time(NULL); |
|||
} |
|||
vcalc_sha256(0,checkkey.bytes,privkey.bytes,sizeof(privkey)); |
|||
checkkey.bytes[0] &= 248, checkkey.bytes[31] &= 127, checkkey.bytes[31] |= 64; |
|||
G.LP_mypub25519 = *pubkeyp = curve25519(checkkey,curve25519_basepoint9()); |
|||
G.LP_mypriv25519 = checkkey; |
|||
LP_pubkeyadd(G.LP_mypub25519); |
|||
return(privkey); |
|||
} |
|||
|
|||
void LP_privkey_updates(void *ctx,int32_t pubsock,char *passphrase) |
|||
{ |
|||
struct iguana_info *coin,*tmp; bits256 pubkey,privkey; uint8_t pubkey33[33]; int32_t initonly; |
|||
initonly = (passphrase != 0); |
|||
memset(privkey.bytes,0,sizeof(privkey)); |
|||
memset(pubkey.bytes,0,sizeof(pubkey)); |
|||
//printf("Total coins: %d\n", HASH_COUNT(LP_coins));
|
|||
//int num_iter = 0;
|
|||
HASH_ITER(hh,LP_coins,coin,tmp) |
|||
{ |
|||
//printf("LP_privkey_updates [%02d / %02d]\n", num_iter++, HASH_COUNT(LP_coins));
|
|||
if ( initonly != 0 ) |
|||
{ |
|||
coin->counter = 0; |
|||
memset(coin->smartaddr,0,sizeof(coin->smartaddr)); |
|||
if ( bits256_nonz(privkey) == 0 || coin->smartaddr[0] == 0 ) |
|||
privkey = LP_privkeycalc(ctx,pubkey33,&pubkey,coin,passphrase,""); |
|||
} |
|||
//printf("i.%d of %d\n",i,LP_numcoins);
|
|||
else if ( IAMLP == 0 || coin->inactive == 0 ) |
|||
{ |
|||
//printf("from updates %s\n",coin->symbol);
|
|||
if ( 0 && LP_privkey_init(pubsock,coin,G.LP_privkey,G.LP_mypub25519) == 0 && (LP_rand() % 10) == 0 ) |
|||
{ |
|||
//LP_postutxos(coin->symbol,coin->smartaddr);
|
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
int32_t LP_passphrase_init(char *passphrase,char *gui) |
|||
{ |
|||
static void *ctx; int32_t counter; //iambob,; struct LP_utxoinfo *utxo,*tmp;
|
|||
if ( ctx == 0 ) |
|||
ctx = bitcoin_ctx(); |
|||
if ( G.LP_pendingswaps != 0 ) |
|||
return(-1); |
|||
G.initializing = 1; |
|||
if ( gui == 0 ) |
|||
gui = "cli"; |
|||
counter = G.USERPASS_COUNTER; |
|||
while ( G.waiting == 0 ) |
|||
{ |
|||
printf("waiting for G.waiting\n"); |
|||
sleep(5); |
|||
} |
|||
memset(&G,0,sizeof(G)); |
|||
vcalc_sha256(0,G.LP_passhash.bytes,(uint8_t *)passphrase,(int32_t)strlen(passphrase)); |
|||
LP_privkey_updates(ctx,LP_mypubsock,passphrase); |
|||
init_hexbytes_noT(G.LP_myrmd160str,G.LP_myrmd160,20); |
|||
G.LP_sessionid = (uint32_t)time(NULL); |
|||
safecopy(G.gui,gui,sizeof(G.gui)); |
|||
LP_tradebot_pauseall(); |
|||
LP_portfolio_reset(); |
|||
LP_priceinfos_clear(); |
|||
G.USERPASS_COUNTER = counter; |
|||
G.initializing = 0; |
|||
return(0); |
|||
} |
|||
|
|||
void LP_privkey_tests() |
|||
{ |
|||
char wifstr[64],str[65],str2[65]; bits256 privkey,checkkey; int32_t i; uint8_t tmptype; |
|||
for (i=0; i<200000000; i++) |
|||
{ |
|||
privkey = rand256(0); |
|||
bitcoin_priv2wif(0,wifstr,privkey,0xff); |
|||
bitcoin_wif2priv(0,&tmptype,&checkkey,wifstr); |
|||
if ( bits256_cmp(privkey,checkkey) != 0 ) |
|||
{ |
|||
printf("i.%d: %s vs %s\n",i,bits256_str(str,privkey),bits256_str(str2,checkkey)); |
|||
exit(-1); |
|||
} |
|||
if ( (i % 1000000) == 0 ) |
|||
fprintf(stderr,"%.1f%% ",100.*(double)i/200000000); |
|||
} |
|||
printf("%d privkeys checked\n",i); |
|||
} |
|||
|
|||
|
|||
// from https://github.com/owencm/C-Steganography-Framework
|
|||
#include "../../crypto777/jpeg/cdjpeg.h" // Common decls for compressing and decompressing jpegs |
|||
|
|||
int32_t LP_jpg_process(int32_t *capacityp,char *inputfname,char *outputfname,uint8_t *decoded,uint8_t *data,int32_t required,int32_t power2,char *passphrase) |
|||
{ |
|||
struct jpeg_decompress_struct inputinfo; |
|||
struct jpeg_compress_struct outputinfo; |
|||
struct jpeg_error_mgr jerr; |
|||
jvirt_barray_ptr *coef_arrays; |
|||
JDIMENSION i,compnum,rownum,blocknum; |
|||
JBLOCKARRAY coef_buffers[MAX_COMPONENTS]; |
|||
JBLOCKARRAY row_ptrs[MAX_COMPONENTS]; |
|||
FILE *input_file,*output_file; int32_t val,modified,emit,totalrows,limit; |
|||
if ( power2 < 0 || power2 > 16 ) |
|||
power2 = 4; |
|||
limit = 1; |
|||
while ( power2 > 0 ) |
|||
{ |
|||
limit <<= 1; |
|||
power2--; |
|||
} |
|||
if ((input_file = fopen(inputfname, READ_BINARY)) == NULL) { |
|||
fprintf(stderr, "Can't open %s\n", inputfname); |
|||
exit(EXIT_FAILURE); |
|||
} |
|||
// Initialize the JPEG compression and decompression objects with default error handling
|
|||
inputinfo.err = jpeg_std_error(&jerr); |
|||
jpeg_create_decompress(&inputinfo); |
|||
// Specify data source for decompression and recompression
|
|||
jpeg_stdio_src(&inputinfo, input_file); |
|||
(void) jpeg_read_header(&inputinfo, TRUE); |
|||
for (compnum=0; compnum<inputinfo.num_components; compnum++) |
|||
coef_buffers[compnum] = ((&inputinfo)->mem->alloc_barray)((j_common_ptr)&inputinfo,JPOOL_IMAGE,inputinfo.comp_info[compnum].width_in_blocks,inputinfo.comp_info[compnum].height_in_blocks); |
|||
coef_arrays = jpeg_read_coefficients(&inputinfo); |
|||
// Copy DCT coeffs to a new array
|
|||
int num_components = inputinfo.num_components; |
|||
size_t block_row_size[num_components]; |
|||
int width_in_blocks[num_components]; |
|||
int height_in_blocks[num_components]; |
|||
*capacityp = modified = emit = totalrows = 0; |
|||
if ( decoded != 0 ) |
|||
memset(decoded,0,required/8+1); |
|||
for (compnum=0; compnum<num_components; compnum++) |
|||
{ |
|||
height_in_blocks[compnum] = inputinfo.comp_info[compnum].height_in_blocks; |
|||
width_in_blocks[compnum] = inputinfo.comp_info[compnum].width_in_blocks; |
|||
block_row_size[compnum] = (size_t) SIZEOF(JCOEF)*DCTSIZE2*width_in_blocks[compnum]; |
|||
for (rownum=0; rownum<height_in_blocks[compnum]; rownum++) |
|||
{ |
|||
row_ptrs[compnum] = ((&inputinfo)->mem->access_virt_barray)((j_common_ptr)&inputinfo,coef_arrays[compnum],rownum,(JDIMENSION)1,FALSE); |
|||
for (blocknum=0; blocknum<width_in_blocks[compnum]; blocknum++) |
|||
{ |
|||
for (i=0; i<DCTSIZE2; i++) |
|||
{ |
|||
val = row_ptrs[compnum][0][blocknum][i]; |
|||
if ( val < -power2 || val > power2 ) |
|||
{ |
|||
if ( decoded != 0 && (val & 1) != 0 && *capacityp < required ) |
|||
decoded[*capacityp >> 3] |= (1 << (*capacityp & 7)); |
|||
(*capacityp)++; |
|||
} |
|||
coef_buffers[compnum][rownum][blocknum][i] = val; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
printf("capacity %d required.%d\n",*capacityp,required); |
|||
if ( *capacityp > required && outputfname != 0 && outputfname[0] != 0 ) |
|||
{ |
|||
if ((output_file = fopen(outputfname, WRITE_BINARY)) == NULL) { |
|||
fprintf(stderr, "Can't open %s\n", outputfname); |
|||
exit(EXIT_FAILURE); |
|||
} |
|||
outputinfo.err = jpeg_std_error(&jerr); |
|||
jpeg_create_compress(&outputinfo); |
|||
jpeg_stdio_dest(&outputinfo, output_file); |
|||
jpeg_copy_critical_parameters(&inputinfo,&outputinfo); |
|||
// Print out or modify DCT coefficients
|
|||
for (compnum=0; compnum<num_components; compnum++) |
|||
{ |
|||
for (rownum=0; rownum<height_in_blocks[compnum]; rownum++) |
|||
{ |
|||
for (blocknum=0; blocknum<width_in_blocks[compnum]; blocknum++) |
|||
{ |
|||
//printf("\n\nComponent: %i, Row:%i, Column: %i\n", compnum, rownum, blocknum);
|
|||
for (i=0; i<DCTSIZE2; i++) |
|||
{ |
|||
val = coef_buffers[compnum][rownum][blocknum][i]; |
|||
if ( val < -power2 || val > power2 ) |
|||
{ |
|||
val &= ~1; |
|||
if ( (data[emit >> 3] & (1 << (emit&7))) != 0 ) |
|||
val |= 1; |
|||
emit++; |
|||
} |
|||
coef_buffers[compnum][rownum][blocknum][i] = val; |
|||
//printf("%i,", coef_buffers[compnum][rownum][blocknum][i]);
|
|||
} |
|||
} |
|||
} |
|||
} |
|||
//printf("\n\n");
|
|||
|
|||
/* Output the new DCT coeffs to a JPEG file */ |
|||
modified = 0; |
|||
for (compnum=0; compnum<num_components; compnum++) |
|||
{ |
|||
for (rownum=0; rownum<height_in_blocks[compnum]; rownum++) |
|||
{ |
|||
row_ptrs[compnum] = ((&outputinfo)->mem->access_virt_barray)((j_common_ptr)&outputinfo,coef_arrays[compnum],rownum,(JDIMENSION)1,TRUE); |
|||
if ( memcmp(row_ptrs[compnum][0][0],coef_buffers[compnum][rownum][0],block_row_size[compnum]) != 0 ) |
|||
{ |
|||
memcpy(row_ptrs[compnum][0][0],coef_buffers[compnum][rownum][0],block_row_size[compnum]); |
|||
modified++; |
|||
} |
|||
totalrows++; |
|||
} |
|||
} |
|||
// Write to the output file
|
|||
jpeg_write_coefficients(&outputinfo, coef_arrays); |
|||
// Finish compression and release memory
|
|||
jpeg_finish_compress(&outputinfo); |
|||
jpeg_destroy_compress(&outputinfo); |
|||
fclose(output_file); |
|||
} |
|||
jpeg_finish_decompress(&inputinfo); |
|||
jpeg_destroy_decompress(&inputinfo); |
|||
fclose(input_file); |
|||
if ( modified != 0 ) |
|||
{ |
|||
printf("New DCT coefficients successfully written to %s, capacity %d modifiedrows.%d/%d emit.%d\n",outputfname,*capacityp,modified,totalrows,emit); |
|||
} |
|||
return(modified); |
|||
} |
|||
|
|||
char *LP_jpg(char *srcfile,char *destfile,int32_t power2,char *passphrase,char *datastr,int32_t required) |
|||
{ |
|||
cJSON *retjson; int32_t len=0,modified,capacity; char *decodedstr; uint8_t *data=0,*decoded=0; |
|||
if ( srcfile != 0 && srcfile[0] != 0 ) |
|||
{ |
|||
retjson = cJSON_CreateObject(); |
|||
jaddstr(retjson,"result","success"); |
|||
if ( datastr != 0 && datastr[0] != 0 ) |
|||
{ |
|||
if ( (len= is_hexstr(datastr,0)) > 0 ) |
|||
{ |
|||
len >>= 1; |
|||
data = calloc(1,len); |
|||
decode_hex(data,len,datastr); |
|||
required = len * 8; |
|||
} |
|||
} |
|||
if ( required > 0 ) |
|||
decoded = calloc(1,len); |
|||
modified = LP_jpg_process(&capacity,srcfile,destfile,decoded,data,required,power2,passphrase); |
|||
jaddnum(retjson,"modifiedrows",modified); |
|||
if ( modified != 0 ) |
|||
jaddstr(retjson,"outputfile",destfile); |
|||
jaddnum(retjson,"power2",power2); |
|||
jaddnum(retjson,"capacity",capacity); |
|||
jaddnum(retjson,"required",required); |
|||
if ( decoded != 0 ) |
|||
{ |
|||
decodedstr = calloc(1,len*2+1); |
|||
init_hexbytes_noT(decodedstr,decoded,len); |
|||
jaddstr(retjson,"decoded",decodedstr); |
|||
free(decodedstr); |
|||
free(decoded); |
|||
} |
|||
if ( data != 0 ) |
|||
free(data); |
|||
return(jprint(retjson,1)); |
|||
} else return(clonestr("{\"error\":\"no source file error\"}")); |
|||
} |
|||
|
|||
|
|||
|
|||
|
File diff suppressed because it is too large
@ -1,905 +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. * |
|||
* * |
|||
******************************************************************************/ |
|||
//
|
|||
// LP_utxos.c
|
|||
// marketmaker
|
|||
//
|
|||
|
|||
|
|||
int32_t LP_ismine(struct LP_utxoinfo *utxo) |
|||
{ |
|||
if ( utxo != 0 && bits256_cmp(utxo->pubkey,G.LP_mypub25519) == 0 ) |
|||
return(1); |
|||
else return(0); |
|||
} |
|||
|
|||
int32_t LP_isunspent(struct LP_utxoinfo *utxo) |
|||
{ |
|||
struct LP_address_utxo *up; struct _LP_utxoinfo u; struct iguana_info *coin; |
|||
if ( (coin= LP_coinfind(utxo->coin)) == 0 ) |
|||
return(0); |
|||
if ( (up= LP_address_utxofind(coin,utxo->coinaddr,utxo->payment.txid,utxo->payment.vout)) != 0 && up->spendheight > 0 ) |
|||
{ |
|||
utxo->T.spentflag = up->spendheight; |
|||
return(0); |
|||
} |
|||
u = (utxo->iambob != 0) ? utxo->deposit : utxo->fee; |
|||
if ( (up= LP_address_utxofind(coin,utxo->coinaddr,u.txid,u.vout)) != 0 && up->spendheight > 0 ) |
|||
{ |
|||
utxo->T.spentflag = up->spendheight; |
|||
return(0); |
|||
} |
|||
if ( utxo != 0 && utxo->T.spentflag == 0 && LP_isavailable(utxo) > 0 ) |
|||
return(1); |
|||
else return(0); |
|||
} |
|||
|
|||
struct LP_utxoinfo *LP_utxopairfind(int32_t iambob,bits256 txid,int32_t vout,bits256 txid2,int32_t vout2) |
|||
{ |
|||
struct LP_utxoinfo *utxo=0; struct _LP_utxoinfo u; |
|||
if ( (utxo= LP_utxofind(iambob,txid,vout)) != 0 ) |
|||
{ |
|||
u = (iambob != 0) ? utxo->deposit : utxo->fee; |
|||
if (vout2 == u.vout && bits256_cmp(u.txid,txid2) == 0 ) |
|||
return(utxo); |
|||
} |
|||
return(0); |
|||
} |
|||
|
|||
struct LP_utxoinfo *LP_utxofinds(int32_t iambob,bits256 txid,int32_t vout,bits256 txid2,int32_t vout2) |
|||
{ |
|||
struct LP_utxoinfo *utxo; |
|||
if ( (utxo= LP_utxofind(iambob,txid,vout)) != 0 || (utxo= LP_utxofind(iambob,txid2,vout2)) != 0 || (utxo= LP_utxo2find(iambob,txid,vout)) != 0 || (utxo= LP_utxo2find(iambob,txid2,vout2)) != 0 ) |
|||
return(utxo); |
|||
else return(0); |
|||
} |
|||
|
|||
int32_t LP_utxoaddptrs(struct LP_utxoinfo *ptrs[],int32_t n,struct LP_utxoinfo *utxo) |
|||
{ |
|||
int32_t i; |
|||
for (i=0; i<n; i++) |
|||
if ( ptrs[i] == utxo ) |
|||
return(n); |
|||
ptrs[n++] = utxo; |
|||
return(n); |
|||
} |
|||
|
|||
/*uint32_t LP_allocated(bits256 txid,int32_t vout)
|
|||
{ |
|||
struct LP_utxoinfo *utxo; |
|||
if ( (utxo= _LP_utxofind(0,txid,vout)) != 0 && LP_isavailable(utxo) == 0 ) |
|||
{ |
|||
//char str[65]; printf("%s/v%d not available\n",bits256_str(str,txid),vout);
|
|||
return(utxo); |
|||
} |
|||
if ( (utxo= _LP_utxo2find(0,txid,vout)) != 0 && LP_isavailable(utxo) == 0 ) |
|||
{ |
|||
//char str[65]; printf("%s/v%d not available2\n",bits256_str(str,txid),vout);
|
|||
return(utxo); |
|||
} |
|||
if ( (utxo= _LP_utxofind(1,txid,vout)) != 0 && LP_isavailable(utxo) == 0 ) |
|||
{ |
|||
//char str[65]; printf("%s/v%d not available\n",bits256_str(str,txid),vout);
|
|||
return(utxo); |
|||
} |
|||
if ( (utxo= _LP_utxo2find(1,txid,vout)) != 0 && LP_isavailable(utxo) == 0 ) |
|||
{ |
|||
//char str[65]; printf("%s/v%d not available2\n",bits256_str(str,txid),vout);
|
|||
return(utxo); |
|||
} |
|||
return(0); |
|||
} |
|||
|
|||
int32_t LP_isavailable(struct LP_utxoinfo *utxo) |
|||
{ |
|||
if ( time(NULL) > utxo->T.swappending ) |
|||
utxo->T.swappending = 0; |
|||
if ( utxo != 0 && utxo->T.swappending == 0 && utxo->S.swap == 0 ) |
|||
return(1); |
|||
else return(0); |
|||
} |
|||
|
|||
int32_t LP_utxocollisions(struct LP_utxoinfo *ptrs[],struct LP_utxoinfo *refutxo) |
|||
{ |
|||
int32_t iambob,n = 0; struct LP_utxoinfo *utxo; struct _LP_utxoinfo u; |
|||
if ( refutxo == 0 ) |
|||
return(0); |
|||
portable_mutex_lock(&LP_utxomutex); |
|||
for (iambob=0; iambob<=1; iambob++) |
|||
{ |
|||
if ( (utxo= _LP_utxofind(iambob,refutxo->payment.txid,refutxo->payment.vout)) != 0 && utxo != refutxo ) |
|||
n = LP_utxoaddptrs(ptrs,n,utxo); |
|||
if ( (utxo= _LP_utxo2find(iambob,refutxo->payment.txid,refutxo->payment.vout)) != 0 && utxo != refutxo ) |
|||
n = LP_utxoaddptrs(ptrs,n,utxo); |
|||
u = (refutxo->iambob != 0) ? refutxo->deposit : refutxo->fee; |
|||
if ( (utxo= _LP_utxofind(iambob,u.txid,u.vout)) != 0 && utxo != refutxo ) |
|||
n = LP_utxoaddptrs(ptrs,n,utxo); |
|||
if ( (utxo= _LP_utxo2find(iambob,u.txid,u.vout)) != 0 && utxo != refutxo ) |
|||
n = LP_utxoaddptrs(ptrs,n,utxo); |
|||
} |
|||
portable_mutex_unlock(&LP_utxomutex); |
|||
if ( 0 && n > 0 ) |
|||
printf("LP_utxocollisions n.%d\n",n); |
|||
return(n); |
|||
} |
|||
|
|||
int32_t _LP_availableset(struct LP_utxoinfo *utxo) |
|||
{ |
|||
int32_t flag = 0; |
|||
if ( utxo != 0 ) |
|||
{ |
|||
if ( bits256_nonz(utxo->S.otherpubkey) != 0 ) |
|||
flag = 1, memset(&utxo->S.otherpubkey,0,sizeof(utxo->S.otherpubkey)); |
|||
if ( utxo->S.swap != 0 ) |
|||
flag = 1, utxo->S.swap = 0; |
|||
if ( utxo->T.swappending != 0 ) |
|||
flag = 1, utxo->T.swappending = 0; |
|||
return(flag); |
|||
} |
|||
return(0); |
|||
} |
|||
|
|||
void _LP_unavailableset(struct LP_utxoinfo *utxo,bits256 otherpubkey) |
|||
{ |
|||
if ( utxo != 0 ) |
|||
{ |
|||
utxo->T.swappending = (uint32_t)(time(NULL) + LP_RESERVETIME); |
|||
utxo->S.otherpubkey = otherpubkey; |
|||
} |
|||
} |
|||
|
|||
void LP_unavailableset(struct LP_utxoinfo *utxo,bits256 otherpubkey) |
|||
{ |
|||
struct LP_utxoinfo *ptrs[8]; int32_t i,n; struct _LP_utxoinfo u; |
|||
memset(ptrs,0,sizeof(ptrs)); |
|||
if ( (n= LP_utxocollisions(ptrs,utxo)) > 0 ) |
|||
{ |
|||
for (i=0; i<n; i++) |
|||
_LP_unavailableset(ptrs[i],otherpubkey); |
|||
} |
|||
u = (utxo->iambob != 0) ? utxo->deposit : utxo->fee; |
|||
char str[65],str2[65]; printf("UTXO.[%d] RESERVED %s/v%d %s/v%d collisions.%d\n",utxo->iambob,bits256_str(str,utxo->payment.txid),utxo->payment.vout,bits256_str(str2,u.txid),u.vout,n); |
|||
_LP_unavailableset(utxo,otherpubkey); |
|||
} |
|||
|
|||
void LP_availableset(struct LP_utxoinfo *utxo) |
|||
{ |
|||
struct LP_utxoinfo *ptrs[8]; int32_t i,n,count = 0; struct _LP_utxoinfo u; |
|||
if ( utxo != 0 ) |
|||
{ |
|||
memset(ptrs,0,sizeof(ptrs)); |
|||
if ( (n= LP_utxocollisions(ptrs,utxo)) > 0 ) |
|||
{ |
|||
for (i=0; i<n; i++) |
|||
count += _LP_availableset(ptrs[i]); |
|||
} |
|||
count += _LP_availableset(utxo); |
|||
if ( count > 0 ) |
|||
{ |
|||
u = (utxo->iambob != 0) ? utxo->deposit : utxo->fee; |
|||
char str[65],str2[65]; printf("UTXO.[%d] AVAIL %s/v%d %s/v%d collisions.%d\n",utxo->iambob,bits256_str(str,utxo->payment.txid),utxo->payment.vout,bits256_str(str2,u.txid),u.vout,n); |
|||
} |
|||
} |
|||
} |
|||
*/ |
|||
|
|||
cJSON *LP_inventoryjson(cJSON *item,struct LP_utxoinfo *utxo) |
|||
{ |
|||
struct _LP_utxoinfo u; |
|||
//jaddstr(item,"method","oldutxo");
|
|||
if ( utxo == 0 ) |
|||
return(item); |
|||
if ( utxo->gui[0] != 0 ) |
|||
jaddstr(item,"gui",utxo->gui); |
|||
jaddstr(item,"coin",utxo->coin); |
|||
//jaddnum(item,"now",time(NULL));
|
|||
jaddnum(item,"iambob",utxo->iambob); |
|||
jaddstr(item,"address",utxo->coinaddr); |
|||
jaddbits256(item,"txid",utxo->payment.txid); |
|||
jaddnum(item,"vout",utxo->payment.vout); |
|||
jadd64bits(item,"value",utxo->payment.value); |
|||
jadd64bits(item,"satoshis",utxo->S.satoshis); |
|||
u = (utxo->iambob != 0) ? utxo->deposit : utxo->fee; |
|||
if ( bits256_nonz(u.txid) != 0 ) |
|||
{ |
|||
jaddbits256(item,"txid2",u.txid); |
|||
jaddnum(item,"vout2",u.vout); |
|||
jadd64bits(item,"value2",u.value); |
|||
} |
|||
if ( utxo->T.swappending != 0 ) |
|||
jaddnum(item,"pending",utxo->T.swappending); |
|||
if ( utxo->iambob != 0 ) |
|||
{ |
|||
jaddbits256(item,"srchash",utxo->pubkey);//LP_mypub25519);
|
|||
if ( bits256_nonz(utxo->S.otherpubkey) != 0 ) |
|||
jaddbits256(item,"desthash",utxo->S.otherpubkey); |
|||
} |
|||
else |
|||
{ |
|||
jaddbits256(item,"desthash",utxo->pubkey);//LP_mypub25519);
|
|||
if ( bits256_nonz(utxo->S.otherpubkey) != 0 ) |
|||
jaddbits256(item,"srchash",utxo->S.otherpubkey); |
|||
} |
|||
//if ( utxo->S.swap != 0 )
|
|||
// jaddstr(item,"swap","in progress");
|
|||
if ( utxo->T.spentflag != 0 ) |
|||
jaddnum(item,"spent",utxo->T.spentflag); |
|||
jaddnum(item,"session",utxo->T.sessionid); |
|||
return(item); |
|||
} |
|||
|
|||
cJSON *LP_utxojson(struct LP_utxoinfo *utxo) |
|||
{ |
|||
cJSON *item = cJSON_CreateObject(); |
|||
item = LP_inventoryjson(item,utxo); |
|||
jaddbits256(item,"pubkey",utxo->pubkey); |
|||
//jaddnum(item,"profit",utxo->S.profitmargin);
|
|||
jaddstr(item,"base",utxo->coin); |
|||
//jaddstr(item,"script",utxo->spendscript);
|
|||
return(item); |
|||
} |
|||
|
|||
struct LP_utxoinfo *LP_utxo_bestfit(char *symbol,uint64_t destsatoshis) |
|||
{ |
|||
uint64_t srcvalue,srcvalue2; struct LP_utxoinfo *utxo,*tmp,*bestutxo = 0; int32_t bestsize,iambob = 0; |
|||
if ( symbol == 0 || destsatoshis == 0 ) |
|||
{ |
|||
printf("LP_utxo_bestfit error symbol.%p %.8f\n",symbol,dstr(destsatoshis)); |
|||
return(0); |
|||
} |
|||
HASH_ITER(hh,G.LP_utxoinfos[iambob],utxo,tmp) |
|||
{ |
|||
if ( strcmp(symbol,utxo->coin) != 0 ) |
|||
continue; |
|||
if ( LP_isavailable(utxo) > 0 && LP_ismine(utxo) > 0 ) |
|||
{ |
|||
//printf("(%.8f %.8f %.8f)\n",dstr(utxo->payment.value),dstr(utxo->fee.value),dstr(utxo->S.satoshis));
|
|||
//char str[65]; printf("s%u %d [%.8f vs %.8f] check %s.%s avail.%d ismine.%d >= %d\n",utxo->T.spentflag,LP_iseligible(&srcvalue,&srcvalue2,utxo->iambob,symbol,utxo->payment.txid,utxo->payment.vout,utxo->S.satoshis,utxo->fee.txid,utxo->fee.vout),dstr(destsatoshis),dstr(utxo->S.satoshis),utxo->coin,bits256_str(str,utxo->payment.txid),LP_isavailable(utxo) > 0,LP_ismine(utxo) > 0,utxo->S.satoshis >= destsatoshis);
|
|||
bestsize = 0; |
|||
if ( bestutxo == 0 ) |
|||
{ |
|||
if ( utxo->S.satoshis > destsatoshis/LP_MINCLIENTVOL ) |
|||
bestsize = 1; |
|||
} |
|||
else |
|||
{ |
|||
if ( bestutxo->S.satoshis < destsatoshis ) |
|||
{ |
|||
if ( utxo->S.satoshis > destsatoshis ) |
|||
bestsize = 1; |
|||
else if ( utxo->S.satoshis > bestutxo->S.satoshis ) |
|||
bestsize = 1; |
|||
} |
|||
else |
|||
{ |
|||
if ( utxo->S.satoshis > destsatoshis && utxo->S.satoshis < bestutxo->S.satoshis ) |
|||
bestsize = 1; |
|||
} |
|||
} |
|||
if ( bestsize > 0 ) |
|||
{ |
|||
//printf("bestsize.%d %.8f %.8f -> %.8f\n",bestsize,dstr(utxo->payment.value),dstr(utxo->fee.value),dstr(utxo->S.satoshis));
|
|||
if ( LP_iseligible(&srcvalue,&srcvalue2,utxo->iambob,symbol,utxo->payment.txid,utxo->payment.vout,utxo->S.satoshis,utxo->fee.txid,utxo->fee.vout) == 0 ) |
|||
{ |
|||
//if ( utxo->T.spentflag == 0 )
|
|||
// utxo->T.spentflag = (uint32_t)time(NULL);
|
|||
continue; |
|||
} |
|||
bestutxo = utxo; |
|||
} //else printf("skip alice utxo %.8f vs dest %.8f, bestsize.%d %p\n",dstr(utxo->S.satoshis),dstr(destsatoshis),bestsize,bestutxo);
|
|||
} |
|||
} |
|||
return(bestutxo); |
|||
} |
|||
|
|||
void LP_spentnotify(struct LP_utxoinfo *utxo,int32_t selector) |
|||
{ |
|||
if ( utxo == 0 ) |
|||
return; |
|||
utxo->T.spentflag = (uint32_t)time(NULL); |
|||
} |
|||
|
|||
struct LP_utxoinfo *LP_utxoadd(int32_t iambob,char *symbol,bits256 txid,int32_t vout,int64_t value,bits256 txid2,int32_t vout2,int64_t value2,char *coinaddr,bits256 pubkey,char *gui,uint32_t sessionid,uint64_t satoshis) |
|||
{ |
|||
uint64_t val,val2=0,txfee; int32_t spendvini,numconfirms,selector; bits256 spendtxid; struct iguana_info *coin; struct _LP_utxoinfo u; struct LP_utxoinfo *utxo = 0; |
|||
if ( symbol == 0 || symbol[0] == 0 || coinaddr == 0 || coinaddr[0] == 0 || bits256_nonz(txid) == 0 || bits256_nonz(txid2) == 0 || vout < 0 || vout2 < 0 || value <= 0 || value2 <= 0 )//|| sessionid == 0 )
|
|||
{ |
|||
char str[65],str2[65]; printf("REJECT (%s) iambob.%d %s utxoadd.(%.8f %.8f) %s/v%d %s/v%d\n",coinaddr,iambob,symbol,dstr(value),dstr(value2),bits256_str(str,txid),vout,bits256_str(str2,txid2),vout2); |
|||
printf("session.%u addutxo %d %d %d %d %d %d %d %d\n",sessionid,symbol == 0,coinaddr == 0,bits256_nonz(txid) == 0,bits256_nonz(txid2) == 0,vout < 0,vout2 < 0,value <= 0,value2 <= 0); |
|||
return(0); |
|||
} |
|||
if ( (coin= LP_coinfind(symbol)) == 0 || (IAMLP == 0 && coin->inactive != 0) ) |
|||
{ |
|||
//printf("LP_utxoadd reject inactive %s\n",symbol);
|
|||
return(0); |
|||
} |
|||
txfee = LP_txfeecalc(coin,0,0); |
|||
/*if ( iambob != 0 && value2 < 9 * (satoshis >> 3) + 2*txfee ) // big txfee padding
|
|||
{ |
|||
if ( value2 > 2*txfee ) |
|||
tmpsatoshis = (((value2 - 2*txfee) / 9) << 3); |
|||
else |
|||
{ |
|||
printf("value2 %.8f <= 2 * %.8f\n",dstr(value2),dstr(txfee)); |
|||
return(0); |
|||
} |
|||
} else tmpsatoshis = (satoshis - txfee);*/ |
|||
char str[65],str2[65],dispflag = 0;//(iambob == 0);
|
|||
if ( iambob == 0 && bits256_cmp(pubkey,G.LP_mypub25519) != 0 ) |
|||
{ |
|||
printf("trying to add Alice utxo when not mine? %s/v%d\n",bits256_str(str,txid),vout); |
|||
return(0); |
|||
} |
|||
if ( coin->inactive == 0 ) |
|||
{ |
|||
if ( LP_iseligible(&val,&val2,iambob,symbol,txid,vout,satoshis,txid2,vout2) <= 0 ) |
|||
{ |
|||
static uint32_t counter; |
|||
if ( counter++ < 3 ) |
|||
printf("iambob.%d utxoadd %s inactive.%u got ineligible txid value %.8f:%.8f, value2 %.8f:%.8f, tmpsatoshis %.8f\n",iambob,symbol,coin->inactive,dstr(value),dstr(val),dstr(value2),dstr(val2),dstr(satoshis)); |
|||
return(0); |
|||
} |
|||
if ( (numconfirms= LP_numconfirms(symbol,coinaddr,txid,vout,0)) <= 0 ) |
|||
{ |
|||
printf("LP_utxoadd reject numconfirms.%d %s.%s\n",numconfirms,symbol,bits256_str(str,txid)); |
|||
return(0); |
|||
} |
|||
if ( (numconfirms= LP_numconfirms(symbol,coinaddr,txid2,vout2,0)) <= 0 ) |
|||
{ |
|||
printf("LP_utxoadd reject2 numconfirms.%d %s %s/v%d\n",numconfirms,symbol,bits256_str(str,txid2),vout2); |
|||
return(0); |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
val = value; |
|||
val2 = value2; |
|||
} |
|||
dispflag = 0; |
|||
if ( dispflag != 0 ) |
|||
printf("%.8f %.8f %s iambob.%d %s utxoadd.(%.8f %.8f) %s %s\n",dstr(val),dstr(val2),coinaddr,iambob,symbol,dstr(value),dstr(value2),bits256_str(str,txid),bits256_str(str2,txid2)); |
|||
dispflag = 1; |
|||
if ( (utxo= LP_utxofinds(iambob,txid,vout,txid2,vout2)) != 0 ) |
|||
{ |
|||
if ( 0 && LP_ismine(utxo) == 0 ) |
|||
{ |
|||
char str2[65],str3[65]; printf("iambob.%d %s %s utxoadd.(%.8f %.8f) %s %s\n",iambob,bits256_str(str3,pubkey),symbol,dstr(value),dstr(value2),bits256_str(str,txid),bits256_str(str2,txid2)); |
|||
printf("duplicate %.8f %.8f %.8f vs utxo.(%.8f %.8f %.8f)\n",dstr(value),dstr(value2),dstr(satoshis),dstr(utxo->payment.value),dstr(utxo->deposit.value),dstr(utxo->S.satoshis)); |
|||
} |
|||
u = (utxo->iambob != 0) ? utxo->deposit : utxo->fee; |
|||
if ( bits256_cmp(txid,utxo->payment.txid) != 0 || bits256_cmp(txid2,u.txid) != 0 || vout != utxo->payment.vout || value != utxo->payment.value || satoshis != utxo->S.satoshis || vout2 != u.vout || value2 != u.value || strcmp(symbol,utxo->coin) != 0 || strcmp(coinaddr,utxo->coinaddr) != 0 || bits256_cmp(pubkey,utxo->pubkey) != 0 ) |
|||
{ |
|||
utxo->T.errors++; |
|||
char str[65],str2[65],str3[65],str4[65],str5[65],str6[65]; |
|||
if ( utxo->T.spentflag != 0 || LP_txvalue(0,utxo->coin,utxo->payment.txid,utxo->payment.vout) < utxo->payment.value || LP_txvalue(0,utxo->coin,u.txid,u.vout) < u.value ) |
|||
{ |
|||
//if ( utxo->T.spentflag == 0 )
|
|||
// utxo->T.spentflag = (uint32_t)time(NULL);
|
|||
printf("original utxo pair not valid\n"); |
|||
if ( dispflag != 0 ) |
|||
printf("error on subsequent utxo iambob.%d %.8f %.8f add.(%s %s) when.(%s %s) %d %d %d %d %d %d %d %d %d %d pubkeys.(%s vs %s)\n",iambob,dstr(val),dstr(val2),bits256_str(str,txid),bits256_str(str2,txid2),bits256_str(str3,utxo->payment.txid),bits256_str(str4,utxo->deposit.txid),bits256_cmp(txid,utxo->payment.txid) != 0,bits256_cmp(txid2,u.txid) != 0,vout != utxo->payment.vout,satoshis != utxo->S.satoshis,vout2 != u.vout,value2 != u.value,strcmp(symbol,utxo->coin) != 0,strcmp(coinaddr,utxo->coinaddr) != 0,bits256_cmp(pubkey,utxo->pubkey) != 0,value != utxo->payment.value,bits256_str(str5,pubkey),bits256_str(str6,utxo->pubkey)); |
|||
utxo = 0; |
|||
} |
|||
} |
|||
if ( utxo != 0 ) |
|||
{ |
|||
if ( utxo->T.sessionid == 0 ) |
|||
utxo->T.sessionid = sessionid; |
|||
//else if ( profitmargin > SMALLVAL )
|
|||
// utxo->S.profitmargin = profitmargin;
|
|||
utxo->T.lasttime = (uint32_t)time(NULL); |
|||
//printf("return existing utxo[%d] %s %s\n",iambob,bits256_str(str,utxo->payment.txid),bits256_str(str2,iambob != 0 ? utxo->deposit.txid : utxo->fee.txid));
|
|||
return(utxo); |
|||
} |
|||
} |
|||
utxo = calloc(1,sizeof(*utxo)); |
|||
//utxo->S.profitmargin = profitmargin;
|
|||
utxo->pubkey = pubkey; |
|||
safecopy(utxo->gui,gui,sizeof(utxo->gui)); |
|||
safecopy(utxo->coin,symbol,sizeof(utxo->coin)); |
|||
safecopy(utxo->coinaddr,coinaddr,sizeof(utxo->coinaddr)); |
|||
//safecopy(utxo->spendscript,spendscript,sizeof(utxo->spendscript));
|
|||
utxo->payment.txid = txid; |
|||
utxo->payment.vout = vout; |
|||
utxo->payment.value = value; |
|||
utxo->S.satoshis = satoshis; |
|||
if ( (utxo->iambob= iambob) != 0 ) |
|||
{ |
|||
utxo->deposit.txid = txid2; |
|||
utxo->deposit.vout = vout2; |
|||
utxo->deposit.value = value2; |
|||
} |
|||
else |
|||
{ |
|||
utxo->fee.txid = txid2; |
|||
utxo->fee.vout = vout2; |
|||
utxo->fee.value = value2; |
|||
} |
|||
LP_utxosetkey(utxo->key,txid,vout); |
|||
LP_utxosetkey(utxo->key2,txid2,vout2); |
|||
if ( LP_ismine(utxo) > 0 ) |
|||
utxo->T.sessionid = G.LP_sessionid; |
|||
else utxo->T.sessionid = sessionid; |
|||
if ( coin->inactive == 0 && (selector= LP_mempool_vinscan(&spendtxid,&spendvini,symbol,coinaddr,txid,vout,txid2,vout2)) >= 0 ) |
|||
{ |
|||
printf("utxoadd selector.%d spent in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); |
|||
utxo->T.spentflag = (uint32_t)time(NULL); |
|||
} |
|||
//printf(" %s %.8f %.8f %p addutxo.%d (%s %s) session.%u iambob.%d <<<<<<<<<<<<<<< %.8f\n",symbol,dstr(value),dstr(value2),utxo,LP_ismine(utxo) > 0,bits256_str(str,utxo->payment.txid),bits256_str(str2,iambob != 0 ? utxo->deposit.txid : utxo->fee.txid),utxo->T.sessionid,iambob,dstr(satoshis));
|
|||
portable_mutex_lock(&LP_utxomutex); |
|||
HASH_ADD_KEYPTR(hh,G.LP_utxoinfos[iambob],utxo->key,sizeof(utxo->key),utxo); |
|||
if ( _LP_utxo2find(iambob,txid2,vout2) == 0 ) |
|||
HASH_ADD_KEYPTR(hh2,G.LP_utxoinfos2[iambob],utxo->key2,sizeof(utxo->key2),utxo); |
|||
portable_mutex_unlock(&LP_utxomutex); |
|||
if ( iambob != 0 ) |
|||
{ |
|||
if ( LP_ismine(utxo) > 0 ) |
|||
{ |
|||
//LP_utxo_clientpublish(utxo);
|
|||
if ( LP_mypeer != 0 ) |
|||
utxo->T.lasttime = (uint32_t)time(NULL); |
|||
} |
|||
} |
|||
return(utxo); |
|||
} |
|||
|
|||
int32_t _LP_utxos_remove(bits256 txid,int32_t vout) |
|||
{ |
|||
struct LP_utxoinfo *utxo,*utxo2; int32_t retval = 0,iambob = 1; |
|||
utxo = utxo2 = 0; |
|||
if ( (utxo= _LP_utxofind(iambob,txid,vout)) != 0 ) |
|||
{ |
|||
if ( LP_isavailable(utxo) == 0 ) |
|||
retval = -1; |
|||
else |
|||
{ |
|||
if ( (utxo2= _LP_utxo2find(iambob,txid,vout)) != 0 ) |
|||
{ |
|||
if ( LP_isavailable(utxo) == 0 ) |
|||
retval = -1; |
|||
else |
|||
{ |
|||
_LP_utxo_delete(iambob,utxo); |
|||
_LP_utxo2_delete(iambob,utxo2); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
else if ( (utxo2= _LP_utxo2find(iambob,txid,vout)) != 0 ) |
|||
{ |
|||
if ( LP_isavailable(utxo2) == 0 ) |
|||
retval = -1; |
|||
else _LP_utxo2_delete(iambob,utxo2); |
|||
} |
|||
return(retval); |
|||
} |
|||
|
|||
int32_t LP_utxos_remove(bits256 txid,int32_t vout) |
|||
{ |
|||
int32_t retval; |
|||
portable_mutex_lock(&LP_utxomutex); |
|||
retval = _LP_utxos_remove(txid,vout); |
|||
portable_mutex_unlock(&LP_utxomutex); |
|||
return(retval); |
|||
} |
|||
|
|||
cJSON *LP_inventory(char *symbol) |
|||
{ |
|||
struct LP_utxoinfo *utxo,*tmp; struct _LP_utxoinfo u; char *myipaddr; cJSON *array; uint64_t val,val2; int32_t iambob = 0; struct iguana_info *coin; |
|||
array = cJSON_CreateArray(); |
|||
if ( LP_mypeer != 0 ) |
|||
myipaddr = LP_mypeer->ipaddr; |
|||
else myipaddr = "127.0.0.1"; |
|||
if ( (coin= LP_coinfind(symbol)) != 0 ) |
|||
LP_listunspent_both(symbol,coin->smartaddr,0); |
|||
HASH_ITER(hh,G.LP_utxoinfos[iambob],utxo,tmp) |
|||
{ |
|||
char str[65]; |
|||
//printf("iambob.%d iterate %s\n",iambob,bits256_str(str,LP_mypub25519));
|
|||
if ( LP_isunspent(utxo) != 0 && strcmp(symbol,utxo->coin) == 0 && utxo->iambob == iambob && LP_ismine(utxo) > 0 ) |
|||
{ |
|||
u = (iambob != 0) ? utxo->deposit : utxo->fee; |
|||
if ( LP_iseligible(&val,&val2,iambob,utxo->coin,utxo->payment.txid,utxo->payment.vout,utxo->S.satoshis,u.txid,u.vout) == 0 ) |
|||
{ |
|||
//if ( utxo->T.spentflag == 0 )
|
|||
// utxo->T.spentflag = (uint32_t)time(NULL);
|
|||
//printf("%s %s ineligible %.8f %.8f\n",utxo->coin,bits256_str(str,u.txid),dstr(val),dstr(val2));
|
|||
continue; |
|||
} |
|||
//if ( iambob != 0 )
|
|||
// LP_utxo_clientpublish(utxo);
|
|||
jaddi(array,LP_inventoryjson(cJSON_CreateObject(),utxo)); |
|||
} |
|||
else if ( 0 && LP_ismine(utxo) > 0 && strcmp(symbol,utxo->coin) == 0 ) |
|||
printf("skip %s %s %d %d %d %d\n",utxo->coin,bits256_str(str,utxo->payment.txid),LP_isunspent(utxo) != 0,strcmp(symbol,utxo->coin) == 0,utxo->iambob == iambob,LP_ismine(utxo) > 0); |
|||
} |
|||
return(array); |
|||
} |
|||
|
|||
int32_t LP_maxvalue(uint64_t *values,int32_t n) |
|||
{ |
|||
int32_t i,maxi = -1; uint64_t maxval = 0; |
|||
for (i=0; i<n; i++) |
|||
if ( values[i] > maxval ) |
|||
{ |
|||
maxi = i; |
|||
maxval = values[i]; |
|||
} |
|||
return(maxi); |
|||
} |
|||
|
|||
int32_t LP_nearestvalue(int32_t iambob,uint64_t *values,int32_t n,uint64_t targetval) |
|||
{ |
|||
int32_t i,mini = -1; int64_t dist; uint64_t mindist = (1 << 31); |
|||
for (i=0; i<n; i++) |
|||
{ |
|||
dist = (values[i] - targetval); |
|||
if ( iambob != 0 && dist < 0 && -dist < values[i]/10 ) |
|||
dist = -dist; |
|||
//printf("(%.8f %.8f %.8f).%d ",dstr(values[i]),dstr(dist),dstr(mindist),mini);
|
|||
if ( dist >= 0 && dist < mindist ) |
|||
{ |
|||
mini = i; |
|||
mindist = dist; |
|||
} |
|||
} |
|||
return(mini); |
|||
} |
|||
|
|||
int32_t LP_privkey_init(int32_t mypubsock,struct iguana_info *coin,bits256 myprivkey,bits256 mypub) |
|||
{ |
|||
int32_t enable_utxos = 0; |
|||
char *script,destaddr[64]; struct LP_utxoinfo *utxo; cJSON *array,*item; bits256 txid,deposittxid; int32_t used,i,flag=0,height,n,cmpflag,iambob,vout,depositvout; uint64_t *values=0,satoshis,txfee,biggerval,value,total = 0; int64_t targetval; |
|||
if ( coin == 0 || (IAMLP == 0 && coin->inactive != 0) ) |
|||
{ |
|||
//printf("coin not active\n");
|
|||
return(0); |
|||
} |
|||
if ( coin->privkeydepth > 0 ) |
|||
return(0); |
|||
coin->privkeydepth++; |
|||
LP_address(coin,coin->smartaddr); |
|||
if ( coin->inactive == 0 ) |
|||
LP_listunspent_issue(coin->symbol,coin->smartaddr,0); |
|||
array = LP_listunspent(coin->symbol,coin->smartaddr); |
|||
if ( array != 0 ) |
|||
{ |
|||
txfee = LP_txfeecalc(coin,0,0); |
|||
if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) |
|||
{ |
|||
coin->numutxos = n; |
|||
//printf("LP_privkey_init %s %d\n",coin->symbol,n);
|
|||
for (iambob=0; iambob<=1; iambob++) |
|||
{ |
|||
if ( iambob == 0 ) |
|||
values = calloc(n,sizeof(*values)); |
|||
else memset(values,0,n * sizeof(*values)); |
|||
used = 0; |
|||
for (i=0; i<n; i++) |
|||
{ |
|||
item = jitem(array,i); |
|||
if ( coin->electrum == 0 ) |
|||
{ |
|||
txid = jbits256(item,"txid"); |
|||
vout = juint(item,"vout"); |
|||
value = LP_value_extract(item,0); |
|||
height = LP_txheight(coin,txid);//LP_getheight(coin) - jint(item,"confirmations") + 1;
|
|||
} |
|||
else |
|||
{ |
|||
txid = jbits256(item,"tx_hash"); |
|||
vout = juint(item,"tx_pos"); |
|||
value = j64bits(item,"value"); |
|||
height = jint(item,"height"); |
|||
} |
|||
satoshis = LP_txvalue(destaddr,coin->symbol,txid,vout); |
|||
if ( satoshis != 0 && satoshis != value ) |
|||
printf("%s %s privkey_init value %.8f vs %.8f (%s) %.8f %.8f\n",coin->symbol,coin->smartaddr,dstr(satoshis),dstr(value),jprint(item,0),jdouble(item,"amount"),jdouble(item,"interest")); |
|||
if ( coin->electrum != 0 || LP_inventory_prevent(iambob,coin->symbol,txid,vout) == 0 )//&& height > 0 )
|
|||
{ |
|||
values[i] = satoshis; |
|||
//flag += LP_address_utxoadd(coin,destaddr,txid,vout,satoshis,height,-1);
|
|||
} else used++; |
|||
} |
|||
//printf("array.%d\n",n);
|
|||
while ( used < n-1 ) |
|||
{ |
|||
//for (i=0; i<n; i++)
|
|||
// printf("%.8f ",dstr(values[i]));
|
|||
//printf("used.%d of n.%d\n",used,n);
|
|||
if ( (i= LP_maxvalue(values,n)) >= 0 ) |
|||
{ |
|||
item = jitem(array,i); |
|||
if ( coin->electrum == 0 ) |
|||
{ |
|||
deposittxid = jbits256(item,"txid"); |
|||
depositvout = juint(item,"vout"); |
|||
script = jstr(item,"scriptPubKey"); |
|||
} |
|||
else |
|||
{ |
|||
deposittxid = jbits256(item,"tx_hash"); |
|||
depositvout = juint(item,"tx_pos"); |
|||
script = coin->smartaddr; |
|||
} |
|||
biggerval = values[i]; |
|||
values[i] = 0, used++; |
|||
if ( iambob == 0 ) |
|||
targetval = (biggerval / 776) + txfee; |
|||
else targetval = (biggerval / 9) * 8 + 2*txfee; |
|||
if ( targetval < txfee*2 ) |
|||
targetval = txfee*2; |
|||
//printf("iambob.%d i.%d deposit %.8f min %.8f target %.8f\n",iambob,i,dstr(biggerval),dstr((1+LP_MINSIZE_TXFEEMULT)*txfee),dstr(targetval));
|
|||
if ( biggerval < (1+LP_MINSIZE_TXFEEMULT)*txfee ) |
|||
continue; |
|||
i = -1; |
|||
if ( iambob != 0 ) |
|||
{ |
|||
if ( (i= LP_nearestvalue(iambob,values,n,targetval)) < 0 ) |
|||
targetval /= 4; |
|||
if ( targetval < txfee*(1+LP_MINSIZE_TXFEEMULT) ) |
|||
continue; |
|||
} |
|||
if ( i >= 0 || (i= LP_nearestvalue(iambob,values,n,targetval)) >= 0 ) |
|||
{ |
|||
//printf("iambob.%d i.%d %.8f target %.8f\n",iambob,i,dstr(biggerval),dstr(targetval));
|
|||
item = jitem(array,i); |
|||
cmpflag = 0; |
|||
if ( coin->electrum == 0 ) |
|||
{ |
|||
txid = jbits256(item,"txid"); |
|||
vout = juint(item,"vout"); |
|||
if ( jstr(item,"scriptPubKey") != 0 && strcmp(script,jstr(item,"scriptPubKey")) == 0 ) |
|||
cmpflag = 1; |
|||
} |
|||
else |
|||
{ |
|||
txid = jbits256(item,"tx_hash"); |
|||
vout = juint(item,"tx_pos"); |
|||
cmpflag = 1; |
|||
} |
|||
if ( cmpflag != 0 ) |
|||
{ |
|||
value = values[i]; |
|||
values[i] = 0, used++; |
|||
portable_mutex_lock(&LP_UTXOmutex); |
|||
if ( iambob != 0 ) |
|||
{ |
|||
if ( (utxo= LP_utxoadd(1,coin->symbol,txid,vout,value,deposittxid,depositvout,biggerval,coin->smartaddr,mypub,LP_gui,G.LP_sessionid,value)) != 0 ) |
|||
{ |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
//printf("call utxoadd\n");
|
|||
if ( (utxo= LP_utxoadd(0,coin->symbol,deposittxid,depositvout,biggerval,txid,vout,value,coin->smartaddr,mypub,LP_gui,G.LP_sessionid,biggerval)) != 0 ) |
|||
{ |
|||
} |
|||
} |
|||
portable_mutex_unlock(&LP_UTXOmutex); |
|||
total += value; |
|||
} // else printf("scriptmismatch.(%s) vs %s\n",script,jprint(item,0));
|
|||
} //else printf("nothing near i.%d\n",i);
|
|||
} else break; |
|||
} |
|||
if ( enable_utxos == 0 ) |
|||
break; |
|||
} |
|||
} |
|||
free_json(array); |
|||
if ( 0 && flag != 0 ) |
|||
LP_postutxos(coin->symbol,coin->smartaddr); |
|||
} |
|||
if ( values != 0 ) |
|||
free(values); |
|||
if ( coin->privkeydepth > 0 ) |
|||
coin->privkeydepth--; |
|||
//printf("privkey.%s %.8f\n",symbol,dstr(total));
|
|||
return(flag); |
|||
} |
|||
|
|||
char *LP_secretaddresses(void *ctx,char *prefix,char *passphrase,int32_t n,uint8_t taddr,uint8_t pubtype) |
|||
{ |
|||
int32_t i; uint8_t tmptype,pubkey33[33],rmd160[20]; char output[777*45],str[65],str2[65],buf[8192],wifstr[128],coinaddr[64]; bits256 checkprivkey,privkey,pubkey; cJSON *retjson; |
|||
retjson = cJSON_CreateObject(); |
|||
if ( prefix == 0 || prefix[0] == 0 ) |
|||
prefix = "secretaddress"; |
|||
if ( passphrase == 0 || passphrase[0] == 0 ) |
|||
passphrase = "password"; |
|||
if ( n <= 0 ) |
|||
n = 16; |
|||
else if ( n > 777 ) |
|||
n = 777; |
|||
conv_NXTpassword(privkey.bytes,pubkey.bytes,(uint8_t *)passphrase,(int32_t)strlen(passphrase)); |
|||
bitcoin_priv2pub(ctx,pubkey33,coinaddr,privkey,taddr,pubtype); |
|||
printf("generator (%s) secrets.[%d] <%s> t.%u p.%u\n",coinaddr,n,passphrase,taddr,pubtype); |
|||
sprintf(output,"\"addresses\":["); |
|||
for (i=0; i<n; i++) |
|||
{ |
|||
sprintf(buf,"%s %s %03d",prefix,passphrase,i); |
|||
conv_NXTpassword(privkey.bytes,pubkey.bytes,(uint8_t *)buf,(int32_t)strlen(buf)); |
|||
bitcoin_priv2pub(ctx,pubkey33,coinaddr,privkey,taddr,pubtype); |
|||
bitcoin_priv2wif(0,wifstr,privkey,188); |
|||
bitcoin_wif2priv(0,&tmptype,&checkprivkey,wifstr); |
|||
bitcoin_addr2rmd160(taddr,&tmptype,rmd160,coinaddr); |
|||
if ( bits256_cmp(checkprivkey,privkey) != 0 ) |
|||
{ |
|||
printf("WIF.(%s) error -> %s vs %s?\n",wifstr,bits256_str(str,privkey),bits256_str(str2,checkprivkey)); |
|||
free_json(retjson); |
|||
return(clonestr("{\"error\":\"couldnt validate wifstr\"}")); |
|||
} |
|||
else if ( tmptype != pubtype ) |
|||
{ |
|||
printf("checktype.%d != pubtype.%d\n",tmptype,pubtype); |
|||
free_json(retjson); |
|||
return(clonestr("{\"error\":\"couldnt validate pubtype\"}")); |
|||
} |
|||
jaddstr(retjson,coinaddr,wifstr); |
|||
sprintf(output+strlen(output),"\\\"%s\\\"%c ",coinaddr,i<n-1?',':' '); |
|||
printf("./komodo-cli jumblr_secret %s\n",coinaddr); |
|||
} |
|||
printf("%s]\n",output); |
|||
return(jprint(retjson,1)); |
|||
} |
|||
|
|||
bits256 LP_privkeycalc(void *ctx,uint8_t *pubkey33,bits256 *pubkeyp,struct iguana_info *coin,char *passphrase,char *wifstr) |
|||
{ |
|||
//static uint32_t counter;
|
|||
bits256 privkey,userpub,userpass,checkkey; char tmpstr[128]; cJSON *retjson; uint8_t tmptype; |
|||
if ( passphrase != 0 && passphrase[0] != 0 ) |
|||
{ |
|||
conv_NXTpassword(privkey.bytes,pubkeyp->bytes,(uint8_t *)passphrase,(int32_t)strlen(passphrase)); |
|||
//vcalc_sha256(0,checkkey.bytes,(uint8_t *)passphrase,(int32_t)strlen(passphrase));
|
|||
//printf("SHA256.(%s) ",bits256_str(pstr,checkkey));
|
|||
//printf("privkey.(%s)\n",bits256_str(pstr,privkey));
|
|||
} |
|||
else |
|||
{ |
|||
bitcoin_wif2priv(coin->wiftaddr,&tmptype,&privkey,wifstr); |
|||
if ( 0 ) |
|||
{ |
|||
char str[65],str2[65]; |
|||
checkkey = iguana_wif2privkey(wifstr); |
|||
if ( bits256_cmp(checkkey,privkey) != 0 ) |
|||
printf("WIF.(%s) -> %s or %s?\n",wifstr,bits256_str(str,privkey),bits256_str(str2,checkkey)); |
|||
} |
|||
} |
|||
privkey.bytes[0] &= 248, privkey.bytes[31] &= 127, privkey.bytes[31] |= 64; |
|||
bitcoin_priv2pub(ctx,coin->pubkey33,coin->smartaddr,privkey,coin->taddr,coin->pubtype); |
|||
if ( coin->counter == 0 ) |
|||
{ |
|||
coin->counter++; |
|||
memcpy(G.LP_pubsecp,coin->pubkey33,33); |
|||
bitcoin_priv2wif(coin->wiftaddr,tmpstr,privkey,coin->wiftype); |
|||
bitcoin_addr2rmd160(coin->taddr,&tmptype,G.LP_myrmd160,coin->smartaddr); |
|||
LP_privkeyadd(privkey,G.LP_myrmd160); |
|||
G.LP_privkey = privkey; |
|||
if ( 0 && (coin->pubtype != 60 || strcmp(coin->symbol,"KMD") == 0) ) |
|||
printf("%s (%s) %d wif.(%s) (%s)\n",coin->symbol,coin->smartaddr,coin->pubtype,tmpstr,passphrase); |
|||
if ( G.counter++ == 0 ) |
|||
{ |
|||
bitcoin_priv2wif(coin->wiftaddr,G.USERPASS_WIFSTR,privkey,188); |
|||
bitcoin_wif2priv(coin->wiftaddr,&tmptype,&checkkey,G.USERPASS_WIFSTR); |
|||
if ( bits256_cmp(checkkey,privkey) != 0 ) |
|||
{ |
|||
char str[65],str2[65]; |
|||
printf("FATAL ERROR converting USERPASS_WIFSTR %s -> %s != %s\n",G.USERPASS_WIFSTR,bits256_str(str,checkkey),bits256_str(str2,privkey)); |
|||
exit(-1); |
|||
} |
|||
conv_NXTpassword(userpass.bytes,pubkeyp->bytes,(uint8_t *)G.USERPASS_WIFSTR,(int32_t)strlen(G.USERPASS_WIFSTR)); |
|||
userpub = curve25519(userpass,curve25519_basepoint9()); |
|||
printf("userpass.(%s)\n",bits256_str(G.USERPASS,userpub)); |
|||
} |
|||
} |
|||
if ( coin->importedprivkey == 0 && coin->electrum == 0 && coin->userpass[0] != 0 && LP_getheight(coin) > 0 ) |
|||
{ |
|||
LP_listunspent_issue(coin->symbol,coin->smartaddr,0); |
|||
if ( (retjson= LP_importprivkey(coin->symbol,tmpstr,coin->smartaddr,-1)) != 0 ) |
|||
{ |
|||
if ( jobj(retjson,"error") != 0 ) |
|||
{ |
|||
printf("cant importprivkey.%s -> (%s), abort session\n",coin->symbol,jprint(retjson,1)); |
|||
exit(-1); |
|||
} |
|||
free_json(retjson); |
|||
} |
|||
coin->importedprivkey = (uint32_t)time(NULL); |
|||
} |
|||
vcalc_sha256(0,checkkey.bytes,privkey.bytes,sizeof(privkey)); |
|||
checkkey.bytes[0] &= 248, checkkey.bytes[31] &= 127, checkkey.bytes[31] |= 64; |
|||
G.LP_mypub25519 = *pubkeyp = curve25519(checkkey,curve25519_basepoint9()); |
|||
G.LP_mypriv25519 = checkkey; |
|||
LP_pubkeyadd(G.LP_mypub25519); |
|||
return(privkey); |
|||
} |
|||
|
|||
void LP_privkey_updates(void *ctx,int32_t pubsock,char *passphrase) |
|||
{ |
|||
struct iguana_info *coin,*tmp; bits256 pubkey,privkey; uint8_t pubkey33[33]; int32_t initonly; |
|||
initonly = (passphrase != 0); |
|||
memset(privkey.bytes,0,sizeof(privkey)); |
|||
memset(pubkey.bytes,0,sizeof(pubkey)); |
|||
//printf("Total coins: %d\n", HASH_COUNT(LP_coins));
|
|||
//int num_iter = 0;
|
|||
HASH_ITER(hh,LP_coins,coin,tmp) |
|||
{ |
|||
//printf("LP_privkey_updates [%02d / %02d]\n", num_iter++, HASH_COUNT(LP_coins));
|
|||
if ( initonly != 0 ) |
|||
{ |
|||
coin->counter = 0; |
|||
memset(coin->smartaddr,0,sizeof(coin->smartaddr)); |
|||
if ( bits256_nonz(privkey) == 0 || coin->smartaddr[0] == 0 ) |
|||
privkey = LP_privkeycalc(ctx,pubkey33,&pubkey,coin,passphrase,""); |
|||
} |
|||
//printf("i.%d of %d\n",i,LP_numcoins);
|
|||
else if ( IAMLP == 0 || coin->inactive == 0 ) |
|||
{ |
|||
//printf("from updates %s\n",coin->symbol);
|
|||
if ( LP_privkey_init(pubsock,coin,G.LP_privkey,G.LP_mypub25519) == 0 && (LP_rand() % 10) == 0 ) |
|||
{ |
|||
//LP_postutxos(coin->symbol,coin->smartaddr);
|
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
int32_t LP_passphrase_init(char *passphrase,char *gui) |
|||
{ |
|||
static void *ctx; int32_t iambob,counter; struct LP_utxoinfo *utxo,*tmp; |
|||
if ( ctx == 0 ) |
|||
ctx = bitcoin_ctx(); |
|||
if ( G.LP_pendingswaps != 0 ) |
|||
return(-1); |
|||
G.initializing = 1; |
|||
if ( gui == 0 ) |
|||
gui = "cli"; |
|||
counter = G.USERPASS_COUNTER; |
|||
while ( G.waiting == 0 ) |
|||
{ |
|||
printf("waiting for G.waiting\n"); |
|||
sleep(5); |
|||
} |
|||
for (iambob=0; iambob<2; iambob++) |
|||
{ |
|||
if ( G.LP_utxoinfos[iambob] != 0 ) |
|||
{ |
|||
HASH_ITER(hh,G.LP_utxoinfos[iambob],utxo,tmp) |
|||
{ |
|||
HASH_DELETE(hh,G.LP_utxoinfos[iambob],utxo); |
|||
//free(utxo);
|
|||
} |
|||
} |
|||
if ( G.LP_utxoinfos2[iambob] != 0 ) |
|||
{ |
|||
G.LP_utxoinfos2[iambob] = 0; |
|||
/*HASH_ITER(hh,G.LP_utxoinfos2[iambob],utxo,tmp)
|
|||
{ |
|||
HASH_DELETE(hh,G.LP_utxoinfos2[iambob],utxo); |
|||
free(utxo); |
|||
}*/ |
|||
} |
|||
} |
|||
memset(&G,0,sizeof(G)); |
|||
LP_privkey_updates(ctx,LP_mypubsock,passphrase); |
|||
init_hexbytes_noT(G.LP_myrmd160str,G.LP_myrmd160,20); |
|||
G.LP_sessionid = (uint32_t)time(NULL); |
|||
safecopy(G.gui,gui,sizeof(G.gui)); |
|||
G.USERPASS_COUNTER = counter; |
|||
G.initializing = 0; |
|||
return(0); |
|||
} |
|||
|
|||
|
@ -0,0 +1,2 @@ |
|||
source userpass |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"autoprice\",\"base\":\"CHIPS\",\"rel\":\"BTC\",\"margin\":0.05,\"refbase\":\"chips\",\"refrel\":\"coinmarketcap\"}" |
@ -0,0 +1,2 @@ |
|||
source userpass |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"autoprice\",\"base\":\"CHIPS\",\"rel\":\"KMD\",\"margin\":0.05,\"refbase\":\"chips\",\"refrel\":\"coinmarketcap\"}" |
@ -1,3 +0,0 @@ |
|||
#!/bin/bash |
|||
source userpass |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"autofill\",\"base\":\"KMD\",\"rel\":\"BTC\",\"price\":0.0005,\"relvolume\":0.1}" |
@ -1,3 +0,0 @@ |
|||
#!/bin/bash |
|||
source userpass |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"autotrade\",\"base\":\"REVS\",\"rel\":\"KMD\",\"relvolume\":1.01,\"price\":1.234}" |
@ -0,0 +1,3 @@ |
|||
#!/bin/bash |
|||
source userpass |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"balances\"}" |
@ -0,0 +1,4 @@ |
|||
#!/bin/bash |
|||
source userpass |
|||
# this will only work for watchonly addresses that have been rescanned and with active coins |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"fundvalue\",\"address\":\"RNdqHx26GWy9bk8MtmH1UiXjQcXE4RKK2P\",\"divisor\":1000000}" |
@ -0,0 +1,3 @@ |
|||
#!/bin/bash |
|||
source userpass |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"instantdex_claim\"}" |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -0,0 +1,3 @@ |
|||
#!/bin/bash |
|||
source userpass |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"instantdex_deposit\",\"weeks\":1,\"amount\":10.0,\"broadcast\":1}" |
@ -0,0 +1,3 @@ |
|||
#!/bin/bash |
|||
source userpass |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"instantdex_deposit\",\"weeks\":10,\"amount\":10.0,\"broadcast\":1}" |
@ -0,0 +1,4 @@ |
|||
#!/bin/bash |
|||
source userpass |
|||
# this will only work for watchonly addresses that have been rescanned and with active coins |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"fundvalue\",\"address\":\"RThtXup6Zo7LZAi8kRWgjAyi1s4u6U9Cpf\",\"divisor\":1000000}" |
@ -0,0 +1,3 @@ |
|||
#!/bin/bash |
|||
source userpass |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"dynamictrust\",\"address\":\"RMfQwu5ey23eWJ4as2ckd8dqsQJwo836ny\"}" |
@ -1,5 +1,18 @@ |
|||
#!/bin/bash |
|||
source userpass |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"enable\",\"coin\":\"REVS\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"enable\",\"coin\":\"CHIPS\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"enable\",\"coin\":\"MNZ\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"enable\",\"coin\":\"KMD\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"enable\",\"coin\":\"BTC\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"enable\",\"coin\":\"SUPERNET\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"enable\",\"coin\":\"CRYPTO\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"enable\",\"coin\":\"DEX\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"enable\",\"coin\":\"BOTS\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"enable\",\"coin\":\"BET\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"enable\",\"coin\":\"HODL\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"enable\",\"coin\":\"MSHARK\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"enable\",\"coin\":\"MGW\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"enable\",\"coin\":\"PANGEA\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"enable\",\"coin\":\"JUMBLR\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"electrum\",\"coin\":\"HUSH\",\"ipaddr\":\"173.212.225.176\",\"port\":50013}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"electrum\",\"coin\":\"BTCH\",\"ipaddr\":\"electrum1.cipig.net\",\"port\":10020}" |
|||
|
|||
|
@ -0,0 +1,4 @@ |
|||
#!/bin/bash |
|||
source userpass |
|||
# this will only work for watchonly addresses that have been rescanned and with active coins |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"fundvalue\",\"address\":\"RRyyejME7LRTuvdziWsXkAbSW1fdiohGwK\",\"holdings\":[{\"coin\":\"iota\",\"balance\":13000000}, {\"coin\":\"stratis\",\"balance\":1300000}, {\"coin\":\"zcash\",\"balance\":10000}, {\"coin\":\"syscoin\",\"balance\":20000000}, {\"coin\":\"waves\",\"balance\":700000}, {\"coin\":\"bitcoin\",\"balance\":625}, {\"coin\":\"bitcoin-cash\",\"balance\":1500}, {\"coin\":\"heat-ledger\",\"balance\":2323851 }, {\"coin\":\"decred\",\"balance\":20000}, {\"coin\":\"vericoin\",\"balance\":2199368 }, {\"coin\":\"byteball\",\"balance\":4238}, {\"coin\":\"iocoin\",\"balance\":150000}, {\"coin\":\"quantum-resistant-ledger\",\"balance\":375000}, {\"coin\":\"chips\",\"balance\":2577006 }, {\"coin\":\"hush\",\"balance\":100000 }, {\"coin\":\"mobilego\",\"balance\":100000 }],\"divisor\":650000}" |
@ -0,0 +1,15 @@ |
|||
#!/bin/bash |
|||
source userpass |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"REVS\",\"rel\":\"KMD\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"CHIPS\",\"rel\":\"KMD\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"KMD\",\"rel\":\"BTC\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"SUPERNET\",\"rel\":\"KMD\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"CRYPTO\",\"rel\":\"KMD\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"DEX\",\"rel\":\"KMD\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"BOTS\",\"rel\":\"KMD\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"BET\",\"rel\":\"KMD\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"HODL\",\"rel\":\"KMD\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"MSHARK\",\"rel\":\"KMD\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"MGW\",\"rel\":\"KMD\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"PANGEA\",\"rel\":\"KMD\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"JUMBLR\",\"rel\":\"KMD\"}" |
@ -0,0 +1,4 @@ |
|||
#!/bin/bash |
|||
source userpass |
|||
# this will only work for watchonly addresses that have been rescanned and with active coins |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"fundvalue\",\"address\":\"RNcUaMUEFLxVwtTo7rgruhwYanGk1jTkeU\",\"holdings\":[{\"coin\":\"siacoin\",\"balance\":185000000,\"comment\":\"using siafunds equal to million siacoin\"}],\"divisor\":10000000}" |
@ -0,0 +1,4 @@ |
|||
#!/bin/bash |
|||
source userpass |
|||
# this will only work for watchonly addresses that have been rescanned and with active coins |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"fundvalue\",\"address\":\"RGhxXpXSSBTBm9EvNsXnTQczthMCxHX91t\",\"divisor\":1000000}" |
@ -0,0 +1,3 @@ |
|||
#!/bin/bash |
|||
source userpass |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"electrum\",\"coin\":\"KMD\",\"ipaddr\":\"\",\"port\":0}" |
@ -0,0 +1,943 @@ |
|||
/******************************************************************************
|
|||
* 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.
|
|||
//
|
|||
|
|||
|
|||
void PNACL_message(char *arg,...) |
|||
{ |
|||
|
|||
} |
|||
#define FROM_MARKETMAKER |
|||
|
|||
#include <stdio.h> |
|||
#include <stdint.h> |
|||
#ifndef NATIVE_WINDOWS |
|||
#include "OS_portable.h" |
|||
#else |
|||
#include "../../crypto777/OS_portable.h" |
|||
#endif // !_WIN_32
|
|||
|
|||
uint32_t DOCKERFLAG; |
|||
#define MAX(a,b) ((a) > (b) ? (a) : (b)) |
|||
char *stats_JSON(void *ctx,char *myipaddr,int32_t pubsock,cJSON *argjson,char *remoteaddr,uint16_t port); |
|||
#include "stats.c" |
|||
void LP_priceupdate(char *base,char *rel,double price,double avebid,double aveask,double highbid,double lowask,double PAXPRICES[32]); |
|||
|
|||
//defined(__APPLE__) ||
|
|||
#ifdef FROM_JS // defined(WIN32) || defined(USE_STATIC_NANOMSG)
|
|||
#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" |
|||
#include "../../crypto777/nanosrc/pair.h" |
|||
#else |
|||
#if defined(WIN32) || defined(USE_STATIC_NANOMSG) |
|||
#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" |
|||
#include "../../crypto777/nanosrc/pair.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" |
|||
#include "/usr/local/include/nanomsg/pair.h" |
|||
#endif |
|||
#endif |
|||
|
|||
char DEX_baseaddr[64],DEX_reladdr[64]; |
|||
struct mmpending_order |
|||
{ |
|||
double price,volume; |
|||
int32_t dir; |
|||
uint32_t pending,completed,canceled,cancelstarted,reported; |
|||
cJSON *errorjson; |
|||
char exchange[16],base[65],rel[65],orderid[64]; |
|||
} *Pending_orders; |
|||
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)]; |
|||
uint32_t PAXACTIVE; |
|||
|
|||
char *DEX_swapstatus() |
|||
{ |
|||
char url[512],postdata[1024]; |
|||
sprintf(url,"%s/?",IGUANA_URL); |
|||
sprintf(postdata,"{\"agent\":\"InstantDEX\",\"method\":\"getswaplist\"}"); |
|||
return(bitcoind_RPC(0,"InstantDEX",url,0,"getswaplist",postdata,0)); |
|||
} |
|||
|
|||
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,0)); |
|||
} |
|||
|
|||
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,0)); |
|||
} |
|||
|
|||
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,0)); |
|||
} |
|||
|
|||
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,0)); |
|||
} |
|||
|
|||
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,0)); |
|||
} |
|||
|
|||
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,0)); |
|||
} |
|||
else |
|||
{ |
|||
sprintf(postdata,"{\"agent\":\"InstantDEX\",\"method\":\"balance\",\"exchange\":\"%s\",\"base\":\"%s\"}",exchange,base); |
|||
return(bitcoind_RPC(0,"InstantDEX",url,0,"balance",postdata,0)); |
|||
} |
|||
} |
|||
|
|||
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,0)); |
|||
} |
|||
|
|||
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,0)); |
|||
} |
|||
|
|||
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,0)); |
|||
} |
|||
|
|||
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,0)); |
|||
} |
|||
|
|||
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,0)); |
|||
} |
|||
|
|||
/*char *iguana_listunspent(char *coin,char *coinaddr)
|
|||
{ |
|||
char url[512],postdata[1024]; |
|||
sprintf(url,"%s/coin=%s&agent=bitcoinrpc&method=listunspent?",IGUANA_URL,coin); |
|||
sprintf(postdata,"[\"%s\"]",coinaddr); |
|||
return(bitcoind_RPC(0,"",url,0,"listunspent",postdata)); |
|||
}*/ |
|||
|
|||
/*char *issue_LP_intro(char *destip,uint16_t destport,char *ipaddr,uint16_t port,int32_t numpeers)
|
|||
{ |
|||
char url[512]; |
|||
sprintf(url,"http://%s:%u/api/stats/intro?ipaddr=%s&port=%u&numpeers=%d",destip,destport,ipaddr,port,numpeers); |
|||
printf("(%s)\n",url); |
|||
return(issue_curl(url)); |
|||
}*/ |
|||
|
|||
//
|
|||
// http://127.0.0.1:7779/api/stats/getpeers
|
|||
|
|||
char *DEX_listunspent(char *coin,char *coinaddr) |
|||
{ |
|||
char url[512],postdata[1024]; |
|||
sprintf(url,"%s/?",IGUANA_URL); |
|||
sprintf(postdata,"{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"%s\",\"symbol\":\"%s\",\"timeout\":60000}",coinaddr,coin); |
|||
return(bitcoind_RPC(0,"dex",url,0,"listunspent",postdata,0)); |
|||
} |
|||
|
|||
bits256 iguana_wif2privkey(char *wifstr) |
|||
{ |
|||
char url[512],postdata[1024],*retstr,*privstr; bits256 privkey; cJSON *retjson; |
|||
memset(privkey.bytes,0,sizeof(privkey)); |
|||
sprintf(url,"%s/?",IGUANA_URL); |
|||
sprintf(postdata,"{\"agent\":\"SuperNET\",\"method\":\"wif2priv\",\"wif\":\"%s\"}",wifstr); |
|||
if ( (retstr= bitcoind_RPC(0,"SuperNET",url,0,"wif2priv",postdata,0)) != 0 ) |
|||
{ |
|||
if ( (retjson= cJSON_Parse(retstr)) != 0 ) |
|||
{ |
|||
if ( (privstr= jstr(retjson,"privkey")) != 0 ) |
|||
{ |
|||
if ( strlen(privstr) == 64 ) |
|||
decode_hex(privkey.bytes,32,privstr); |
|||
} |
|||
free_json(retjson); |
|||
} |
|||
free(retstr); |
|||
} |
|||
return(privkey); |
|||
} |
|||
|
|||
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); |
|||
} |
|||
|
|||
int32_t komodo_baseid(char *base) |
|||
{ |
|||
int32_t i; |
|||
for (i=0; i<sizeof(CURRENCIES)/sizeof(*CURRENCIES); i++) |
|||
if ( strcmp(base,CURRENCIES[i]) == 0 ) |
|||
return(i); |
|||
return(-1); |
|||
} |
|||
|
|||
cJSON *yahoo_allcurrencies() |
|||
{ |
|||
char *retstr; cJSON *retjson = 0; |
|||
if ( (retstr= issue_curl("http://finance.yahoo.com/webservice/v1/symbols/allcurrencies/quote?format=json")) != 0 ) |
|||
{ |
|||
retjson = cJSON_Parse(retstr); |
|||
free(retstr); |
|||
} |
|||
return(retjson); |
|||
} |
|||
|
|||
void _marketmaker_fiatupdate(int32_t baseid,double price) |
|||
{ |
|||
PAXPRICES[baseid] = price * PAXPRICES[0]; |
|||
printf("%.6f %s per USD, %.8f %s per KMD\n",price,CURRENCIES[baseid],PAXPRICES[baseid],CURRENCIES[baseid]); |
|||
} |
|||
|
|||
uint32_t marketmaker_fiatupdate(cJSON *fiatjson) |
|||
{ |
|||
int32_t i,n,baseid; cJSON *item,*array; double price; char *name; uint64_t mask = 0; |
|||
fiatjson = jobj(fiatjson,"list"); |
|||
if ( fiatjson != 0 && (array= jarray(&n,fiatjson,"resources")) > 0 ) |
|||
{ |
|||
for (i=0; i<n; i++) |
|||
{ |
|||
/*
|
|||
"resource" : { |
|||
"classname" : "Quote", |
|||
"fields" : { |
|||
"name" : "USD/BRX", |
|||
"price" : "3.063200", |
|||
"symbol" : "BRX=X", |
|||
"ts" : "1487866204", |
|||
"type" : "currency", |
|||
"utctime" : "2017-02-23T16:10:04+0000", |
|||
"volume" : "0" |
|||
} |
|||
*/ |
|||
item = jitem(array,i); |
|||
if ( (item= jobj(item,"resource")) != 0 ) |
|||
item = jobj(item,"fields"); |
|||
if ( item != 0 ) |
|||
{ |
|||
price = jdouble(item,"price"); |
|||
if ( price > 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; |
|||
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; i<Num_Pending; i++) |
|||
{ |
|||
ptr = &Pending_orders[i]; |
|||
if ( strcmp(exchange,ptr->exchange) != 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,*pairstr,relbase[65]; cJSON *retjson,*array,*item; int32_t i,j,n,dir; struct mmpending_order *ptr; |
|||
sprintf(relbase,"%s-%s",rel,base); |
|||
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; i<n; i++) |
|||
{ |
|||
item = jitem(array,i); |
|||
if ( (pairstr= jstr(item,"Exchange")) == 0 ) |
|||
continue; |
|||
if ( strcmp(pairstr,relbase) != 0 ) |
|||
{ |
|||
printf("skip %s when %s\n",pairstr,relbase); |
|||
continue; |
|||
} |
|||
//printf("(%s)\n",jprint(item,0));
|
|||
//{"success":true,"message":"","result":[{"Uuid":null,"OrderUuid":"81ad3e37-65d4-4fee-9c29-03b050f5192b","Exchange":"BTC-KMD","OrderType":"LIMIT_BUY","Quantity":885.19934578,"QuantityRemaining":885.19934578,"Limit":0.00011184,"CommissionPaid":0,"Price":0,"PricePerUnit":null,"Opened":"2017-02-19T19:14:02.94","Closed":null,"CancelInitiated":false,"ImmediateOrCancel":false,"IsConditional":false,"Condition":"NONE","ConditionTarget":null}],"tag":"10056789044100011414"}
|
|||
if ( (orderid= jstr(item,"OrderUuid")) != 0 && is_cJSON_Null(jobj(item,"Closed")) != 0 && is_cJSON_False(jobj(item,"CancelInitiated")) != 0 ) |
|||
{ |
|||
for (j=0; j<Num_Pending; j++) |
|||
{ |
|||
ptr = &Pending_orders[j]; |
|||
if ( strcmp(exchange,ptr->exchange) != 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; i<Num_Pending; i++) |
|||
{ |
|||
ptr = &Pending_orders[i]; |
|||
if ( strcmp(exchange,ptr->exchange) != 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; i<Num_Pending; i++) |
|||
{ |
|||
ptr = &Pending_orders[i]; |
|||
if ( strcmp(exchange,ptr->exchange) != 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]; double vol,spread_ratio; |
|||
memset(nearflags,0,sizeof(nearflags)); |
|||
if ( strcmp("DEX",exchange) != 0 ) |
|||
{ |
|||
for (i=0; i<Num_Pending; i++) |
|||
{ |
|||
ptr = &Pending_orders[i]; |
|||
if ( strcmp(exchange,ptr->exchange) != 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 ) |
|||
{ |
|||
//printf("bid %.8f near %.8f\n",bid,ptr->price);
|
|||
nearflags[0]++; |
|||
} |
|||
if ( ask > SMALLVAL && askvol > SMALLVAL && ptr->dir < 0 && fabs(ask - ptr->price) < separation ) |
|||
{ |
|||
//printf("%.8f near %.8f\n",ask,ptr->price);
|
|||
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 && strcmp(base,"KMD") == 0 && strcmp(rel,"BTC") == 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); |
|||
vol = bidvol > askvol ? askvol : bidvol; |
|||
jaddnum(vals,"maxvol",vol); |
|||
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)) != 0 ) |
|||
{ |
|||
//printf("(%s) -> (%s)\n",postdata,retstr);
|
|||
free(retstr); |
|||
} |
|||
spread_ratio = .5 * ((ask - bid) / (bid + ask)); |
|||
for (i=0; i<sizeof(CURRENCIES)/sizeof(*CURRENCIES); i++) |
|||
{ |
|||
if ( (PAXACTIVE & (1<<i)) == 0 ) |
|||
continue; |
|||
if ( PAXPRICES[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",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)) != 0 ) |
|||
{ |
|||
//printf("(%s) -> (%s)\n",postdata,retstr);
|
|||
free(retstr); |
|||
} |
|||
} |
|||
//break;
|
|||
} |
|||
} 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); |
|||
} //else printf("skip bid %s %.8f vol %f\n",exchange,bid,bidvol);
|
|||
} |
|||
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); |
|||
} |
|||
} //else printf("skip ask %s %.8f vol %f\n",exchange,bid,bidvol);
|
|||
return(n); |
|||
} |
|||
|
|||
double marketmaker_updateprice(char *name,char *base,char *rel,double theoretical,double *incrp) |
|||
{ |
|||
static uint32_t counter; |
|||
cJSON *fiatjson; double USD_average=0.,usdprice=0.,CMC_average=0.,avebid=0.,aveask=0.,val,changes[3],highbid=0.,lowask=0.; |
|||
if ( (val= get_theoretical(&avebid,&aveask,&highbid,&lowask,&CMC_average,changes,name,base,rel,&USD_average)) != 0. ) |
|||
{ |
|||
if ( theoretical == 0. ) |
|||
{ |
|||
theoretical = val; |
|||
if ( *incrp > 2 ) |
|||
{ |
|||
*incrp = (int32_t)*incrp; |
|||
*incrp += 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); |
|||
} |
|||
} |
|||
} |
|||
LP_priceupdate(base,rel,theoretical,avebid,aveask,highbid,lowask,PAXPRICES); |
|||
} |
|||
return(theoretical); |
|||
} |
|||
|
|||
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) |
|||
{ |
|||
char *retstr; double bid,ask,start_DEXbase,start_DEXrel,DEX_base = 0.,DEX_rel = 0.,balance_base=0.,balance_rel=0.,mmbid,mmask,aveprice,incr,pendingbids,pendingasks,buyvol,sellvol,bidincr,askincr,filledprice,avebid=0.,aveask=0.,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 ( (theoretical= marketmaker_updateprice(name,base,rel,theoretical,&incr)) != 0. ) |
|||
{ |
|||
if ( lasttime == 0 ) |
|||
maxexposure /= theoretical; |
|||
} |
|||
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 || (maxbid > SMALLVAL && mmbid > maxbid) ) //mmbid < highbid ||
|
|||
{ |
|||
printf("clear mmbid %.8f lowask %.8f maxbid %.8f\n",mmbid,lowask,maxbid); |
|||
mmbid = 0.; |
|||
} |
|||
if ( mmask <= highbid || (minask > SMALLVAL && mmask < minask) ) // 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) 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 ( (retstr= DEX_swapstatus()) != 0 ) |
|||
printf("%s\n",retstr), free(retstr); |
|||
printf("%s %s %s, %s %s %s\n",base,DEX_baseaddr,DEX_balance("DEX",base,DEX_baseaddr),rel,DEX_reladdr,DEX_balance("DEX",rel,DEX_reladdr)); |
|||
if ( (aveask - avebid)/aveprice > profitmargin ) |
|||
bid = highbid * (1 - profitmargin), ask = lowask * (1 + 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) && (pendingbids + buyvol) > bidincr ) |
|||
{ |
|||
bidincr *= ((double)(pendingasks + sellvol) / ((pendingbids + buyvol) + (pendingasks + sellvol))); |
|||
printf("bidincr %f buy.(%f + %f) sell.(%f + %f)\n",bidincr,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) && (pendingasks + sellvol) > askincr ) |
|||
{ |
|||
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); |
|||
} |
|||
} |
|||
} |
|||
|
|||
#include "LP_nativeDEX.c" |
|||
|
|||
void LP_main(void *ptr) |
|||
{ |
|||
char *passphrase; double profitmargin; uint16_t port; cJSON *argjson = ptr; |
|||
if ( (passphrase= jstr(argjson,"passphrase")) != 0 ) |
|||
{ |
|||
profitmargin = jdouble(argjson,"profitmargin"); |
|||
LP_profitratio += profitmargin; |
|||
if ( (port= juint(argjson,"rpcport")) < 1000 ) |
|||
port = LP_RPCPORT; |
|||
LPinit(port,LP_RPCPORT+10,LP_RPCPORT+20,LP_RPCPORT+30,passphrase,jint(argjson,"client"),jstr(argjson,"userhome"),argjson); |
|||
} |
|||
} |
|||
|
|||
int main(int argc, const char * argv[]) |
|||
{ |
|||
char dirname[512],*base,*rel,*name,*exchange,*apikey,*apisecret,*blocktrail,*retstr,*baseaddr,*reladdr,*passphrase; |
|||
double profitmargin,maxexposure,incrratio,start_rel,start_base,minask,maxbid,incr; |
|||
cJSON *retjson,*loginjson; int32_t i; |
|||
OS_init(); |
|||
if ( strstr(argv[0],"btc2kmd") != 0 && argv[1] != 0 ) |
|||
{ |
|||
uint8_t addrtype,rmd160[20],rmd160b[20]; char coinaddr[64],coinaddr2[64]; |
|||
bitcoin_addr2rmd160(0,&addrtype,rmd160,(char *)argv[1]); |
|||
if ( addrtype == 0 ) |
|||
{ |
|||
bitcoin_address(coinaddr,0,60,rmd160,20); |
|||
bitcoin_addr2rmd160(0,&addrtype,rmd160b,coinaddr); |
|||
bitcoin_address(coinaddr2,0,0,rmd160b,20); |
|||
} |
|||
else if ( addrtype == 60 ) |
|||
{ |
|||
bitcoin_address(coinaddr,0,0,rmd160,20); |
|||
bitcoin_addr2rmd160(0,&addrtype,rmd160b,coinaddr); |
|||
bitcoin_address(coinaddr2,0,60,rmd160b,20); |
|||
} |
|||
printf("(%s) -> %s -> %s\n",(char *)argv[1],coinaddr,coinaddr2); |
|||
if ( strcmp((char *)argv[1],coinaddr2) != 0 ) |
|||
printf("ERROR\n"); |
|||
exit(0); |
|||
} |
|||
sprintf(dirname,"%s",GLOBAL_DBDIR), OS_ensure_directory(dirname); |
|||
sprintf(dirname,"%s/SWAPS",GLOBAL_DBDIR), OS_ensure_directory(dirname); |
|||
sprintf(dirname,"%s/PRICES",GLOBAL_DBDIR), OS_ensure_directory(dirname); |
|||
sprintf(dirname,"%s/UNSPENTS",GLOBAL_DBDIR), OS_ensure_directory(dirname); |
|||
#ifdef FROM_JS |
|||
argc = 2; |
|||
retjson = cJSON_Parse("{\"client\":1,\"passphrase\":\"test\"}"); |
|||
printf("calling LP_main(%s)\n",jprint(retjson,0)); |
|||
LP_main(retjson); |
|||
emscripten_set_main_loop(LP_fromjs_iter,1,0); |
|||
#else |
|||
if ( argc == 1 ) |
|||
{ |
|||
LP_NXT_redeems(); |
|||
sleep(3); |
|||
return(0); |
|||
} |
|||
if ( argc > 1 && (retjson= cJSON_Parse(argv[1])) != 0 ) |
|||
{ |
|||
if ( jint(retjson,"docker") == 1 ) |
|||
DOCKERFLAG = 1; |
|||
else if ( jstr(retjson,"docker") != 0 ) |
|||
DOCKERFLAG = (uint32_t)calc_ipbits(jstr(retjson,"docker")); |
|||
if ( (passphrase= jstr(retjson,"passphrase")) == 0 ) |
|||
jaddstr(retjson,"passphrase","test"); |
|||
if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)LP_main,(void *)retjson) != 0 ) |
|||
{ |
|||
printf("error launching LP_main (%s)\n",jprint(retjson,0)); |
|||
exit(-1); |
|||
} //else printf("(%s) launched.(%s)\n",argv[1],passphrase);
|
|||
incr = 100.; |
|||
while ( (1) ) |
|||
sleep(100000); |
|||
profitmargin = jdouble(retjson,"profitmargin"); |
|||
minask = jdouble(retjson,"minask"); |
|||
maxbid = jdouble(retjson,"maxbid"); |
|||
maxexposure = jdouble(retjson,"maxexposure"); |
|||
incrratio = jdouble(retjson,"lotratio"); |
|||
start_base = jdouble(retjson,"start_base"); |
|||
start_rel = jdouble(retjson,"start_rel"); |
|||
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"); |
|||
PAXACTIVE = juint(retjson,"paxactive"); |
|||
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/%s) login.(%s)\n",base,rel,retstr); |
|||
if ( (loginjson= cJSON_Parse(retstr)) != 0 ) |
|||
{ |
|||
if ( PAXACTIVE != 0 ) |
|||
{ |
|||
for (i=0; i<32; i++) |
|||
{ |
|||
if ( ((1<<i) & PAXACTIVE) != 0 ) |
|||
{ |
|||
if ( jstr(loginjson,CURRENCIES[i]) == 0 ) |
|||
PAXACTIVE &= ~(1 << i); |
|||
} |
|||
} |
|||
} |
|||
if ( (baseaddr= jstr(loginjson,base)) == 0 || (reladdr= jstr(loginjson,rel)) == 0 ) |
|||
{ |
|||
printf("Need to activate both %s and %s before marketmaker\n",base,rel); |
|||
exit(1); |
|||
} |
|||
printf("%s\n",DEX_apikeypair(exchange,apikey,apisecret)); |
|||
marketmaker_pendinginit(exchange,base,rel); |
|||
if ( baseaddr != 0 && reladdr != 0 ) |
|||
{ |
|||
printf("PAXACTIVE.%08x %s\n",PAXACTIVE,DEX_amlp(blocktrail)); |
|||
strncpy(DEX_baseaddr,baseaddr,sizeof(DEX_baseaddr)-1); |
|||
strncpy(DEX_reladdr,reladdr,sizeof(DEX_reladdr)-1); |
|||
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(minask,maxbid,baseaddr,reladdr,start_base,start_rel,profitmargin,maxexposure,incrratio,exchange,name,base,rel); |
|||
} |
|||
free_json(loginjson); |
|||
} else printf("ERROR parsing.(%s)\n",retstr); |
|||
free(retstr); |
|||
} |
|||
free_json(retjson); |
|||
} |
|||
#endif |
|||
return 0; |
|||
} |
@ -0,0 +1,4 @@ |
|||
#!/bin/bash |
|||
source userpass |
|||
# this will only work for watchonly addresses that have been rescanned and with active coins |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"fundvalue\",\"address\":\"RTu3JZZKLJTcfNwBa19dWRagEfQq49STqC\",\"holdings\":[{\"coin\":\"iota\",\"balance\":1500000}, {\"coin\":\"bitcoin-cash\",\"balance\":1200}, {\"coin\":\"bitcoin\",\"balance\":145}],\"divisor\":1400000}" |
@ -0,0 +1,3 @@ |
|||
#!/bin/bash |
|||
source userpass |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"swapstatus\",\"pending\":1}" |
@ -0,0 +1,49 @@ |
|||
#!/bin/bash |
|||
margin=0.05 |
|||
source userpass |
|||
./auto_chipskmd |
|||
./auto_chipsbtc |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"autoprice\",\"base\":\"KMD\",\"rel\":\"BTC\",\"margin\":$margin,\"refbase\":\"komodo\",\"refrel\":\"coinmarketcap\"}" |
|||
#curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"autoprice\",\"base\":\"BTC\",\"rel\":\"KMD\",\"fixed\":0.00025,\"margin\":$margin}" |
|||
#curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"autoprice\",\"base\":\"KMD\",\"rel\":\"BTC\",\"fixed\":4000,\"margin\":$margin}" |
|||
#curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"autoprice\",\"base\":\"KMD\",\"rel\":\"MNZ\",\"offset\":0.0,\"refbase\":\"KMD\",\"refrel\":\"BTC\",\"factor\":15000,\"margin\":-0.2}" |
|||
|
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"autoprice\",\"base\":\"HUSH\",\"rel\":\"KMD\",\"margin\":$margin,\"refbase\":\"hush\",\"refrel\":\"coinmarketcap\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"autoprice\",\"base\":\"KMD\",\"rel\":\"BTCH\",\"offset\":0.0,\"refbase\":\"KMD\",\"refrel\":\"HUSH\",\"factor\":1.44,\"buymargin\":0.01,\"sellmargin\":0.01}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"autoprice\",\"base\":\"BTCH\",\"rel\":\"KMD\",\"offset\":0.0,\"refbase\":\"HUSH\",\"refrel\":\"KMD\",\"factor\":0.7,\"buymargin\":0.01,\"sellmargin\":0.01}" |
|||
|
|||
|
|||
source crypto |
|||
source trackbtc |
|||
|
|||
source dex |
|||
source trackbtc |
|||
|
|||
source jumblr |
|||
source trackbtc |
|||
|
|||
source pangea |
|||
source trackbtc |
|||
|
|||
source bots |
|||
source trackbtc |
|||
|
|||
source bet |
|||
source trackbtc |
|||
|
|||
source revs |
|||
source trackbtc |
|||
|
|||
source mgw |
|||
source trackbtc |
|||
|
|||
source revs |
|||
source trackbtc |
|||
|
|||
sharkholdings="{\"coin\":\"iota\",\"balance\":1500000}, {\"coin\":\"bitcoin-cash\",\"balance\":1200}, {\"coin\":\"bitcoin\",\"balance\":145}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"base\":\"MSHARK\",\"rel\":\"KMD\",\"fundvalue_bid\":\"NAV_KMD\",\"fundvalue_ask\":\"assetNAV_KMD\",\"userpass\":\"$userpass\",\"method\":\"autoprice\",\"address\":\"RTu3JZZKLJTcfNwBa19dWRagEfQq49STqC\",\"holdings\":[$sharkholdings],\"divisor\":1400000}" |
|||
|
|||
|
|||
curl --url "http://127.0.0.1:7783" --data "{\"base\":\"SUPERNET\",\"rel\":\"KMD\",\"fundvalue_bid\":\"NAV_KMD\",\"fundvalue_ask\":\"assetNAV_KMD\",\"userpass\":\"$userpass\",\"method\":\"autoprice\",\"address\":\"RRyyejME7LRTuvdziWsXkAbSW1fdiohGwK\",\"holdings\":[{\"coin\":\"iota\",\"balance\":11000000}, {\"coin\":\"stratis\",\"balance\":1300000}, {\"coin\":\"zcash\",\"balance\":10000}, {\"coin\":\"syscoin\",\"balance\":20000000}, {\"coin\":\"waves\",\"balance\":700000}, {\"coin\":\"bitcoin\",\"balance\":625}, {\"coin\":\"bitcoin-cash\",\"balance\":1500}, {\"coin\":\"heat-ledger\",\"balance\":2323851 }, {\"coin\":\"decred\",\"balance\":20000}, {\"coin\":\"vericoin\",\"balance\":2199368 }, {\"coin\":\"byteball\",\"balance\":4238}, {\"coin\":\"iocoin\",\"balance\":150000}, {\"coin\":\"quantum-resistant-ledger\",\"balance\":375000}, {\"coin\":\"chips\",\"balance\":2577006 }, {\"coin\":\"hush\",\"balance\":100000 }, {\"coin\":\"mobilego\",\"balance\":100000 }],\"divisor\":816016}" |
|||
|
|||
curl --url "http://127.0.0.1:7783" --data "{\"margin\":$margin,\"base\":\"HODL\",\"rel\":\"KMD\",\"fundvalue_bid\":\"assetNAV_KMD\",\"fundvalue_ask\":\"assetNAV_KMD\",\"userpass\":\"$userpass\",\"method\":\"autoprice\",\"address\":\"RNcUaMUEFLxVwtTo7rgruhwYanGk1jTkeU\",\"holdings\":[{\"coin\":\"siacoin\",\"balance\":185000000,\"comment\":\"using siafunds equal to million siacoin\"}],\"divisor\":10000000}" |
@ -0,0 +1,3 @@ |
|||
coin=BET |
|||
price=0.0005 |
|||
invprice=2000 |
@ -0,0 +1,3 @@ |
|||
coin=BOTS |
|||
price=0.001 |
|||
invprice=1000 |
@ -0,0 +1,3 @@ |
|||
coin=CRYPTO |
|||
price=0.002666666 |
|||
invprice=375 |
@ -0,0 +1,3 @@ |
|||
coin=DEX |
|||
price=0.0030 |
|||
invprice=333 |
@ -0,0 +1,18 @@ |
|||
#!/bin/bash |
|||
source userpass |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"REVS\",\"rel\":\"KMD\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"CHIPS\",\"rel\":\"KMD\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"KMD\",\"rel\":\"BTC\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"SUPERNET\",\"rel\":\"KMD\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"CRYPTO\",\"rel\":\"KMD\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"DEX\",\"rel\":\"KMD\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"BOTS\",\"rel\":\"KMD\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"BET\",\"rel\":\"KMD\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"HODL\",\"rel\":\"KMD\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"MSHARK\",\"rel\":\"KMD\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"MGW\",\"rel\":\"KMD\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"PANGEA\",\"rel\":\"KMD\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"JUMBLR\",\"rel\":\"KMD\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"HUSH\",\"rel\":\"KMD\"}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"BTCH\",\"rel\":\"KMD\"}" |
|||
|
@ -0,0 +1,3 @@ |
|||
coin=JUMBLR |
|||
price=0.002 |
|||
invprice=500 |
@ -0,0 +1,3 @@ |
|||
coin=MGW |
|||
price=0.00015 |
|||
invprice=6666 |
@ -0,0 +1,3 @@ |
|||
coin=PANGEA |
|||
price=0.001 |
|||
invprice=1000 |
@ -0,0 +1,3 @@ |
|||
coin=REVS |
|||
price=0.0005 |
|||
invprice=2000 |
@ -1,3 +1,3 @@ |
|||
#!/bin/bash |
|||
source userpass |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"sell\",\"base\":\"KMD\",\"rel\":\"BTC\",\"basevolume\":10.0\",\"price\":0.0005}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"sell\",\"base\":\"KMD\",\"rel\":\"BTC\",\"basevolume\":10.0,\"price\":0.0005}" |
|||
|
@ -0,0 +1,20 @@ |
|||
#!/bin/bash |
|||
source userpass |
|||
# this will only work for watchonly addresses that have been rescanned and with active coins |
|||
echo mshark |
|||
./mshark |
|||
echo hodl |
|||
./hodl |
|||
echo dex |
|||
./dex |
|||
echo jumblr |
|||
./jumblr |
|||
echo bots |
|||
./bots |
|||
echo supernet |
|||
|
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"balances\",\"address\":\"RRyyejME7LRTuvdziWsXkAbSW1fdiohGwK\"}" |
|||
echo supernet |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"fundvalue\",\"address\":\"RRyyejME7LRTuvdziWsXkAbSW1fdiohGwK\",\"holdings\":[{\"coin\":\"iota\",\"balance\":11000000}, {\"coin\":\"stratis\",\"balance\":1300000}, {\"coin\":\"zcash\",\"balance\":10000}, {\"coin\":\"syscoin\",\"balance\":20000000}, {\"coin\":\"waves\",\"balance\":700000}, {\"coin\":\"bitcoin\",\"balance\":625}, {\"coin\":\"bitcoin-cash\",\"balance\":1500}, {\"coin\":\"heat-ledger\",\"balance\":2323851 }, {\"coin\":\"decred\",\"balance\":20000}, {\"coin\":\"vericoin\",\"balance\":2199368 }, {\"coin\":\"byteball\",\"balance\":4238}, {\"coin\":\"iocoin\",\"balance\":150000}, {\"coin\":\"quantum-resistant-ledger\",\"balance\":375000}, {\"coin\":\"hush\",\"balance\":100000 }, {\"coin\":\"mobilego\",\"balance\":100000 }],\"divisor\":816016}" |
|||
|
|||
#curl --url "http://5.9.253.196:7782" --data "{\"userpass\":\"$userpass\",\"method\":\"fundvalue\",\"address\":\"RRyyejME7LRTuvdziWsXkAbSW1fdiohGwK\",\"holdings\":[{\"coin\":\"iota\",\"balance\":11000000}, {\"coin\":\"stratis\",\"balance\":1300000}, {\"coin\":\"zcash\",\"balance\":10000}, {\"coin\":\"syscoin\",\"balance\":20000000}, {\"coin\":\"waves\",\"balance\":700000}, {\"coin\":\"bitcoin\",\"balance\":625}, {\"coin\":\"bitcoin-cash\",\"balance\":1500}, {\"coin\":\"heat-ledger\",\"balance\":2323851 }, {\"coin\":\"decred\",\"balance\":20000}, {\"coin\":\"vericoin\",\"balance\":2199368 }, {\"coin\":\"byteball\",\"balance\":4238}, {\"coin\":\"iocoin\",\"balance\":150000}, {\"coin\":\"quantum-resistant-ledger\",\"balance\":375000}, {\"coin\":\"chips\",\"balance\":2577006 }, {\"coin\":\"hush\",\"balance\":100000 }, {\"coin\":\"mobilego\",\"balance\":100000 }],\"divisor\":816016}" |
@ -0,0 +1,3 @@ |
|||
#!/bin/bash |
|||
source userpass |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"ticker\",\"base\":\"REVS\",\"rel\":\"KMD\"}" |
@ -0,0 +1,2 @@ |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"autoprice\",\"base\":\"KMD\",\"rel\":\"$coin\",\"offset\":0.0,\"refbase\":\"KMD\",\"refrel\":\"BTC\",\"factor\":$invprice,\"margin\":$margin}" |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"autoprice\",\"base\":\"$coin\",\"rel\":\"KMD\",\"offset\":0.0,\"refbase\":\"BTC\",\"refrel\":\"KMD\",\"factor\":$price,\"margin\":$margin}" |
@ -0,0 +1,3 @@ |
|||
#!/bin/bash |
|||
source userpass |
|||
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"tradesarray\",\"base\":\"REVS\",\"rel\":\"KMD\",\"timescale\":3600}" |
@ -0,0 +1,50 @@ |
|||
#!/bin/bash |
|||
|
|||
cd secp256k1; ./m_unix; cd .. |
|||
cd ../crypto777; ./m_LP; cd ../iguana |
|||
#gcc -g -fno-aggressive-loop-optimizations -Wno-deprecated -c -O2 -DISNOTARYNODE=1 -DLIQUIDITY_PROVIDER=1 *.c ../basilisk/basilisk.c ../gecko/gecko.c ../datachain/datachain.c |
|||
clang -g -Wno-deprecated -c -O2 -DISNOTARYNODE=1 -DLIQUIDITY_PROVIDER=1 *.c ../basilisk/basilisk.c ../gecko/gecko.c ../datachain/datachain.c |
|||
#gcc -g -fno-aggressive-loop-optimizations -Wno-deprecated -c -DISNOTARYNODE=1 -DLIQUIDITY_PROVIDER=1 main.c iguana777.c iguana_bundles.c ../basilisk/basilisk.c |
|||
clang -g -Wno-deprecated -c -DISNOTARYNODE=1 -DLIQUIDITY_PROVIDER=1 main.c iguana777.c iguana_bundles.c ../basilisk/basilisk.c |
|||
clang -g -o ../agents/iguana *.o ../agents/libcrypto777.a -lnanomsg -lcurl -lssl -lcrypto -lpthread -lz -lm |
|||
|
|||
../agents/iguana notary & #> iguana.log 2> error.log & |
|||
|
|||
myip=`curl -s4 checkip.amazonaws.com` |
|||
source pubkey.txt |
|||
|
|||
sleep 4 |
|||
curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"SuperNET\",\"method\":\"myipaddr\",\"ipaddr\":\"$myip\"}" |
|||
sleep 3 |
|||
tests/addnotarys_7776 |
|||
coins/btc_7776 |
|||
coins/ltc_7776 |
|||
coins/kmd_7776 |
|||
coins/chips_7776 |
|||
./wp_7776 |
|||
|
|||
coins/revs_7776 |
|||
coins/supernet_7776 |
|||
coins/dex_7776 |
|||
coins/bet_7776 |
|||
coins/bots_7776 |
|||
coins/hodl_7776 |
|||
coins/shark_7776 |
|||
coins/mshark_7776 |
|||
coins/jumblr_7776 |
|||
coins/crypto_7776 |
|||
coins/pangea_7776 |
|||
coins/mgw_7776 |
|||
coins/coqui_7776 |
|||
coins/wlc_7776 |
|||
coins/kv_7776 |
|||
coins/ceal_7776 |
|||
coins/mesh_7776 |
|||
coins/mnz_7776 |
|||
coins/axo_7776 |
|||
coins/etomic_7776 |
|||
coins/btch_7776 |
|||
#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"passthru\",\"method\":\"paxfiats\",\"timeout\":900000}" |
|||
|
|||
#curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"addnotary\",\"ipaddr\":\"$myip\"}" |
|||
curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"KMD\",\"pubkey\":\"$pubkey\"}" |
Loading…
Reference in new issue