Merge branch 'dev' into sietch
Conflicts: src/coins.cpp
This commit is contained in:
1151
src/KMD.batch0
1151
src/KMD.batch0
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,525 +0,0 @@
|
||||
{"isvalid":true,"address":"RG1QE6hTqu4dadL2XSNWS9VCHjd8xNVo58","scriptPubKey":"76a91449cc5da005a2aa06e6690353e722f88ee89363a588ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RG1QE6hTqu4dadL2XSNWS9VCHjd8xNVo58","randipbits":3539516869,"coin":"KMD","tag":"16288560152454326470"}
|
||||
6c41106538a27ef2bb120c00dd1d3e20090f1b840566bdd7512e4a0bca186215
|
||||
{"isvalid":true,"address":"RFVvyUAnQe5yon6wq7B73Z1BzfFeZKyAZA","scriptPubKey":"76a91444398dc662aac85fc0609aec81e9d79322ce900c88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RFVvyUAnQe5yon6wq7B73Z1BzfFeZKyAZA","randipbits":1411135637,"coin":"KMD","tag":"3179312406704497929"}
|
||||
05bd059c29f88d5d9035c4f1c1cebed5472d90fe76ed9e690799e9184809c710
|
||||
{"isvalid":true,"address":"RL9YVW2GxbYh6hM3D1J7Z2y4feK4MrwZqe","scriptPubKey":"76a914773718a66f6b0c7659317ca4fc18190605e17d7388ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RL9YVW2GxbYh6hM3D1J7Z2y4feK4MrwZqe","randipbits":91648679,"coin":"KMD","tag":"11766425327561479716"}
|
||||
b523610a955ca1eac0c1dd045638187faf1e3fc5e2f1bfaf1afe83d237072c82
|
||||
{"isvalid":true,"address":"RRCwketDe8CXt4dMWpL4NpQntxJvmwousn","scriptPubKey":"76a914aeb463ff1d4c9c27b5f09a35b990e0fba0615efb88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RRCwketDe8CXt4dMWpL4NpQntxJvmwousn","randipbits":3795805790,"coin":"KMD","tag":"2213064305641142722"}
|
||||
4bf772a69fd710e33120d3505af324c8f8385c998667e4edfb61bf6b8bc581ab
|
||||
{"isvalid":true,"address":"RWfaj9ZNmHq5A4jV411xpt1FJoyvKfVJ6c","scriptPubKey":"76a914ea96b2ebeaaaddbdcebee688115f0cd17ef21de088ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RWfaj9ZNmHq5A4jV411xpt1FJoyvKfVJ6c","randipbits":54591336,"coin":"KMD","tag":"1991526992156118043"}
|
||||
6d6149051a2ada76f42602086904aebb7ad4204d0b839718357aa4fd7e099d57
|
||||
{"isvalid":true,"address":"R9dTcQWVDuaRdFqDzq4xPaFDjGbaLK6t8n","scriptPubKey":"76a91403d5490200db77ec959c5cf6969cf05f14df3ed188ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"R9dTcQWVDuaRdFqDzq4xPaFDjGbaLK6t8n","randipbits":1411135637,"coin":"KMD","tag":"12495037900283412508"}
|
||||
9056c3261b7e83aca6b7452e67624ec41fcb1f34828909567d2bc9de281b3fb2
|
||||
{"isvalid":true,"address":"RDfCcqrNn8wgkr8CL29Z7PynpGP4w2ZySQ","scriptPubKey":"76a914300a1aec1446041f14da6d398db07401f8c99c8c88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RDfCcqrNn8wgkr8CL29Z7PynpGP4w2ZySQ","randipbits":3909093808,"coin":"KMD","tag":"11062888787074595098"}
|
||||
c481af1d88dd5a4a7bd70215ee844fbf93d0b8cbbbd14b7e2d3ee4159e942e8d
|
||||
{"isvalid":true,"address":"REvJWEuwqmwTnanZ8bWt85wnjfrsAjnvgE","scriptPubKey":"76a9143ddd624736664ccccf41b086ca4365f699b05cfd88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"REvJWEuwqmwTnanZ8bWt85wnjfrsAjnvgE","randipbits":3510593118,"coin":"KMD","tag":"7033063778497304509"}
|
||||
487390833e214ef3844db459a6e89c8793afb82f14d0c15032679c29bc4f969b
|
||||
{"isvalid":true,"address":"RXb4SUn9mQ4Q1Fa8eehn5vitcfMMCjW2Ub","scriptPubKey":"76a914f4b3e0d24ea8a51e5e881c9bb895f4c9ee9e13c288ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RXb4SUn9mQ4Q1Fa8eehn5vitcfMMCjW2Ub","randipbits":91648679,"coin":"KMD","tag":"10824723049153421531"}
|
||||
0342364215116a32fa2867493057700bd5e475f14385b68d868bb20a5fc60fee
|
||||
{"isvalid":true,"address":"RBpEnyzuQNj1hNdAG1pKLALpAWEUS67PBj","scriptPubKey":"76a9141bcf69a7ab607498d0f1c63b2fa688e5154975bc88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RBpEnyzuQNj1hNdAG1pKLALpAWEUS67PBj","randipbits":3558029461,"coin":"KMD","tag":"7785495498399627728"}
|
||||
5096f8365fae17da86137a1cbea31bf06cc3b0c9d511260a29aa134c284fde7c
|
||||
{"isvalid":true,"address":"RGCCkHkLTkSiQFMeFvWSPzM2rNM3rrDkfw","scriptPubKey":"76a9144bd75bd5192483706cdcd0049822713f6c3afd3c88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RGCCkHkLTkSiQFMeFvWSPzM2rNM3rrDkfw","randipbits":3401109677,"coin":"KMD","tag":"16537564279194878673"}
|
||||
6919ad3587cbe425da0dbe4310f26f9395632fca5f9a05ac43ddd98d30a3d9cc
|
||||
{"isvalid":true,"address":"RR6soE71ZggsYm6FeSVqebtn6oruYm3Xr8","scriptPubKey":"76a914ad8e97c42d07bad4bde9a0beece8316c64b0b9cf88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RR6soE71ZggsYm6FeSVqebtn6oruYm3Xr8","randipbits":1212417070,"coin":"KMD","tag":"7525933131130473137"}
|
||||
0a80c365dff82831085c7d53e1de4d5105a9bd89306e80883e9cfc6bcc50ffea
|
||||
{"isvalid":true,"address":"RDobQ77wnMY8Me7RAL9oiFqVNvwkqqgPRF","scriptPubKey":"76a91431a072f05bafb0227368d56bfff15903fbc4552588ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RDobQ77wnMY8Me7RAL9oiFqVNvwkqqgPRF","randipbits":649762625,"coin":"KMD","tag":"2425986373848064585"}
|
||||
fc2dde20fd79bb832b7030d64366d29826fbff3619ac49a536a2987be2c4368c
|
||||
{"isvalid":true,"address":"RHSZ1CWDNhkNbbQRDrqLHRAdCshueMrt2r","scriptPubKey":"76a914598637bc09954bd7da6a778ea9c7f3cfd4d3904b88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RHSZ1CWDNhkNbbQRDrqLHRAdCshueMrt2r","randipbits":1088793017,"coin":"KMD","tag":"14096394822976266606"}
|
||||
f210ca40ab1086d81490a530df38113e353169f01984aa228961ff10cefb59b9
|
||||
{"isvalid":true,"address":"RSY3GTogE7WfwukhaemrAZtPh6Gsy2q1XV","scriptPubKey":"76a914bd4905c1577b64e76a80f418dd9dab9e9373bba688ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RSY3GTogE7WfwukhaemrAZtPh6Gsy2q1XV","randipbits":2966062244,"coin":"KMD","tag":"18071086034519656023"}
|
||||
cbf73f04e90be80486427f209a4538b415b3d15798b6008c45c8fe086f2ac0fb
|
||||
{"isvalid":true,"address":"RM4RavnpbqkyB3cVq9tyzkoPuFZ2q87qqk","scriptPubKey":"76a9148137608770773545f9c440ea89ffa0bfb53abef288ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RM4RavnpbqkyB3cVq9tyzkoPuFZ2q87qqk","randipbits":3510593118,"coin":"KMD","tag":"3561554924088986465"}
|
||||
02e0e3d66d975c8894f259cc3d46d3731e0c0482c0b819bb585c0998eff990c6
|
||||
{"isvalid":true,"address":"RRMu7ikH1CVQmpY1vHWSZh7NTjVFbaAcUV","scriptPubKey":"76a914b065eee5b00d302ea21bc7a3a2f70ca9443d38e888ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RRMu7ikH1CVQmpY1vHWSZh7NTjVFbaAcUV","randipbits":2474273465,"coin":"KMD","tag":"11509287663278756924"}
|
||||
634e2fe90916382616d59598f96bd4a9f9b7b2f7da7cbc186f4dc33da2a1a657
|
||||
{"isvalid":true,"address":"REyKZQ8q8xbRNCtpA5ABY1BsfscduWGgKv","scriptPubKey":"76a9143e6f8312f4eaa31bf524c6a32f7685555b63faa188ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"REyKZQ8q8xbRNCtpA5ABY1BsfscduWGgKv","randipbits":716060302,"coin":"KMD","tag":"4325124703204695399"}
|
||||
b81349eace18c6217e0316a26bc60050508f382db8d78e2acad208cbbc8ccc6d
|
||||
{"isvalid":true,"address":"RTqh7gEJMJDpnBp62FZZAfXctj8X7sRRia","scriptPubKey":"76a914cb97d060539ff58c1bd400574ea65e9f91fd968a88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RTqh7gEJMJDpnBp62FZZAfXctj8X7sRRia","randipbits":3539516869,"coin":"KMD","tag":"13543971405175291137"}
|
||||
3952e239e439f67dd7cadf6b976ad75926c2e8b998ce03c4e7236dfe21d5e283
|
||||
{"isvalid":true,"address":"RJZ2DjthdsfCuaGxiE1PNCUGuvARAsMpHn","scriptPubKey":"76a91465b78ee8240e7782fa27e881d670712c31f0569e88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RJZ2DjthdsfCuaGxiE1PNCUGuvARAsMpHn","randipbits":3403802753,"coin":"KMD","tag":"4335745825084189316"}
|
||||
error: {"code":-4,"message":"Transaction too large"}
|
||||
{"isvalid":true,"address":"RTr3ghnoUgKMz7NVhcc2PEMmQ637J1P3CS","scriptPubKey":"76a914cba8fc05e1f3aaf40d860be4d4be0f07460c248a88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RTr3ghnoUgKMz7NVhcc2PEMmQ637J1P3CS","randipbits":2422516899,"coin":"KMD","tag":"2947923480050518251"}
|
||||
da4f18857462797230b5364dbe72ec1b894caff855330caf6380dda06fab6f6a
|
||||
{"isvalid":true,"address":"REPaLcbXYKr7D6kx6M56bwwgC7QShb8gL7","scriptPubKey":"76a914380db4e82b6f46ec530c83adda33d86e56f1301088ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"REPaLcbXYKr7D6kx6M56bwwgC7QShb8gL7","randipbits":726058584,"coin":"KMD","tag":"4980424036659628209"}
|
||||
22cd1971f3b04800000c7e38bb20e1545de02df1f0eec4da4881fb7b7a966fcc
|
||||
{"isvalid":true,"address":"RY1n8qYX7hUVPiupbiX5zAbN4CtGpyKN5F","scriptPubKey":"76a914f960aaceaf81ac5964449e0dbc0de837c980ce4b88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RY1n8qYX7hUVPiupbiX5zAbN4CtGpyKN5F","randipbits":3403802753,"coin":"KMD","tag":"3251164214415661624"}
|
||||
812b649ba9934722da8a9aebf9def7afbe3443d31d203f231713fed70f266a20
|
||||
{"isvalid":true,"address":"RNhyF9U3o4hTgWqnwQjHwrD1o4GqWiP1T6","scriptPubKey":"76a9149349522c5c55a9ec0123af9f168cabed8109fe2188ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RNhyF9U3o4hTgWqnwQjHwrD1o4GqWiP1T6","randipbits":716060302,"coin":"KMD","tag":"5234495825041085252"}
|
||||
a9a0e66817c6486ae275b6a45caa8fa283b19210572a058fa66780b3cdc46748
|
||||
{"isvalid":true,"address":"RV3JsiGCq92BXiyo4JvRVJzTAm9RTdnNKn","scriptPubKey":"76a914d8c25d99ff2688fd583d758b3c6d24d3e26ef8cc88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RV3JsiGCq92BXiyo4JvRVJzTAm9RTdnNKn","randipbits":2474273465,"coin":"KMD","tag":"9180311689755188937"}
|
||||
e4658a039c5710109cd247b6277543d0222130dccac2173bea9a2ffb4694845b
|
||||
{"isvalid":true,"address":"RRMGMXyfD4ye9ebKwGWrAme3KU2CbaWy78","scriptPubKey":"76a914b0473ef7cceb7ab1235bc20092dc04c604d2745788ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RRMGMXyfD4ye9ebKwGWrAme3KU2CbaWy78","randipbits":2064902657,"coin":"KMD","tag":"15674851778818678874"}
|
||||
529def46303ab4b76d303747165109d0cb4b1c86c8e618a34bdb52f51bad3790
|
||||
{"isvalid":true,"address":"RE3yR2mCeG15ARgvENMbb573VqoQJcM3po","scriptPubKey":"76a9143458a682ab0925d5d56e0610e626b3172dcd51ec88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RE3yR2mCeG15ARgvENMbb573VqoQJcM3po","randipbits":306342285,"coin":"KMD","tag":"9687020715829259000"}
|
||||
a008035209a4b2f4a6aa2d576290a6d6a80ab7eb58212908a0aad1cc558d60d7
|
||||
{"isvalid":true,"address":"RF8Ua3mt2tMbwADn1XvYWxfJGz6fAnYBeq","scriptPubKey":"76a914402ac71f9482aa74c7814f596272fe4509bb68a088ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RF8Ua3mt2tMbwADn1XvYWxfJGz6fAnYBeq","randipbits":4250743323,"coin":"KMD","tag":"17377210194918425517"}
|
||||
90dc4ffb856cc8c1a99477bb53effb45c7b2ef70aaa2e28357a7d7e039eee979
|
||||
{"isvalid":true,"address":"RApWnKTepnDfPSDGX1wJnLXoNFCP5QzGWe","scriptPubKey":"76a91410e4a22cbc2658898cb06cba104e58d4f3d339a688ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RApWnKTepnDfPSDGX1wJnLXoNFCP5QzGWe","randipbits":1923364494,"coin":"KMD","tag":"17542877703605544136"}
|
||||
7952dce16d049bdacdbb094d3d464f220a9885bfff368ecdc402ffea96b0da31
|
||||
{"isvalid":true,"address":"RQjw6VEsAECmnKxXwwWCixCsz7gfFSaKsZ","scriptPubKey":"76a914a9989c3f389ebdb64d8e69b7fd36633c2c27745e88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RQjw6VEsAECmnKxXwwWCixCsz7gfFSaKsZ","randipbits":3795805790,"coin":"KMD","tag":"3735447127207900209"}
|
||||
441a799eb41a295ac8d0012b4f849d317322cf39985fe4515288f2271f141020
|
||||
{"isvalid":true,"address":"RWXYahA1NR6p5sBzXBknCaTDGmhSfhMV3a","scriptPubKey":"76a914e911947b9ed9f98913e50d0064f862077f3d66ff88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RWXYahA1NR6p5sBzXBknCaTDGmhSfhMV3a","randipbits":2358278621,"coin":"KMD","tag":"6739245804480077645"}
|
||||
5f8db9862cbea86bed29bc0bcf60b669256c90e16751f7888d39d519cde7f761
|
||||
{"isvalid":true,"address":"RPkMn5ZH5E7xPbQdCYkZYx3WueAqYKVTyn","scriptPubKey":"76a9149eb516ac39827e32c13866aa711226bcffaf6a5d88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RPkMn5ZH5E7xPbQdCYkZYx3WueAqYKVTyn","randipbits":2462330702,"coin":"KMD","tag":"11324913039846102509"}
|
||||
6cf2ba41bf1e2c02292aa00101ae5c76cd4400e11e53e016d6203ac630559147
|
||||
{"isvalid":true,"address":"RA8GBwKDSyQas9uTAi6ThYi2jNXfrcbyZw","scriptPubKey":"76a9140947d04682d3ed7296161e47d83e364d412d8b7988ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RA8GBwKDSyQas9uTAi6ThYi2jNXfrcbyZw","randipbits":2320559039,"coin":"KMD","tag":"691697661607362697"}
|
||||
e44a891c59676ae770867d90b9b24c403a4255741aca3fa66b973e896ee84095
|
||||
{"isvalid":true,"address":"RJ8QYKwegf7ApdYsWo3PXrGfX3nBvpN9Zn","scriptPubKey":"76a914610fca9762bdd0a73343fbb7fd0632daf9eed78988ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RJ8QYKwegf7ApdYsWo3PXrGfX3nBvpN9Zn","randipbits":3364309044,"coin":"KMD","tag":"6358148030402549471"}
|
||||
a9f6929d64b2f3513660667a068c693dce25a428406e2e43e89f21d327e8fb80
|
||||
{"isvalid":true,"address":"RW3kA5hhT2Zi19ifVLWh3eHEbF7vGHp5xr","scriptPubKey":"76a914e3cf9890f7dda2aeb1636e102e33a0a78fc5dd1f88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RW3kA5hhT2Zi19ifVLWh3eHEbF7vGHp5xr","randipbits":1254871213,"coin":"KMD","tag":"16358443473279198304"}
|
||||
cb2f5d2ca806f1c6d929aba2200816dd73c1e76d84b7fb3eeaf2298b93b3fb6d
|
||||
{"isvalid":true,"address":"RHgNtXM72MHF8BtiD9mixaotZvb1W3LsN3","scriptPubKey":"76a9145c2398f7905a487ef2c2dde166629c501817395188ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RHgNtXM72MHF8BtiD9mixaotZvb1W3LsN3","randipbits":2064902657,"coin":"KMD","tag":"2346456096472089935"}
|
||||
df4c96cf763367fb5c7bbe119592c7b58664f496646a0536f6789f7ebd072c40
|
||||
{"isvalid":true,"address":"RWX3kh4b4vR2fsrgEm9SA4KQbWMaJEH5fa","scriptPubKey":"76a914e8f984140df1804f049f854978c029699d96508788ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RWX3kh4b4vR2fsrgEm9SA4KQbWMaJEH5fa","randipbits":2064902657,"coin":"KMD","tag":"12537419930934684840"}
|
||||
fce876ee6f84d7b4273fd1b1a0985b95cc9f27c5b9a9491c04552981bc84c976
|
||||
{"isvalid":true,"address":"RP38FcReMG1hqt4jjLVuGUzbQQPgNwEQ71","scriptPubKey":"76a91496e8be6804163c7b83a0baf3c63036ca3dd407dd88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RP38FcReMG1hqt4jjLVuGUzbQQPgNwEQ71","randipbits":2474273465,"coin":"KMD","tag":"5384244912975550172"}
|
||||
15d1a53e7e710d19080703bede7aba84401c1e19c765397199d1acf62e162e54
|
||||
{"isvalid":true,"address":"RUUskhF2uWvRGsnTvhgjMkq48XgZ12EXuK","scriptPubKey":"76a914d2a015bc549478ff8e33b68e50c7ac084e912cf688ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RUUskhF2uWvRGsnTvhgjMkq48XgZ12EXuK","randipbits":3909093808,"coin":"KMD","tag":"12528796893037423999"}
|
||||
66aab31fd9b7cc9ba594fec0ab6cfe81be82c6ee2e4ab8bd32e010e3b818b35a
|
||||
{"isvalid":true,"address":"RT7ENMvL46nwrFfNj1TLa5FEqJzTztHefH","scriptPubKey":"76a914c39004363120a3aa755761ef960155dd1aafad7188ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RT7ENMvL46nwrFfNj1TLa5FEqJzTztHefH","randipbits":1542469781,"coin":"KMD","tag":"11491814467570927200"}
|
||||
8294fd3faa45599a1f40c7fb4f5a8b6d5672b1f4a5a31aaa5f1bc85b6c50322c
|
||||
{"isvalid":true,"address":"RKyqUmtUmogi4qT5uWxvSh15TwFebrJS4B","scriptPubKey":"76a91475611dfa5f73e2b84c6389e1d05ae24bd626d50c88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RKyqUmtUmogi4qT5uWxvSh15TwFebrJS4B","randipbits":3558029461,"coin":"KMD","tag":"15194126656935962116"}
|
||||
635e95f78bb7fc6ad94094730aa9e25c830d604a92634c9d28732512b57a5df2
|
||||
{"isvalid":true,"address":"RCQGZn4x3AFjQJJwW6hFHfsiQQQ1pL2Kne","scriptPubKey":"76a914223f08ed3f1631212f45737855f63c6e55a1caea88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RCQGZn4x3AFjQJJwW6hFHfsiQQQ1pL2Kne","randipbits":726058584,"coin":"KMD","tag":"3967062199769834648"}
|
||||
b023e334164367987fa52c4149fb81efa6d84d5a01d0836c432ebed4c15f4efa
|
||||
{"isvalid":true,"address":"RSHNubMtw3ZLmHy9QEkYmwPLy7vob6NvfP","scriptPubKey":"76a914ba832d877e47318901fb3931ca6787fbbc0e73bb88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RSHNubMtw3ZLmHy9QEkYmwPLy7vob6NvfP","randipbits":306342285,"coin":"KMD","tag":"4483658653165447734"}
|
||||
c35fbde14f46e6f848b6edec6d3df9ecaa9928ec31a2fbf4bf2cf4214d1dcd01
|
||||
{"isvalid":true,"address":"RDTcqgh4MMHLtu9FBCcULqZmP761DFmk9b","scriptPubKey":"76a9142dd955280946cc639cab214bbf446b3ff0f8518588ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RDTcqgh4MMHLtu9FBCcULqZmP761DFmk9b","randipbits":3634905133,"coin":"KMD","tag":"11344523147445575411"}
|
||||
62200600b4acb2f6e2e3d8b3935c0909f8271ab219d41972d0d24bf496885fe7
|
||||
{"isvalid":true,"address":"RWhJ879HiwHEb9sKbdhWQuoSQAFtC4G6t4","scriptPubKey":"76a914eae9ab9dc139c650d4250f8e236d5734a3e555b088ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RWhJ879HiwHEb9sKbdhWQuoSQAFtC4G6t4","randipbits":3401109677,"coin":"KMD","tag":"16787258714200697070"}
|
||||
0cfed45ada960afb1bd423c690d0e8927d2e5c138646635b1af889f24512c10b
|
||||
{"isvalid":true,"address":"RLS7frPLUVeNTMGQx6rBHYmcDgvNrT4cKN","scriptPubKey":"76a9147a59729a5a8dd074584f4e67cd21e0d307897f3a88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RLS7frPLUVeNTMGQx6rBHYmcDgvNrT4cKN","randipbits":649762625,"coin":"KMD","tag":"11053535089936096826"}
|
||||
92f3f4309e6bbf972cfe68446751ca764d2f1039afba6869ae9d19391010f4a9
|
||||
{"isvalid":true,"address":"RTQknkEBMuz5i7m8ZM9BjbuFn8iXNxgeed","scriptPubKey":"76a914c6e07b432daf16066df6547c909084963d1b71a088ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RTQknkEBMuz5i7m8ZM9BjbuFn8iXNxgeed","randipbits":726058584,"coin":"KMD","tag":"5325563408707364750"}
|
||||
c65010c8e7cf56b2c430088e8469b24915f329f5a72e5d62794e871a3de702af
|
||||
{"isvalid":true,"address":"RXfY8PwT85HVhK2cgV9uRpdaLQzTsR5g1y","scriptPubKey":"76a914f58ca7af165e6f00f878b5935fcf2e3c1e05cf0088ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RXfY8PwT85HVhK2cgV9uRpdaLQzTsR5g1y","randipbits":3293921202,"coin":"KMD","tag":"9195255102705678520"}
|
||||
32fdb823cc855083fc99e2fcbb8dabc6070eca610fd7f0ccaaae9add2769f8b8
|
||||
{"isvalid":true,"address":"RHSUmLRyJwpbdsRtytkGs9GmpZghQWHje3","scriptPubKey":"76a9145982addd174641008df30c1524ad27dfccb8ad7488ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RHSUmLRyJwpbdsRtytkGs9GmpZghQWHje3","randipbits":3364309044,"coin":"KMD","tag":"8518964928972688730"}
|
||||
fcec44ec1e7576f6870cdcde063b6882f7b2e988b946b5c353a3f5550b6c8381
|
||||
{"isvalid":true,"address":"RJEQbNrMQUHELrYPVLPepR2Y3ruAag3hEP","scriptPubKey":"76a914623254bf2cd6434f6fb5c842239774ef249f6dcc88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RJEQbNrMQUHELrYPVLPepR2Y3ruAag3hEP","randipbits":4267520539,"coin":"KMD","tag":"16626053169895800025"}
|
||||
edf9594142d015aa6235ff033c417bd8a7c32b1b5a88efce9d5da84426a45744
|
||||
{"isvalid":true,"address":"RRBnn6p3pJfyrjFBrDrTD2RJg2AAQVSXa1","scriptPubKey":"76a914ae7c7b8f3c14553692894d655d0006f604fe8aff88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RRBnn6p3pJfyrjFBrDrTD2RJg2AAQVSXa1","randipbits":3401109677,"coin":"KMD","tag":"14413840130845658678"}
|
||||
99349c193d04ebe3a446588b018edb00bd05a99744df88a71a9f70d93b25cfc9
|
||||
{"isvalid":true,"address":"RJ1DUUySYib5LcwJKFJ78PD3so2GQ89jKJ","scriptPubKey":"76a9145fb3a458652cd3fb73b76d2e80c9bcfdc679729688ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RJ1DUUySYib5LcwJKFJ78PD3so2GQ89jKJ","randipbits":3310160965,"coin":"KMD","tag":"14126720894847525618"}
|
||||
752d12092ed2b760f6220ade29cb5bc2a6901e30ed546b671d3e1ac6d5e6e4cb
|
||||
{"isvalid":true,"address":"RKtGS9q1vcReNcEtP3MzQjfjXyomLK2716","scriptPubKey":"76a914745373da21b3bb80036a769e80f8c6a3d3e4948688ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RKtGS9q1vcReNcEtP3MzQjfjXyomLK2716","randipbits":2358278621,"coin":"KMD","tag":"17104607943365151277"}
|
||||
6eec059986ea9c5e82dacff7aa35d393874eb1ff3676638ea847b020779575c2
|
||||
{"isvalid":true,"address":"R9YZPUTTVNcnKpuQ4JgMaxYzLXmeWA3msY","scriptPubKey":"76a91402e8071e2f5a14918907badf6b94b85c7948725a88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"R9YZPUTTVNcnKpuQ4JgMaxYzLXmeWA3msY","randipbits":306342285,"coin":"KMD","tag":"5232612928191713501"}
|
||||
070eba63d2bc102861db484c1b55859c4e2f2d5058e5c0e4bbd8e28db2f329a4
|
||||
{"isvalid":true,"address":"RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz","scriptPubKey":"76a914804cde8bd43649030d5145e9101bb7ac3b23b73b88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz","randipbits":91648679,"coin":"KMD","tag":"10039760411238994711"}
|
||||
8cd23c312e725e78bfc222a7c19be9f22dcc7ebb01048e1aeb7ed9d92d9edca2
|
||||
{"isvalid":true,"address":"RF6eSvAE12JNFZ2eT9rwFti2CJT8m13gwA","scriptPubKey":"76a9143fd230db3f6c4886618c38ad4ab20f9288be8e9488ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RF6eSvAE12JNFZ2eT9rwFti2CJT8m13gwA","randipbits":2520388199,"coin":"KMD","tag":"13292755015763538750"}
|
||||
f91d7878b4e4d6f0e7a6c001ac36de4b5a33932671986ff25e8c677b0b44d6e0
|
||||
{"isvalid":true,"address":"RC2nLGhFUc5Q9QFG1b38gAi9WgSgzQ9hJR","scriptPubKey":"76a9141e2ebb6842a61c203086408455e5eea44dc6598b88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RC2nLGhFUc5Q9QFG1b38gAi9WgSgzQ9hJR","randipbits":847292520,"coin":"KMD","tag":"9397111505327710979"}
|
||||
407eb64d1b0894e582ac0e60d6d81b0000d7c07d2fe46594da900dda8815b036
|
||||
{"isvalid":true,"address":"RCJHEogA7SW6PxuctPLtaVnXwiu49PyZY8","scriptPubKey":"76a914211d19ce1683dd3659156a274a4edbe93a38f88588ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RCJHEogA7SW6PxuctPLtaVnXwiu49PyZY8","randipbits":1844341465,"coin":"KMD","tag":"17859576886586018081"}
|
||||
2cc3b69f247b0d6a8ec638ff4edbdc8298eaf226b3826fba1004d13c703be833
|
||||
{"isvalid":true,"address":"RJbudEMb7wEEN8QZ18fEkptxjE4QnMECUu","scriptPubKey":"76a91466434d0797d5a5aa97986dae9b8fb0741a0e1ba888ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RJbudEMb7wEEN8QZ18fEkptxjE4QnMECUu","randipbits":1212417070,"coin":"KMD","tag":"7540453955310013286"}
|
||||
a0e2c98c384964fcf401a26e3d7babc92a5cb6eefb85bca20d41fa175e749018
|
||||
{"isvalid":true,"address":"RSdVypRznJsboL6MaP1shkaLhrVFcNx2KL","scriptPubKey":"76a914be5166b5403b56f7efc38cbbcfce87a1450e357f88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RSdVypRznJsboL6MaP1shkaLhrVFcNx2KL","randipbits":716060302,"coin":"KMD","tag":"6972408695981873869"}
|
||||
f5783555e153fb023781e4351baa5d04338325ee7c97e56ad36d0e27441bdfa3
|
||||
{"isvalid":true,"address":"RY69roX9pRXdH3yeF8WMFUDWFEoEdWDn5S","scriptPubKey":"76a914fa347707836553e07a5f7b238176f93b8c960c8e88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RY69roX9pRXdH3yeF8WMFUDWFEoEdWDn5S","randipbits":3496806661,"coin":"KMD","tag":"15234119449986174095"}
|
||||
377b110b0207b3a68fe79c4fc4c7b70f52e2f6b61407a11af0bf86780d8e8e3c
|
||||
{"isvalid":true,"address":"RWXwZyGf4q7cBakkY4tgupptBbCSvcBsBH","scriptPubKey":"76a914e924c4e0837d80befa971d1b47143aa270c46d2f88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RWXwZyGf4q7cBakkY4tgupptBbCSvcBsBH","randipbits":114528085,"coin":"KMD","tag":"943732072175534499"}
|
||||
ce54ec0b12791cb1025baafeba17a11482f42cf191101271539c61a40b5db46a
|
||||
{"isvalid":true,"address":"RA7UJPwPxqgPHn4YscYWRH5EPQVaFaaaPa","scriptPubKey":"76a914092181f6b17ac6731ae4ca8b86d63f19b602f7d688ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RA7UJPwPxqgPHn4YscYWRH5EPQVaFaaaPa","randipbits":3401109677,"coin":"KMD","tag":"2878844206316999883"}
|
||||
c02114f4ab56ad0af0bf62ca8311b4c654840b1b86ead10c075a88a180a76063
|
||||
{"isvalid":true,"address":"RUWFJ2c9CvJM8sp3YmaaN6EG58qkZ9M6ac","scriptPubKey":"76a914d2e27b5425896664c33d046856789e297976b50b88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RUWFJ2c9CvJM8sp3YmaaN6EG58qkZ9M6ac","randipbits":4250743323,"coin":"KMD","tag":"357309525036217724"}
|
||||
76a5d648f0ffe8f925b501b1be4378b25a2092983933d8fedaa7fd6eb2cc0741
|
||||
{"isvalid":true,"address":"RRFFxsc6kkfahR7v4paTaUZrPFisuz9Nkq","scriptPubKey":"76a914af246c8e231a108fea8878d5f142d4946428cd0788ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RRFFxsc6kkfahR7v4paTaUZrPFisuz9Nkq","randipbits":2064902657,"coin":"KMD","tag":"210881918943137081"}
|
||||
d7bdb5b203224a421197c8cd5e37179cd6e58495d9fe93b10d51cf994d49b340
|
||||
{"isvalid":true,"address":"RKAkaVY1fgNKDbwSNiFKfWE9o5Rten6yQb","scriptPubKey":"76a9146c7979b415b433a5c8bc8ba508d2429430f5510188ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RKAkaVY1fgNKDbwSNiFKfWE9o5Rten6yQb","randipbits":206567803,"coin":"KMD","tag":"5746501564338759564"}
|
||||
34fa33d1032630b84579950bb82a20e4e2543f85217e1acc60ea8b5be29d7f39
|
||||
{"isvalid":true,"address":"RWFSbi9ECuZWVE37jpkbiKGw7DaFYdNtts","scriptPubKey":"76a914e605ee4325ca45fa3a742617d85bdcf162343ae588ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RWFSbi9ECuZWVE37jpkbiKGw7DaFYdNtts","randipbits":1212417070,"coin":"KMD","tag":"8736280242584498818"}
|
||||
73e5694f9114bc263a5806a3cc36cc23585c83712bf76834ab5a54b3f8e59a15
|
||||
{"isvalid":true,"address":"RYQZmzckzB1gMYZQAYorYUcRuND8J6Lm4Z","scriptPubKey":"76a914fdafead11ddddad539874cc4c20016f5c1c9754088ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RYQZmzckzB1gMYZQAYorYUcRuND8J6Lm4Z","randipbits":2064902657,"coin":"KMD","tag":"17575441322980275301"}
|
||||
a92f52a9110bb60b6a25705f0f35f8a951bcf71f3d4af5d1b0df88972033f9d9
|
||||
{"isvalid":true,"address":"RUVkn1F9g7TxoPbYtegiQoFnPTusP2gzDr","scriptPubKey":"76a914d2caad29e4776ab5a721ca6cd9b8e4c0b8b12b3188ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RUVkn1F9g7TxoPbYtegiQoFnPTusP2gzDr","randipbits":3644810846,"coin":"KMD","tag":"2583959057534564900"}
|
||||
e2909b8e5a767c7caaa8906edd752350b00cad780282067c23af2b7f3cf7c001
|
||||
{"isvalid":true,"address":"RWDt2Xw6gHLdKdFEQFsNqAYYGUq37MvWYX","scriptPubKey":"76a914e5ba533418d08703cceb09411171744dd857c59088ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RWDt2Xw6gHLdKdFEQFsNqAYYGUq37MvWYX","randipbits":2422516899,"coin":"KMD","tag":"2048027938272322199"}
|
||||
b304bd4af03705c22481d87a96435c97b88dc2553db6758a7e8b8b507205aed9
|
||||
{"isvalid":true,"address":"R9vBYQw9tSBhu2c1g4SQhZdhuZeeQrEBoN","scriptPubKey":"76a91406fef164e66fe13fc0d004ee799e5ec45cbc465088ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"R9vBYQw9tSBhu2c1g4SQhZdhuZeeQrEBoN","randipbits":457907142,"coin":"KMD","tag":"9283672618776353727"}
|
||||
621545f8933fc63cd4dfb84c84ee572e4a34f686465decb037b2ef3953d9614d
|
||||
{"isvalid":true,"address":"RH2udBo3386n4hatBet85WUxiGao8VVSM6","scriptPubKey":"76a914550d729f014e2a096e36d34b1fc75262020c89c588ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RH2udBo3386n4hatBet85WUxiGao8VVSM6","randipbits":54591336,"coin":"KMD","tag":"251527748478896161"}
|
||||
2a6fe584d8de09f9d98ddf07774f7ac6aa1723c3838344dcc3ffb31cf17f2863
|
||||
{"isvalid":true,"address":"RUFov2hPGqwtVTVVJGxUL5AGcyFSWmjRXe","scriptPubKey":"76a914d0277904bffa113141ccbbc71873821bf7eea8b388ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RUFov2hPGqwtVTVVJGxUL5AGcyFSWmjRXe","randipbits":1254871213,"coin":"KMD","tag":"17551086453483742837"}
|
||||
b26f3ec0c0ab12780c8cc15a616bc69a57ea375f84427645d03af4b575b29ad2
|
||||
{"isvalid":true,"address":"RG8g7LjK7hdyKp3aoKBRdwzpLy31XMXMLk","scriptPubKey":"76a9144b2c894c2626b5293e55c214cf628f2de606499688ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RG8g7LjK7hdyKp3aoKBRdwzpLy31XMXMLk","randipbits":2520388199,"coin":"KMD","tag":"4954973328524652350"}
|
||||
cdf4d221895b073158cf5a5f18e9223cbee1bf2a9aa6e496fdb9b4ba54ce33aa
|
||||
{"isvalid":true,"address":"RTDNWLv3EJeKhhwrvBdKuxBLfWz7prmv9B","scriptPubKey":"76a914c4b94e200349e3a08a4d1f86296a9b76d6d3bc8688ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RTDNWLv3EJeKhhwrvBdKuxBLfWz7prmv9B","randipbits":2324724189,"coin":"KMD","tag":"7142362055829083106"}
|
||||
bf8326cffa7d143091f1b37e3aa04eaf94e7f1c7122908815245f8ff76ea2b67
|
||||
{"isvalid":true,"address":"RCdkLhDy7Ec2i7pwAsVmi1rnUufy2TEZmJ","scriptPubKey":"76a91424cba09649f2096b3b58d8230308ef8d3eadd9ec88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RCdkLhDy7Ec2i7pwAsVmi1rnUufy2TEZmJ","randipbits":3634905133,"coin":"KMD","tag":"2336355694077200792"}
|
||||
cbe889025be1cc7a7c96304fcfd880bf4fb19acf9e885e0ef69ed1f04586407d
|
||||
{"isvalid":true,"address":"RJ7RfZfip4qL9uEJs7Wr9FYtGusQiryMqE","scriptPubKey":"76a91460e0507759fa96a2a05791ad76fdf97bb85baf9388ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RJ7RfZfip4qL9uEJs7Wr9FYtGusQiryMqE","randipbits":1088793017,"coin":"KMD","tag":"14390406640983825135"}
|
||||
c85c72314bb4c3164267fb5d7f25a4eee99a682fd92f1f7120b7f9a1b2c95997
|
||||
{"isvalid":true,"address":"RNW6Kkcdktbeemd2n8NVPCfgnRirzWoiZY","scriptPubKey":"76a914910a3d320cd80073a08cbe7eb7f25eddc6c1ef8c88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RNW6Kkcdktbeemd2n8NVPCfgnRirzWoiZY","randipbits":847292520,"coin":"KMD","tag":"14017430827874418616"}
|
||||
fb1ba9f28573ff72aecb57c6a0f2ced35b012a7b937b3187fcd0070b85f3ba69
|
||||
{"isvalid":true,"address":"RRNkPd3BmppvxVxQCLzKfg2vVT2ypNcVxv","scriptPubKey":"76a914b08f10b08c959821af9501602dced4869746100588ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RRNkPd3BmppvxVxQCLzKfg2vVT2ypNcVxv","randipbits":2324724189,"coin":"KMD","tag":"13526153211163956794"}
|
||||
02d621f92d7c18d6ea73beba325036d4ef1fbf54227c7978dd270e3e07a12f14
|
||||
{"isvalid":true,"address":"RA2uJhw4TktHGHShKBTKoTaGjZSXU9Z2nX","scriptPubKey":"76a91408444d2068632d58ab97a4df1dc529352f54d2db88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RA2uJhw4TktHGHShKBTKoTaGjZSXU9Z2nX","randipbits":114528085,"coin":"KMD","tag":"11739329602920481340"}
|
||||
dd42502b243f23c52660e8ac3c4e812e563fb2472714773d3f59053ebd741299
|
||||
{"isvalid":true,"address":"RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3","scriptPubKey":"76a91433dab4ba613013fc625b8a8f13dfa24ac871a57788ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3","randipbits":206567803,"coin":"KMD","tag":"2188765595827953039"}
|
||||
6adda35ccf807130e1e184ec3be431cbca497891cfdaf2413b8f0758cb77a882
|
||||
{"isvalid":true,"address":"RSMNwfRUZxbE5YPud3PM46YYML8XsdELf6","scriptPubKey":"76a914bb44df19df2bbee23f70c347b6513769130f89ba88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RSMNwfRUZxbE5YPud3PM46YYML8XsdELf6","randipbits":2324724189,"coin":"KMD","tag":"14203284957422953099"}
|
||||
72e54ad3664eed5c7a7d0795f5269bb7ed23ac9cbdf8a48d924a1aaa0ef02e86
|
||||
{"isvalid":true,"address":"RUfJhANk7NzFapqGV1zamTgHm47LXsi8Zz","scriptPubKey":"76a914d4991008dd3d3f49219ebad8d81d3be20b68d8e188ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RUfJhANk7NzFapqGV1zamTgHm47LXsi8Zz","randipbits":2358278621,"coin":"KMD","tag":"7194688126046488756"}
|
||||
82e7f1134ba7492b89cc22589ee735ebcaa0cfb1581a77ccb576a3c26203c40c
|
||||
{"isvalid":true,"address":"RCyBEMjM6UgHAEosMCdxJb5VophihZ84hq","scriptPubKey":"76a91428784eee5fcd571e0868215b5e35eca6d5a2f64e88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RCyBEMjM6UgHAEosMCdxJb5VophihZ84hq","randipbits":4250743323,"coin":"KMD","tag":"17248417093121510016"}
|
||||
7db24382fd29cf34a67be01e1c07fcbefdeb6bd965210746eddb8a241503bd01
|
||||
{"isvalid":true,"address":"RSCe76vADETuwWAdga98c2LVdvKcNXeHmJ","scriptPubKey":"76a914b99dc8f9aa36ee23981c6ab7c526b4a49ab0586488ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RSCe76vADETuwWAdga98c2LVdvKcNXeHmJ","randipbits":457907142,"coin":"KMD","tag":"778630204581031306"}
|
||||
21f0500514dc34a01a87375873d82dccd88926d8ef42c5449f298a683563732d
|
||||
{"isvalid":true,"address":"RTkvmxME9rVZBY6ABNqkkbqKvn8WUqgQqr","scriptPubKey":"76a914cab1230d7fb16813ab068980a34de836ca72130188ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RTkvmxME9rVZBY6ABNqkkbqKvn8WUqgQqr","randipbits":3558029461,"coin":"KMD","tag":"5320375479599427963"}
|
||||
78058b35527a437bd96fce13c3e514125d0ff1e41ecd43b23e31b3926cff36d7
|
||||
{"isvalid":true,"address":"R9Udy3hSfnsr6YuRkHXsuKWrZsd8oEm2jb","scriptPubKey":"76a914022a2fa9e4d8b3c9b22c7661652844a0f1cbaba588ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"R9Udy3hSfnsr6YuRkHXsuKWrZsd8oEm2jb","randipbits":3364309044,"coin":"KMD","tag":"15333721779696912075"}
|
||||
a5dad1b9de870faf83619122fa56b8ddd96b9ba514cdab058f4117efd471f3f4
|
||||
{"isvalid":true,"address":"RAaQjULJVvG6LLF8NVKPidX1HYtrGSWbCN","scriptPubKey":"76a9140e39c2b09627151a71a5552e7bf60f6805b9512d88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RAaQjULJVvG6LLF8NVKPidX1HYtrGSWbCN","randipbits":1088793017,"coin":"KMD","tag":"17243448525041517600"}
|
||||
9d304d9d3c55ca70485ac2d9e079508528d9e4fcc68038350bdc2af1e0a525e6
|
||||
{"isvalid":true,"address":"RNBqCY6Mcp5ZLgL8R66FzvprYKhXaraeBb","scriptPubKey":"76a9148d962062eb70f15c447163baab98497bb6af33ca88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RNBqCY6Mcp5ZLgL8R66FzvprYKhXaraeBb","randipbits":847292520,"coin":"KMD","tag":"6707385559134931632"}
|
||||
0590159c5841969e39c4009c491c500078ee02392c985fe59baa7c7f6444d20a
|
||||
{"isvalid":true,"address":"RCMjQirY1RqzJDEKLQjvN4Q35CHgy6LbEP","scriptPubKey":"76a91421c431f36ed6dec6568c7af58fe69f8e32bb534088ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RCMjQirY1RqzJDEKLQjvN4Q35CHgy6LbEP","randipbits":2520388199,"coin":"KMD","tag":"1770519203948001772"}
|
||||
421dea2b550587801d8e5a7b77c0e7644455f4ca8feecb57193fabf7dea6a997
|
||||
{"isvalid":true,"address":"RUtbAxmAqv1V47932T89tt79AN6TzazXSk","scriptPubKey":"76a914d71c39f36e8be76b75818576fa3dce6e000417a588ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RUtbAxmAqv1V47932T89tt79AN6TzazXSk","randipbits":3634905133,"coin":"KMD","tag":"16491680889809776621"}
|
||||
4632b4efb5f8d1dfb7e4a52699b31a6fb6b813b34db0682795b8e6c8f744de2f
|
||||
{"isvalid":true,"address":"RS9erX84xJG17efdZ66qHxhsUMG15fnCsH","scriptPubKey":"76a914b90d297c4cce14a4db9c697b7202ffb291a8e12988ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RS9erX84xJG17efdZ66qHxhsUMG15fnCsH","randipbits":1542469781,"coin":"KMD","tag":"17766574050972005361"}
|
||||
b9561160578cbcb33a2af1dfeb9451a844f27a2778e1866f32225d214ef0f443
|
||||
{"isvalid":true,"address":"RMJp33AqgWV6oH4iLgN9XaXa2WThNdWdKL","scriptPubKey":"76a91483eff0e4d61e91512a67f03ae3be73e23066a2b588ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RMJp33AqgWV6oH4iLgN9XaXa2WThNdWdKL","randipbits":585288902,"coin":"KMD","tag":"16365871507310721637"}
|
||||
af0f9734bcdda97719db25039f07d64c85228f7ecbeb391bfa48849d88f92ddf
|
||||
{"isvalid":true,"address":"RLG1kAeCLx4heef3FfqcqWe9ysR1BdNMoZ","scriptPubKey":"76a9147870577336ce44b2ef218650b3a865b73e6b261988ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RLG1kAeCLx4heef3FfqcqWe9ysR1BdNMoZ","randipbits":2474273465,"coin":"KMD","tag":"10744261407829615743"}
|
||||
d6c372038dda9a16bf33a112ddc403200170f40c8d562dc535d2769a48cb82f4
|
||||
{"isvalid":true,"address":"RE1wsrDNwW2NnNWM5eE162yp6haLtm5uh7","scriptPubKey":"76a91433f688f3b18263f634aabb69efd3b93a33fde24088ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RE1wsrDNwW2NnNWM5eE162yp6haLtm5uh7","randipbits":457907142,"coin":"KMD","tag":"11780765036246479007"}
|
||||
1b2a1cdc356e3414f977d625465b60b889f19a05ee444c83ef3bfcfa6388e726
|
||||
{"isvalid":true,"address":"RRbV5dN4N7wUj3iLrv95SWJCZbtkV9uwoC","scriptPubKey":"76a914b2f7b13d911ac7325b79fd9c72730d00cd82286a88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RRbV5dN4N7wUj3iLrv95SWJCZbtkV9uwoC","randipbits":1411135637,"coin":"KMD","tag":"1438068949713707267"}
|
||||
b3502fbb49f8c4d629e7126f1ab6f4168e758c8b7cf5c42a16cf299db3b8ab8a
|
||||
{"isvalid":true,"address":"RTwpYxfrofdzSYg55ci6Us48jHmtS4cjKk","scriptPubKey":"76a914ccc08455e15336a52f15a8e077dd1f86d0fec27a88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RTwpYxfrofdzSYg55ci6Us48jHmtS4cjKk","randipbits":1505688468,"coin":"KMD","tag":"13886562617860071686"}
|
||||
56fcc61b28bcc8172ee61c21841cd20d56dce4b16eee653f2623bf5c64a3f74c
|
||||
{"isvalid":true,"address":"RP6fkbQibLJnKqJTogBpJ1sv6zX9b6widN","scriptPubKey":"76a91497944949e3b91dd584926f4ad6c03571082cd86588ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RP6fkbQibLJnKqJTogBpJ1sv6zX9b6widN","randipbits":2582272023,"coin":"KMD","tag":"13785824139789581179"}
|
||||
952ddf2c76d9aeeaf0a1980e9e6ec4cb2c1d0edd5fb641a987780fd87a2efd94
|
||||
{"isvalid":true,"address":"RB5AaE1vQKejds89eDxDzsWcDSfi8ixfbL","scriptPubKey":"76a91413aa00f2b3e0b42834712f1d118003f070d084cb88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RB5AaE1vQKejds89eDxDzsWcDSfi8ixfbL","randipbits":3678679579,"coin":"KMD","tag":"4999111739944287822"}
|
||||
cb10ee752a4b0b82b9aad04995c46578562071e76b332a4b2721fdd4ea2d79d2
|
||||
{"isvalid":true,"address":"RMPUMa3sjX98GG1RQunbc4mnTqUq4E6ZU3","scriptPubKey":"76a91484d197a55ca3df9d1bfd578d456856b533e963d188ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RMPUMa3sjX98GG1RQunbc4mnTqUq4E6ZU3","randipbits":649762625,"coin":"KMD","tag":"11958180350852771857"}
|
||||
1014eff6a17d8e094519427b6e25c01563009ef5df4f0916e6ff0eb3c21bc9b8
|
||||
{"isvalid":true,"address":"RK5BnRzCP52qsTE4xR3Qysn6m6KeTgpZA6","scriptPubKey":"76a9146b6c05399e340b2eccfa4236256edb12b3852bd488ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RK5BnRzCP52qsTE4xR3Qysn6m6KeTgpZA6","randipbits":2007892413,"coin":"KMD","tag":"14446227905410790814"}
|
||||
4d4535cb9dcf87bc72fdef7e02b23086ee78b7317ef149eb8dbf6dfda4b01ec9
|
||||
{"isvalid":true,"address":"RUuWvTwNAMGLpuY3GLPBAmMp8ptShkMSyN","scriptPubKey":"76a914d749183b4beeae17edc5c89e7c9660ae592712ab88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RUuWvTwNAMGLpuY3GLPBAmMp8ptShkMSyN","randipbits":54591336,"coin":"KMD","tag":"5018494193879306000"}
|
||||
585da7006a6572f1c0b7b909060349ad46910deab6915c5f7df48171bf1766d9
|
||||
{"isvalid":true,"address":"RN6TfTEYHdvFAeosYrvDaMBb2yBco47Q5a","scriptPubKey":"76a9148c9211c51a59f12b1dc13f012648a39a7056b09f88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RN6TfTEYHdvFAeosYrvDaMBb2yBco47Q5a","randipbits":3337526720,"coin":"KMD","tag":"534424659596494422"}
|
||||
75c1b09830c5acbeff23f2ea270ac8a69a2b89829533c348515006e58b6eaef9
|
||||
{"isvalid":true,"address":"RV4Hf22arBv4P4s5eFsUAnXC6N11T8x9tv","scriptPubKey":"76a914d8f1c39ed42cb8be6568f726ffe63f4e81f6e0bc88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RV4Hf22arBv4P4s5eFsUAnXC6N11T8x9tv","randipbits":749314742,"coin":"KMD","tag":"7441787949666968718"}
|
||||
33f07fd3098bf6d7ab4df6e5c6a2ee651a644c6f2e8895c0ff76d734b1687988
|
||||
{"isvalid":true,"address":"RYBH6Ha8RJa3CcE91yxJP6z2E6mDFm3bBt","scriptPubKey":"76a914fb2c9506c8d00f379e212575dcac3870426acd7188ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RYBH6Ha8RJa3CcE91yxJP6z2E6mDFm3bBt","randipbits":749314742,"coin":"KMD","tag":"511634291572145073"}
|
||||
783e0fd8fd7916ed107586ee44b073436a46284822e98f23340d17f975cb0d16
|
||||
{"isvalid":true,"address":"RHBHVXLAnvB8y5itKBNxnM8w2zqDRGCg2q","scriptPubKey":"76a91456a307a21837e9c204a58bf20a06b105eb07528488ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RHBHVXLAnvB8y5itKBNxnM8w2zqDRGCg2q","randipbits":3529902341,"coin":"KMD","tag":"7494929723958765508"}
|
||||
0b0f79b25d4f4d9adc9d3c7178483d206745713d767914682cc80bf6d15d8efa
|
||||
{"isvalid":true,"address":"RUY7YW1WmTD3hCvkXmUKLeRnNg5UsJoLbU","scriptPubKey":"76a914d33cd80a35f1b186c90316918341d5427041e19588ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RUY7YW1WmTD3hCvkXmUKLeRnNg5UsJoLbU","randipbits":119096734,"coin":"KMD","tag":"3434976226585857084"}
|
||||
5026d39dd6a23266bc22682fd09854ab3c482c8f18ce36ace7bc11f6729766e6
|
||||
{"isvalid":true,"address":"RBxjj7kxFipThuHR9i3cyumFzM2c1puiua","scriptPubKey":"76a9141d6ae48afde378a6ab28b0c9aa2c5ec4074ca72e88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RBxjj7kxFipThuHR9i3cyumFzM2c1puiua","randipbits":54591336,"coin":"KMD","tag":"2622549340299730568"}
|
||||
2cf0fcaa8ef97cf35ffc7079ce26b380fa6e5b6cb546bc6bd9d802b4dd7e9a0c
|
||||
{"isvalid":true,"address":"REQqBMStNf7gWLxvG1a9KnbSgV78Hk19Js","scriptPubKey":"76a914384a82bdc7803e98e226447234e784e88e93a92d88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"REQqBMStNf7gWLxvG1a9KnbSgV78Hk19Js","randipbits":847292520,"coin":"KMD","tag":"15965009567113204449"}
|
||||
751f17608d49b2a9167ef27c060f8b3e7bc091c924f296f0dc728be89a64bde6
|
||||
{"isvalid":true,"address":"RNVwzuZynZ7d4DE5CfT8CWkxsp9TtCY3BF","scriptPubKey":"76a91491034a2cecea787192a3e3e89a01cd5c9345ff4988ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RNVwzuZynZ7d4DE5CfT8CWkxsp9TtCY3BF","randipbits":3510593118,"coin":"KMD","tag":"15837593094225797232"}
|
||||
2d6eb44496a5592b3055c21fe4715d031fe9f6fa98ce600a07d444771c439553
|
||||
{"isvalid":true,"address":"RHTDjCzn36ERtpE2DddYZq162EL9DZcsbK","scriptPubKey":"76a91459a68b09c1d233068d1a667145d6c43ee34c0ecc88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RHTDjCzn36ERtpE2DddYZq162EL9DZcsbK","randipbits":457907142,"coin":"KMD","tag":"12565475373131426932"}
|
||||
8980af120fc9c2c63dc69ac2269545080c4b6f2565128b0296e9f9f026e655e3
|
||||
{"isvalid":true,"address":"RBBMrEHLVicGMQx1Do5FBUFP2tk5QiTD5a","scriptPubKey":"76a91414d5e98308cc6adda82731d2e38fdfeeaea436e488ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RBBMrEHLVicGMQx1Do5FBUFP2tk5QiTD5a","randipbits":3529902341,"coin":"KMD","tag":"300934710021873493"}
|
||||
805383f9257764387480475987857f677ec8a55d0da478ba606728f32e92052a
|
||||
{"isvalid":true,"address":"RWfVv2z5FrHmKPayFfSM4FZQpgBctbPHTk","scriptPubKey":"76a914ea92ae8aec967c174909ac5f798cb755e1e162d788ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RWfVv2z5FrHmKPayFfSM4FZQpgBctbPHTk","randipbits":3350674129,"coin":"KMD","tag":"7098830207905164869"}
|
||||
fbdec954360187e674ee97fd26a230aaa20e4aca3e1ee0b43a5c26b598a4f2b0
|
||||
{"isvalid":true,"address":"RBy9jDvvNgvRGeyWh96rhvwLJ8zR44YTBj","scriptPubKey":"76a9141d7eedb01b9c96f3d55f8628f88f76d58d65640288ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RBy9jDvvNgvRGeyWh96rhvwLJ8zR44YTBj","randipbits":1254871213,"coin":"KMD","tag":"1319568634314930573"}
|
||||
a1fca322764d9a3f1322a1cc52a489d5c1054f0d5c0c2b2d2d62b4f7ecba8544
|
||||
{"isvalid":true,"address":"RMeXSe9FBfb7UA4rWKbbyUykF5SWsQFu2a","scriptPubKey":"76a91487aa68b72eb2d26ef5f77d3894db960ef59bfb0788ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RMeXSe9FBfb7UA4rWKbbyUykF5SWsQFu2a","randipbits":3510593118,"coin":"KMD","tag":"394498272477560351"}
|
||||
bd8e8d2f4f976569984d68d7963246bcac817dc03c396f846e37ae000a63ae4b
|
||||
{"isvalid":true,"address":"RHGSJf8UV9zJTdszmggAPdmNzzewrc5fnQ","scriptPubKey":"76a914579c7750254b9393561cd536eaaada5707dbcdd788ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RHGSJf8UV9zJTdszmggAPdmNzzewrc5fnQ","randipbits":3337526720,"coin":"KMD","tag":"6694083873737818898"}
|
||||
940095b2a0ede8cd6bcc1169e28ca8b05c92ad270e51273231ed91e5cf45d53e
|
||||
{"isvalid":true,"address":"RK7jYxdWFmDNEyutSbt5mLYdAdqsJv2E7A","scriptPubKey":"76a9146be75ee62891cdaeb881d5fb5163521742bc73cd88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RK7jYxdWFmDNEyutSbt5mLYdAdqsJv2E7A","randipbits":4250743323,"coin":"KMD","tag":"16731422082360975529"}
|
||||
4f4eca5a7373bec93bea81e1f60808812d287b89db50035c67a20307deb3a383
|
||||
{"isvalid":true,"address":"RUQYagJpBH5Enm8jRJcY4yfGUtKdXe5jLJ","scriptPubKey":"76a914d1ce6a9fcb1eb633c27d4a406397c7cb32f0623388ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RUQYagJpBH5Enm8jRJcY4yfGUtKdXe5jLJ","randipbits":3795805790,"coin":"KMD","tag":"4521076885978381865"}
|
||||
94db6f0136d3f779911653a56f84a28e7a3c35b9487d53a259b31c6f45438d79
|
||||
{"isvalid":true,"address":"RKNQdaiP4PivQqtE9wE3nPHFZkkBXSmprU","scriptPubKey":"76a9146eadd0f5aab812a543e7e30ce6b8204204a1db5488ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RKNQdaiP4PivQqtE9wE3nPHFZkkBXSmprU","randipbits":4267520539,"coin":"KMD","tag":"11442699958332113711"}
|
||||
4344a05556982b7bb204616ccfe75e06807bc325565ff873277aec898f555d64
|
||||
{"isvalid":true,"address":"RKiCeCxYaJNGfgvkbH1RHsVctR3JWtDNw7","scriptPubKey":"76a914726c209c25bfe7b9ca4efd1d043f1b520661c69388ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RKiCeCxYaJNGfgvkbH1RHsVctR3JWtDNw7","randipbits":3756225191,"coin":"KMD","tag":"13589462905750214810"}
|
||||
d1f1146089eadd90054cb74d8de79937017a8b0d5ee6f928ef2e24e88aa4e15b
|
||||
{"isvalid":true,"address":"RU3zngUmo6Mg4kDSWdLazMS5ht1RxQ7DCM","scriptPubKey":"76a914cdeb8ec9727b93b2abb369a2936e3fe213d3b83388ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RU3zngUmo6Mg4kDSWdLazMS5ht1RxQ7DCM","randipbits":3644810846,"coin":"KMD","tag":"8690642146235803592"}
|
||||
8048ca4813cc758c747f3a190f11b9dcb48d4bd15271aa1372f85dd690490345
|
||||
{"isvalid":true,"address":"RMuMHC1Gp3b8yCUD5XsQH85QpfrRm1kLyS","scriptPubKey":"76a9148a782a3541059ec42d67786223bf282fd863afd688ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RMuMHC1Gp3b8yCUD5XsQH85QpfrRm1kLyS","randipbits":2320559039,"coin":"KMD","tag":"10001715180968585266"}
|
||||
dd5c616d14054f3c6386df8ddaefad3348655137644b5e28b4ff9e8c436aeddf
|
||||
{"isvalid":true,"address":"RNScwyFBUV5yZz6svwsVD7fVDrAydrqFRG","scriptPubKey":"76a914906223a25fbadbd61240bfbd091bac775c1f8aea88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RNScwyFBUV5yZz6svwsVD7fVDrAydrqFRG","randipbits":1923364494,"coin":"KMD","tag":"12150764634426200372"}
|
||||
7ddb9993f4fbfebd2be2b6219ae7e28987d1853acb6f50a7c2f9d9e3b9bca654
|
||||
{"isvalid":true,"address":"RYWjav2a7USMWe5qK2rtLkzRgE4Ciezb9Z","scriptPubKey":"76a914feda99e4e1cbdaf75988e3b9e4769fca9c8fef2a88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RYWjav2a7USMWe5qK2rtLkzRgE4Ciezb9Z","randipbits":3529902341,"coin":"KMD","tag":"13857744196806816320"}
|
||||
b16b2e0c7b2b269a65a23e27961ba53774befcd298a44e6e790ee23b37de90b0
|
||||
{"isvalid":true,"address":"RSbNJbs7PitRvqqVMdCpzD1yKBMM3gGAQb","scriptPubKey":"76a914bdea295b83d94bf60f6e3fbb0a2678c41c59dede88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RSbNJbs7PitRvqqVMdCpzD1yKBMM3gGAQb","randipbits":1088793017,"coin":"KMD","tag":"16902010955508909"}
|
||||
23472f0b052ea3613807d17fff268169d92ebd39102238968b6209e1c12cac5a
|
||||
{"isvalid":true,"address":"RBbxPEyNRrJ5f3QtG6yz8hco3nFZPoLeUM","scriptPubKey":"76a914197cb92d18306351e887459061c1691bc8677f2a88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RBbxPEyNRrJ5f3QtG6yz8hco3nFZPoLeUM","randipbits":306342285,"coin":"KMD","tag":"3783173686883055537"}
|
||||
63b3ca7f8adf7df6a1dd7b8e9a3836d094fd14b5c043fda62161223f6a89237e
|
||||
{"isvalid":true,"address":"RPriQZfzzgin7y2Ns6vxdrMAa4XgZqdY6y","scriptPubKey":"76a9149fe8cdfa1ff37c6051aff789f52534e0f87b760e88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RPriQZfzzgin7y2Ns6vxdrMAa4XgZqdY6y","randipbits":3350674129,"coin":"KMD","tag":"7767367854665040092"}
|
||||
8b57bff58cbae87e299647b9b027c5a0646b9e7f0d67c0fc1156067a91521fb6
|
||||
{"isvalid":true,"address":"RFbaPjT7beKPWswQHcHSpicRJ35ZBMCPC4","scriptPubKey":"76a914454ade6e54f6c5bb738d3e93906451fb3d7be2db88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RFbaPjT7beKPWswQHcHSpicRJ35ZBMCPC4","randipbits":3644810846,"coin":"KMD","tag":"1633406094519773603"}
|
||||
4b90fdf777eb0b005179d129d4cd735a5c2c66e4392058765445fd4b473b1ef0
|
||||
{"isvalid":true,"address":"RSCdeeWvzpBhg2tKnCWZWKw9iAMyYWiREG","scriptPubKey":"76a914b99d6780a34383e9afb2ce0ddb59d013bb22dc1888ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RSCdeeWvzpBhg2tKnCWZWKw9iAMyYWiREG","randipbits":649762625,"coin":"KMD","tag":"3248725960354162385"}
|
||||
6cac71e1faf5d7d28396480f095b4f78f73685ef0327d4453c1f1a5b8d60ff0f
|
||||
{"isvalid":true,"address":"RRjuStV5BMjwEueeEZT8DWBaUx9gQjRDLG","scriptPubKey":"76a914b48f5c3796a0f05f66cb8208653996f0f69279ea88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RRjuStV5BMjwEueeEZT8DWBaUx9gQjRDLG","randipbits":2462330702,"coin":"KMD","tag":"12254026536075417754"}
|
||||
13311ca88878ae6f4040a61704faabd8b8b4b633cc898cf96cb973684de26a17
|
||||
{"isvalid":true,"address":"RUAvb7FFPvxjNTVhABeS2EbbdUi2LfGNMj","scriptPubKey":"76a914cf3af6c2197d16c8349f98b3aa5f48c98fc51e3888ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RUAvb7FFPvxjNTVhABeS2EbbdUi2LfGNMj","randipbits":1374184384,"coin":"KMD","tag":"15878239814491599651"}
|
||||
617dbf8b37dc4f6f74545c54110ad9bda172cf9920ebe224ee5365790e0c51f1
|
||||
{"isvalid":true,"address":"RDs6US7EYgfFrKiPzMFT84PcoQWUCniwky","scriptPubKey":"76a9143249f795abe0ff5f15bb08c8fa7b0c4e85cfe35d88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RDs6US7EYgfFrKiPzMFT84PcoQWUCniwky","randipbits":3606291758,"coin":"KMD","tag":"304075312990232153"}
|
||||
470cae60ebb45da984e69e6bbb07612cacd231707998699ccef238e6e7ec9f95
|
||||
{"isvalid":true,"address":"RQuMEMn1TG7CCpbmYCVcDfPqesEvEkisjC","scriptPubKey":"76a914ab608060994e0d84a92d4ede5ae7521250945f0588ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RQuMEMn1TG7CCpbmYCVcDfPqesEvEkisjC","randipbits":716060302,"coin":"KMD","tag":"16841908010320994413"}
|
||||
fa7f4bc04cb787b60266390c75a11596e43e3b1de93d7eaf9c1275cfca1ea711
|
||||
{"isvalid":true,"address":"RVptmyXVcTSkZQNd7UMgDz73p3AdfsamLS","scriptPubKey":"76a914e1616213dce019aa785d4f50e93044323a3f3f9688ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RVptmyXVcTSkZQNd7UMgDz73p3AdfsamLS","randipbits":2007892413,"coin":"KMD","tag":"17542855293629488829"}
|
||||
10a0f36aa4b41085b2729cb98f4c5ff2ebd36d2b494ec56cb3e8a1d83bc7a521
|
||||
{"isvalid":true,"address":"REe9cFdWLNNDbCgWMNHAYBU4hBjUsu8zgY","scriptPubKey":"76a9143acf4d5e59871fcb370ec2e33722ea65bbb309e988ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"REe9cFdWLNNDbCgWMNHAYBU4hBjUsu8zgY","randipbits":1986374819,"coin":"KMD","tag":"11909432399170482093"}
|
||||
527582bb80e267d5f81dace2041ae354223c40dde432366aa9a90e9e1ed33c9b
|
||||
{"isvalid":true,"address":"RBNB5mKstG86jYRjrKFgJuFoUFvZKJb9Wq","scriptPubKey":"76a91416e1800d3dd586c4c6d91121ed749fd04471cc1b88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RBNB5mKstG86jYRjrKFgJuFoUFvZKJb9Wq","randipbits":3401109677,"coin":"KMD","tag":"18350877783347530320"}
|
||||
de9926f4d719e8b6ec643f3f5a631d36197b0b7170c20947f7135373ce3519f7
|
||||
{"isvalid":true,"address":"RHoouCBBapEHE6uyX7CxHGFcRwUQFGMot5","scriptPubKey":"76a9145d8b6349c3527dca7775b2b90a58a7de78faa22588ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RHoouCBBapEHE6uyX7CxHGFcRwUQFGMot5","randipbits":3350674129,"coin":"KMD","tag":"7123808566180249738"}
|
||||
464b5f7fcb81232475b060b48cb02060b79e6670e658a78dc342bb01986f787c
|
||||
{"isvalid":true,"address":"RAvtq1kazCRZUvWvPsN7ioY2Vt1EYtgpuz","scriptPubKey":"76a914121988609954b7cab724bb1a7b765007be0af53f88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RAvtq1kazCRZUvWvPsN7ioY2Vt1EYtgpuz","randipbits":3634905133,"coin":"KMD","tag":"9537577755089129848"}
|
||||
ed73d122e844f89644b2834139e97aee01d9cf916cfd054087ebac3d02d64eb5
|
||||
{"isvalid":true,"address":"RLHEGDwXuXQwhYkrhwSRGSJMFuvv7EAT7i","scriptPubKey":"76a91478ab350e4688cde485981b263b107ca8530df35388ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RLHEGDwXuXQwhYkrhwSRGSJMFuvv7EAT7i","randipbits":2358278621,"coin":"KMD","tag":"5718268358216405838"}
|
||||
5965e76bcd04dfc7f05fde7d38f4485eaf8996d1a16967f0073a6558b67b2a9d
|
||||
{"isvalid":true,"address":"RMWZenedfv1AQtuJw1EzYj9R2FxwzFpd54","scriptPubKey":"76a9148628ecf9c505db39c9d7f970c51b32b1800ab50388ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RMWZenedfv1AQtuJw1EzYj9R2FxwzFpd54","randipbits":1505688468,"coin":"KMD","tag":"4674256031372819957"}
|
||||
86851cbc08c16417fa68499e3b79b41f504d9245b788872e120558d0eae5ce31
|
||||
{"isvalid":true,"address":"RAEtFUqe3jwVxLywCga2eKQxT2DiewsUuN","scriptPubKey":"76a9140a886960c8b160b4320158608a2aa4b092e19ff088ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RAEtFUqe3jwVxLywCga2eKQxT2DiewsUuN","randipbits":114528085,"coin":"KMD","tag":"10552555834387036968"}
|
||||
6dd815f89a731a406b09900fcf324303a7be8c13365ab9a7dec63f60c1139192
|
||||
{"isvalid":true,"address":"RUcDMtu7fA3ATbHHsDTsZ8KThgd1ivawym","scriptPubKey":"76a914d4035d191e1b7a8fbd75017d3835615c740a9cd388ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RUcDMtu7fA3ATbHHsDTsZ8KThgd1ivawym","randipbits":54591336,"coin":"KMD","tag":"13813100490014569188"}
|
||||
e8815e7710ae3e4f1e3e04d862557e8398d6fa7cf8c49f03e1c32e90df74659b
|
||||
{"isvalid":true,"address":"RDndtdqjEgQ2kyiCzpeWEtf9TSDJnMBvao","scriptPubKey":"76a91431721cf6ffd22fc321672a296b736700a7da0b5488ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RDndtdqjEgQ2kyiCzpeWEtf9TSDJnMBvao","randipbits":4250743323,"coin":"KMD","tag":"7291875145736103770"}
|
||||
5098d95a95c46aede54f23dc304e194ccdb407656d48b9485ce38ae2ed0b6713
|
||||
{"isvalid":true,"address":"RG2cAef3JbCXiQkzPgrqS52HAQrBzJiAy4","scriptPubKey":"76a9144a06bfc7b5774b79b75bb1fd59aa55564ca7851888ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RG2cAef3JbCXiQkzPgrqS52HAQrBzJiAy4","randipbits":1254871213,"coin":"KMD","tag":"6911754146836909525"}
|
||||
9614014f177326c1ecb7deca198da9a42f7d12e000cde4805a8932507174aa63
|
||||
{"isvalid":true,"address":"RSFJ19qzQbtYJQD98pqpkTNoBEi9gM31TA","scriptPubKey":"76a914ba1e408d6de31fdcf06b0630e7fd141d3baecb0988ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RSFJ19qzQbtYJQD98pqpkTNoBEi9gM31TA","randipbits":2324724189,"coin":"KMD","tag":"14797953134924064379"}
|
||||
69e29c31f55c34b7e5a13d73ed9192b545c91d2a077d1ab1144951e5f76016d9
|
||||
{"isvalid":true,"address":"R9gDQRa62Eg24qwZd3Pv374bYbWf4BSLZs","scriptPubKey":"76a914045aac8c4b5e08a096bbcb3731883d85df7c8e5e88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"R9gDQRa62Eg24qwZd3Pv374bYbWf4BSLZs","randipbits":3812583006,"coin":"KMD","tag":"9620290839030244767"}
|
||||
cea46d425815acc0c1a850e96387f2aa5a9a4dbecdecbd8de6943d1427d3f941
|
||||
{"isvalid":true,"address":"RTh7GDBqLRDMYLdQyE7HHooBobztNXfsdW","scriptPubKey":"76a914c9f83a320582f8626b687cb068e4d3414560d8c888ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RTh7GDBqLRDMYLdQyE7HHooBobztNXfsdW","randipbits":2320559039,"coin":"KMD","tag":"16922858734762556442"}
|
||||
5150e662e2bd14543c2431878e65d9f0af277b753bac98b961a90dd702507c68
|
||||
{"isvalid":true,"address":"RKEkubK347PwSM9SQ9eReFng1yFrEbGN8C","scriptPubKey":"76a9146d3b6a051157ac77a03b33d114f9a5afd33f904688ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RKEkubK347PwSM9SQ9eReFng1yFrEbGN8C","randipbits":2324724189,"coin":"KMD","tag":"4744510157175025104"}
|
||||
23bc43496ede3eacda904ea0d0e1f5ca5d986dc8a1ee7b8bc967ebfc54ae1b56
|
||||
{"isvalid":true,"address":"RHMKLGnyum4miEW55qL8Mawv7KdGsjbmAB","scriptPubKey":"76a9145888b9ced1e7b109b7726285f282c610b934b5b288ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RHMKLGnyum4miEW55qL8Mawv7KdGsjbmAB","randipbits":3350674129,"coin":"KMD","tag":"5367532454610447559"}
|
||||
62b7d9122629b14ea243792661d1b79f030e38828e5c1923b057f1cb8e002cce
|
||||
{"isvalid":true,"address":"REzcqBkARMCCxkA5rVdp61f7rovmFtq5kf","scriptPubKey":"76a9143eae58974a1556bf59b8466cfc7722c48c8e63c888ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"REzcqBkARMCCxkA5rVdp61f7rovmFtq5kf","randipbits":1212417070,"coin":"KMD","tag":"11412226478957048194"}
|
||||
cf033ccd827c66a31fed7c0f632220fbf962ba85e3ed32a20bbd5c451ccec775
|
||||
{"isvalid":true,"address":"RTuiEzbcX7N1j1oXSwBbRE5n8s31wzyuXQ","scriptPubKey":"76a914cc5a6afa24ae63f07a2f5be771ac4c7019f7d7fa88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RTuiEzbcX7N1j1oXSwBbRE5n8s31wzyuXQ","randipbits":4233966107,"coin":"KMD","tag":"778006809548776634"}
|
||||
9d3a45f497d3d8f4692f8c987fe61804f8c7472cb63d603b8cd9874845fa970f
|
||||
{"isvalid":true,"address":"RVcyGvC5uYhT1UguHu1wgHxSTH6JEx8NHP","scriptPubKey":"76a914df2025ac1ca399941504360a093fbf6f2c1374ae88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RVcyGvC5uYhT1UguHu1wgHxSTH6JEx8NHP","randipbits":54591336,"coin":"KMD","tag":"12876797057007631595"}
|
||||
5e5540d6242d839f13467208615208f77ca79af123bb1e87eee1295e058e74ce
|
||||
{"isvalid":true,"address":"RQKrkjKAvhPvhB3f9yAjipBPutJAP7TA32","scriptPubKey":"76a914a50b00fd9bd4ab6716a1a8388fc06260fff597c388ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RQKrkjKAvhPvhB3f9yAjipBPutJAP7TA32","randipbits":749314742,"coin":"KMD","tag":"1385317779138681935"}
|
||||
f508d1cf5b97a96642542aa664a2bf1e12355f5e65760dc97c0b8330d0b6dcf5
|
||||
{"isvalid":true,"address":"RFwK8bejf6ANo61ipukbXxto15z55CwRUm","scriptPubKey":"76a914490672ec2d4d90f387a5234879c9218484fabb3288ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RFwK8bejf6ANo61ipukbXxto15z55CwRUm","randipbits":2320559039,"coin":"KMD","tag":"4313376125996087051"}
|
||||
76a5b7c320eb55b7dbaeb182e9d04b78da451121a7726a3c9246e47dd5ed0da8
|
||||
{"isvalid":true,"address":"RFHBwfH6pSfzaw3WDvV84ii4SGvGpEtgjJ","scriptPubKey":"76a91441d0a442f03aeedb063a5abead3b7952a7028f6088ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RFHBwfH6pSfzaw3WDvV84ii4SGvGpEtgjJ","randipbits":2324724189,"coin":"KMD","tag":"8759821642199629279"}
|
||||
c4fec5cedfd6c87cdec0e3581d2ad915b36b05589d5c8b2a3cc5ed363dfef0d2
|
||||
{"isvalid":true,"address":"RXKZmFmmpfAV2DAdUUXhA88RqCoyPRXcnA","scriptPubKey":"76a914f1c5b376a2ece345538303b7909537eea0dc673d88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RXKZmFmmpfAV2DAdUUXhA88RqCoyPRXcnA","randipbits":2422516899,"coin":"KMD","tag":"8492321325267627692"}
|
||||
aad28724a994936e8247ae00442db08e3d1bdfc16bc5cfae8a99596e3e1a58b6
|
||||
{"isvalid":true,"address":"RCxnQhmYdpK9vTS7PLRtXBtDk2HaRNo1qk","scriptPubKey":"76a914286541fe60f8df629cc7fd38178fdb3d3da9ed8088ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RCxnQhmYdpK9vTS7PLRtXBtDk2HaRNo1qk","randipbits":3558029461,"coin":"KMD","tag":"18417126252958022460"}
|
||||
98e3bfcd7af8d2d9442e3bb6ed41e1dbbdc4b352171401c925cca2ac28617319
|
||||
{"isvalid":true,"address":"RNFLSwnYtoA5Gjb1eHDszeGLtxaE9yPiFp","scriptPubKey":"76a9148e3fca2cf0ebbf8951534c93f4874c0aa877475c88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RNFLSwnYtoA5Gjb1eHDszeGLtxaE9yPiFp","randipbits":1212417070,"coin":"KMD","tag":"9599710567188407177"}
|
||||
27d879a8c15eab6e578372ef23d4cd341f40879b973dbc0d136c61156c32a075
|
||||
{"isvalid":true,"address":"RPtwW4UejbAxs5PU6a1zMPcPqW7SVghMDS","scriptPubKey":"76a914a0549146a960c4a94c6b5e32e920b1c998f27d4988ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RPtwW4UejbAxs5PU6a1zMPcPqW7SVghMDS","randipbits":1986374819,"coin":"KMD","tag":"11042382638743199135"}
|
||||
eb456947490ef5307495665184ffe4972d46c607987729f7799e94353198ae4f
|
||||
{"isvalid":true,"address":"RYWPYz5qotHsukbFpzRksctMUBobmWLdkG","scriptPubKey":"76a914fec9e0d27479c32069dfbf7508dbde33580059f188ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RYWPYz5qotHsukbFpzRksctMUBobmWLdkG","randipbits":4250743323,"coin":"KMD","tag":"17319290498951891263"}
|
||||
50e8b42e36624a41d81e1b76fdcd8672fd7e0aee06488bec8e2dfb7cf1126339
|
||||
{"isvalid":true,"address":"RBnTykMEj7GPYN1v8VtE9rrPvggZGuHzct","scriptPubKey":"76a9141b79966b3b9d5945e0cdd171c8c7d376d02d2cd088ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RBnTykMEj7GPYN1v8VtE9rrPvggZGuHzct","randipbits":306342285,"coin":"KMD","tag":"12897443633789600924"}
|
||||
1b14ec04e35f10a4f739f50ba2426417da50604ebf555fce8d993b7a554c4f25
|
||||
{"isvalid":true,"address":"RYMzZx5nxKrMtTm3TNeheVn4RooTGvhsNd","scriptPubKey":"76a914fd335d6f4fc38b4a4a987df588c44725ebb7343a88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RYMzZx5nxKrMtTm3TNeheVn4RooTGvhsNd","randipbits":4250743323,"coin":"KMD","tag":"954207933552674459"}
|
||||
90c7027fcec618acd43127a249a20f94dda8e2e10ef565d0285ca48829c95381
|
||||
{"isvalid":true,"address":"RPyKbtBPVb3FYv5iFULNUB6bq9DdvekZuz","scriptPubKey":"76a914a128ae07bfea203567eed1d4387e9982cdb220fa88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RPyKbtBPVb3FYv5iFULNUB6bq9DdvekZuz","randipbits":3756225191,"coin":"KMD","tag":"15826281881566727460"}
|
||||
f29fe74e7e4432e47ad5e7107d2defb2d5f5fc817fa970b418454af4177dc84f
|
||||
{"isvalid":true,"address":"RVcGdBT2N6Fbqbptj3R4zhZYNB4WJQWEns","scriptPubKey":"76a914defe36b60170a9e8e9bd72c6d2e261ae3844e71788ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RVcGdBT2N6Fbqbptj3R4zhZYNB4WJQWEns","randipbits":2582272023,"coin":"KMD","tag":"16897803795030709684"}
|
||||
e7be7bd4a50917ae08dbcc552899579ce007c04c450db239ed04ab21a6b3c0bb
|
||||
{"isvalid":true,"address":"RPZ1G1SP3qmfdmwxeLzuFYpeg2YgsyDmKm","scriptPubKey":"76a9149c8f629187105a8fa636522df9ac5a7733ec87c088ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RPZ1G1SP3qmfdmwxeLzuFYpeg2YgsyDmKm","randipbits":2324724189,"coin":"KMD","tag":"11315948320004966528"}
|
||||
d0192a91c0fcbfbc3bc9f1dac9d69cc9833713be6a46ad45685d74b43cd3c935
|
||||
{"isvalid":true,"address":"RH4SXj2zZqfG4TfejyHcVpaoPoDv1Uonnf","scriptPubKey":"76a9145557a99fd7b24c7446c3073cfd32fa0f1cefa4d988ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RH4SXj2zZqfG4TfejyHcVpaoPoDv1Uonnf","randipbits":3909093808,"coin":"KMD","tag":"7344087155129809820"}
|
||||
0faf3844c6a7a397ae493073c9dacc11837767029ea30230c25891b9b6a86c68
|
||||
{"isvalid":true,"address":"RQrV64mBwDgfSSe7Tf57xApNUYKfgeAyUx","scriptPubKey":"76a914aad5cff252e7d513f77b0641975ae825bb126ee288ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RQrV64mBwDgfSSe7Tf57xApNUYKfgeAyUx","randipbits":1505688468,"coin":"KMD","tag":"16079253493034989224"}
|
||||
abf5bfde999429f715526121bb39c69848923ac19625a38d25be7a22048df736
|
||||
{"isvalid":true,"address":"RV9osrAbwSAdNpm6qNXJrC2gk3nZhp3dZB","scriptPubKey":"76a914d9fd124397928b0bdb92db17d84a62361a28cf5988ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RV9osrAbwSAdNpm6qNXJrC2gk3nZhp3dZB","randipbits":1077965479,"coin":"KMD","tag":"9988292869269206255"}
|
||||
175cc61e5248906edd3b7db690c214b14ab46cd0ec2f5e8f92578342c34831bd
|
||||
{"isvalid":true,"address":"RNhXnjLYF8xWK3WJ81QGayVKspv39piE9A","scriptPubKey":"76a91493341264d21e46de1fa136ee1c9262ce4c78dc2488ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RNhXnjLYF8xWK3WJ81QGayVKspv39piE9A","randipbits":847292520,"coin":"KMD","tag":"1403051894683228468"}
|
||||
a6c9cfc58d407efdc675c3728f341c742dba746bdca5f453fa12a3b8e3d3f890
|
||||
{"isvalid":true,"address":"RMtaFKtY9shLtoP3WBZqWgwGFGnN48aEms","scriptPubKey":"76a9148a5292eda04f6c8320528f7021b628292e0101aa88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RMtaFKtY9shLtoP3WBZqWgwGFGnN48aEms","randipbits":3756225191,"coin":"KMD","tag":"6503461066901703669"}
|
||||
ff046afbfa484fd79b46eefed4456dbae47b3c5925bc4f4a5eb7e74145cbc3de
|
||||
{"isvalid":true,"address":"REtq1LtbLVo6bz68f9TGFduNmUTKqG7vnH","scriptPubKey":"76a9143d960379bf0e4810f83901222e7336b22cfe96a488ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"REtq1LtbLVo6bz68f9TGFduNmUTKqG7vnH","randipbits":3634905133,"coin":"KMD","tag":"7508633147319547146"}
|
||||
76905fc13c9ea057bef4c2a19572cd694a7f370342ebb3c19d4cc3780e6dfceb
|
||||
{"isvalid":true,"address":"RS3rMPEGouBWbHKStyQg8TxVmtwFQ6ebh3","scriptPubKey":"76a914b7f4439822570e19407915681dceef4216d3d2c988ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RS3rMPEGouBWbHKStyQg8TxVmtwFQ6ebh3","randipbits":3529902341,"coin":"KMD","tag":"1611789650002957008"}
|
||||
e69fe9437bd18e84094ccf24539aa247504880990a9070a8ab15e029a0c637b4
|
||||
{"isvalid":true,"address":"REEwT31zNEKL9B6ufdEeh3v39kaGXXmbHM","scriptPubKey":"76a914366b95d90bff5aa4fdd0639a0a94efb7b27e785a88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"REEwT31zNEKL9B6ufdEeh3v39kaGXXmbHM","randipbits":649762625,"coin":"KMD","tag":"15096574960004591485"}
|
||||
56d892f8d413a17d6c37994551757f9a995eb4ee153269b06e27470d7bf67ac1
|
||||
{"isvalid":true,"address":"RGzvr4JSHDLDQAGBwdyoUiUuaYn5sUwKNd","scriptPubKey":"76a91454ada2c4bfec4e7ed82382211696f9ce87b09c1688ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RGzvr4JSHDLDQAGBwdyoUiUuaYn5sUwKNd","randipbits":1212417070,"coin":"KMD","tag":"18297255803991747940"}
|
||||
9c666a9485226b43ea7347c3501a1e202c15cc774198af8c7ae08c2c2ed55562
|
||||
{"isvalid":true,"address":"RUNnhqkaV7SLEGCaD72mPq8nmY4c2kFpZg","scriptPubKey":"76a914d1795fd0bc9baf0088a8b83a6d740d93f3278e1488ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RUNnhqkaV7SLEGCaD72mPq8nmY4c2kFpZg","randipbits":3795805790,"coin":"KMD","tag":"2145714060452604690"}
|
||||
df90b57f4b9449064e3ca431d57060852a90f0985a2d54fcc70630712d9e0370
|
||||
{"isvalid":true,"address":"RKKuzpkq1jxGAJSbADQzUDHUbfNvVCKFpW","scriptPubKey":"76a9146e35150271cf43c66a7a922835b9fad8d45ef6db88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RKKuzpkq1jxGAJSbADQzUDHUbfNvVCKFpW","randipbits":643714192,"coin":"KMD","tag":"2946658726146331625"}
|
||||
03af4acfcc572ef72a52a3de00f0f5184335d46cce10759768b4521faa4ca7c2
|
||||
{"isvalid":true,"address":"RMD1wVnzMmKn8uMTHaP9pYfCWkxf3QVWWE","scriptPubKey":"76a91482d761f006050eb1b113a3888661d5e0375f05d988ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RMD1wVnzMmKn8uMTHaP9pYfCWkxf3QVWWE","randipbits":3812583006,"coin":"KMD","tag":"16372490744275563321"}
|
||||
1cda54568e4675b0b518d7e263a21d4af5cb770b57746db815da857d4a3e401e
|
||||
{"isvalid":true,"address":"RKxR5Zafxm5WcmFFBdfWYTk55Qv6fbC4Vd","scriptPubKey":"76a914751c5536fa26302c9f156e8fc30b1e3af5ad40f488ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RKxR5Zafxm5WcmFFBdfWYTk55Qv6fbC4Vd","randipbits":749314742,"coin":"KMD","tag":"1309576106322226605"}
|
||||
951d923d10a05f21b958e1995a6c7b629896baad1fd29b3b6ebfea9ea3c7fd16
|
||||
{"isvalid":true,"address":"RFAPtYANyAs9hhwUBNYemugxjhpwp4YvwF","scriptPubKey":"76a9144087b3baa1860e9850a116b233f09428bea53e6388ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RFAPtYANyAs9hhwUBNYemugxjhpwp4YvwF","randipbits":3529902341,"coin":"KMD","tag":"5056643247278593208"}
|
||||
fee88cbd9256d4040147f1a9084c837cfe543c65e6c517d725053e0f4cce4fab
|
||||
{"isvalid":true,"address":"RQCEEEprmqghZHN73iG1C2XvYTTQ6FB2wE","scriptPubKey":"76a914a3999a1d550236b3751f2686b9bb028a6d809c2488ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RQCEEEprmqghZHN73iG1C2XvYTTQ6FB2wE","randipbits":1923364494,"coin":"KMD","tag":"12755903076952666958"}
|
||||
9b7899b241a21fb8f42da4cd4d95eebdff582d2cde6fc75d41bf3a1e8ccb7721
|
||||
{"isvalid":true,"address":"RDX85BbF7kJY4S33VTPgCM1tWQGwU9huTy","scriptPubKey":"76a9142e82fb97834aacac8775388add5a55c3efa1160488ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RDX85BbF7kJY4S33VTPgCM1tWQGwU9huTy","randipbits":4267520539,"coin":"KMD","tag":"16666215209891718793"}
|
||||
cb6383f164c1b4f0c43b967c1fe661cb70e0fc99a56964d9810fceac995315cb
|
||||
{"isvalid":true,"address":"RCmLc2JBpPw9T9g1skg7J5Xr5kz1fyd7mx","scriptPubKey":"76a914263b2433c4d49decd7bfe07b979b9d4e1f1199c988ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RCmLc2JBpPw9T9g1skg7J5Xr5kz1fyd7mx","randipbits":3529902341,"coin":"KMD","tag":"12381750983796080467"}
|
||||
5ddc1f11bee91a4ae75b322c4b75e1a3fe99c05e928160a5f50cc1dae108357d
|
||||
{"isvalid":true,"address":"R9ULUWEvzmHPZ4rYL5FtwkMyTWvGDZX43J","scriptPubKey":"76a914021b95a25573864846945228ae49eee8988bbd9f88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"R9ULUWEvzmHPZ4rYL5FtwkMyTWvGDZX43J","randipbits":3496806661,"coin":"KMD","tag":"17644502224478366215"}
|
||||
1224a168d52a5b655cbcec7fa0a24298edc9dbc30c07ea2cf498c3c1fa067bb1
|
||||
{"isvalid":true,"address":"RE2f5UV1JDhUk6TeJLhz3VgxH5ePPa7SYH","scriptPubKey":"76a9143418ed6789ece2b95fd952365ad120d9eec6021088ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RE2f5UV1JDhUk6TeJLhz3VgxH5ePPa7SYH","randipbits":2582272023,"coin":"KMD","tag":"6785214726302321931"}
|
||||
1b5368b02c3d3e4c3c20f744d4c5f10e70a064183c368a2d3e60bd5cf9793dea
|
||||
{"isvalid":true,"address":"RGW1zNcVLcZDHTMBqEiSEXCm2WNWBx3z9A","scriptPubKey":"76a9144f35ddcc179396618acc714732967422738184b688ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RGW1zNcVLcZDHTMBqEiSEXCm2WNWBx3z9A","randipbits":1254871213,"coin":"KMD","tag":"14293138457751365327"}
|
||||
637521bbe2c313ca0a07a462fc658fede79e7b414303e33c9ec3d00391235163
|
||||
{"isvalid":true,"address":"RW2xS8dpxjudqBX1hqxShP7FWn8EHYH4Rb","scriptPubKey":"76a914e3a96d98131e45c6f3e950f75253d98419aeb8d888ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RW2xS8dpxjudqBX1hqxShP7FWn8EHYH4Rb","randipbits":3558029461,"coin":"KMD","tag":"5448300338283729444"}
|
||||
1770fbc3208c66bd8b258cab6e2187265bfa8a4d97cb093a82a98b4c5a379247
|
||||
{"isvalid":true,"address":"RALRwXaEN3yS5damdDwAkmEMKvdAkVs361","scriptPubKey":"76a9140b94f1ffffa0faa5dac21421ae1e1bead1f66d7a88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RALRwXaEN3yS5damdDwAkmEMKvdAkVs361","randipbits":4267520539,"coin":"KMD","tag":"12118001679126191805"}
|
||||
7c7570ce5fa58b1a0bb93a2db3eea3c9028868a48641cd2a6af51387d66f8f9e
|
||||
{"isvalid":true,"address":"RXk8hbw2g1iU5Vae5Aov8MmJBcNH9jTq6V","scriptPubKey":"76a914f66b2db5f465e4fa0f6c9f31e32245848e6ed96e88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RXk8hbw2g1iU5Vae5Aov8MmJBcNH9jTq6V","randipbits":4233966107,"coin":"KMD","tag":"5621563725418681913"}
|
||||
aa21768e3c790802f3fa27b700f2742a43480df3f85be7eba7a4131b75032445
|
||||
{"isvalid":true,"address":"RPVNUvVq4BgKrrB3E1uULja2hjPW6Hv6r9","scriptPubKey":"76a9149bdf6fddcb7b9b67b5f6f23fdddea6f1f4cc77ec88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RPVNUvVq4BgKrrB3E1uULja2hjPW6Hv6r9","randipbits":726058584,"coin":"KMD","tag":"3851576222574280395"}
|
||||
1722916a64aaa8367d2c3993184e98673a796e0d998ba6d5612e367e0c36f8cf
|
||||
{"isvalid":true,"address":"RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A","scriptPubKey":"76a914e8557b8b75b39e8d9a7b753cf9b7ab113896a65b88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A","randipbits":649762625,"coin":"KMD","tag":"18419270347001149487"}
|
||||
24447c5b1d1fdf46aeccff20b73441ca148380d1d515ef6066aab66d04fe039e
|
||||
{"isvalid":true,"address":"RXFr5VB9gQYC5QYv7yVvkxtjDY3zwYuvDx","scriptPubKey":"76a914f111a7dbd1f603dc32f374e4118b1dfc3fe14e9c88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RXFr5VB9gQYC5QYv7yVvkxtjDY3zwYuvDx","randipbits":3539516869,"coin":"KMD","tag":"13829815321973515267"}
|
||||
d0498e111bcccc806b7afc51678adea13450af859596e3b7c663e60323259764
|
||||
{"isvalid":true,"address":"RYZHjTxct7aq83rLkvb3ZrfXpPPQKdBX4z","scriptPubKey":"76a914ff5644b531e1fb08b58dac5f1d37c078d9103a3288ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RYZHjTxct7aq83rLkvb3ZrfXpPPQKdBX4z","randipbits":1254871213,"coin":"KMD","tag":"16781356966076449675"}
|
||||
f4ea9bc2b3545436fc6a6dfb8a6b46a18a82c8602c9d599be1a74f39ed943369
|
||||
{"isvalid":true,"address":"RCKvFCXm1SLr24i2FiVN7yNmxaXpWGy2o3","scriptPubKey":"76a914216c68920eeddea258964692b1466271bdf6015c88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RCKvFCXm1SLr24i2FiVN7yNmxaXpWGy2o3","randipbits":2064902657,"coin":"KMD","tag":"7726735762950180477"}
|
||||
86c4ad9a4c58f03f6abf54a76ea8f3624b6965862a0c63963681dd24039a2cf8
|
||||
{"isvalid":true,"address":"RUqYxcjB5Hy6eqK1YDimjfXfhfp5TSyCF4","scriptPubKey":"76a914d689219c2fa34b4b808ab6c8c0e7564c787b579e88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RUqYxcjB5Hy6eqK1YDimjfXfhfp5TSyCF4","randipbits":3510593118,"coin":"KMD","tag":"16596108505359964587"}
|
||||
76babaa471e2fdc389c72e22a655a4858abcce8ba2779a326a179fe6147f1869
|
||||
{"isvalid":true,"address":"RHUpvFhHv1umX1JsV5S8smAKAsN5CxA4HD","scriptPubKey":"76a91459f455a7f1c831b5e48313dc4199ed96f4d9a87588ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RHUpvFhHv1umX1JsV5S8smAKAsN5CxA4HD","randipbits":3350674129,"coin":"KMD","tag":"16007497338429761026"}
|
||||
679dc17d85468f1fad4246cf9af774978315cfe7ecb7857cfda443911a21a1a8
|
||||
{"isvalid":true,"address":"RW7w9NLACVHnBW37QVTKeP6YYuYegfg1LF","scriptPubKey":"76a914e49a6e8fbbdb28035a808eb49fe2081508c3b66b88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RW7w9NLACVHnBW37QVTKeP6YYuYegfg1LF","randipbits":716060302,"coin":"KMD","tag":"5747497138021474289"}
|
||||
8ce8a445c44931b44b476e108bce0bf9bb007286844d437e2aff34c1928e1237
|
||||
{"isvalid":true,"address":"RAhvJHePdAb1PF9jjZhP2F7r72ebL9pA1f","scriptPubKey":"76a9140fa55a3e89016269ad97d9aa83af1f6be1f6d6ad88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RAhvJHePdAb1PF9jjZhP2F7r72ebL9pA1f","randipbits":3558029461,"coin":"KMD","tag":"4441920960443819055"}
|
||||
bd7a2bae340307163e9e2fb47c76a8b131da9dbd45ccb88111719ea0c71b0269
|
||||
{"isvalid":true,"address":"RQ5PNbYYJgytmGQQSdbUeuh7Nekc3jcMRW","scriptPubKey":"76a914a24e52c8fee5637df02e97007ee05fef796157b588ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RQ5PNbYYJgytmGQQSdbUeuh7Nekc3jcMRW","randipbits":1212417070,"coin":"KMD","tag":"3842268692737470166"}
|
||||
955346716d601009ab91b7f9eb71642feb3f2237c414ae059397f68732bea877
|
||||
{"isvalid":true,"address":"RLS8Y41iqJp8rBVPtsg6mDymyWmdWBQZby","scriptPubKey":"76a9147a5a2b9063706a821b5587d55a1ef3de71f4d7ec88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RLS8Y41iqJp8rBVPtsg6mDymyWmdWBQZby","randipbits":2520388199,"coin":"KMD","tag":"12038156323115667698"}
|
||||
f5d6b5296e7bf4742de8461819b5d88a48afc2048976fa85083cfd33daafdd32
|
||||
{"isvalid":true,"address":"RUYWU7rQ4vDyhhHbnyEeSMHrxt79qsnsAy","scriptPubKey":"76a914d34ffaf30e3d67c825a94edf932f8b35845cded188ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RUYWU7rQ4vDyhhHbnyEeSMHrxt79qsnsAy","randipbits":2320559039,"coin":"KMD","tag":"5932046731441869369"}
|
||||
264d0216229c778eb7068db63a4261bb1a8d18855a1cb5533c3e976819b36f07
|
||||
{"isvalid":true,"address":"RDCjGgoZ1tvCWop6m5wPYkr83wdFrofF6M","scriptPubKey":"76a9142b08762b7091f4308f0890c34f8bda155a898c5388ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RDCjGgoZ1tvCWop6m5wPYkr83wdFrofF6M","randipbits":3310160965,"coin":"KMD","tag":"12705068326486539703"}
|
||||
722466cdfc81b2025b95e6094a746d68eac713d72b53eba6509121c473e1fd8b
|
||||
{"isvalid":true,"address":"RLAEm3H2LMSNzJmveLkcf2nS18AnqWR7pJ","scriptPubKey":"76a9147758b5d2e66bff666973ab0a13f2605f14e9128088ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RLAEm3H2LMSNzJmveLkcf2nS18AnqWR7pJ","randipbits":2474273465,"coin":"KMD","tag":"12111710440388271062"}
|
||||
f7e7b99252dfc6b5c8ec506a2d8c96f526d55eac6535ad25af3cdbfac379e444
|
||||
{"isvalid":true,"address":"RLko1vnC4k8WntCjCLwK6WcLYnzLZnCzfj","scriptPubKey":"76a9147de1c78be58cf827ffbd7cf13415a16842791ebd88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RLko1vnC4k8WntCjCLwK6WcLYnzLZnCzfj","randipbits":749314742,"coin":"KMD","tag":"8226524654736218895"}
|
||||
2e72a3f2d69e7ba6fba79e977543182ffb86f9a9eb4c9fa31ee04ae2741a81cc
|
||||
{"isvalid":true,"address":"RSUfnwTLE36E3Nx8PptxVoAfSRtMeGQsFL","scriptPubKey":"76a914bca5d93ac90d40379e75f503406f58827bd984a288ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RSUfnwTLE36E3Nx8PptxVoAfSRtMeGQsFL","randipbits":1505688468,"coin":"KMD","tag":"10008945353933923072"}
|
||||
2868a66048b79c560d0b4c0ec8ca8d3567cd731fdf246fbeb96eaee49b3e5f9b
|
||||
{"isvalid":true,"address":"RPkkQmMmyLQe8Th7ZP5GoF6kSUs1DTNfAf","scriptPubKey":"76a9149ec7fb32ba719194cbec3bee682970683ffeefa188ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RPkkQmMmyLQe8Th7ZP5GoF6kSUs1DTNfAf","randipbits":1212417070,"coin":"KMD","tag":"804390373941681274"}
|
||||
3041e038d4b498d32a7985870b8d1499accf35e76d9285cdf25e42153539e527
|
||||
{"isvalid":true,"address":"RSkhXmiPCxqdp4bM4ux7VxAwMoCv2Uar6d","scriptPubKey":"76a914bfadf4850adc513efcb24ee1ae425ff0c67561f588ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RSkhXmiPCxqdp4bM4ux7VxAwMoCv2Uar6d","randipbits":3606291758,"coin":"KMD","tag":"9863218566458520290"}
|
||||
34f2929e81a532a7acbcc1b9b7be539ecad2527162b2afda1db81accf5536680
|
||||
{"isvalid":true,"address":"RP8AvHsUhZkbDdcfHFrRsZZn2QVNcBMPNQ","scriptPubKey":"76a91497dd0cbf91133e34fed843b9d266b724400268f088ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RP8AvHsUhZkbDdcfHFrRsZZn2QVNcBMPNQ","randipbits":2064902657,"coin":"KMD","tag":"13143107622263065925"}
|
||||
4f17c4368e0330e89e08d4271b35649093f121384b46ab311ca0aa1115e7f497
|
||||
{"isvalid":true,"address":"RUJvR3TXCAcizk7dXdFc6GKRFS6jZfjtyY","scriptPubKey":"76a914d0be25901387463ef3690e4561c24fcb342ce06788ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RUJvR3TXCAcizk7dXdFc6GKRFS6jZfjtyY","randipbits":2320559039,"coin":"KMD","tag":"3164889605565987995"}
|
||||
791f8a22193dfce8fbc2bea5466c747291391e85291f96b53c4f98ce012a1d35
|
||||
{"isvalid":true,"address":"RLZmhbeB2tXTas9grzAeqaL2RFAXVmDVpU","scriptPubKey":"76a9147bcc1af6d5a695940a3f37e15f377e5adf39475888ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RLZmhbeB2tXTas9grzAeqaL2RFAXVmDVpU","randipbits":585288902,"coin":"KMD","tag":"14041076325487564924"}
|
||||
7351a8e69fdea30190975ca4c84116cf2e3205d2e1f7f2a51a8dc865c34da859
|
||||
{"isvalid":true,"address":"REU3FkPuNbZxogpStpyhZiyPkCp58G2bh3","scriptPubKey":"76a91438e5d6c5a489294ce3c6857c5b6fac47194b17e488ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"REU3FkPuNbZxogpStpyhZiyPkCp58G2bh3","randipbits":2320559039,"coin":"KMD","tag":"6027473142906672140"}
|
||||
6b9bbb886bba401ccbbca520bc85504fe2eea3c58c2ac6c8b114cf3648bd65b0
|
||||
{"isvalid":true,"address":"RGHoKLW6r7DEBtYfV6VgjeBsQQFMvZ5thw","scriptPubKey":"76a9144ce64bc233e77d397cf575ef86bb14107a1c2a7288ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RGHoKLW6r7DEBtYfV6VgjeBsQQFMvZ5thw","randipbits":1374184384,"coin":"KMD","tag":"4680412223953801587"}
|
||||
2d27631432ad1a61e46f2b1be20c46c518f5c2d3f38b7125556862ca76a670de
|
||||
{"isvalid":true,"address":"RLCDEXwfJ75P1iKgWGfR9geJmjZ84A4XXJ","scriptPubKey":"76a91477b844b38a23d95d1071051ea2c3f71e47f6877b88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RLCDEXwfJ75P1iKgWGfR9geJmjZ84A4XXJ","randipbits":2324724189,"coin":"KMD","tag":"4861630013629819552"}
|
||||
75519042825ee2ac86142c0488d363a39557d98b59de2e4dc9c6f275d9106d25
|
||||
{"isvalid":true,"address":"RW1FmQGcpPv87WZVSCaMgjj74shMb3Y6Zi","scriptPubKey":"76a914e357107c6793c649aeaa83b1c2fbab3cdc717c2988ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RW1FmQGcpPv87WZVSCaMgjj74shMb3Y6Zi","randipbits":2582272023,"coin":"KMD","tag":"3609665741252491211"}
|
||||
9f38f6451f00adeef0e64ac32cddb32c5278e5721dd176e0204dc75fcb75de2c
|
||||
{"isvalid":true,"address":"RQUMrGYr4SsHgbN56WP7tuEpWUcd62KidP","scriptPubKey":"76a914a6a69e87aeaa85845a2b4688b1df3b282ec959db88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RQUMrGYr4SsHgbN56WP7tuEpWUcd62KidP","randipbits":1844341465,"coin":"KMD","tag":"4594736785745315617"}
|
||||
ae39a9904bfe3397e09f36d720f53d4caab83a8826a9f0225f550d70e05d29a5
|
||||
{"isvalid":true,"address":"RP8CkGhyfhdoVpGqGbVmEmRL7gGdqKBdkt","scriptPubKey":"76a91497de9339d8c7071012e5cdc0d7fef07325bd9ece88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RP8CkGhyfhdoVpGqGbVmEmRL7gGdqKBdkt","randipbits":119096734,"coin":"KMD","tag":"8511847080866559487"}
|
||||
2bded7bf8992062ede8c27d4ac1960b667ed9d66e8bcb79cbc94ba5103182ee4
|
||||
{"isvalid":true,"address":"RRupn47XfLSMhXEuShtCCPBCv8P6LYXrLN","scriptPubKey":"76a914b66f9f348f8df6f7af3adb4d83699f68cea9307588ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RRupn47XfLSMhXEuShtCCPBCv8P6LYXrLN","randipbits":306342285,"coin":"KMD","tag":"7266318498151320931"}
|
||||
35443c3f172f04e39320b8c25ebab7b5866577174e70bbedf7514645f2ee76ec
|
||||
{"isvalid":true,"address":"RTPiNQKiaVaBnhneiZXqpieHfF6F2RWt7y","scriptPubKey":"76a914c6ae0bb05c9a33ac18ef833f5e001973901872b788ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RTPiNQKiaVaBnhneiZXqpieHfF6F2RWt7y","randipbits":2474273465,"coin":"KMD","tag":"1187650091494195557"}
|
||||
998dac128e50a70addbcbc2492009ea03dd81d1ae1115fc78ef3f1df9a136217
|
||||
{"isvalid":true,"address":"RAiZZDEXN8gqgotWvxxMc4cY7shkZ6y2Es","scriptPubKey":"76a9140fc4740ee559334ea78908fbe0d0bc7d726b3b4e88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RAiZZDEXN8gqgotWvxxMc4cY7shkZ6y2Es","randipbits":2324724189,"coin":"KMD","tag":"15788132541469737392"}
|
||||
eb3809ccc146af2e228234957e115a8003b6db0e89544dbb329bd2ef51dbc7b4
|
||||
{"isvalid":true,"address":"RLkUAjyNy8CQz8SxGvLwLWMP6rj3AK8Y7S","scriptPubKey":"76a9147dd20bc1dc1070e66616685c4fbdea2e77fe82c488ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RLkUAjyNy8CQz8SxGvLwLWMP6rj3AK8Y7S","randipbits":1923364494,"coin":"KMD","tag":"7216368189000613073"}
|
||||
9621e4c03d1a0893873660052e6db5916181639299afb743764f9e69a8527b29
|
||||
{"isvalid":true,"address":"RRX73tynW4sxCmqyYBQrS9nMcDUcXuX1yG","scriptPubKey":"76a914b223a38fd7eb896d55da2482791a348a86eeef1288ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RRX73tynW4sxCmqyYBQrS9nMcDUcXuX1yG","randipbits":3678679579,"coin":"KMD","tag":"7320146782036675413"}
|
||||
e2560151e8f9979fed63a1264b9ecf9734652423d7c69d2019ea1c10bda6dcc7
|
||||
{"isvalid":true,"address":"RBFoJqbhcDJG3wcKu9vvenTMcc7EJTowFq","scriptPubKey":"76a91415acd3f264307f868095fe1016c7853df10ff2d288ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RBFoJqbhcDJG3wcKu9vvenTMcc7EJTowFq","randipbits":2320559039,"coin":"KMD","tag":"7368663450862819294"}
|
||||
2f1140761ff445d9bea8dabed5e680eb1b121645e7d355b3617b56041c28ac0e
|
||||
{"isvalid":true,"address":"R9u7V63TLwJPH1shvAGHRG61aci61yy7RN","scriptPubKey":"76a91406cb23dcc2f6c42c1ca274ee956c3eb8b9b4facf88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"R9u7V63TLwJPH1shvAGHRG61aci61yy7RN","randipbits":457907142,"coin":"KMD","tag":"13184722178550341776"}
|
||||
c60188aa2f78979e09248dc4397c31b987391172a2aba4786a6160c5aa946445
|
||||
{"isvalid":true,"address":"RK6x2w56cGqJrnFiGcuR5VNWahzm8G5AiA","scriptPubKey":"76a9146bc15fdad74e3c3626e06ee63198382557d3c60388ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RK6x2w56cGqJrnFiGcuR5VNWahzm8G5AiA","randipbits":3634905133,"coin":"KMD","tag":"12251590486799800132"}
|
||||
009d448297d24da1a93e08b297a44251f37b704563bcaf290167f42eaf147e1b
|
||||
{"isvalid":true,"address":"RV56pNJyghFp8ikNMqPsuaffcJxrk39Xkh","scriptPubKey":"76a914d91921e070947bc792dcf0c43a07d315269531b488ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RV56pNJyghFp8ikNMqPsuaffcJxrk39Xkh","randipbits":4267520539,"coin":"KMD","tag":"12059954479745860123"}
|
||||
29adf19c3b9915939b9e2294501f2935da30112bf38ea66bd892b3010bcb9f8d
|
||||
{"isvalid":true,"address":"RKAxvqvC3apzrb8udG9trBxiNhhNXaLkz4","scriptPubKey":"76a9146c83c9104daa35ad9351144d5b7e85326e10c9e288ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RKAxvqvC3apzrb8udG9trBxiNhhNXaLkz4","randipbits":3756225191,"coin":"KMD","tag":"524537270209711700"}
|
||||
34a157d49905f690aa5f9549cf5b864519fa348a7f10868a6642e2eb10c605c2
|
||||
{"isvalid":true,"address":"R9SHcVV3m86KDnjRo2Pxc5yeLGKxwbyChb","scriptPubKey":"76a91401b85cfebe711a95b9f553084f5101c22780964688ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"R9SHcVV3m86KDnjRo2Pxc5yeLGKxwbyChb","randipbits":1844341465,"coin":"KMD","tag":"6409293806330068501"}
|
||||
1f93484709404b43e25cc7d8d7e737ea2bd5d4382761cb1adae82563b84c3b4a
|
||||
{"isvalid":true,"address":"RV5cgPjqt37QBHr94VL5HnXWqcwdqoqoC3","scriptPubKey":"76a914d9320f6edb3adec52e7b63981d42c68cb2b3a1eb88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RV5cgPjqt37QBHr94VL5HnXWqcwdqoqoC3","randipbits":2422516899,"coin":"KMD","tag":"16335033217890267622"}
|
||||
112ecc7c1bb31c32eef17672d5edc367c3cdbb529cdfe9ac6f4356e71256f15a
|
||||
{"isvalid":true,"address":"RMnuGgpEzWcxYi861E7BjGMURCFX2Szj2v","scriptPubKey":"76a914893ff54993f8c662a05e286a32762f651941fc7788ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RMnuGgpEzWcxYi861E7BjGMURCFX2Szj2v","randipbits":649762625,"coin":"KMD","tag":"15192753244820233720"}
|
||||
b848db8cecb959d7a253efc566ca7bc27c7a351dacfc9c19bcee084015ee8870
|
||||
{"isvalid":true,"address":"RF4iG6huXb9u6Pt8281WvnBjhdEtiVUnp4","scriptPubKey":"76a9143f748ad131ae69461369d8aa8022bb49e3b19d1188ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RF4iG6huXb9u6Pt8281WvnBjhdEtiVUnp4","randipbits":3678679579,"coin":"KMD","tag":"15693301119386652646"}
|
||||
4068a71cd8c5cde48482ac401d051b79d8e55c8972d65b5dad46fa7b1df4b982
|
||||
{"isvalid":true,"address":"RFKC68PGKwYz6rnPAbWomGZUv1BWKY8ugN","scriptPubKey":"76a9144231986e724878f23e1baa82f911a1cd46009afb88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RFKC68PGKwYz6rnPAbWomGZUv1BWKY8ugN","randipbits":2358278621,"coin":"KMD","tag":"8100233926452389942"}
|
||||
9c2015601f3e05365eb6a9bcd805533dd8b6b89554633e1fbd531e2427a9ff9c
|
||||
{"isvalid":true,"address":"RQAzL9perFJbDKcHiJ9Lafxxce7XiKo7Sx","scriptPubKey":"76a914a35d95a508fe1da8ca967e0a0a066215e8186a3688ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RQAzL9perFJbDKcHiJ9Lafxxce7XiKo7Sx","randipbits":1077965479,"coin":"KMD","tag":"17562431360068145734"}
|
||||
da99d4b45f298f761c03f498bf4bcf780abd1322de1ec8cdb800a2b11ca82a86
|
||||
{"isvalid":true,"address":"RRaSQCAWk74r5cXzZV8JqqW9JFbhF2o2nH","scriptPubKey":"76a914b2c50a105d3f8ad8c8bc5fab0a7996f444627c2488ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RRaSQCAWk74r5cXzZV8JqqW9JFbhF2o2nH","randipbits":1505688468,"coin":"KMD","tag":"13131499332489581200"}
|
||||
e2b77ab956cfd75a458bf94d485ef9dbfaf81ce0e6f1739f3a6cb1538cbe61af
|
||||
{"isvalid":true,"address":"RU49btc37WeEiQotQZMhEaGokFYeJYc616","scriptPubKey":"76a914cdf2ea4f812d9b101c0f3ab2592b55b6b65ba80a88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RU49btc37WeEiQotQZMhEaGokFYeJYc616","randipbits":3496806661,"coin":"KMD","tag":"12544229480263406885"}
|
||||
bcbaeb10d2bb27e48a68d88f02c84439e4e5cf07fa4db8b01ab85a324f5da1a9
|
||||
{"isvalid":true,"address":"RW3gz9fEadohRLZerK9r8zXkugk5swWHrf","scriptPubKey":"76a914e3ccf2e10b6458091159d89c462d747398bb1fc788ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RW3gz9fEadohRLZerK9r8zXkugk5swWHrf","randipbits":3496806661,"coin":"KMD","tag":"18021827275773651771"}
|
||||
a927c61a7cdc072e13b3851831f8c099574ef27c24dea53e20253ab0712e5aec
|
||||
{"isvalid":true,"address":"RAFLKtQxyGECt5fBfufuCGY6rvupfKrn3U","scriptPubKey":"76a9140a9e2dc32e77fd3ad91b28b11581317695733aed88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RAFLKtQxyGECt5fBfufuCGY6rvupfKrn3U","randipbits":2966062244,"coin":"KMD","tag":"17980386951023891077"}
|
||||
30e0c514b2be13f40cf44586c3e0323e1c9d137a45f105f43c282154afda964d
|
||||
{"isvalid":true,"address":"RJ89radoRzRr5oDsf71QZ7BXUTiHcyVSUu","scriptPubKey":"76a9146103885fca72f9596bcf24a60549afe1e375921d88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RJ89radoRzRr5oDsf71QZ7BXUTiHcyVSUu","randipbits":1077965479,"coin":"KMD","tag":"6623859242676141391"}
|
||||
ca212b020dda025944d7c18f815339d4dd10d2d7c7b8f423eb42b3f1cd5591d5
|
||||
{"isvalid":true,"address":"RKenAzKZyD58qPu2zVdjwPjDn71T34sWE4","scriptPubKey":"76a91471c6741d8ec5e9a546412794e75d7b88ec0f587a88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RKenAzKZyD58qPu2zVdjwPjDn71T34sWE4","randipbits":114528085,"coin":"KMD","tag":"15210845949632153032"}
|
||||
2f0390723351dd64861ed915ea52fb4635d2c9ef9c3da8b25831d148b5a54a83
|
||||
{"isvalid":true,"address":"R9ibGGfsFHD8MxLRL4q2a6ezxAaHHPJvLc","scriptPubKey":"76a91404cdc0d618d595996cfccc66a10cc4bcdcf18aae88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"R9ibGGfsFHD8MxLRL4q2a6ezxAaHHPJvLc","randipbits":3558029461,"coin":"KMD","tag":"9528516854577807170"}
|
||||
ae807083da593f9d52bba1f3b69a41bae4035e1a3fb2ade88b1c730f51426bc4
|
||||
{"isvalid":true,"address":"RGwuMmW1ZBMrHJwJucEy5JEV3BZWv7eQnm","scriptPubKey":"76a914541b25614a7625c52e4c21dd60314289900ff0de88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RGwuMmW1ZBMrHJwJucEy5JEV3BZWv7eQnm","randipbits":3310160965,"coin":"KMD","tag":"18443691897336118104"}
|
||||
c19bda5d056d8d9ec0d24bb3295e7286cc08ce603c404c7e259a485a9f177193
|
||||
{"isvalid":true,"address":"RT6Ckpw8yM2Q7yaCxejiVTrxELGQPtnGPm","scriptPubKey":"76a914c35e411a73cff73790032b0fbed8eea33fc6dffe88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RT6Ckpw8yM2Q7yaCxejiVTrxELGQPtnGPm","randipbits":3496806661,"coin":"KMD","tag":"415486371631711829"}
|
||||
d79df8653e0788811d7c9ef352b6cea6625a68b11a60b4eb5dfede3271e3aaae
|
||||
{"isvalid":true,"address":"RJfzvRW4cWXcjFpQZmv2PSy5GDGrnbM76Q","scriptPubKey":"76a914670962cef415469e0b62d0c637981d6c0eec7f9688ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RJfzvRW4cWXcjFpQZmv2PSy5GDGrnbM76Q","randipbits":2474273465,"coin":"KMD","tag":"8013502689693214744"}
|
||||
3cbbfe701158eac511e1586a765aacf568e6650efd1f105d8ae154b650ddb343
|
||||
{"isvalid":true,"address":"RSixxEuXMe8DacnajhgqDdrcFjeGD54drE","scriptPubKey":"76a914bf59ff2c07389655a469672cd03e2bf9edfceb9688ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RSixxEuXMe8DacnajhgqDdrcFjeGD54drE","randipbits":114528085,"coin":"KMD","tag":"15074159837093731000"}
|
||||
a218dcfbe40ddf06f1526694b1e18b27e1f03ddf5cb517cfa5a5cc01593f5dcd
|
||||
{"isvalid":true,"address":"RGf4wwbHVYYZrVPVZg6XdS3mWvbzHSebzu","scriptPubKey":"76a91450ec144f18b23eae5238e12592881b82b659868288ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RGf4wwbHVYYZrVPVZg6XdS3mWvbzHSebzu","randipbits":2966062244,"coin":"KMD","tag":"8936737403658615534"}
|
||||
69eb1aa7e85b7a482a85057139fea77da53da045afec40ad715fe226adbbab81
|
||||
{"isvalid":true,"address":"RESydSaRoxRWWb1Pxn88H2kTRuV1W38dhU","scriptPubKey":"76a91438b2656b6c8cfb9140367e588414cd18b99a8d1988ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RESydSaRoxRWWb1Pxn88H2kTRuV1W38dhU","randipbits":1212417070,"coin":"KMD","tag":"11659009895163208128"}
|
||||
29cc4ce2621bf8921ab8d479f7583c293d8baa3f13b4a8e8ea1add1a229b87a9
|
||||
{"isvalid":true,"address":"RJAbNiCSRaMxUky9h8as6orZY3cu2rSW8z","scriptPubKey":"76a9146179aacfbc2836d98717833f48152f4edcacd94e88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RJAbNiCSRaMxUky9h8as6orZY3cu2rSW8z","randipbits":2462330702,"coin":"KMD","tag":"9700846191891445667"}
|
||||
f0fd5536b290f0e6b57917988ef0de03158de8f82d20e6ba5cc29442a8a2e732
|
||||
{"isvalid":true,"address":"RSW5SvtjWiGYN3iwb2mteYP7Hn223Zk1tP","scriptPubKey":"76a914bcea02be7c44fd1ddb4e49e60439548d43c3310e88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RSW5SvtjWiGYN3iwb2mteYP7Hn223Zk1tP","randipbits":2358278621,"coin":"KMD","tag":"10319162265769564466"}
|
||||
e3bf487579e76e3ec2f8f0c5d1dcd9bf3857c9b2c992c9cbb93b1987f0031387
|
||||
{"isvalid":true,"address":"RNnzD9QxDZqo6DvzfM3Pu7GiyNkVk7dgsG","scriptPubKey":"76a914943c34ee1c920c171b1f876526b56c0848bea92a88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RNnzD9QxDZqo6DvzfM3Pu7GiyNkVk7dgsG","randipbits":1923364494,"coin":"KMD","tag":"18409283446389213145"}
|
||||
b22b15340992d70c221b7320accaf625c0ea7102fab2cf1be7d1e1daea214dc5
|
||||
{"isvalid":true,"address":"RSofHVn8U4WfqgfXCksqqgmiVSwXxnANvq","scriptPubKey":"76a914c03d53fcd96b09a06f118c455b3e12c5ed12fe3288ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RSofHVn8U4WfqgfXCksqqgmiVSwXxnANvq","randipbits":1844341465,"coin":"KMD","tag":"7630923714071169428"}
|
||||
f42e2f46b50f54bca487acb26a810e976a6eafbaabc9480f398c5f2650a418f1
|
||||
{"isvalid":true,"address":"RFPKxBL8iLQGmkoUukXdFU7VkXyGJLSsGw","scriptPubKey":"76a91442f9d2ac12e63b0b5a9d38c61ec4f11f2992e68688ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RFPKxBL8iLQGmkoUukXdFU7VkXyGJLSsGw","randipbits":3795805790,"coin":"KMD","tag":"2785625006751141995"}
|
||||
dc263bb3650ad3808755f878c880e3f4c5abe89f9ba98887b6c31e219bb45422
|
||||
{"isvalid":true,"address":"RA9xKdNjw1H2eqPi9f9J77v7Uq1CSWdNQJ","scriptPubKey":"76a9140999bb04e94a9ff14cd6ecff4a022e881ab8126688ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RA9xKdNjw1H2eqPi9f9J77v7Uq1CSWdNQJ","randipbits":3795805790,"coin":"KMD","tag":"7691621473590935051"}
|
||||
a0046fcf6edd0265f6ffba0b9ad0b5a9d06d29d428fbe3b8e5c09a464c41ade2
|
||||
{"isvalid":true,"address":"RVFspAKoUpDMAiiEUiQQEpqdqXDMB48Jqp","scriptPubKey":"76a914db22da63a40e3dbffec5eda5ae6fd13924e32b7888ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RVFspAKoUpDMAiiEUiQQEpqdqXDMB48Jqp","randipbits":3678679579,"coin":"KMD","tag":"3212160090881594053"}
|
||||
1e5426a9b795b4f02bd6507dc7521561244a00a6a24e1cd57a018b8afd51730f
|
||||
{"isvalid":true,"address":"RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1","scriptPubKey":"76a91422311801b820cf5a169e3614cfc7e61e08cffc1c88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1","randipbits":2736601237,"coin":"KMD","tag":"11382624799425215788"}
|
||||
7684235993f66a032341e2490fab43f9628a64680f186f264ddb33c53eeea8c7
|
||||
{"isvalid":true,"address":"R9ce1xHEaWnRRP5jrWozEfPf9ZJgX7jnxd","scriptPubKey":"76a91403ad8e4339c06506054f30b8fc892d0a5929911388ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"R9ce1xHEaWnRRP5jrWozEfPf9ZJgX7jnxd","randipbits":3539516869,"coin":"KMD","tag":"14036968980545438130"}
|
||||
1df1eec279f85621609f2ebffe5cc8d001c538d7efa96113942ade806938e839
|
||||
{"isvalid":true,"address":"RS1rdGqAhXvwFFTVyUCx695y84E3N3emcU","scriptPubKey":"76a914b793a92aa3faed3b311f6ddfb7643a1ddf25974788ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RS1rdGqAhXvwFFTVyUCx695y84E3N3emcU","randipbits":3496806661,"coin":"KMD","tag":"3577416118331019992"}
|
||||
7d1f8ac6d53d17fced782240fc36b963f526e836701b1d9ce334159574f58731
|
||||
{"isvalid":true,"address":"RLgKsmgdzwNCt8CgqZ5J6cZhTat9HeZgxG","scriptPubKey":"76a9147d0975b37fc7f1a178c8f79f2318f3ac6b0a331388ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RLgKsmgdzwNCt8CgqZ5J6cZhTat9HeZgxG","randipbits":1664639832,"coin":"KMD","tag":"2925847345452408723"}
|
||||
b91b032588384be30fc1ee5dddc1ab6bc270660482faa6f360cbc9519769aeae
|
||||
{"isvalid":true,"address":"RFN4H8YYm71TjCVkHkoVFBFpg31i4ejbiu","scriptPubKey":"76a91442bc52d84a6a4fc475a2d734ce676bf1c9af304788ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RFN4H8YYm71TjCVkHkoVFBFpg31i4ejbiu","randipbits":3310160965,"coin":"KMD","tag":"8812871207750283691"}
|
||||
451f8dd4333bb2274ebeb3f030aa51c3ca3e725a0f034c73d110009bc96cc33b
|
||||
{"isvalid":true,"address":"RUBESyzjgZUts3fD6W7abpgMj4qRFSSszC","scriptPubKey":"76a914cf49df6300a73fc8b97b9f0d48ac4b5ef1a6039d88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RUBESyzjgZUts3fD6W7abpgMj4qRFSSszC","randipbits":3337526720,"coin":"KMD","tag":"3607830388298007708"}
|
||||
e3e90065ca3ab033b284a5c3eb5bd28f9b09e6610a64927bc453c2a3544c5f94
|
||||
{"isvalid":true,"address":"RSNu7Kd9p33aDrgT2AM8buy7fUSQZ2N3Gs","scriptPubKey":"76a914bb8e781d7e1b8d749aba265b06dc119d5faeb96788ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RSNu7Kd9p33aDrgT2AM8buy7fUSQZ2N3Gs","randipbits":2736601237,"coin":"KMD","tag":"9147772191752034854"}
|
||||
5d6f63ec26ebe0ef24bf5347e24ee94abb476209b7e9e85dfff2d23ed5e531c3
|
||||
{"isvalid":true,"address":"RCrCe4dsMzXzzp7GLahubjg73VGK2rnczC","scriptPubKey":"76a9142726929106dcde565083ec6040339ca0bff1c63288ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RCrCe4dsMzXzzp7GLahubjg73VGK2rnczC","randipbits":2358278621,"coin":"KMD","tag":"14533532906797650391"}
|
||||
fc4a55367a6800e58c0672842a13827af143e67745b7313b1bcd274952bac78a
|
||||
{"isvalid":true,"address":"RVTCRzofA2cV6FwGcvn1uGjZJmP5s9G1o9","scriptPubKey":"76a914dd46f8567587f0b56a2c2c686aa5ad73882f8b1b88ac","ismine":false,"iswatchonly":true,"isscript":false,"account":"RVTCRzofA2cV6FwGcvn1uGjZJmP5s9G1o9","randipbits":585288902,"coin":"KMD","tag":"12509011310067902676"}
|
||||
33dddb1215c8deb4889d29f7f9d0b9767e0a467dbd43e8530675c6a56105a2bb
|
||||
|
||||
fix:
|
||||
./komodo-cli sendtoaddress RJZ2DjthdsfCuaGxiE1PNCUGuvARAsMpHn 2848.88502056
|
||||
4f7f03dc44a79078cbf1e103e254eafc6b8856c5be891f6b6f5bbc702edff159
|
||||
|
||||
443
src/KMD.batch1
443
src/KMD.batch1
@@ -1,443 +0,0 @@
|
||||
sleep 999999
|
||||
# RDjc2nYjd2cgcyLyfCxCHNUacTHueLH5W8 KMD 968.31524937
|
||||
./komodo-cli sendtoaddress RDjc2nYjd2cgcyLyfCxCHNUacTHueLH5W8 968.31524937
|
||||
sleep 3
|
||||
echo "968.31524937 <- expected amount RDjc2nYjd2cgcyLyfCxCHNUacTHueLH5W8"
|
||||
|
||||
# RA4nyddYYzEzoUqnpLCvTm8d4nKvqQavs4 KMD 205767.24475092, REVS 4084.38717211
|
||||
# RA4nyddYYzEzoUqnpLCvTm8d4nKvqQavs4 KMD 205767.24475092
|
||||
./komodo-cli sendtoaddress RA4nyddYYzEzoUqnpLCvTm8d4nKvqQavs4 205767.24475092
|
||||
sleep 3
|
||||
echo "205767.24475092 <- expected amount RA4nyddYYzEzoUqnpLCvTm8d4nKvqQavs4"
|
||||
|
||||
# RAS5HArp8SMWVWm91Gwxtyno6Tkw9DBQLb KMD 9683.15249375
|
||||
./komodo-cli sendtoaddress RAS5HArp8SMWVWm91Gwxtyno6Tkw9DBQLb 9683.15249375
|
||||
sleep 3
|
||||
echo "9683.15249375 <- expected amount RAS5HArp8SMWVWm91Gwxtyno6Tkw9DBQLb"
|
||||
|
||||
# RGQ6jMjParVKLYMVLoKTuUAeUDKBbZhHRh KMD 7746.52199500
|
||||
./komodo-cli sendtoaddress RGQ6jMjParVKLYMVLoKTuUAeUDKBbZhHRh 7746.52199500
|
||||
sleep 3
|
||||
echo "7746.52199500 <- expected amount RGQ6jMjParVKLYMVLoKTuUAeUDKBbZhHRh"
|
||||
|
||||
# RFppcFo1bKQzD4zxrxCbicpAvnrqo99hPx KMD 138163.01002402, REVS 2740.59474723
|
||||
# RFppcFo1bKQzD4zxrxCbicpAvnrqo99hPx KMD 138163.01002402
|
||||
./komodo-cli sendtoaddress RFppcFo1bKQzD4zxrxCbicpAvnrqo99hPx 138163.01002402
|
||||
sleep 3
|
||||
echo "138163.01002402 <- expected amount RFppcFo1bKQzD4zxrxCbicpAvnrqo99hPx"
|
||||
|
||||
# RHfHV1LTG5rz3T2HApavCto9973puD93qt KMD 243998.92767004, REVS 4839.53600000
|
||||
# RHfHV1LTG5rz3T2HApavCto9973puD93qt KMD 243998.92767004
|
||||
./komodo-cli sendtoaddress RHfHV1LTG5rz3T2HApavCto9973puD93qt 243998.92767004
|
||||
sleep 3
|
||||
echo "243998.92767004 <- expected amount RHfHV1LTG5rz3T2HApavCto9973puD93qt"
|
||||
|
||||
# RMMR84AiLuuRB5gXESJ2W7q4M9bPdt57Ys KMD 5228902.34662500
|
||||
./komodo-cli sendtoaddress RMMR84AiLuuRB5gXESJ2W7q4M9bPdt57Ys 5228902.34662500
|
||||
sleep 3
|
||||
echo "5228902.34662500 <- expected amount RMMR84AiLuuRB5gXESJ2W7q4M9bPdt57Ys"
|
||||
|
||||
# RCkJC2Vd3A3R7na5vfHaSBUQHA3iKB4veg KMD 82566.66667868
|
||||
./komodo-cli sendtoaddress RCkJC2Vd3A3R7na5vfHaSBUQHA3iKB4veg 82566.66667868
|
||||
sleep 3
|
||||
echo "82566.66667868 <- expected amount RCkJC2Vd3A3R7na5vfHaSBUQHA3iKB4veg"
|
||||
|
||||
# RRjFRzpV5EBrGigciSUn5QHkdWhB7tC6oH KMD 9683.15249375
|
||||
./komodo-cli sendtoaddress RRjFRzpV5EBrGigciSUn5QHkdWhB7tC6oH 9683.15249375
|
||||
sleep 3
|
||||
echo "9683.15249375 <- expected amount RRjFRzpV5EBrGigciSUn5QHkdWhB7tC6oH"
|
||||
|
||||
# RXs3VbEem331Rxg1Jac3hqknTti4UUo5pz KMD 968.31524937
|
||||
./komodo-cli sendtoaddress RXs3VbEem331Rxg1Jac3hqknTti4UUo5pz 968.31524937
|
||||
sleep 3
|
||||
echo "968.31524937 <- expected amount RXs3VbEem331Rxg1Jac3hqknTti4UUo5pz"
|
||||
|
||||
# RPNRr6efhaPYKHzRyemxYowUbNQ6crBtcy KMD 36785.74330117, REVS 730.28056435
|
||||
# RPNRr6efhaPYKHzRyemxYowUbNQ6crBtcy KMD 36785.74330117
|
||||
./komodo-cli sendtoaddress RPNRr6efhaPYKHzRyemxYowUbNQ6crBtcy 36785.74330117
|
||||
sleep 3
|
||||
echo "36785.74330117 <- expected amount RPNRr6efhaPYKHzRyemxYowUbNQ6crBtcy"
|
||||
|
||||
# RTnhkYHVoApyX8Fc2ZEHB2rtW7cLHqZEMB KMD 567760.05597770, REVS 11191.99000000
|
||||
# RTnhkYHVoApyX8Fc2ZEHB2rtW7cLHqZEMB KMD 567760.05597770
|
||||
./komodo-cli sendtoaddress RTnhkYHVoApyX8Fc2ZEHB2rtW7cLHqZEMB 567760.05597770
|
||||
sleep 3
|
||||
echo "567760.05597770 <- expected amount RTnhkYHVoApyX8Fc2ZEHB2rtW7cLHqZEMB"
|
||||
|
||||
# RC22v2GtzyHqdVQFBstrps9SBoDnSuQWot KMD 30287.84201075
|
||||
./komodo-cli sendtoaddress RC22v2GtzyHqdVQFBstrps9SBoDnSuQWot 30287.84201075
|
||||
sleep 3
|
||||
echo "30287.84201075 <- expected amount RC22v2GtzyHqdVQFBstrps9SBoDnSuQWot"
|
||||
|
||||
# RJdKcUM9LazYuw9xsUEQYZRjDCZNi1M9wJ KMD 2202.52763206
|
||||
./komodo-cli sendtoaddress RJdKcUM9LazYuw9xsUEQYZRjDCZNi1M9wJ 2202.52763206
|
||||
sleep 3
|
||||
echo "2202.52763206 <- expected amount RJdKcUM9LazYuw9xsUEQYZRjDCZNi1M9wJ"
|
||||
|
||||
# RLWai9FYvgf88UmGhqBKQfU1HFcviD2yXQ KMD 1403669.78549400
|
||||
./komodo-cli sendtoaddress RLWai9FYvgf88UmGhqBKQfU1HFcviD2yXQ 1403669.78549400
|
||||
sleep 3
|
||||
echo "1403669.78549400 <- expected amount RLWai9FYvgf88UmGhqBKQfU1HFcviD2yXQ"
|
||||
|
||||
# REvmz5CwutJh8pqSr6QtiZjMVmrvDMZsmD KMD 4002.16436294
|
||||
./komodo-cli sendtoaddress REvmz5CwutJh8pqSr6QtiZjMVmrvDMZsmD 4002.16436294
|
||||
sleep 3
|
||||
echo "4002.16436294 <- expected amount REvmz5CwutJh8pqSr6QtiZjMVmrvDMZsmD"
|
||||
|
||||
# REu24h1gWLmijHRnw5JEiQYe395ZRqoP2F KMD 198171.06769187
|
||||
./komodo-cli sendtoaddress REu24h1gWLmijHRnw5JEiQYe395ZRqoP2F 198171.06769187
|
||||
sleep 3
|
||||
echo "198171.06769187 <- expected amount REu24h1gWLmijHRnw5JEiQYe395ZRqoP2F"
|
||||
|
||||
# RShbCikwRgHp6YDNPWQyF8KBY3vEtMmtuP KMD 4824.87172431
|
||||
./komodo-cli sendtoaddress RShbCikwRgHp6YDNPWQyF8KBY3vEtMmtuP 4824.87172431
|
||||
sleep 3
|
||||
echo "4824.87172431 <- expected amount RShbCikwRgHp6YDNPWQyF8KBY3vEtMmtuP"
|
||||
|
||||
# RER2vwRLHFT4HNQLzyqT1PhbeMCitDaY1u KMD 7771.42052436, REVS 0.62700000
|
||||
# RER2vwRLHFT4HNQLzyqT1PhbeMCitDaY1u KMD 7771.42052436
|
||||
./komodo-cli sendtoaddress RER2vwRLHFT4HNQLzyqT1PhbeMCitDaY1u 7771.42052436
|
||||
sleep 3
|
||||
echo "7771.42052436 <- expected amount RER2vwRLHFT4HNQLzyqT1PhbeMCitDaY1u"
|
||||
|
||||
# RM3onNDjZbjypoN8wqo7Rzz3QEv6EiCfwK KMD 18186.86986853, REVS 143.39272495
|
||||
# RM3onNDjZbjypoN8wqo7Rzz3QEv6EiCfwK KMD 18186.86986853
|
||||
./komodo-cli sendtoaddress RM3onNDjZbjypoN8wqo7Rzz3QEv6EiCfwK 18186.86986853
|
||||
sleep 3
|
||||
echo "18186.86986853 <- expected amount RM3onNDjZbjypoN8wqo7Rzz3QEv6EiCfwK"
|
||||
|
||||
# RKJGbG1xxkzwm54gdga9Jhj49G9C8F8KZL KMD 9673.46934125
|
||||
./komodo-cli sendtoaddress RKJGbG1xxkzwm54gdga9Jhj49G9C8F8KZL 9673.46934125
|
||||
sleep 3
|
||||
echo "9673.46934125 <- expected amount RKJGbG1xxkzwm54gdga9Jhj49G9C8F8KZL"
|
||||
|
||||
# RJgMCdrxjg1xeJ1Rmi9CS3R93MS35Tx2sM KMD 601.90475901
|
||||
./komodo-cli sendtoaddress RJgMCdrxjg1xeJ1Rmi9CS3R93MS35Tx2sM 601.90475901
|
||||
sleep 3
|
||||
echo "601.90475901 <- expected amount RJgMCdrxjg1xeJ1Rmi9CS3R93MS35Tx2sM"
|
||||
|
||||
# RSCeyDCcZ3kpJWcwBzmcEyHQ7e9VEtQXY7 KMD 1626.98055674
|
||||
./komodo-cli sendtoaddress RSCeyDCcZ3kpJWcwBzmcEyHQ7e9VEtQXY7 1626.98055674
|
||||
sleep 3
|
||||
echo "1626.98055674 <- expected amount RSCeyDCcZ3kpJWcwBzmcEyHQ7e9VEtQXY7"
|
||||
|
||||
# RGERRfbvuZx2RsVyvUpjtdgBjdKzKMNww7 KMD 12588.09824187
|
||||
./komodo-cli sendtoaddress RGERRfbvuZx2RsVyvUpjtdgBjdKzKMNww7 12588.09824187
|
||||
sleep 3
|
||||
echo "12588.09824187 <- expected amount RGERRfbvuZx2RsVyvUpjtdgBjdKzKMNww7"
|
||||
|
||||
# RJVPgswKQzcWxHB1Woin6QKpPVYRpXVoFn KMD 4919.31879231
|
||||
./komodo-cli sendtoaddress RJVPgswKQzcWxHB1Woin6QKpPVYRpXVoFn 4919.31879231
|
||||
sleep 3
|
||||
echo "4919.31879231 <- expected amount RJVPgswKQzcWxHB1Woin6QKpPVYRpXVoFn"
|
||||
|
||||
# RBSqMV6ihCDzgMjFgm7g5bSxAwtBGseRuE KMD 17428.70617350
|
||||
./komodo-cli sendtoaddress RBSqMV6ihCDzgMjFgm7g5bSxAwtBGseRuE 17428.70617350
|
||||
sleep 3
|
||||
echo "17428.70617350 <- expected amount RBSqMV6ihCDzgMjFgm7g5bSxAwtBGseRuE"
|
||||
|
||||
# RVXTirtRaZkYk1wjAE3mwhdUjTXWKrTnFu KMD 2375.16051963, REVS 47.12337252
|
||||
# RVXTirtRaZkYk1wjAE3mwhdUjTXWKrTnFu KMD 2375.16051963
|
||||
./komodo-cli sendtoaddress RVXTirtRaZkYk1wjAE3mwhdUjTXWKrTnFu 2375.16051963
|
||||
sleep 3
|
||||
echo "2375.16051963 <- expected amount RVXTirtRaZkYk1wjAE3mwhdUjTXWKrTnFu"
|
||||
|
||||
# RGNrH63hZEkcPzCZBnnpyYLDYfKXQqvBk1 KMD 1742.96744887
|
||||
./komodo-cli sendtoaddress RGNrH63hZEkcPzCZBnnpyYLDYfKXQqvBk1 1742.96744887
|
||||
sleep 3
|
||||
echo "1742.96744887 <- expected amount RGNrH63hZEkcPzCZBnnpyYLDYfKXQqvBk1"
|
||||
|
||||
# RJJBtg8XfxMmb6rg6UMWME6zhxM1n8Umta KMD 70173.29001640, REVS 1392.33555151
|
||||
# RJJBtg8XfxMmb6rg6UMWME6zhxM1n8Umta KMD 70173.29001640
|
||||
./komodo-cli sendtoaddress RJJBtg8XfxMmb6rg6UMWME6zhxM1n8Umta 70173.29001640
|
||||
sleep 3
|
||||
echo "70173.29001640 <- expected amount RJJBtg8XfxMmb6rg6UMWME6zhxM1n8Umta"
|
||||
|
||||
# RQNegFE2PWQtC8La69esvn2VGKttTAYpny KMD 4766.21295597
|
||||
./komodo-cli sendtoaddress RQNegFE2PWQtC8La69esvn2VGKttTAYpny 4766.21295597
|
||||
sleep 3
|
||||
echo "4766.21295597 <- expected amount RQNegFE2PWQtC8La69esvn2VGKttTAYpny"
|
||||
|
||||
# RPWiTSrWZyGDmpXfVYcVpmQq56XCh4Hkky KMD 228081.21691774
|
||||
./komodo-cli sendtoaddress RPWiTSrWZyGDmpXfVYcVpmQq56XCh4Hkky 228081.21691774
|
||||
sleep 3
|
||||
echo "228081.21691774 <- expected amount RPWiTSrWZyGDmpXfVYcVpmQq56XCh4Hkky"
|
||||
|
||||
# REbMisMicS8W7LUqBPJwkVfYHxNfSeW7d8 KMD 220390.81840860, REVS 1384.18511377
|
||||
# REbMisMicS8W7LUqBPJwkVfYHxNfSeW7d8 KMD 220390.81840860
|
||||
./komodo-cli sendtoaddress REbMisMicS8W7LUqBPJwkVfYHxNfSeW7d8 220390.81840860
|
||||
sleep 3
|
||||
echo "220390.81840860 <- expected amount REbMisMicS8W7LUqBPJwkVfYHxNfSeW7d8"
|
||||
|
||||
# RLBg1V9MCKeQjjFd2d6WKxon1hVTS4si73 KMD 3505.92510761
|
||||
./komodo-cli sendtoaddress RLBg1V9MCKeQjjFd2d6WKxon1hVTS4si73 3505.92510761
|
||||
sleep 3
|
||||
echo "3505.92510761 <- expected amount RLBg1V9MCKeQjjFd2d6WKxon1hVTS4si73"
|
||||
|
||||
# RQNmvhca3LfPV8mGf7GKKCMoM1PPMojxmz KMD 15844.60160895
|
||||
./komodo-cli sendtoaddress RQNmvhca3LfPV8mGf7GKKCMoM1PPMojxmz 15844.60160895
|
||||
sleep 3
|
||||
echo "15844.60160895 <- expected amount RQNmvhca3LfPV8mGf7GKKCMoM1PPMojxmz"
|
||||
|
||||
# RRDmaG64XZjdERzojAQ3DwHewBZbXfqpcJ KMD 479029.87110523, REVS 9502.00000000
|
||||
# RRDmaG64XZjdERzojAQ3DwHewBZbXfqpcJ KMD 479029.87110523
|
||||
./komodo-cli sendtoaddress RRDmaG64XZjdERzojAQ3DwHewBZbXfqpcJ 479029.87110523
|
||||
sleep 3
|
||||
echo "479029.87110523 <- expected amount RRDmaG64XZjdERzojAQ3DwHewBZbXfqpcJ"
|
||||
|
||||
# RTBeZc5Biq3BY1hB1dXi6XTaH8j6FsyGuz KMD 230594.13977661, REVS 8.48502608
|
||||
# RTBeZc5Biq3BY1hB1dXi6XTaH8j6FsyGuz KMD 230594.13977661
|
||||
./komodo-cli sendtoaddress RTBeZc5Biq3BY1hB1dXi6XTaH8j6FsyGuz 230594.13977661
|
||||
sleep 3
|
||||
echo "230594.13977661 <- expected amount RTBeZc5Biq3BY1hB1dXi6XTaH8j6FsyGuz"
|
||||
|
||||
# RC1S2CERDJR8BmvF3GZ4sbPviC5JrDYNKe KMD 36914.86263802
|
||||
./komodo-cli sendtoaddress RC1S2CERDJR8BmvF3GZ4sbPviC5JrDYNKe 36914.86263802
|
||||
sleep 3
|
||||
echo "36914.86263802 <- expected amount RC1S2CERDJR8BmvF3GZ4sbPviC5JrDYNKe"
|
||||
|
||||
# RNy3NHtaKZ11xRqEU4YWWbrcdzjCgDBTuV KMD 528.33837397
|
||||
./komodo-cli sendtoaddress RNy3NHtaKZ11xRqEU4YWWbrcdzjCgDBTuV 528.33837397
|
||||
sleep 3
|
||||
echo "528.33837397 <- expected amount RNy3NHtaKZ11xRqEU4YWWbrcdzjCgDBTuV"
|
||||
|
||||
# RXUEryMpxikDCdUT7LyCT3dq6bf4PPRibX KMD 19366.30498750
|
||||
./komodo-cli sendtoaddress RXUEryMpxikDCdUT7LyCT3dq6bf4PPRibX 19366.30498750
|
||||
sleep 3
|
||||
echo "19366.30498750 <- expected amount RXUEryMpxikDCdUT7LyCT3dq6bf4PPRibX"
|
||||
|
||||
# RVoY1wTJug2VWeEG7C35iPseW2CtgZduRN KMD 13921.94668799
|
||||
./komodo-cli sendtoaddress RVoY1wTJug2VWeEG7C35iPseW2CtgZduRN 13921.94668799
|
||||
sleep 3
|
||||
echo "13921.94668799 <- expected amount RVoY1wTJug2VWeEG7C35iPseW2CtgZduRN"
|
||||
|
||||
# RUJRcSoNU1y8WM7xq7X4JAwBMEqovak4Rb KMD 3873.26099750
|
||||
./komodo-cli sendtoaddress RUJRcSoNU1y8WM7xq7X4JAwBMEqovak4Rb 3873.26099750
|
||||
sleep 3
|
||||
echo "3873.26099750 <- expected amount RUJRcSoNU1y8WM7xq7X4JAwBMEqovak4Rb"
|
||||
|
||||
# RAp5JCZiuapAgcbxgLnvbYKZcLq66LWRRk KMD 28437.73050782
|
||||
./komodo-cli sendtoaddress RAp5JCZiuapAgcbxgLnvbYKZcLq66LWRRk 28437.73050782
|
||||
sleep 3
|
||||
echo "28437.73050782 <- expected amount RAp5JCZiuapAgcbxgLnvbYKZcLq66LWRRk"
|
||||
|
||||
# RQantoJxT8szwfAqUM3enLPe85YiQtwndH KMD 4163.75557231
|
||||
./komodo-cli sendtoaddress RQantoJxT8szwfAqUM3enLPe85YiQtwndH 4163.75557231
|
||||
sleep 3
|
||||
echo "4163.75557231 <- expected amount RQantoJxT8szwfAqUM3enLPe85YiQtwndH"
|
||||
|
||||
# RQ7ZvdGNyxKJsn9WKcPbc72R91gs7WooGY KMD 4483.69874171
|
||||
./komodo-cli sendtoaddress RQ7ZvdGNyxKJsn9WKcPbc72R91gs7WooGY 4483.69874171
|
||||
sleep 3
|
||||
echo "4483.69874171 <- expected amount RQ7ZvdGNyxKJsn9WKcPbc72R91gs7WooGY"
|
||||
|
||||
# RWEzWEk5KSa2yBUCdHnoZ4RXS1VReq6omp KMD 56079.05303659
|
||||
./komodo-cli sendtoaddress RWEzWEk5KSa2yBUCdHnoZ4RXS1VReq6omp 56079.05303659
|
||||
sleep 3
|
||||
echo "56079.05303659 <- expected amount RWEzWEk5KSa2yBUCdHnoZ4RXS1VReq6omp"
|
||||
|
||||
# RP8AvHsUhZkbDdcfHFrRsZZn2QVNcBMPNQ KMD 8540.87460698
|
||||
./komodo-cli sendtoaddress RP8AvHsUhZkbDdcfHFrRsZZn2QVNcBMPNQ 8540.87460698
|
||||
sleep 3
|
||||
echo "8540.87460698 <- expected amount RP8AvHsUhZkbDdcfHFrRsZZn2QVNcBMPNQ"
|
||||
|
||||
# RLJkv3utC9vbsZDC12JtWPeY8Sp8dCAwZK KMD 1450.14891746
|
||||
./komodo-cli sendtoaddress RLJkv3utC9vbsZDC12JtWPeY8Sp8dCAwZK 1450.14891746
|
||||
sleep 3
|
||||
echo "1450.14891746 <- expected amount RLJkv3utC9vbsZDC12JtWPeY8Sp8dCAwZK"
|
||||
|
||||
# RGZcCA8BT3m9vDSXmhyQQijGLw9HCsSdBy KMD 2949.36469257
|
||||
./komodo-cli sendtoaddress RGZcCA8BT3m9vDSXmhyQQijGLw9HCsSdBy 2949.36469257
|
||||
sleep 3
|
||||
echo "2949.36469257 <- expected amount RGZcCA8BT3m9vDSXmhyQQijGLw9HCsSdBy"
|
||||
|
||||
# RGbLr8CsszoGATo6uy7fZJ5GJPuXYbA6sv KMD 25505.74161232, REVS 506.00000000
|
||||
# RGbLr8CsszoGATo6uy7fZJ5GJPuXYbA6sv KMD 25505.74161232
|
||||
./komodo-cli sendtoaddress RGbLr8CsszoGATo6uy7fZJ5GJPuXYbA6sv 25505.74161232
|
||||
sleep 3
|
||||
echo "25505.74161232 <- expected amount RGbLr8CsszoGATo6uy7fZJ5GJPuXYbA6sv"
|
||||
|
||||
# RYE329fWaVUaVg55DU4hiB4P2rfr4w3K2Y KMD 51.15844888
|
||||
./komodo-cli sendtoaddress RYE329fWaVUaVg55DU4hiB4P2rfr4w3K2Y 51.15844888
|
||||
sleep 3
|
||||
echo "51.15844888 <- expected amount RYE329fWaVUaVg55DU4hiB4P2rfr4w3K2Y"
|
||||
|
||||
# RP7HdvokCK1yJmpVCY49q4LXsVe3qhnEU5 KMD 4516.65527532, REVS 31.96541397
|
||||
# RP7HdvokCK1yJmpVCY49q4LXsVe3qhnEU5 KMD 4516.65527532
|
||||
./komodo-cli sendtoaddress RP7HdvokCK1yJmpVCY49q4LXsVe3qhnEU5 4516.65527532
|
||||
sleep 3
|
||||
echo "4516.65527532 <- expected amount RP7HdvokCK1yJmpVCY49q4LXsVe3qhnEU5"
|
||||
|
||||
# RTJFUrfou8DU63uyGqH7ULgiCHHPZLkDT5 KMD 288282.30230152
|
||||
./komodo-cli sendtoaddress RTJFUrfou8DU63uyGqH7ULgiCHHPZLkDT5 288282.30230152
|
||||
sleep 3
|
||||
echo "288282.30230152 <- expected amount RTJFUrfou8DU63uyGqH7ULgiCHHPZLkDT5"
|
||||
|
||||
# RU1usSdDYTL7yN34EayPxJurQ7UMxDvTkF KMD 2218.92003493
|
||||
./komodo-cli sendtoaddress RU1usSdDYTL7yN34EayPxJurQ7UMxDvTkF 2218.92003493
|
||||
sleep 3
|
||||
echo "2218.92003493 <- expected amount RU1usSdDYTL7yN34EayPxJurQ7UMxDvTkF"
|
||||
|
||||
# RQFicXTYo7QzKhFbo3ELuBfo3eyYiUv6o6 KMD 30244.47828467
|
||||
./komodo-cli sendtoaddress RQFicXTYo7QzKhFbo3ELuBfo3eyYiUv6o6 30244.47828467
|
||||
sleep 3
|
||||
echo "30244.47828467 <- expected amount RQFicXTYo7QzKhFbo3ELuBfo3eyYiUv6o6"
|
||||
|
||||
# RF2LDXirQQ5afPGVM7W7o3ZQhgGbhSeH8W KMD 781.43040624
|
||||
./komodo-cli sendtoaddress RF2LDXirQQ5afPGVM7W7o3ZQhgGbhSeH8W 781.43040624
|
||||
sleep 3
|
||||
echo "781.43040624 <- expected amount RF2LDXirQQ5afPGVM7W7o3ZQhgGbhSeH8W"
|
||||
|
||||
# RMvpp3QwvYch8hFCjZNXvXkzoFWEw9R5QH KMD 35011.78668474, REVS 310.59835083
|
||||
# RMvpp3QwvYch8hFCjZNXvXkzoFWEw9R5QH KMD 35011.78668474
|
||||
./komodo-cli sendtoaddress RMvpp3QwvYch8hFCjZNXvXkzoFWEw9R5QH 35011.78668474
|
||||
sleep 3
|
||||
echo "35011.78668474 <- expected amount RMvpp3QwvYch8hFCjZNXvXkzoFWEw9R5QH"
|
||||
|
||||
# RH4u1f9PndVVYHkpxdMV28HwbdKphPiX6o KMD 20332.68360637
|
||||
./komodo-cli sendtoaddress RH4u1f9PndVVYHkpxdMV28HwbdKphPiX6o 20332.68360637
|
||||
sleep 3
|
||||
echo "20332.68360637 <- expected amount RH4u1f9PndVVYHkpxdMV28HwbdKphPiX6o"
|
||||
|
||||
# RWszpjqDXG6ifFzTJN2qaqSfZ4nJ8FX3Cp KMD 4942.25856789
|
||||
./komodo-cli sendtoaddress RWszpjqDXG6ifFzTJN2qaqSfZ4nJ8FX3Cp 4942.25856789
|
||||
sleep 3
|
||||
echo "4942.25856789 <- expected amount RWszpjqDXG6ifFzTJN2qaqSfZ4nJ8FX3Cp"
|
||||
|
||||
# R9whNiPsV9NHvyPqg6ranxDFvsM8HsDtks KMD 201.26853079, REVS 3.99180609
|
||||
# R9whNiPsV9NHvyPqg6ranxDFvsM8HsDtks KMD 201.26853079
|
||||
./komodo-cli sendtoaddress R9whNiPsV9NHvyPqg6ranxDFvsM8HsDtks 201.26853079
|
||||
sleep 3
|
||||
echo "201.26853079 <- expected amount R9whNiPsV9NHvyPqg6ranxDFvsM8HsDtks"
|
||||
|
||||
# RFfJkcC1fnFZB2G2MUPYdNEeRrZk6njPig KMD 663.13491046, REVS 13.16292943
|
||||
# RFfJkcC1fnFZB2G2MUPYdNEeRrZk6njPig KMD 663.13491046
|
||||
./komodo-cli sendtoaddress RFfJkcC1fnFZB2G2MUPYdNEeRrZk6njPig 663.13491046
|
||||
sleep 3
|
||||
echo "663.13491046 <- expected amount RFfJkcC1fnFZB2G2MUPYdNEeRrZk6njPig"
|
||||
|
||||
# RV49vYgGa9kdzTQ5hq5ra88DkX4wwVdzmK KMD 29548.60287586, REVS 586.04438779
|
||||
# RV49vYgGa9kdzTQ5hq5ra88DkX4wwVdzmK KMD 29548.60287586
|
||||
./komodo-cli sendtoaddress RV49vYgGa9kdzTQ5hq5ra88DkX4wwVdzmK 29548.60287586
|
||||
sleep 3
|
||||
echo "29548.60287586 <- expected amount RV49vYgGa9kdzTQ5hq5ra88DkX4wwVdzmK"
|
||||
|
||||
# RMYqPrPpgosrjcoS34WmBtG9KDRmE7WcXK KMD 100186.19238242, REVS 1944.84440292
|
||||
# RMYqPrPpgosrjcoS34WmBtG9KDRmE7WcXK KMD 100186.19238242
|
||||
./komodo-cli sendtoaddress RMYqPrPpgosrjcoS34WmBtG9KDRmE7WcXK 100186.19238242
|
||||
sleep 3
|
||||
echo "100186.19238242 <- expected amount RMYqPrPpgosrjcoS34WmBtG9KDRmE7WcXK"
|
||||
|
||||
# RH1Ug5jz6S5DbJyLENhMthMEAoSBbkXRMq KMD 1853646.03638691, REVS 415.68775429
|
||||
# RH1Ug5jz6S5DbJyLENhMthMEAoSBbkXRMq KMD 1853646.03638691
|
||||
./komodo-cli sendtoaddress RH1Ug5jz6S5DbJyLENhMthMEAoSBbkXRMq 1853646.03638691
|
||||
sleep 3
|
||||
echo "1853646.03638691 <- expected amount RH1Ug5jz6S5DbJyLENhMthMEAoSBbkXRMq"
|
||||
|
||||
# RDQH9gVbS9Yza5fd7T4GSASzdTuwiP3Sgm KMD 56782.00622335
|
||||
./komodo-cli sendtoaddress RDQH9gVbS9Yza5fd7T4GSASzdTuwiP3Sgm 56782.00622335
|
||||
sleep 3
|
||||
echo "56782.00622335 <- expected amount RDQH9gVbS9Yza5fd7T4GSASzdTuwiP3Sgm"
|
||||
|
||||
# RFREgr9p32GanT4YcM25hMcPYkvRLDNkja KMD 151544.96672946, REVS 3005.62695376
|
||||
# RFREgr9p32GanT4YcM25hMcPYkvRLDNkja KMD 151544.96672946
|
||||
./komodo-cli sendtoaddress RFREgr9p32GanT4YcM25hMcPYkvRLDNkja 151544.96672946
|
||||
sleep 3
|
||||
echo "151544.96672946 <- expected amount RFREgr9p32GanT4YcM25hMcPYkvRLDNkja"
|
||||
|
||||
# RHQggZrkWW9HV8d7o2dvb9mgN1z6tGDJRh KMD 48415.76246875
|
||||
./komodo-cli sendtoaddress RHQggZrkWW9HV8d7o2dvb9mgN1z6tGDJRh 48415.76246875
|
||||
sleep 3
|
||||
echo "48415.76246875 <- expected amount RHQggZrkWW9HV8d7o2dvb9mgN1z6tGDJRh"
|
||||
|
||||
# RFjddDTCuobaHatQtd7kTiSjYv94Mp9Cu4 KMD 295382.69930466, REVS 5860.00000000
|
||||
# RFjddDTCuobaHatQtd7kTiSjYv94Mp9Cu4 KMD 295382.69930466
|
||||
./komodo-cli sendtoaddress RFjddDTCuobaHatQtd7kTiSjYv94Mp9Cu4 295382.69930466
|
||||
sleep 3
|
||||
echo "295382.69930466 <- expected amount RFjddDTCuobaHatQtd7kTiSjYv94Mp9Cu4"
|
||||
|
||||
# RKyMDKFNC79FhCfnFr58JE1ibpADa2WScE KMD 64965.94673778
|
||||
./komodo-cli sendtoaddress RKyMDKFNC79FhCfnFr58JE1ibpADa2WScE 64965.94673778
|
||||
sleep 3
|
||||
echo "64965.94673778 <- expected amount RKyMDKFNC79FhCfnFr58JE1ibpADa2WScE"
|
||||
|
||||
# RHoPZSxWRgeQp7nB3eTn4dyDpmBRoZPoKv KMD 9683.15249375
|
||||
./komodo-cli sendtoaddress RHoPZSxWRgeQp7nB3eTn4dyDpmBRoZPoKv 9683.15249375
|
||||
sleep 3
|
||||
echo "9683.15249375 <- expected amount RHoPZSxWRgeQp7nB3eTn4dyDpmBRoZPoKv"
|
||||
|
||||
# RGiA2sP25BqtW9qfJ3vRUAPH8zbgepwriY KMD 2414.30320001
|
||||
./komodo-cli sendtoaddress RGiA2sP25BqtW9qfJ3vRUAPH8zbgepwriY 2414.30320001
|
||||
sleep 3
|
||||
echo "2414.30320001 <- expected amount RGiA2sP25BqtW9qfJ3vRUAPH8zbgepwriY"
|
||||
|
||||
# RTHtdb735hqJi5DJjXNiP2LREkqUL5b8Sx KMD 19375.01982474
|
||||
./komodo-cli sendtoaddress RTHtdb735hqJi5DJjXNiP2LREkqUL5b8Sx 19375.01982474
|
||||
sleep 3
|
||||
echo "19375.01982474 <- expected amount RTHtdb735hqJi5DJjXNiP2LREkqUL5b8Sx"
|
||||
|
||||
# RHZR3YhrgxaYASvNUrcVdoonXCfgrdGULz KMD 1589788.37880130
|
||||
./komodo-cli sendtoaddress RHZR3YhrgxaYASvNUrcVdoonXCfgrdGULz 1589788.37880130
|
||||
sleep 3
|
||||
echo "1589788.37880130 <- expected amount RHZR3YhrgxaYASvNUrcVdoonXCfgrdGULz"
|
||||
|
||||
# RCaxwG9VfLVvxMVvc5q7SQxRSuwR9amxoy KMD 4458.42312105
|
||||
./komodo-cli sendtoaddress RCaxwG9VfLVvxMVvc5q7SQxRSuwR9amxoy 4458.42312105
|
||||
sleep 3
|
||||
echo "4458.42312105 <- expected amount RCaxwG9VfLVvxMVvc5q7SQxRSuwR9amxoy"
|
||||
|
||||
# RAyEy5vxNeAAeRw57BrsN5Kh4zu8i3KYEf KMD 21120.82823309
|
||||
./komodo-cli sendtoaddress RAyEy5vxNeAAeRw57BrsN5Kh4zu8i3KYEf 21120.82823309
|
||||
sleep 3
|
||||
echo "21120.82823309 <- expected amount RAyEy5vxNeAAeRw57BrsN5Kh4zu8i3KYEf"
|
||||
|
||||
# RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47 KMD 6566.15472364
|
||||
./komodo-cli sendtoaddress RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47 6566.15472364
|
||||
sleep 3
|
||||
echo "6566.15472364 <- expected amount RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47"
|
||||
|
||||
# RVNWkGzsFG1ZhzKBzzUj7UPzHMu8s1JWfT KMD 59621.32507756, REVS 606.36817953
|
||||
# RVNWkGzsFG1ZhzKBzzUj7UPzHMu8s1JWfT KMD 59621.32507756
|
||||
./komodo-cli sendtoaddress RVNWkGzsFG1ZhzKBzzUj7UPzHMu8s1JWfT 59621.32507756
|
||||
sleep 3
|
||||
echo "59621.32507756 <- expected amount RVNWkGzsFG1ZhzKBzzUj7UPzHMu8s1JWfT"
|
||||
|
||||
# RGwu8hcD19TKuqzPbjdnzKmkMsUUrdsw5p KMD 23159.75532541, REVS 459.58469952
|
||||
# RGwu8hcD19TKuqzPbjdnzKmkMsUUrdsw5p KMD 23159.75532541
|
||||
./komodo-cli sendtoaddress RGwu8hcD19TKuqzPbjdnzKmkMsUUrdsw5p 23159.75532541
|
||||
sleep 3
|
||||
echo "23159.75532541 <- expected amount RGwu8hcD19TKuqzPbjdnzKmkMsUUrdsw5p"
|
||||
|
||||
# RG7jKgxwFPKNPy4MFxXaBr7TRDEzR2sSkV KMD 9683.15249375
|
||||
./komodo-cli sendtoaddress RG7jKgxwFPKNPy4MFxXaBr7TRDEzR2sSkV 9683.15249375
|
||||
sleep 3
|
||||
echo "9683.15249375 <- expected amount RG7jKgxwFPKNPy4MFxXaBr7TRDEzR2sSkV"
|
||||
|
||||
# RQft1wNt3sgntZDRbpz2WzHDy4F2TRamhB KMD 1504.76189752
|
||||
./komodo-cli sendtoaddress RQft1wNt3sgntZDRbpz2WzHDy4F2TRamhB 1504.76189752
|
||||
sleep 3
|
||||
echo "1504.76189752 <- expected amount RQft1wNt3sgntZDRbpz2WzHDy4F2TRamhB"
|
||||
|
||||
# RRergGKQPDcYHU8PxKhpx6kmR7mXdqp8Ce KMD 1452.47287406
|
||||
./komodo-cli sendtoaddress RRergGKQPDcYHU8PxKhpx6kmR7mXdqp8Ce 1452.47287406
|
||||
sleep 3
|
||||
echo "1452.47287406 <- expected amount RRergGKQPDcYHU8PxKhpx6kmR7mXdqp8Ce"
|
||||
|
||||
# RDPo9tEaM9Ds5UePeQS1pAFqXzD1ZVvS1n KMD 7746.52199500
|
||||
./komodo-cli sendtoaddress RDPo9tEaM9Ds5UePeQS1pAFqXzD1ZVvS1n 7746.52199500
|
||||
sleep 3
|
||||
echo "7746.52199500 <- expected amount RDPo9tEaM9Ds5UePeQS1pAFqXzD1ZVvS1n"
|
||||
|
||||
# RMwP7F2QRMprthjNwT7gHWjHvvqtefwRsJ KMD 77304.58455563, REVS 1533.20000000
|
||||
# RMwP7F2QRMprthjNwT7gHWjHvvqtefwRsJ KMD 77304.58455563
|
||||
./komodo-cli sendtoaddress RMwP7F2QRMprthjNwT7gHWjHvvqtefwRsJ 77304.58455563
|
||||
sleep 3
|
||||
echo "77304.58455563 <- expected amount RMwP7F2QRMprthjNwT7gHWjHvvqtefwRsJ"
|
||||
|
||||
# RNpa2spCJutTMYHgsr6MwM6X2pmRfYd6LT KMD 894.72329042
|
||||
./komodo-cli sendtoaddress RNpa2spCJutTMYHgsr6MwM6X2pmRfYd6LT 894.72329042
|
||||
sleep 3
|
||||
echo "894.72329042 <- expected amount RNpa2spCJutTMYHgsr6MwM6X2pmRfYd6LT"
|
||||
|
||||
|
||||
# total KMD 14534159.61298856 REVS 0.00000000
|
||||
@@ -1,166 +0,0 @@
|
||||
325fc4797d28b57f477f7ea172972683a6ea2cdb5c5c238725f78856ef2e3a28
|
||||
968.31524937 <- expected amount RDjc2nYjd2cgcyLyfCxCHNUacTHueLH5W8
|
||||
509a075ecde88ca0fc5834cb0057d837eedc488870635f6461d7f5e60e5e49ce
|
||||
205767.24475092 <- expected amount RA4nyddYYzEzoUqnpLCvTm8d4nKvqQavs4
|
||||
dbc1cca89049d06a5ac6de9922b1db01f3cda9c1b580c54400b0443ea06a84bb
|
||||
9683.15249375 <- expected amount RAS5HArp8SMWVWm91Gwxtyno6Tkw9DBQLb
|
||||
6260fbc0a0ddfd88b9f4603713c23dfb1d14a6dac586377268a893dc60d53252
|
||||
7746.52199500 <- expected amount RGQ6jMjParVKLYMVLoKTuUAeUDKBbZhHRh
|
||||
34e61e89fc491a24291d4471d93d3b72b2ea790e4e18df941d9744273413f0de
|
||||
138163.01002402 <- expected amount RFppcFo1bKQzD4zxrxCbicpAvnrqo99hPx
|
||||
79873fe0e2e52f9e55601baf68b4770bcfcd2c9caf4e5015bdbb231a7089793f
|
||||
243998.92767004 <- expected amount RHfHV1LTG5rz3T2HApavCto9973puD93qt
|
||||
78d8efb10877c2293d5f2ed6fd3b7ff2da4f599ab63de25043e9211ddb669c13
|
||||
5228902.34662500 <- expected amount RMMR84AiLuuRB5gXESJ2W7q4M9bPdt57Ys
|
||||
d1a8b7cc8782480f8c2633561193a79eaa0e31b0e12173a593cd0f52c29111f0
|
||||
82566.66667868 <- expected amount RCkJC2Vd3A3R7na5vfHaSBUQHA3iKB4veg
|
||||
ce4e52efc6b973b073dd7246b881cd81fc2ad5927ee17f62a50b91b460fcaf46
|
||||
9683.15249375 <- expected amount RRjFRzpV5EBrGigciSUn5QHkdWhB7tC6oH
|
||||
2af36c684878c208f477f4cb54a5ca05db84848a6aa5027386e997446fcf39b0
|
||||
968.31524937 <- expected amount RXs3VbEem331Rxg1Jac3hqknTti4UUo5pz
|
||||
da64a366b0c2ee633390cd86d85a97eceda39e62c38d08ac4f48b1b15f43f396
|
||||
36785.74330117 <- expected amount RPNRr6efhaPYKHzRyemxYowUbNQ6crBtcy
|
||||
c485e9ec07fefcdb01b98c7253ba7cae9cf44a6069f9c05a44f7910df96e8048
|
||||
567760.05597770 <- expected amount RTnhkYHVoApyX8Fc2ZEHB2rtW7cLHqZEMB
|
||||
acd9dc7b2700e505e28f36ac6739c6a9aa50c77c1fad4c95581584431f89679c
|
||||
30287.84201075 <- expected amount RC22v2GtzyHqdVQFBstrps9SBoDnSuQWot
|
||||
51560f60cda3aa1ac1b887cea074a344f69f716e5d7777115976ef1538fad3fd
|
||||
2202.52763206 <- expected amount RJdKcUM9LazYuw9xsUEQYZRjDCZNi1M9wJ
|
||||
e0d4e99d2275cacf95be661ab6bd98935b547f59775281b085f5b26fe09cf18c
|
||||
1403669.78549400 <- expected amount RLWai9FYvgf88UmGhqBKQfU1HFcviD2yXQ
|
||||
6b5c4ed565ec56ff7cd8301e3051e96fc8f26186f64f93f12a65bde73f16d92d
|
||||
4002.16436294 <- expected amount REvmz5CwutJh8pqSr6QtiZjMVmrvDMZsmD
|
||||
ed8b998240bc13ff35dad3a7a8f96fbdc04ff8388e96d6f618ac4e66a29d1c53
|
||||
198171.06769187 <- expected amount REu24h1gWLmijHRnw5JEiQYe395ZRqoP2F
|
||||
b7cf02901629acce9eb84c2b83839b4f575d3d8710fabb2d5e43f92308abaa6a
|
||||
4824.87172431 <- expected amount RShbCikwRgHp6YDNPWQyF8KBY3vEtMmtuP
|
||||
c0ee42c0a0a32ec75283b3899958d5d3d5d59202642933806e1dfc0dfc47b48e
|
||||
7771.42052436 <- expected amount RER2vwRLHFT4HNQLzyqT1PhbeMCitDaY1u
|
||||
f0fa139e16b9a32af25d20daf6efef8b703a0b48ca12afd3743cb29e35955801
|
||||
18186.86986853 <- expected amount RM3onNDjZbjypoN8wqo7Rzz3QEv6EiCfwK
|
||||
e080c71757f1bd918615cc7439c92db81a83da2dea904938463bb8b224679508
|
||||
9673.46934125 <- expected amount RKJGbG1xxkzwm54gdga9Jhj49G9C8F8KZL
|
||||
2e343fd3e06b3a5081db25f8e549836feb850a10561dfb4d0ea19a7302238fa4
|
||||
601.90475901 <- expected amount RJgMCdrxjg1xeJ1Rmi9CS3R93MS35Tx2sM
|
||||
b416a052a3ef694be7ef72d14846e2509199464ecb0b96087f484829c41bd30b
|
||||
1626.98055674 <- expected amount RSCeyDCcZ3kpJWcwBzmcEyHQ7e9VEtQXY7
|
||||
8203d78d210e5a1b54443be48232658fe4b9f59819b1272cb5f9534866ce49af
|
||||
12588.09824187 <- expected amount RGERRfbvuZx2RsVyvUpjtdgBjdKzKMNww7
|
||||
f52b579986b45625a33d56d5daa857918764dc17d71f5aff8e80c268d0572eea
|
||||
4919.31879231 <- expected amount RJVPgswKQzcWxHB1Woin6QKpPVYRpXVoFn
|
||||
ab386ce9a2cf983996d7146669dedd5d55a297998935707b6c0f5b7dea1bac05
|
||||
17428.70617350 <- expected amount RBSqMV6ihCDzgMjFgm7g5bSxAwtBGseRuE
|
||||
78dacea10a1c616d6adafbf38e09c6814fc93b38509609823903c1a58de1aa27
|
||||
2375.16051963 <- expected amount RVXTirtRaZkYk1wjAE3mwhdUjTXWKrTnFu
|
||||
30775d94acdeb3463d16989d110c0aa690e009839e28a2a7087c3b828adec933
|
||||
1742.96744887 <- expected amount RGNrH63hZEkcPzCZBnnpyYLDYfKXQqvBk1
|
||||
8ad511c7ad95ea7b8f866ae388ea49f16ebcb2131477135dd1a9ede4459e1381
|
||||
70173.29001640 <- expected amount RJJBtg8XfxMmb6rg6UMWME6zhxM1n8Umta
|
||||
45c359d398c92be3f6304db62f3247a03a8d2231583161a440ab88fc9653a90f
|
||||
4766.21295597 <- expected amount RQNegFE2PWQtC8La69esvn2VGKttTAYpny
|
||||
ee0dda87563392f4e999f67765506cbdd4896b281f0c7628c1f150972f2bc6e4
|
||||
228081.21691774 <- expected amount RPWiTSrWZyGDmpXfVYcVpmQq56XCh4Hkky
|
||||
428f2447ae5f52492451e906837f9281ab0bfe5b0c5eba19ec8c85b3aab70fe1
|
||||
220390.81840860 <- expected amount REbMisMicS8W7LUqBPJwkVfYHxNfSeW7d8
|
||||
0edcf59104c3ebcb7a013ab84810f3b90eee025fda6fa3adb1c3931891ffb746
|
||||
3505.92510761 <- expected amount RLBg1V9MCKeQjjFd2d6WKxon1hVTS4si73
|
||||
8c33e6e5649e1d741561ca8bccb544076981915e73aa0324de90f9eae6ceec3c
|
||||
15844.60160895 <- expected amount RQNmvhca3LfPV8mGf7GKKCMoM1PPMojxmz
|
||||
46e957ee13d83fc2e1fcc9b1509b3cce1a97853879527cc23105fd1e1041a9e6
|
||||
479029.87110523 <- expected amount RRDmaG64XZjdERzojAQ3DwHewBZbXfqpcJ
|
||||
ec1fe34569606f2fff172643d2cc7ff3ccabbc423a69641b689c1bbaaace7f4b
|
||||
230594.13977661 <- expected amount RTBeZc5Biq3BY1hB1dXi6XTaH8j6FsyGuz
|
||||
ec3c0b89027f557d7bce9c7646ea16b4c30eff4e9939543492820f4040c4313e
|
||||
36914.86263802 <- expected amount RC1S2CERDJR8BmvF3GZ4sbPviC5JrDYNKe
|
||||
d1ab50f8afeb1e11eb1133fc9c20273cb2f4ef8eec971bdfa56f2d4349bf33c7
|
||||
528.33837397 <- expected amount RNy3NHtaKZ11xRqEU4YWWbrcdzjCgDBTuV
|
||||
683591f99a2ed1d511613fe21496e84f15e86efc9365cb84a80847c2f80b0910
|
||||
19366.30498750 <- expected amount RXUEryMpxikDCdUT7LyCT3dq6bf4PPRibX
|
||||
fd143bd2d9b5e4ff8747de2cf3951f0f52be6026df26478e5331618c7f3c97af
|
||||
13921.94668799 <- expected amount RVoY1wTJug2VWeEG7C35iPseW2CtgZduRN
|
||||
540e9c776c6c4dedd5def92a522a6b4c778550af2686866ad4b1287d8aebbb37
|
||||
3873.26099750 <- expected amount RUJRcSoNU1y8WM7xq7X4JAwBMEqovak4Rb
|
||||
bcea48b56a6ad36af29f7c87fd7a14edd662ddbbc52f9c97371d16dcca29c7da
|
||||
28437.73050782 <- expected amount RAp5JCZiuapAgcbxgLnvbYKZcLq66LWRRk
|
||||
ded071de735644f210758726f68b4c6150bb4523f5653b7199a15eb7ab3a435b
|
||||
4163.75557231 <- expected amount RQantoJxT8szwfAqUM3enLPe85YiQtwndH
|
||||
b87f15a0f1c9ffb89e0535b1469ebda7cfe3dc83ad88891741e7837d60055253
|
||||
4483.69874171 <- expected amount RQ7ZvdGNyxKJsn9WKcPbc72R91gs7WooGY
|
||||
788aa4fe73d8192633d1a461075735090a198c5d12bea35936cd7513c0d3fa95
|
||||
56079.05303659 <- expected amount RWEzWEk5KSa2yBUCdHnoZ4RXS1VReq6omp
|
||||
8364a25a0d458dc05941e66e9eb09170a267ec1a1df63eefdfdb80d9d4a81232
|
||||
8540.87460698 <- expected amount RP8AvHsUhZkbDdcfHFrRsZZn2QVNcBMPNQ
|
||||
c3e58a0d1c39010a922e4017fd221c4893b10772a3f447736ce722b1e8ea6993
|
||||
1450.14891746 <- expected amount RLJkv3utC9vbsZDC12JtWPeY8Sp8dCAwZK
|
||||
a2bf31cefbc81290aecf3ff06a505d9f14605e7576a4d36d59820fb7b030e36b
|
||||
2949.36469257 <- expected amount RGZcCA8BT3m9vDSXmhyQQijGLw9HCsSdBy
|
||||
af648086e1d651d1d26456c4da519622ade8cbdccd6af9b0c8f5437fd251347b
|
||||
25505.74161232 <- expected amount RGbLr8CsszoGATo6uy7fZJ5GJPuXYbA6sv
|
||||
035ad7612e8e55c1d9278e212ac956446a5906e4feb003897f0f8b95f6663254
|
||||
51.15844888 <- expected amount RYE329fWaVUaVg55DU4hiB4P2rfr4w3K2Y
|
||||
7350a71ea0d7e6d99526ed9a5c85b651f233982002f5cf301fbba79335028a3a
|
||||
4516.65527532 <- expected amount RP7HdvokCK1yJmpVCY49q4LXsVe3qhnEU5
|
||||
11d94c19c3a2c82b02f1f93f0b4e2e1f0a6d8ebaef16fd89a0c305c420b1cde0
|
||||
288282.30230152 <- expected amount RTJFUrfou8DU63uyGqH7ULgiCHHPZLkDT5
|
||||
a97fb20e966eb2cd579b794bb2f218624ae2aeb8f0e37e5b324388ee3ceab56b
|
||||
2218.92003493 <- expected amount RU1usSdDYTL7yN34EayPxJurQ7UMxDvTkF
|
||||
710e15413e8da75abe790d0703ba30b472aa7105a77a1345c085d1eebfc4087f
|
||||
30244.47828467 <- expected amount RQFicXTYo7QzKhFbo3ELuBfo3eyYiUv6o6
|
||||
c6fa9d781a236f7c8093204aea3e556cdf5cfe9e063458ce67c2afc119f76580
|
||||
781.43040624 <- expected amount RF2LDXirQQ5afPGVM7W7o3ZQhgGbhSeH8W
|
||||
18245cc8005658ef365bd12af5b97d7fc1f1a5675bbd1e4138b42c9ec6c8619d
|
||||
35011.78668474 <- expected amount RMvpp3QwvYch8hFCjZNXvXkzoFWEw9R5QH
|
||||
0acb562a4c07bdb2f33b2b5cb9f68f840210463e9fd18db639cbeb90de9e99e0
|
||||
20332.68360637 <- expected amount RH4u1f9PndVVYHkpxdMV28HwbdKphPiX6o
|
||||
857d1d59ff05ff27e5b3e8ce700d96f3675f9fbfaf433dadfa12acb510a03b7f
|
||||
4942.25856789 <- expected amount RWszpjqDXG6ifFzTJN2qaqSfZ4nJ8FX3Cp
|
||||
341859ac10c24da4fb186a44c1e75cf4bedda18541d67ec07a707df7e0e69c30
|
||||
201.26853079 <- expected amount R9whNiPsV9NHvyPqg6ranxDFvsM8HsDtks
|
||||
1d3cb3afd0bde49c6c7cdfa233db1822fe40914ee9bd61db2c81715e5ea53cd2
|
||||
663.13491046 <- expected amount RFfJkcC1fnFZB2G2MUPYdNEeRrZk6njPig
|
||||
0c824f0c1b31f59e41fbb428f8f0907cd2add1850ba1f9017e7e9f7f04f600ed
|
||||
29548.60287586 <- expected amount RV49vYgGa9kdzTQ5hq5ra88DkX4wwVdzmK
|
||||
37412c5be96ee323937ab206493b087475cab8fbae0197b8422308766cf915d2
|
||||
100186.19238242 <- expected amount RMYqPrPpgosrjcoS34WmBtG9KDRmE7WcXK
|
||||
474ef35ca33bae3dbf27ea3c7c97bf9a1602c35b49ebad3d547cbd6246d2f023
|
||||
1853646.03638691 <- expected amount RH1Ug5jz6S5DbJyLENhMthMEAoSBbkXRMq
|
||||
a2f94d89c18012ff284a957cb02c782c3e0def90225326a13248429b5e004975
|
||||
56782.00622335 <- expected amount RDQH9gVbS9Yza5fd7T4GSASzdTuwiP3Sgm
|
||||
d0b85a1a723b4be4d5dfd81d952edf4cd8e4f48efe5d94e06b284c64477e6fc2
|
||||
151544.96672946 <- expected amount RFREgr9p32GanT4YcM25hMcPYkvRLDNkja
|
||||
610739fdc49cb25411ce8601afda3afec67ea302fb30143ffdbf610051212490
|
||||
48415.76246875 <- expected amount RHQggZrkWW9HV8d7o2dvb9mgN1z6tGDJRh
|
||||
872c7832baefaec9371e405920d66a04eabad19a5bf96f1d4acf09a48ca7201e
|
||||
295382.69930466 <- expected amount RFjddDTCuobaHatQtd7kTiSjYv94Mp9Cu4
|
||||
0a96a0d8f6286a92fbef3d0cdff39dac4a545ec53c86f208b7fa07597e426d05
|
||||
64965.94673778 <- expected amount RKyMDKFNC79FhCfnFr58JE1ibpADa2WScE
|
||||
45b415f970c7be2eebda55ee16ec06f53e78108ea8dd8d6c6303739fe23a2f77
|
||||
9683.15249375 <- expected amount RHoPZSxWRgeQp7nB3eTn4dyDpmBRoZPoKv
|
||||
b3e59b50ba662b58187ba8805cd538700001dafa3aaac7d861fd36e1d1fd28d0
|
||||
2414.30320001 <- expected amount RGiA2sP25BqtW9qfJ3vRUAPH8zbgepwriY
|
||||
b9910599dbb95dbffa4654bb71e943a44137ac382961ef3e6cf0a7cd8cfad5a8
|
||||
19375.01982474 <- expected amount RTHtdb735hqJi5DJjXNiP2LREkqUL5b8Sx
|
||||
1e4c430408b1348baeba6a3c5512c982178aa31ecfbd8e4ae2992a71cce71032
|
||||
1589788.37880130 <- expected amount RHZR3YhrgxaYASvNUrcVdoonXCfgrdGULz
|
||||
270e639e54ca586a2f3e836f00d047469c275a2ce4939950c1af72e541651701
|
||||
4458.42312105 <- expected amount RCaxwG9VfLVvxMVvc5q7SQxRSuwR9amxoy
|
||||
9aeef2d9cb225e6378b6395f80b427e74e4612b2c77fa917fcfc7b8769e72ae9
|
||||
21120.82823309 <- expected amount RAyEy5vxNeAAeRw57BrsN5Kh4zu8i3KYEf
|
||||
6645da8d60c49f89481af3368809142031387df0fec55284c06a47fad3779b0e
|
||||
6566.15472364 <- expected amount RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47
|
||||
81ed2fa06af264ea2aa37c80520ed4c404ce9fe8df1d0ba74aeb793a01b0e507
|
||||
59621.32507756 <- expected amount RVNWkGzsFG1ZhzKBzzUj7UPzHMu8s1JWfT
|
||||
c24ba22994d4fe8cb8fd16bc37e0c2b788146364da20087ae4ad66483f85d1b2
|
||||
23159.75532541 <- expected amount RGwu8hcD19TKuqzPbjdnzKmkMsUUrdsw5p
|
||||
e44928ab1c8a9ca209476b8e045e8118e291e6d4e945ab220500c5cf0f095c0a
|
||||
9683.15249375 <- expected amount RG7jKgxwFPKNPy4MFxXaBr7TRDEzR2sSkV
|
||||
6213d1dcfc67f81075a2b6b75791868ff9215c85d9ad985ce064cf7e5926c9d7
|
||||
1504.76189752 <- expected amount RQft1wNt3sgntZDRbpz2WzHDy4F2TRamhB
|
||||
4da2ae47d8745cf35b5ec454ea098b2d2ea58ccffddbde5adbe87de3c67d2a51
|
||||
1452.47287406 <- expected amount RRergGKQPDcYHU8PxKhpx6kmR7mXdqp8Ce
|
||||
ac0d7b59075d46fc37d53a114c31183f592fc82f5d9c3da0a8cfbfa3dc78c038
|
||||
7746.52199500 <- expected amount RDPo9tEaM9Ds5UePeQS1pAFqXzD1ZVvS1n
|
||||
15de030bc97e0edbd0f45bf45990d634a540e5ad746d89be763c95888a75f1e5
|
||||
77304.58455563 <- expected amount RMwP7F2QRMprthjNwT7gHWjHvvqtefwRsJ
|
||||
c00ef567b0cf806b09f3a9a30d9935efe8271960f97321804c697ad9d4c681c1
|
||||
894.72329042 <- expected amount RNpa2spCJutTMYHgsr6MwM6X2pmRfYd6LT
|
||||
268
src/KMD.batch2
268
src/KMD.batch2
@@ -1,268 +0,0 @@
|
||||
sleep 999999
|
||||
# RDB6rqTtXja9iRKu5KeKz36poQqQkadsvG KMD 1597.72016146
|
||||
./komodo-cli sendtoaddress RDB6rqTtXja9iRKu5KeKz36poQqQkadsvG 1597.72016146
|
||||
sleep 3
|
||||
echo "1597.72016146 <- expected amount RDB6rqTtXja9iRKu5KeKz36poQqQkadsvG"
|
||||
|
||||
# RFahFwS1xmwufLvidWFg3aQwi6JnZ7MV92 KMD 30956.65119641
|
||||
./komodo-cli sendtoaddress RFahFwS1xmwufLvidWFg3aQwi6JnZ7MV92 30956.65119641
|
||||
sleep 3
|
||||
echo "30956.65119641 <- expected amount RFahFwS1xmwufLvidWFg3aQwi6JnZ7MV92"
|
||||
|
||||
# RS3dv3trTkvMUc1qpycmcY2mZRZj527HMG KMD 8011.05479853
|
||||
./komodo-cli sendtoaddress RS3dv3trTkvMUc1qpycmcY2mZRZj527HMG 8011.05479853
|
||||
sleep 3
|
||||
echo "8011.05479853 <- expected amount RS3dv3trTkvMUc1qpycmcY2mZRZj527HMG"
|
||||
|
||||
# RU18xoQZeK4Kno2ER7mv8ZEKLHiTECRhkU KMD 501.64865701, REVS 9.95750000
|
||||
# RU18xoQZeK4Kno2ER7mv8ZEKLHiTECRhkU KMD 501.64865701
|
||||
./komodo-cli sendtoaddress RU18xoQZeK4Kno2ER7mv8ZEKLHiTECRhkU 501.64865701
|
||||
sleep 3
|
||||
echo "501.64865701 <- expected amount RU18xoQZeK4Kno2ER7mv8ZEKLHiTECRhkU"
|
||||
|
||||
# RFuD6bLb6seuKPmQqouwcjAy1yexEYGJ8Q KMD 6617.71011981
|
||||
./komodo-cli sendtoaddress RFuD6bLb6seuKPmQqouwcjAy1yexEYGJ8Q 6617.71011981
|
||||
sleep 3
|
||||
echo "6617.71011981 <- expected amount RFuD6bLb6seuKPmQqouwcjAy1yexEYGJ8Q"
|
||||
|
||||
# RSj2RG9yEbokDDNCn94g6wRf3y1R4HztjT KMD 58970.39868693
|
||||
./komodo-cli sendtoaddress RSj2RG9yEbokDDNCn94g6wRf3y1R4HztjT 58970.39868693
|
||||
sleep 3
|
||||
echo "58970.39868693 <- expected amount RSj2RG9yEbokDDNCn94g6wRf3y1R4HztjT"
|
||||
|
||||
# RLWjPQPe4zZ1ZF4VpShkiBkgkF4V9YFt7a KMD 18618.76561497
|
||||
./komodo-cli sendtoaddress RLWjPQPe4zZ1ZF4VpShkiBkgkF4V9YFt7a 18618.76561497
|
||||
sleep 3
|
||||
echo "18618.76561497 <- expected amount RLWjPQPe4zZ1ZF4VpShkiBkgkF4V9YFt7a"
|
||||
|
||||
# RARemRFU1R5QcRdDZqrufjks2KCzBi6bxL KMD 52766.61227268
|
||||
./komodo-cli sendtoaddress RARemRFU1R5QcRdDZqrufjks2KCzBi6bxL 52766.61227268
|
||||
sleep 3
|
||||
echo "52766.61227268 <- expected amount RARemRFU1R5QcRdDZqrufjks2KCzBi6bxL"
|
||||
|
||||
# REg8BhZUaxjJu8Ad4ZYsrETJwcwYL7mPkC KMD 7204.26545535
|
||||
./komodo-cli sendtoaddress REg8BhZUaxjJu8Ad4ZYsrETJwcwYL7mPkC 7204.26545535
|
||||
sleep 3
|
||||
echo "7204.26545535 <- expected amount REg8BhZUaxjJu8Ad4ZYsrETJwcwYL7mPkC"
|
||||
|
||||
# RMnLqCcb13npqdUMgUYAdr4bGawNe5H8yo KMD 871.48372443
|
||||
./komodo-cli sendtoaddress RMnLqCcb13npqdUMgUYAdr4bGawNe5H8yo 871.48372443
|
||||
sleep 3
|
||||
echo "871.48372443 <- expected amount RMnLqCcb13npqdUMgUYAdr4bGawNe5H8yo"
|
||||
|
||||
# RWCz1ibkFVpo6pBoBT7XeMZHVZy61EnYj3 KMD 681.69393556
|
||||
./komodo-cli sendtoaddress RWCz1ibkFVpo6pBoBT7XeMZHVZy61EnYj3 681.69393556
|
||||
sleep 3
|
||||
echo "681.69393556 <- expected amount RWCz1ibkFVpo6pBoBT7XeMZHVZy61EnYj3"
|
||||
|
||||
# RJxiu5FTx2Nqr9xHvwdq1xynExUjFKVPdf KMD 62103.45021354, REVS 50.00000000
|
||||
# RJxiu5FTx2Nqr9xHvwdq1xynExUjFKVPdf KMD 62103.45021354
|
||||
./komodo-cli sendtoaddress RJxiu5FTx2Nqr9xHvwdq1xynExUjFKVPdf 62103.45021354
|
||||
sleep 3
|
||||
echo "62103.45021354 <- expected amount RJxiu5FTx2Nqr9xHvwdq1xynExUjFKVPdf"
|
||||
|
||||
# RRcP4HLapHvTinSVYq6bMA3d41XeYCH2Uz KMD 9683.15249375
|
||||
./komodo-cli sendtoaddress RRcP4HLapHvTinSVYq6bMA3d41XeYCH2Uz 9683.15249375
|
||||
sleep 3
|
||||
echo "9683.15249375 <- expected amount RRcP4HLapHvTinSVYq6bMA3d41XeYCH2Uz"
|
||||
|
||||
# RB95bkGifi94Z4VSHGULKhCU8ML7tUbQ71 KMD 12520.16564088, REVS 138.94305839
|
||||
# RB95bkGifi94Z4VSHGULKhCU8ML7tUbQ71 KMD 12520.16564088
|
||||
./komodo-cli sendtoaddress RB95bkGifi94Z4VSHGULKhCU8ML7tUbQ71 12520.16564088
|
||||
sleep 3
|
||||
echo "12520.16564088 <- expected amount RB95bkGifi94Z4VSHGULKhCU8ML7tUbQ71"
|
||||
|
||||
# RKb5ay26iSzmBoqm51vPveyErH9BYG3dry KMD 3674.15911735, REVS 72.89043156
|
||||
# RKb5ay26iSzmBoqm51vPveyErH9BYG3dry KMD 3674.15911735
|
||||
./komodo-cli sendtoaddress RKb5ay26iSzmBoqm51vPveyErH9BYG3dry 3674.15911735
|
||||
sleep 3
|
||||
echo "3674.15911735 <- expected amount RKb5ay26iSzmBoqm51vPveyErH9BYG3dry"
|
||||
|
||||
# RNFKCPjFTQq5pFxBpehrVFzB55zE9enRyK KMD 1859.16527880
|
||||
./komodo-cli sendtoaddress RNFKCPjFTQq5pFxBpehrVFzB55zE9enRyK 1859.16527880
|
||||
sleep 3
|
||||
echo "1859.16527880 <- expected amount RNFKCPjFTQq5pFxBpehrVFzB55zE9enRyK"
|
||||
|
||||
# REGu6tiLygx7HjsRnEYypHiV3QotErvKxP KMD 9683.15249375
|
||||
./komodo-cli sendtoaddress REGu6tiLygx7HjsRnEYypHiV3QotErvKxP 9683.15249375
|
||||
sleep 3
|
||||
echo "9683.15249375 <- expected amount REGu6tiLygx7HjsRnEYypHiV3QotErvKxP"
|
||||
|
||||
# RVeVZrr24524LhN3VRhLqNG6qgH9tBPixx KMD 612851.03780014, REVS 5433.13031755
|
||||
# RVeVZrr24524LhN3VRhLqNG6qgH9tBPixx KMD 612851.03780014
|
||||
./komodo-cli sendtoaddress RVeVZrr24524LhN3VRhLqNG6qgH9tBPixx 612851.03780014
|
||||
sleep 3
|
||||
echo "612851.03780014 <- expected amount RVeVZrr24524LhN3VRhLqNG6qgH9tBPixx"
|
||||
|
||||
# RVGv9EP36z2SHf5zuGrGKEq6or8Q2hEPts KMD 954.83978703
|
||||
./komodo-cli sendtoaddress RVGv9EP36z2SHf5zuGrGKEq6or8Q2hEPts 954.83978703
|
||||
sleep 3
|
||||
echo "954.83978703 <- expected amount RVGv9EP36z2SHf5zuGrGKEq6or8Q2hEPts"
|
||||
|
||||
# RUuWvTwNAMGLpuY3GLPBAmMp8ptShkMSyN KMD 139007.63452726
|
||||
./komodo-cli sendtoaddress RUuWvTwNAMGLpuY3GLPBAmMp8ptShkMSyN 139007.63452726
|
||||
sleep 3
|
||||
echo "139007.63452726 <- expected amount RUuWvTwNAMGLpuY3GLPBAmMp8ptShkMSyN"
|
||||
|
||||
# RFBxwyTKGy5DtxR5CLLZSjKL5jU6fm13kp KMD 519232.27493854, REVS 10298.05578171
|
||||
# RFBxwyTKGy5DtxR5CLLZSjKL5jU6fm13kp KMD 519232.27493854
|
||||
./komodo-cli sendtoaddress RFBxwyTKGy5DtxR5CLLZSjKL5jU6fm13kp 519232.27493854
|
||||
sleep 3
|
||||
echo "519232.27493854 <- expected amount RFBxwyTKGy5DtxR5CLLZSjKL5jU6fm13kp"
|
||||
|
||||
# RV6EZQRiEszMydw3VjLabjGCBG1HiHrU6f KMD 19366.30498750
|
||||
./komodo-cli sendtoaddress RV6EZQRiEszMydw3VjLabjGCBG1HiHrU6f 19366.30498750
|
||||
sleep 3
|
||||
echo "19366.30498750 <- expected amount RV6EZQRiEszMydw3VjLabjGCBG1HiHrU6f"
|
||||
|
||||
# RB1cuwtKBpwZPZnwyJeznaij53ovj8Dm8i KMD 19106.59220646, REVS 374.39305755
|
||||
# RB1cuwtKBpwZPZnwyJeznaij53ovj8Dm8i KMD 19106.59220646
|
||||
./komodo-cli sendtoaddress RB1cuwtKBpwZPZnwyJeznaij53ovj8Dm8i 19106.59220646
|
||||
sleep 3
|
||||
echo "19106.59220646 <- expected amount RB1cuwtKBpwZPZnwyJeznaij53ovj8Dm8i"
|
||||
|
||||
# RK5z4QVhNBWJn5xSkpPPgdcZzms7VtFV4x KMD 3097.05949360
|
||||
./komodo-cli sendtoaddress RK5z4QVhNBWJn5xSkpPPgdcZzms7VtFV4x 3097.05949360
|
||||
sleep 3
|
||||
echo "3097.05949360 <- expected amount RK5z4QVhNBWJn5xSkpPPgdcZzms7VtFV4x"
|
||||
|
||||
# RTSFrcYBPZ3wMUtJCo5RC8n71R2c1ypC46 KMD 968.31524937
|
||||
./komodo-cli sendtoaddress RTSFrcYBPZ3wMUtJCo5RC8n71R2c1ypC46 968.31524937
|
||||
sleep 3
|
||||
echo "968.31524937 <- expected amount RTSFrcYBPZ3wMUtJCo5RC8n71R2c1ypC46"
|
||||
|
||||
# RSxDyaWzqT3VTK9WLkAKhY5WST8a9kQgr9 KMD 14268.23083290
|
||||
./komodo-cli sendtoaddress RSxDyaWzqT3VTK9WLkAKhY5WST8a9kQgr9 14268.23083290
|
||||
sleep 3
|
||||
echo "14268.23083290 <- expected amount RSxDyaWzqT3VTK9WLkAKhY5WST8a9kQgr9"
|
||||
|
||||
# RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf KMD 1212.14061568, REVS 24.05385000
|
||||
# RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf KMD 1212.14061568
|
||||
./komodo-cli sendtoaddress RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf 1212.14061568
|
||||
sleep 3
|
||||
echo "1212.14061568 <- expected amount RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf"
|
||||
|
||||
# RVUFVtJN2mVDEsADwMfZBBXXSq3G9QCvBs KMD 20418.65848567
|
||||
./komodo-cli sendtoaddress RVUFVtJN2mVDEsADwMfZBBXXSq3G9QCvBs 20418.65848567
|
||||
sleep 3
|
||||
echo "20418.65848567 <- expected amount RVUFVtJN2mVDEsADwMfZBBXXSq3G9QCvBs"
|
||||
|
||||
# RDx4sokytAASudNuMDDdk4R6RHJ4P8aPza KMD 10347.76210933, REVS 205.22959870
|
||||
# RDx4sokytAASudNuMDDdk4R6RHJ4P8aPza KMD 10347.76210933
|
||||
./komodo-cli sendtoaddress RDx4sokytAASudNuMDDdk4R6RHJ4P8aPza 10347.76210933
|
||||
sleep 3
|
||||
echo "10347.76210933 <- expected amount RDx4sokytAASudNuMDDdk4R6RHJ4P8aPza"
|
||||
|
||||
# RAPJuPCGMoPwfeHuckiea21LMek8BkH8Zr KMD 71712.83911390, REVS 500.67180183
|
||||
# RAPJuPCGMoPwfeHuckiea21LMek8BkH8Zr KMD 71712.83911390
|
||||
./komodo-cli sendtoaddress RAPJuPCGMoPwfeHuckiea21LMek8BkH8Zr 71712.83911390
|
||||
sleep 3
|
||||
echo "71712.83911390 <- expected amount RAPJuPCGMoPwfeHuckiea21LMek8BkH8Zr"
|
||||
|
||||
# RNszK1KnyyDoU6di3qQgCYvSL3V3ZgGNGY KMD 26725.50088275
|
||||
./komodo-cli sendtoaddress RNszK1KnyyDoU6di3qQgCYvSL3V3ZgGNGY 26725.50088275
|
||||
sleep 3
|
||||
echo "26725.50088275 <- expected amount RNszK1KnyyDoU6di3qQgCYvSL3V3ZgGNGY"
|
||||
|
||||
# RSWsxgczqH1uYyY6MMPePJY5jNjj7uD7Xr KMD 16435.34703311, REVS 114.80740001
|
||||
# RSWsxgczqH1uYyY6MMPePJY5jNjj7uD7Xr KMD 16435.34703311
|
||||
./komodo-cli sendtoaddress RSWsxgczqH1uYyY6MMPePJY5jNjj7uD7Xr 16435.34703311
|
||||
sleep 3
|
||||
echo "16435.34703311 <- expected amount RSWsxgczqH1uYyY6MMPePJY5jNjj7uD7Xr"
|
||||
|
||||
# RVxvCQ393MRnsQ8Fn8qiKm5yP6pk9GVgEr KMD 17137.93285029, REVS 340.00462653
|
||||
# RVxvCQ393MRnsQ8Fn8qiKm5yP6pk9GVgEr KMD 17137.93285029
|
||||
./komodo-cli sendtoaddress RVxvCQ393MRnsQ8Fn8qiKm5yP6pk9GVgEr 17137.93285029
|
||||
sleep 3
|
||||
echo "17137.93285029 <- expected amount RVxvCQ393MRnsQ8Fn8qiKm5yP6pk9GVgEr"
|
||||
|
||||
# RMKk4K7zC6QrESUxNGRTfqbBnXr2MFYsLV KMD 1302.29267891
|
||||
./komodo-cli sendtoaddress RMKk4K7zC6QrESUxNGRTfqbBnXr2MFYsLV 1302.29267891
|
||||
sleep 3
|
||||
echo "1302.29267891 <- expected amount RMKk4K7zC6QrESUxNGRTfqbBnXr2MFYsLV"
|
||||
|
||||
# RJaaPBFPBTtqzPZ5ZV2uu15urxhiycwg7K KMD 32805.26183900
|
||||
./komodo-cli sendtoaddress RJaaPBFPBTtqzPZ5ZV2uu15urxhiycwg7K 32805.26183900
|
||||
sleep 3
|
||||
echo "32805.26183900 <- expected amount RJaaPBFPBTtqzPZ5ZV2uu15urxhiycwg7K"
|
||||
|
||||
# R9isnAJ2iyyFq8BMZZJu8PiFLpnXPhXcZ7 KMD 502854.27827071
|
||||
./komodo-cli sendtoaddress R9isnAJ2iyyFq8BMZZJu8PiFLpnXPhXcZ7 502854.27827071
|
||||
sleep 3
|
||||
echo "502854.27827071 <- expected amount R9isnAJ2iyyFq8BMZZJu8PiFLpnXPhXcZ7"
|
||||
|
||||
# RG5eabU8sYvrfWrCu1wb2Go5vxhyVXsbAF KMD 409543.68954327, REVS 8123.68911362
|
||||
# RG5eabU8sYvrfWrCu1wb2Go5vxhyVXsbAF KMD 409543.68954327
|
||||
./komodo-cli sendtoaddress RG5eabU8sYvrfWrCu1wb2Go5vxhyVXsbAF 409543.68954327
|
||||
sleep 3
|
||||
echo "409543.68954327 <- expected amount RG5eabU8sYvrfWrCu1wb2Go5vxhyVXsbAF"
|
||||
|
||||
# RQWxU8AV5SkKCmz6Q3CecmAtnauESPxDod KMD 8908.50029425
|
||||
./komodo-cli sendtoaddress RQWxU8AV5SkKCmz6Q3CecmAtnauESPxDod 8908.50029425
|
||||
sleep 3
|
||||
echo "8908.50029425 <- expected amount RQWxU8AV5SkKCmz6Q3CecmAtnauESPxDod"
|
||||
|
||||
# RMqivy9QZ7ax1UU8ZxqaupLqDqEBAFW6MY KMD 708.48776076
|
||||
./komodo-cli sendtoaddress RMqivy9QZ7ax1UU8ZxqaupLqDqEBAFW6MY 708.48776076
|
||||
sleep 3
|
||||
echo "708.48776076 <- expected amount RMqivy9QZ7ax1UU8ZxqaupLqDqEBAFW6MY"
|
||||
|
||||
# RV85Dvvf4fm13xxtjmucYXDAarMcnV8EFq KMD 29057.20400324
|
||||
./komodo-cli sendtoaddress RV85Dvvf4fm13xxtjmucYXDAarMcnV8EFq 29057.20400324
|
||||
sleep 3
|
||||
echo "29057.20400324 <- expected amount RV85Dvvf4fm13xxtjmucYXDAarMcnV8EFq"
|
||||
|
||||
# RJzRaaqhT8R7pbVuVeY3C69X9K89UMU55E KMD 632.08133544
|
||||
./komodo-cli sendtoaddress RJzRaaqhT8R7pbVuVeY3C69X9K89UMU55E 632.08133544
|
||||
sleep 3
|
||||
echo "632.08133544 <- expected amount RJzRaaqhT8R7pbVuVeY3C69X9K89UMU55E"
|
||||
|
||||
# RCBSjuktzRbsz1UHKjFmTUVG6nDNhd3y2g KMD 24029.98198519
|
||||
./komodo-cli sendtoaddress RCBSjuktzRbsz1UHKjFmTUVG6nDNhd3y2g 24029.98198519
|
||||
sleep 3
|
||||
echo "24029.98198519 <- expected amount RCBSjuktzRbsz1UHKjFmTUVG6nDNhd3y2g"
|
||||
|
||||
# RKDnex4tqTGA9u2UqEDGS8uTxceqWGwejk KMD 10684.09534584
|
||||
./komodo-cli sendtoaddress RKDnex4tqTGA9u2UqEDGS8uTxceqWGwejk 10684.09534584
|
||||
sleep 3
|
||||
echo "10684.09534584 <- expected amount RKDnex4tqTGA9u2UqEDGS8uTxceqWGwejk"
|
||||
|
||||
# RYTMDSu1BjaQAdvh6a9CQFCr7h1rsGi48d KMD 302.06577591, REVS 5.99094155
|
||||
# RYTMDSu1BjaQAdvh6a9CQFCr7h1rsGi48d KMD 302.06577591
|
||||
./komodo-cli sendtoaddress RYTMDSu1BjaQAdvh6a9CQFCr7h1rsGi48d 302.06577591
|
||||
sleep 3
|
||||
echo "302.06577591 <- expected amount RYTMDSu1BjaQAdvh6a9CQFCr7h1rsGi48d"
|
||||
|
||||
# REhPMC2k5XAsiqd3X1afzdT6SzE9vY7MS6 KMD 9683.15249375
|
||||
./komodo-cli sendtoaddress REhPMC2k5XAsiqd3X1afzdT6SzE9vY7MS6 9683.15249375
|
||||
sleep 3
|
||||
echo "9683.15249375 <- expected amount REhPMC2k5XAsiqd3X1afzdT6SzE9vY7MS6"
|
||||
|
||||
# RVLd4HkkB8SsyXfXHQeHHNouNer7nv3mkL KMD 30407.13753317, REVS 411.30538288
|
||||
# RVLd4HkkB8SsyXfXHQeHHNouNer7nv3mkL KMD 30407.13753317
|
||||
./komodo-cli sendtoaddress RVLd4HkkB8SsyXfXHQeHHNouNer7nv3mkL 30407.13753317
|
||||
sleep 3
|
||||
echo "30407.13753317 <- expected amount RVLd4HkkB8SsyXfXHQeHHNouNer7nv3mkL"
|
||||
|
||||
# RKa3UX7xvQuYhd9LWHFGjQm8EjbLcnLxo1 KMD 4647.91319700
|
||||
./komodo-cli sendtoaddress RKa3UX7xvQuYhd9LWHFGjQm8EjbLcnLxo1 4647.91319700
|
||||
sleep 3
|
||||
echo "4647.91319700 <- expected amount RKa3UX7xvQuYhd9LWHFGjQm8EjbLcnLxo1"
|
||||
|
||||
# RRBhAPHb7WY2XrLSST2oymc4LYtCskzijc KMD 1914.39627638
|
||||
./komodo-cli sendtoaddress RRBhAPHb7WY2XrLSST2oymc4LYtCskzijc 1914.39627638
|
||||
sleep 3
|
||||
echo "1914.39627638 <- expected amount RRBhAPHb7WY2XrLSST2oymc4LYtCskzijc"
|
||||
|
||||
# RQFicXTYo7QzKhFbo3ELuBfo3eyYiUv6o6 KMD 56568.34116197
|
||||
./komodo-cli sendtoaddress RQFicXTYo7QzKhFbo3ELuBfo3eyYiUv6o6 56568.34116197
|
||||
sleep 3
|
||||
echo "56568.34116197 <- expected amount RQFicXTYo7QzKhFbo3ELuBfo3eyYiUv6o6"
|
||||
|
||||
# RNkRuGR4uFrcMqrPMu8X5Nwvgbc3Jxxkqk KMD 96831.52493750
|
||||
./komodo-cli sendtoaddress RNkRuGR4uFrcMqrPMu8X5Nwvgbc3Jxxkqk 96831.52493750
|
||||
sleep 3
|
||||
echo "96831.52493750 <- expected amount RNkRuGR4uFrcMqrPMu8X5Nwvgbc3Jxxkqk"
|
||||
|
||||
|
||||
# total KMD 3000044.12520703 REVS 0.00000000
|
||||
@@ -1,100 +0,0 @@
|
||||
c329c89b3f7aafccc387d603701a6a64a936128ac7664fb0fee65e0bf2e429b6
|
||||
1597.72016146 <- expected amount RDB6rqTtXja9iRKu5KeKz36poQqQkadsvG
|
||||
b2cdaf93b7eacfed0a4f5097aa04ec75b7370ba0af607eef94e350aea7e70434
|
||||
30956.65119641 <- expected amount RFahFwS1xmwufLvidWFg3aQwi6JnZ7MV92
|
||||
56ed0d28cec7e2c69b5c5032196cdeb836c0f03068d06c1ad1a0512cc4dd4829
|
||||
8011.05479853 <- expected amount RS3dv3trTkvMUc1qpycmcY2mZRZj527HMG
|
||||
5278f1cd93023398be92f19af29e0a36650d44c749137b933330961f6b58e3f9
|
||||
501.64865701 <- expected amount RU18xoQZeK4Kno2ER7mv8ZEKLHiTECRhkU
|
||||
179c2d0dead8ce8290259d89b9ec3e3636c8cfddb5c302329f7f370d7e1ca164
|
||||
6617.71011981 <- expected amount RFuD6bLb6seuKPmQqouwcjAy1yexEYGJ8Q
|
||||
18a92ae3929a170820bcc5ad626a926a43f21bcf2010731d3e10618c723c48ab
|
||||
58970.39868693 <- expected amount RSj2RG9yEbokDDNCn94g6wRf3y1R4HztjT
|
||||
7e3f8af2083bfa820b629c28109d36aece5d211a90f4f28e2f6a166aa1cf52ba
|
||||
18618.76561497 <- expected amount RLWjPQPe4zZ1ZF4VpShkiBkgkF4V9YFt7a
|
||||
9cb657f2475005cd61d75b878f45e08c5a02dcc4f2697c8471b4d9a28e350f03
|
||||
52766.61227268 <- expected amount RARemRFU1R5QcRdDZqrufjks2KCzBi6bxL
|
||||
87dce30d57d563adc799d2f10e865b0ff18336d50616bc326fbcc2b30c6f2fe2
|
||||
7204.26545535 <- expected amount REg8BhZUaxjJu8Ad4ZYsrETJwcwYL7mPkC
|
||||
26f44e65cd397b58339bbc210e864172c17764f42c0507b603283be31b4e8256
|
||||
871.48372443 <- expected amount RMnLqCcb13npqdUMgUYAdr4bGawNe5H8yo
|
||||
325d5c3fdd4a637ec18db2b182c7256535b1fad9e7246e9beab3c17203df9293
|
||||
681.69393556 <- expected amount RWCz1ibkFVpo6pBoBT7XeMZHVZy61EnYj3
|
||||
d70a3661cc7b41394e1493656391bb1cba899fbdea7d6ceef74068855324b647
|
||||
62103.45021354 <- expected amount RJxiu5FTx2Nqr9xHvwdq1xynExUjFKVPdf
|
||||
2d26feebf39ec339502faa9f87269d3fe34caacb1eb3fcc332c17f85190ec351
|
||||
9683.15249375 <- expected amount RRcP4HLapHvTinSVYq6bMA3d41XeYCH2Uz
|
||||
b87fcff23d4d6b1de22d101cb9d312ffd893f170e60726cd03cf2b998a5dbe9d
|
||||
12520.16564088 <- expected amount RB95bkGifi94Z4VSHGULKhCU8ML7tUbQ71
|
||||
d131c69df7cd932c6962957e5fed4c4288ef8114b14046a32514845817475bad
|
||||
3674.15911735 <- expected amount RKb5ay26iSzmBoqm51vPveyErH9BYG3dry
|
||||
915d049fb7144c834876f3cd37c6af78cfb9cae800dc0b8ed995262912a3129e
|
||||
1859.16527880 <- expected amount RNFKCPjFTQq5pFxBpehrVFzB55zE9enRyK
|
||||
33ef89d3a1685aa2f35307b86a198a4d643c43ddd8a13f00431d66cab8f0377c
|
||||
9683.15249375 <- expected amount REGu6tiLygx7HjsRnEYypHiV3QotErvKxP
|
||||
991a9017669144f83e724f134a4ae66c2db968fabb35d6196020686d8f10ae1f
|
||||
612851.03780014 <- expected amount RVeVZrr24524LhN3VRhLqNG6qgH9tBPixx
|
||||
cabb00fd0bc49d51b494093a6aa247277391ec531b4b12beca58980ff4f6c831
|
||||
954.83978703 <- expected amount RVGv9EP36z2SHf5zuGrGKEq6or8Q2hEPts
|
||||
82fa5756cba3af6b06f1dde3080e3e1eaf67f7fe10b1242f038f9e6780819ff3
|
||||
139007.63452726 <- expected amount RUuWvTwNAMGLpuY3GLPBAmMp8ptShkMSyN
|
||||
09d000249df0e9cd6a5bbcf110a04be611e19dce4bfc83a4986d8b84ffb8b609
|
||||
519232.27493854 <- expected amount RFBxwyTKGy5DtxR5CLLZSjKL5jU6fm13kp
|
||||
8f453874283a089c2a3fe3b6ff5779174c57e230b04ee5c6246d02df042a333a
|
||||
19366.30498750 <- expected amount RV6EZQRiEszMydw3VjLabjGCBG1HiHrU6f
|
||||
065f16bf44bc940aab138fbe2ecf99bed897ec3fcdcb1ab97604564bc76a6b6f
|
||||
19106.59220646 <- expected amount RB1cuwtKBpwZPZnwyJeznaij53ovj8Dm8i
|
||||
a64451f3360f11c068f2ed9393eba0a8889ffff4156d80e17fe969cb8811cb62
|
||||
3097.05949360 <- expected amount RK5z4QVhNBWJn5xSkpPPgdcZzms7VtFV4x
|
||||
f93c8c747753e2742e89d8f0901b5084762327c733499fdc673f1c053ad3c64c
|
||||
968.31524937 <- expected amount RTSFrcYBPZ3wMUtJCo5RC8n71R2c1ypC46
|
||||
484d5632f378f026b62c064c649e616b8d9bd889caa67f393210e771e845fe83
|
||||
14268.23083290 <- expected amount RSxDyaWzqT3VTK9WLkAKhY5WST8a9kQgr9
|
||||
adf2fd2eee75f5d9fdce44b4fe4d32f62d79f5e1b0362640c76eb109b1ceb30b
|
||||
1212.14061568 <- expected amount RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf
|
||||
5f2fbb598d9c824c65909c675f9cdf5450062dcf3c5cc74e7028f7709965fe2c
|
||||
20418.65848567 <- expected amount RVUFVtJN2mVDEsADwMfZBBXXSq3G9QCvBs
|
||||
25861dd56268dbe16b1139273b1065a35c1fe7a5922a820d8e2dec36d43aaec3
|
||||
10347.76210933 <- expected amount RDx4sokytAASudNuMDDdk4R6RHJ4P8aPza
|
||||
ff8b27a51fab38a48749e59f0313eb4857d733ba04a17827152fe3691762a869
|
||||
71712.83911390 <- expected amount RAPJuPCGMoPwfeHuckiea21LMek8BkH8Zr
|
||||
2b49a3430d317a1f09b1105cccc8dd2faf11ee730b4ed247a9ce5ac37a56c64a
|
||||
26725.50088275 <- expected amount RNszK1KnyyDoU6di3qQgCYvSL3V3ZgGNGY
|
||||
c0d8d3c2d7a5d8ab8ce3ed91dc97c9d4badb304cbf6c916257a68251ba33171e
|
||||
16435.34703311 <- expected amount RSWsxgczqH1uYyY6MMPePJY5jNjj7uD7Xr
|
||||
9e93f9084dd0d77b84c6fe71ec6e84fcb3a417f29b102be7b9bc9513b2212b5e
|
||||
17137.93285029 <- expected amount RVxvCQ393MRnsQ8Fn8qiKm5yP6pk9GVgEr
|
||||
33a8050ebc63e301adfada7a1c86b84d1ac11891f00efe2c1f546a245e6eedfc
|
||||
1302.29267891 <- expected amount RMKk4K7zC6QrESUxNGRTfqbBnXr2MFYsLV
|
||||
3d21078ebe08f4860d3e7cfda791ed78eacf13e2da98295f9aa2e02f9b8b50f1
|
||||
32805.26183900 <- expected amount RJaaPBFPBTtqzPZ5ZV2uu15urxhiycwg7K
|
||||
3578e7e457292ab2ba5ab9870eed5d4afd4d8f207d40a5977adc3ac05ae28534
|
||||
502854.27827071 <- expected amount R9isnAJ2iyyFq8BMZZJu8PiFLpnXPhXcZ7
|
||||
0a6eb401ccd0f546ea6bc8dd0c94ec9815f3f99e5c2d5c6c3ace3d38563491d2
|
||||
409543.68954327 <- expected amount RG5eabU8sYvrfWrCu1wb2Go5vxhyVXsbAF
|
||||
43434a36fa78520ec042e5916662d10ad83f2d1e61014de495943aff647d9137
|
||||
8908.50029425 <- expected amount RQWxU8AV5SkKCmz6Q3CecmAtnauESPxDod
|
||||
2f2395d0eb5a29501c2c63fa70b79cfafb2b521fa5826d7f16e6699ef388aad9
|
||||
708.48776076 <- expected amount RMqivy9QZ7ax1UU8ZxqaupLqDqEBAFW6MY
|
||||
85bae2856dc4a113ca7e852d09a40a5ecaa08604371a94fd3ba7cf9f4e9cd7fd
|
||||
29057.20400324 <- expected amount RV85Dvvf4fm13xxtjmucYXDAarMcnV8EFq
|
||||
a841458bbee450c66a706fd65bc6f3085ec3811885e0021307269f35a634c62f
|
||||
632.08133544 <- expected amount RJzRaaqhT8R7pbVuVeY3C69X9K89UMU55E
|
||||
b181d7f1e63468885406edfd312013b3341e1d8b20daafee61ed09aa2688a857
|
||||
24029.98198519 <- expected amount RCBSjuktzRbsz1UHKjFmTUVG6nDNhd3y2g
|
||||
a63afab4b50441c2a0d7acf987d806b28ccf7e1a96474bace772fa12abb6f07b
|
||||
10684.09534584 <- expected amount RKDnex4tqTGA9u2UqEDGS8uTxceqWGwejk
|
||||
5fbe39fc4f4284b5dee48adba5417360e36b6d6ad3df2f3f57de95c71c9e5258
|
||||
302.06577591 <- expected amount RYTMDSu1BjaQAdvh6a9CQFCr7h1rsGi48d
|
||||
e70bfabab12277e80f6c46dc3afa7612fd2e9232f18d0372e5338da3022c67f6
|
||||
9683.15249375 <- expected amount REhPMC2k5XAsiqd3X1afzdT6SzE9vY7MS6
|
||||
b552d0a83fad0d9ea90ac807676339a3775ad6135e1626b4283da9b792c629a0
|
||||
30407.13753317 <- expected amount RVLd4HkkB8SsyXfXHQeHHNouNer7nv3mkL
|
||||
b705ff799a0053b85764aa6a10dc35f4028404c14e1645423a4ca3e66ecbaedc
|
||||
4647.91319700 <- expected amount RKa3UX7xvQuYhd9LWHFGjQm8EjbLcnLxo1
|
||||
292649c59c73458074e05c90be0b98284baf551bd7ea6015dcc329f510eb140b
|
||||
1914.39627638 <- expected amount RRBhAPHb7WY2XrLSST2oymc4LYtCskzijc
|
||||
de68a847b4dc4e0d9595dd0ccda713f6c4e40af69a0b0722fb1bf85937019675
|
||||
56568.34116197 <- expected amount RQFicXTYo7QzKhFbo3ELuBfo3eyYiUv6o6
|
||||
8c8d15cda8840fe62e3f67a6a1a34ec538c8740dacad9d41363252c0be60635d
|
||||
96831.52493750 <- expected amount RNkRuGR4uFrcMqrPMu8X5Nwvgbc3Jxxkqk
|
||||
248
src/KMD.batch3
248
src/KMD.batch3
@@ -1,248 +0,0 @@
|
||||
sleep 9999999
|
||||
# RSVzs8BLvCrmvNF1MbqEpAwx9VHinmAxDg KMD 5669.98491054, REVS 112.56208000
|
||||
# RSVzs8BLvCrmvNF1MbqEpAwx9VHinmAxDg KMD 5669.98491054
|
||||
./komodo-cli sendtoaddress RSVzs8BLvCrmvNF1MbqEpAwx9VHinmAxDg 5669.98491054
|
||||
sleep 3
|
||||
echo "5669.98491054 <- expected amount RSVzs8BLvCrmvNF1MbqEpAwx9VHinmAxDg"
|
||||
|
||||
# RXbWQbnpsQ3iSBBj5bn2HDq3WvqRPJg5Ek KMD 8353.36815152
|
||||
./komodo-cli sendtoaddress RXbWQbnpsQ3iSBBj5bn2HDq3WvqRPJg5Ek 8353.36815152
|
||||
sleep 3
|
||||
echo "8353.36815152 <- expected amount RXbWQbnpsQ3iSBBj5bn2HDq3WvqRPJg5Ek"
|
||||
|
||||
# RKCDBxUx7mbCnViLt423jdLt6oNpW7SH7z KMD 9683.15249375
|
||||
./komodo-cli sendtoaddress RKCDBxUx7mbCnViLt423jdLt6oNpW7SH7z 9683.15249375
|
||||
sleep 3
|
||||
echo "9683.15249375 <- expected amount RKCDBxUx7mbCnViLt423jdLt6oNpW7SH7z"
|
||||
|
||||
# RLqqYX4oMVz6c6s52bLnYdfi9qZ56bEK3W KMD 43088.74729573, REVS 470.87980000
|
||||
# RLqqYX4oMVz6c6s52bLnYdfi9qZ56bEK3W KMD 43088.74729573
|
||||
./komodo-cli sendtoaddress RLqqYX4oMVz6c6s52bLnYdfi9qZ56bEK3W 43088.74729573
|
||||
sleep 3
|
||||
echo "43088.74729573 <- expected amount RLqqYX4oMVz6c6s52bLnYdfi9qZ56bEK3W"
|
||||
|
||||
# RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct KMD 50806.03038250
|
||||
./komodo-cli sendtoaddress RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct 50806.03038250
|
||||
sleep 3
|
||||
echo "50806.03038250 <- expected amount RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct"
|
||||
|
||||
# RDqaDbfFHrnPAnyLY6b9A3CFZZjivhdYSJ KMD 2015.79933830
|
||||
./komodo-cli sendtoaddress RDqaDbfFHrnPAnyLY6b9A3CFZZjivhdYSJ 2015.79933830
|
||||
sleep 3
|
||||
echo "2015.79933830 <- expected amount RDqaDbfFHrnPAnyLY6b9A3CFZZjivhdYSJ"
|
||||
|
||||
# RBGX2Z43Fiey6tkgRCL9rzc3gNhdcvQyzf KMD 48415.76246875
|
||||
./komodo-cli sendtoaddress RBGX2Z43Fiey6tkgRCL9rzc3gNhdcvQyzf 48415.76246875
|
||||
sleep 3
|
||||
echo "48415.76246875 <- expected amount RBGX2Z43Fiey6tkgRCL9rzc3gNhdcvQyzf"
|
||||
|
||||
# RWdo833bYVhMUHRdr8hMs7HHVcG2UNPwcZ KMD 7885.04483652
|
||||
./komodo-cli sendtoaddress RWdo833bYVhMUHRdr8hMs7HHVcG2UNPwcZ 7885.04483652
|
||||
sleep 3
|
||||
echo "7885.04483652 <- expected amount RWdo833bYVhMUHRdr8hMs7HHVcG2UNPwcZ"
|
||||
|
||||
# RVUby7nAZAEKQc1mNu89KGchwgVN6H74Pb KMD 2076.57141858
|
||||
./komodo-cli sendtoaddress RVUby7nAZAEKQc1mNu89KGchwgVN6H74Pb 2076.57141858
|
||||
sleep 3
|
||||
echo "2076.57141858 <- expected amount RVUby7nAZAEKQc1mNu89KGchwgVN6H74Pb"
|
||||
|
||||
# RY5qhTwDGWQy4LsG2M3R8zyJz51KaMgCLW KMD 55892.82951156, REVS 1070.41924580
|
||||
# RY5qhTwDGWQy4LsG2M3R8zyJz51KaMgCLW KMD 55892.82951156
|
||||
./komodo-cli sendtoaddress RY5qhTwDGWQy4LsG2M3R8zyJz51KaMgCLW 55892.82951156
|
||||
sleep 3
|
||||
echo "55892.82951156 <- expected amount RY5qhTwDGWQy4LsG2M3R8zyJz51KaMgCLW"
|
||||
|
||||
# RPAueErz2MDLv1T4VNVRkkWRPmUKDXxNyW KMD 110983.78643539
|
||||
./komodo-cli sendtoaddress RPAueErz2MDLv1T4VNVRkkWRPmUKDXxNyW 110983.78643539
|
||||
sleep 3
|
||||
echo "110983.78643539 <- expected amount RPAueErz2MDLv1T4VNVRkkWRPmUKDXxNyW"
|
||||
|
||||
# RQ2pMNHbPGagXKQoVzrgF2o718GmP7A74Z KMD 135104.07865436
|
||||
./komodo-cli sendtoaddress RQ2pMNHbPGagXKQoVzrgF2o718GmP7A74Z 135104.07865436
|
||||
sleep 3
|
||||
echo "135104.07865436 <- expected amount RQ2pMNHbPGagXKQoVzrgF2o718GmP7A74Z"
|
||||
|
||||
# RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3 KMD 8376.94442691
|
||||
./komodo-cli sendtoaddress RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3 8376.94442691
|
||||
sleep 3
|
||||
echo "8376.94442691 <- expected amount RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3"
|
||||
|
||||
# RHSA9ocZc77tHiFvVQ2h26AJQFsionWAXK KMD 47849.00411034
|
||||
./komodo-cli sendtoaddress RHSA9ocZc77tHiFvVQ2h26AJQFsionWAXK 47849.00411034
|
||||
sleep 3
|
||||
echo "47849.00411034 <- expected amount RHSA9ocZc77tHiFvVQ2h26AJQFsionWAXK"
|
||||
|
||||
# RS8F3LcQ8DUSoBacUKBKzMR2Wxe3hCSToY KMD 15163.82967582
|
||||
./komodo-cli sendtoaddress RS8F3LcQ8DUSoBacUKBKzMR2Wxe3hCSToY 15163.82967582
|
||||
sleep 3
|
||||
echo "15163.82967582 <- expected amount RS8F3LcQ8DUSoBacUKBKzMR2Wxe3hCSToY"
|
||||
|
||||
# RLijku3v2wyCcGykdbsUViqDCNaVkVkQpc KMD 3002.22564175
|
||||
./komodo-cli sendtoaddress RLijku3v2wyCcGykdbsUViqDCNaVkVkQpc 3002.22564175
|
||||
sleep 3
|
||||
echo "3002.22564175 <- expected amount RLijku3v2wyCcGykdbsUViqDCNaVkVkQpc"
|
||||
|
||||
# RMeaeKG7vrTpryBGVEWQ8twjQDnRVAhpqH KMD 14101.70011189
|
||||
./komodo-cli sendtoaddress RMeaeKG7vrTpryBGVEWQ8twjQDnRVAhpqH 14101.70011189
|
||||
sleep 3
|
||||
echo "14101.70011189 <- expected amount RMeaeKG7vrTpryBGVEWQ8twjQDnRVAhpqH"
|
||||
|
||||
# RUDEQESpyWvpwdfrieiBoNo93WHaKhGxGf KMD 5832.55634776
|
||||
./komodo-cli sendtoaddress RUDEQESpyWvpwdfrieiBoNo93WHaKhGxGf 5832.55634776
|
||||
sleep 3
|
||||
echo "5832.55634776 <- expected amount RUDEQESpyWvpwdfrieiBoNo93WHaKhGxGf"
|
||||
|
||||
# RMat1mSDDigFHhVL74mjBia9uHo5w24MLQ KMD 890.85002942
|
||||
./komodo-cli sendtoaddress RMat1mSDDigFHhVL74mjBia9uHo5w24MLQ 890.85002942
|
||||
sleep 3
|
||||
echo "890.85002942 <- expected amount RMat1mSDDigFHhVL74mjBia9uHo5w24MLQ"
|
||||
|
||||
# RMx1MCvzuaiuRpS3rXV4LURWgZVRnLJCYK KMD 335.54240549, REVS 6.65853993
|
||||
# RMx1MCvzuaiuRpS3rXV4LURWgZVRnLJCYK KMD 335.54240549
|
||||
./komodo-cli sendtoaddress RMx1MCvzuaiuRpS3rXV4LURWgZVRnLJCYK 335.54240549
|
||||
sleep 3
|
||||
echo "335.54240549 <- expected amount RMx1MCvzuaiuRpS3rXV4LURWgZVRnLJCYK"
|
||||
|
||||
# RVcMp4KgwCg6GnUJAAU2dmCvPjAa9JrEds KMD 19366.30498750
|
||||
./komodo-cli sendtoaddress RVcMp4KgwCg6GnUJAAU2dmCvPjAa9JrEds 19366.30498750
|
||||
sleep 3
|
||||
echo "19366.30498750 <- expected amount RVcMp4KgwCg6GnUJAAU2dmCvPjAa9JrEds"
|
||||
|
||||
# RNdQAbnuehuF5RnYiaLkWoWktpaxzfvNXh KMD 163589.49612623, REVS 3245.93000000
|
||||
# RNdQAbnuehuF5RnYiaLkWoWktpaxzfvNXh KMD 163589.49612623
|
||||
./komodo-cli sendtoaddress RNdQAbnuehuF5RnYiaLkWoWktpaxzfvNXh 163589.49612623
|
||||
sleep 3
|
||||
echo "163589.49612623 <- expected amount RNdQAbnuehuF5RnYiaLkWoWktpaxzfvNXh"
|
||||
|
||||
# RB1j3QidCF9PTKQaZMGKe6Hzm5jdY8Mzus KMD 3873.26099750
|
||||
./komodo-cli sendtoaddress RB1j3QidCF9PTKQaZMGKe6Hzm5jdY8Mzus 3873.26099750
|
||||
sleep 3
|
||||
echo "3873.26099750 <- expected amount RB1j3QidCF9PTKQaZMGKe6Hzm5jdY8Mzus"
|
||||
|
||||
# RFcH8p3Ke5y4UL3pdL9KCkJWp3aRdBwWpg KMD 7746.52199500
|
||||
./komodo-cli sendtoaddress RFcH8p3Ke5y4UL3pdL9KCkJWp3aRdBwWpg 7746.52199500
|
||||
sleep 3
|
||||
echo "7746.52199500 <- expected amount RFcH8p3Ke5y4UL3pdL9KCkJWp3aRdBwWpg"
|
||||
|
||||
# RJDkJJd66n4Q4jVWbZJQKyXTf29ZqzeXac KMD 16670.51967129
|
||||
./komodo-cli sendtoaddress RJDkJJd66n4Q4jVWbZJQKyXTf29ZqzeXac 16670.51967129
|
||||
sleep 3
|
||||
echo "16670.51967129 <- expected amount RJDkJJd66n4Q4jVWbZJQKyXTf29ZqzeXac"
|
||||
|
||||
# RKzELkcNJu4g9DWQsFFeQtFZQE5u9vevuK KMD 7746.52199500
|
||||
./komodo-cli sendtoaddress RKzELkcNJu4g9DWQsFFeQtFZQE5u9vevuK 7746.52199500
|
||||
sleep 3
|
||||
echo "7746.52199500 <- expected amount RKzELkcNJu4g9DWQsFFeQtFZQE5u9vevuK"
|
||||
|
||||
# RKpUFnxUn9mJCZmNECEQT7xEubHECUPCem KMD 74455.81274009
|
||||
./komodo-cli sendtoaddress RKpUFnxUn9mJCZmNECEQT7xEubHECUPCem 74455.81274009
|
||||
sleep 3
|
||||
echo "74455.81274009 <- expected amount RKpUFnxUn9mJCZmNECEQT7xEubHECUPCem"
|
||||
|
||||
# RXX1kbdye39h9g7oFnP6cMZ6EEePCPRYnc KMD 98858.55994787, REVS 1384.95819177
|
||||
# RXX1kbdye39h9g7oFnP6cMZ6EEePCPRYnc KMD 98858.55994787
|
||||
./komodo-cli sendtoaddress RXX1kbdye39h9g7oFnP6cMZ6EEePCPRYnc 98858.55994787
|
||||
sleep 3
|
||||
echo "98858.55994787 <- expected amount RXX1kbdye39h9g7oFnP6cMZ6EEePCPRYnc"
|
||||
|
||||
# RUV5xgcHVavuxKkvMduhjXPVKA7oa1QCK9 KMD 5226.14889591, REVS 103.72248253
|
||||
# RUV5xgcHVavuxKkvMduhjXPVKA7oa1QCK9 KMD 5226.14889591
|
||||
./komodo-cli sendtoaddress RUV5xgcHVavuxKkvMduhjXPVKA7oa1QCK9 5226.14889591
|
||||
sleep 3
|
||||
echo "5226.14889591 <- expected amount RUV5xgcHVavuxKkvMduhjXPVKA7oa1QCK9"
|
||||
|
||||
# RBtfFBdYiryB6fyWoubm4XNqZwXqzAbJEK KMD 753.34926401
|
||||
./komodo-cli sendtoaddress RBtfFBdYiryB6fyWoubm4XNqZwXqzAbJEK 753.34926401
|
||||
sleep 3
|
||||
echo "753.34926401 <- expected amount RBtfFBdYiryB6fyWoubm4XNqZwXqzAbJEK"
|
||||
|
||||
# RGFv6LBE1xgiu34SqSh6wjn3fpr973sREK KMD 159251.95713851, REVS 3160.13095281
|
||||
# RGFv6LBE1xgiu34SqSh6wjn3fpr973sREK KMD 159251.95713851
|
||||
./komodo-cli sendtoaddress RGFv6LBE1xgiu34SqSh6wjn3fpr973sREK 159251.95713851
|
||||
sleep 3
|
||||
echo "159251.95713851 <- expected amount RGFv6LBE1xgiu34SqSh6wjn3fpr973sREK"
|
||||
|
||||
# RAaszCNodXXu9rJL6qqVMZDykXncDecTMS KMD 693.08132289
|
||||
./komodo-cli sendtoaddress RAaszCNodXXu9rJL6qqVMZDykXncDecTMS 693.08132289
|
||||
sleep 3
|
||||
echo "693.08132289 <- expected amount RAaszCNodXXu9rJL6qqVMZDykXncDecTMS"
|
||||
|
||||
# RT1xC82iwXtZeDLLYz3tgQRCHKsRD62Jt5 KMD 2304.59029350
|
||||
./komodo-cli sendtoaddress RT1xC82iwXtZeDLLYz3tgQRCHKsRD62Jt5 2304.59029350
|
||||
sleep 3
|
||||
echo "2304.59029350 <- expected amount RT1xC82iwXtZeDLLYz3tgQRCHKsRD62Jt5"
|
||||
|
||||
# RGPEHHmPFaMPSLMQxEao2uVPTfN8vBCmym KMD 6506.14889316
|
||||
./komodo-cli sendtoaddress RGPEHHmPFaMPSLMQxEao2uVPTfN8vBCmym 6506.14889316
|
||||
sleep 3
|
||||
echo "6506.14889316 <- expected amount RGPEHHmPFaMPSLMQxEao2uVPTfN8vBCmym"
|
||||
|
||||
# RBUEoAzoydjckYewPsW2kfTr8TGFgnR2Ec KMD 38732.60997500
|
||||
./komodo-cli sendtoaddress RBUEoAzoydjckYewPsW2kfTr8TGFgnR2Ec 38732.60997500
|
||||
sleep 3
|
||||
echo "38732.60997500 <- expected amount RBUEoAzoydjckYewPsW2kfTr8TGFgnR2Ec"
|
||||
|
||||
# RVQS9NGKsbBJuKDhJnPssTRevrE428dxDK KMD 916.79536397
|
||||
./komodo-cli sendtoaddress RVQS9NGKsbBJuKDhJnPssTRevrE428dxDK 916.79536397
|
||||
sleep 3
|
||||
echo "916.79536397 <- expected amount RVQS9NGKsbBJuKDhJnPssTRevrE428dxDK"
|
||||
|
||||
# RHiUqYUohv49bvB2wbDe1mAkwyEFwUEnrb KMD 48415.76246875
|
||||
./komodo-cli sendtoaddress RHiUqYUohv49bvB2wbDe1mAkwyEFwUEnrb 48415.76246875
|
||||
sleep 3
|
||||
echo "48415.76246875 <- expected amount RHiUqYUohv49bvB2wbDe1mAkwyEFwUEnrb"
|
||||
|
||||
# RSWPtfGaHPL1g7SMqbLm1YZ8o3QM6krzo1 KMD 16542.25810519
|
||||
./komodo-cli sendtoaddress RSWPtfGaHPL1g7SMqbLm1YZ8o3QM6krzo1 16542.25810519
|
||||
sleep 3
|
||||
echo "16542.25810519 <- expected amount RSWPtfGaHPL1g7SMqbLm1YZ8o3QM6krzo1"
|
||||
|
||||
# RFMcTK36Wzjo5QEk1wAH2CbATqsYvzgwXH KMD 2322923.09575692
|
||||
./komodo-cli sendtoaddress RFMcTK36Wzjo5QEk1wAH2CbATqsYvzgwXH 2322923.09575692
|
||||
sleep 3
|
||||
echo "2322923.09575692 <- expected amount RFMcTK36Wzjo5QEk1wAH2CbATqsYvzgwXH"
|
||||
|
||||
# RQFihaDjPvCwhENGhB163D7e8Wc8LURtKq KMD 28529.48507541, REVS 566.06461415
|
||||
# RQFihaDjPvCwhENGhB163D7e8Wc8LURtKq KMD 28529.48507541
|
||||
./komodo-cli sendtoaddress RQFihaDjPvCwhENGhB163D7e8Wc8LURtKq 28529.48507541
|
||||
sleep 3
|
||||
echo "28529.48507541 <- expected amount RQFihaDjPvCwhENGhB163D7e8Wc8LURtKq"
|
||||
|
||||
# RDjm2Xec5UTWiz3Yku8sUce8ZWxe8mTh72 KMD 8637.01756743, REVS 171.30000000
|
||||
# RDjm2Xec5UTWiz3Yku8sUce8ZWxe8mTh72 KMD 8637.01756743
|
||||
./komodo-cli sendtoaddress RDjm2Xec5UTWiz3Yku8sUce8ZWxe8mTh72 8637.01756743
|
||||
sleep 3
|
||||
echo "8637.01756743 <- expected amount RDjm2Xec5UTWiz3Yku8sUce8ZWxe8mTh72"
|
||||
|
||||
# RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf KMD 1212.26932063
|
||||
./komodo-cli sendtoaddress RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf 1212.26932063
|
||||
sleep 3
|
||||
echo "1212.26932063 <- expected amount RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf"
|
||||
|
||||
# RBD72Bh4wxGi8q8xQbLfwMF2RAkTZ7sVZT KMD 32148.06627925
|
||||
./komodo-cli sendtoaddress RBD72Bh4wxGi8q8xQbLfwMF2RAkTZ7sVZT 32148.06627925
|
||||
sleep 3
|
||||
echo "32148.06627925 <- expected amount RBD72Bh4wxGi8q8xQbLfwMF2RAkTZ7sVZT"
|
||||
|
||||
# RVih8N9Qh1jf4CCF5ySsAY8DR42eTxYqpB KMD 1924.55258644
|
||||
./komodo-cli sendtoaddress RVih8N9Qh1jf4CCF5ySsAY8DR42eTxYqpB 1924.55258644
|
||||
sleep 3
|
||||
echo "1924.55258644 <- expected amount RVih8N9Qh1jf4CCF5ySsAY8DR42eTxYqpB"
|
||||
|
||||
# RWez2L8rPoTmqj8kYKqxLdeD9BFuDibMyJ KMD 44542.50147125
|
||||
./komodo-cli sendtoaddress RWez2L8rPoTmqj8kYKqxLdeD9BFuDibMyJ 44542.50147125
|
||||
sleep 3
|
||||
echo "44542.50147125 <- expected amount RWez2L8rPoTmqj8kYKqxLdeD9BFuDibMyJ"
|
||||
|
||||
# RUuWvTwNAMGLpuY3GLPBAmMp8ptShkMSyN KMD 49199.88128813
|
||||
./komodo-cli sendtoaddress RUuWvTwNAMGLpuY3GLPBAmMp8ptShkMSyN 49199.88128813
|
||||
sleep 3
|
||||
echo "49199.88128813 <- expected amount RUuWvTwNAMGLpuY3GLPBAmMp8ptShkMSyN"
|
||||
|
||||
# RRTks3iwSe4oR3UDmRfGszcNcfAv6Rb5es KMD 30170.24616125
|
||||
./komodo-cli sendtoaddress RRTks3iwSe4oR3UDmRfGszcNcfAv6Rb5es 30170.24616125
|
||||
sleep 3
|
||||
echo "30170.24616125 <- expected amount RRTks3iwSe4oR3UDmRfGszcNcfAv6Rb5es"
|
||||
|
||||
|
||||
# total KMD 3766464.62433496 REVS 0.00000000
|
||||
@@ -1,94 +0,0 @@
|
||||
[{"txid":"8f7d4648657dd7f8aa70d8e83539ae0592cbfafc6a961fe75d7f7f613b4d5737","vout":1,"address":"RSVzs8BLvCrmvNF1MbqEpAwx9VHinmAxDg","account":"RSVzs8BLvCrmvNF1MbqEpAwx9VHinmAxDg","scriptPubKey":"76a914bce62f65cb5f01e0f4c63fc3500d524aa599842e88ac","amount":5669.98491054,"interest":0,"confirmations":5,"spendable":false}]
|
||||
5669.98491054 <- expected amount RSVzs8BLvCrmvNF1MbqEpAwx9VHinmAxDg
|
||||
[{"txid":"0f5681bbc1441e39cd3226847e3863489bc3ffe6b00c161e453a897b6a4e1268","vout":1,"address":"RXbWQbnpsQ3iSBBj5bn2HDq3WvqRPJg5Ek","account":"RXbWQbnpsQ3iSBBj5bn2HDq3WvqRPJg5Ek","scriptPubKey":"76a914f4c98e0c09a9f1383baff8ce0480680987598fb588ac","amount":8353.36815152,"interest":0,"confirmations":5,"spendable":false}]
|
||||
8353.36815152 <- expected amount RXbWQbnpsQ3iSBBj5bn2HDq3WvqRPJg5Ek
|
||||
[{"txid":"34cfb92756c33c9fc2b0f1126884044711a83a6deb05c8b38cc744b7a87f34f5","vout":1,"address":"RKCDBxUx7mbCnViLt423jdLt6oNpW7SH7z","account":"RKCDBxUx7mbCnViLt423jdLt6oNpW7SH7z","scriptPubKey":"76a9146cc01b01968437e4ee0929cd0ef1fab0a281fd7588ac","amount":9683.15249375,"interest":0,"confirmations":5,"spendable":false}]
|
||||
9683.15249375 <- expected amount RKCDBxUx7mbCnViLt423jdLt6oNpW7SH7z
|
||||
[{"txid":"cad96a82897ec8d240bb410a1c1b54922444d7bc6383ef31ae153646d4cb0837","vout":1,"address":"RLqqYX4oMVz6c6s52bLnYdfi9qZ56bEK3W","account":"RLqqYX4oMVz6c6s52bLnYdfi9qZ56bEK3W","scriptPubKey":"76a9147ed5f815cc22ca78fee2667281ca7e5ba14ce1e188ac","amount":43088.74729573,"interest":0,"confirmations":5,"spendable":false}]
|
||||
43088.74729573 <- expected amount RLqqYX4oMVz6c6s52bLnYdfi9qZ56bEK3W
|
||||
[{"txid":"ccef457f43908a2f18c86c3c1431a9b3857263413a756ca46117655fae2acec3","vout":1,"address":"RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct","account":"RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct","scriptPubKey":"76a914aeb33755d5b9797988f0ab88e00765521e10bf4388ac","amount":50806.03038250,"interest":0,"confirmations":5,"spendable":false}]
|
||||
50806.03038250 <- expected amount RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct
|
||||
[{"txid":"216f60dff778c0701def1ea8eb582959591369c7a67864bf2ef20ca99178138b","vout":1,"address":"RDqaDbfFHrnPAnyLY6b9A3CFZZjivhdYSJ","account":"RDqaDbfFHrnPAnyLY6b9A3CFZZjivhdYSJ","scriptPubKey":"76a91432004b7f51c97bf9f8de8dfb65a6403f3e7afc4e88ac","amount":2015.79933830,"interest":0,"confirmations":5,"spendable":false}]
|
||||
2015.79933830 <- expected amount RDqaDbfFHrnPAnyLY6b9A3CFZZjivhdYSJ
|
||||
[{"txid":"96e0916f1598824cfa1e2a590a0dc683be93c6fa8dbffb6153b341906de84398","vout":1,"address":"RBGX2Z43Fiey6tkgRCL9rzc3gNhdcvQyzf","account":"RBGX2Z43Fiey6tkgRCL9rzc3gNhdcvQyzf","scriptPubKey":"76a91415cfa7431eb88b3caf584f9d3ba0d95672ac8d9588ac","amount":48415.76246875,"interest":0,"confirmations":5,"spendable":false}]
|
||||
48415.76246875 <- expected amount RBGX2Z43Fiey6tkgRCL9rzc3gNhdcvQyzf
|
||||
[{"txid":"e0b44fb9e74984823a307c82b70ddb7a173976fa43aec61440d9cd53654a8e93","vout":1,"address":"RWdo833bYVhMUHRdr8hMs7HHVcG2UNPwcZ","account":"RWdo833bYVhMUHRdr8hMs7HHVcG2UNPwcZ","scriptPubKey":"76a914ea4036a775293e12177fc8da78018cd96efceee588ac","amount":7885.04483652,"interest":0,"confirmations":5,"spendable":false}]
|
||||
7885.04483652 <- expected amount RWdo833bYVhMUHRdr8hMs7HHVcG2UNPwcZ
|
||||
[{"txid":"6bff9d66cafe0f249de24a6be6312f75ea97cce10c40bd2ffd4a785758787782","vout":1,"address":"RVUby7nAZAEKQc1mNu89KGchwgVN6H74Pb","account":"RVUby7nAZAEKQc1mNu89KGchwgVN6H74Pb","scriptPubKey":"76a914dd8b088a2f59c370cc1c76f1d301b30ddaacd87988ac","amount":2076.57141858,"interest":0,"confirmations":5,"spendable":false}]
|
||||
2076.57141858 <- expected amount RVUby7nAZAEKQc1mNu89KGchwgVN6H74Pb
|
||||
[{"txid":"d4c509d86d3ddeb3be1ea733e2c79c816c0639f3ba1738d1f50140915292949e","vout":1,"address":"RY5qhTwDGWQy4LsG2M3R8zyJz51KaMgCLW","account":"RY5qhTwDGWQy4LsG2M3R8zyJz51KaMgCLW","scriptPubKey":"76a914fa254e0f7b117ba261287a1fbdbaff863f6c0def88ac","amount":55892.82951156,"interest":0,"confirmations":5,"spendable":false}]
|
||||
55892.82951156 <- expected amount RY5qhTwDGWQy4LsG2M3R8zyJz51KaMgCLW
|
||||
[{"txid":"615c5efe7cbddd2e07d2282d215f307cbdc7e102ce4e3c1e134b96086736e459","vout":1,"address":"RPAueErz2MDLv1T4VNVRkkWRPmUKDXxNyW","account":"RPAueErz2MDLv1T4VNVRkkWRPmUKDXxNyW","scriptPubKey":"76a91498618b98162f7da185026e19bbb809eaafcae73e88ac","amount":110983.78643539,"interest":0,"confirmations":5,"spendable":false}]
|
||||
110983.78643539 <- expected amount RPAueErz2MDLv1T4VNVRkkWRPmUKDXxNyW
|
||||
[{"txid":"1baad4f5d826832d13b0ddc7379b7235a38caa42b5098f273811109b974a6dbf","vout":1,"address":"RQ2pMNHbPGagXKQoVzrgF2o718GmP7A74Z","account":"RQ2pMNHbPGagXKQoVzrgF2o718GmP7A74Z","scriptPubKey":"76a914a1d1ed4034395692262717011245ef6ca4656bff88ac","amount":135104.07865436,"interest":0,"confirmations":5,"spendable":false}]
|
||||
135104.07865436 <- expected amount RQ2pMNHbPGagXKQoVzrgF2o718GmP7A74Z
|
||||
[{"txid":"c70b43c915aac7f917026d6229f5a7ce15184de37ed5f8aa4756d8416a3cde70","vout":1,"address":"RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3","account":"RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3","scriptPubKey":"76a91433dab4ba613013fc625b8a8f13dfa24ac871a57788ac","amount":8376.94442691,"interest":0,"confirmations":5,"spendable":false}, {"txid":"6adda35ccf807130e1e184ec3be431cbca497891cfdaf2413b8f0758cb77a882","vout":1,"address":"RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3","account":"RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3","scriptPubKey":"76a91433dab4ba613013fc625b8a8f13dfa24ac871a57788ac","amount":57862.44847739,"interest":22.96128907,"confirmations":4057,"spendable":false}]
|
||||
8376.94442691 <- expected amount RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3
|
||||
[]
|
||||
47849.00411034 <- expected amount RHSA9ocZc77tHiFvVQ2h26AJQFsionWAXK
|
||||
[{"txid":"4b08e4b3ea8608e97d8ccdd30c4785f03c443002127269c1936134c9f2cc717d","vout":1,"address":"RS8F3LcQ8DUSoBacUKBKzMR2Wxe3hCSToY","account":"RS8F3LcQ8DUSoBacUKBKzMR2Wxe3hCSToY","scriptPubKey":"76a914b8c8de1b8beca01347543b52bd6314323a9c468388ac","amount":15163.82967582,"interest":0,"confirmations":4,"spendable":false}]
|
||||
15163.82967582 <- expected amount RS8F3LcQ8DUSoBacUKBKzMR2Wxe3hCSToY
|
||||
[{"txid":"d2c320a2fafa054cd166b331937fd5fe005f07ec02f9fd5977ca466ed663d0eb","vout":1,"address":"RLijku3v2wyCcGykdbsUViqDCNaVkVkQpc","account":"RLijku3v2wyCcGykdbsUViqDCNaVkVkQpc","scriptPubKey":"76a9147d7e3a1a75ab78d63ec73d979ab8ca24ff2d5c7a88ac","amount":3002.22564175,"interest":0,"confirmations":4,"spendable":false}]
|
||||
3002.22564175 <- expected amount RLijku3v2wyCcGykdbsUViqDCNaVkVkQpc
|
||||
[{"txid":"cf93b70a0ff58ec115c03e0a395a5b413610437f40bd496707ae426df1a46aa8","vout":1,"address":"RMeaeKG7vrTpryBGVEWQ8twjQDnRVAhpqH","account":"RMeaeKG7vrTpryBGVEWQ8twjQDnRVAhpqH","scriptPubKey":"76a91487ad14d2d8541588ad37d918c05d0bdf3fcc407c88ac","amount":14101.70011189,"interest":0,"confirmations":4,"spendable":false}]
|
||||
14101.70011189 <- expected amount RMeaeKG7vrTpryBGVEWQ8twjQDnRVAhpqH
|
||||
[{"txid":"6be9eb9a87781ebcbd633946c891b98499001d38c934e827371a7b79d57b0de0","vout":1,"address":"RUDEQESpyWvpwdfrieiBoNo93WHaKhGxGf","account":"RUDEQESpyWvpwdfrieiBoNo93WHaKhGxGf","scriptPubKey":"76a914cfaaaa3947506b277a17144094d7c4e6f897ab7188ac","amount":5832.55634776,"interest":0,"confirmations":4,"spendable":false}]
|
||||
5832.55634776 <- expected amount RUDEQESpyWvpwdfrieiBoNo93WHaKhGxGf
|
||||
[{"txid":"e63deddaf983e5cf537f34b9777a65f001f4dda5bb86dc8b1c8f5d0ead105435","vout":1,"address":"RMat1mSDDigFHhVL74mjBia9uHo5w24MLQ","account":"RMat1mSDDigFHhVL74mjBia9uHo5w24MLQ","scriptPubKey":"76a91486f9eac811c22a9a788fd04492410b3c8a92312588ac","amount":890.85002942,"interest":0,"confirmations":4,"spendable":false}]
|
||||
890.85002942 <- expected amount RMat1mSDDigFHhVL74mjBia9uHo5w24MLQ
|
||||
[{"txid":"f382d7ec4a9f9cf4283776449521e6c2c73a44863f119a6fa3ddd319c042f08c","vout":1,"address":"RMx1MCvzuaiuRpS3rXV4LURWgZVRnLJCYK","account":"RMx1MCvzuaiuRpS3rXV4LURWgZVRnLJCYK","scriptPubKey":"76a9148af8c680a740a56a5b2d33ab4cef75ee373514cb88ac","amount":335.54240549,"interest":0,"confirmations":4,"spendable":false}]
|
||||
335.54240549 <- expected amount RMx1MCvzuaiuRpS3rXV4LURWgZVRnLJCYK
|
||||
[{"txid":"f04aaada09059b8df995cf29c7f6d0c7ca20ed7e70d698bd21df1e61c70d2cca","vout":1,"address":"RVcMp4KgwCg6GnUJAAU2dmCvPjAa9JrEds","account":"RVcMp4KgwCg6GnUJAAU2dmCvPjAa9JrEds","scriptPubKey":"76a914df028b470266daed9d80b585bcfc49799e65d69288ac","amount":19366.30498750,"interest":0,"confirmations":4,"spendable":false}]
|
||||
19366.30498750 <- expected amount RVcMp4KgwCg6GnUJAAU2dmCvPjAa9JrEds
|
||||
[{"txid":"8496fcbe66360a2753f1795dc4b0bb1a93fa121de4b521410e046611bc04f2e5","vout":1,"address":"RNdQAbnuehuF5RnYiaLkWoWktpaxzfvNXh","account":"RNdQAbnuehuF5RnYiaLkWoWktpaxzfvNXh","scriptPubKey":"76a914926c0b7176412519172564ff1ad129575c55560d88ac","amount":163589.49612623,"interest":0,"confirmations":4,"spendable":false}]
|
||||
163589.49612623 <- expected amount RNdQAbnuehuF5RnYiaLkWoWktpaxzfvNXh
|
||||
[{"txid":"9b3e499b36112979a084534143826776699b2a5def69e656d7aa7dc98a381501","vout":1,"address":"RB1j3QidCF9PTKQaZMGKe6Hzm5jdY8Mzus","account":"RB1j3QidCF9PTKQaZMGKe6Hzm5jdY8Mzus","scriptPubKey":"76a91413037180179f82080f6aaadaeef8d9292462613988ac","amount":3873.26099750,"interest":0,"confirmations":4,"spendable":false}]
|
||||
3873.26099750 <- expected amount RB1j3QidCF9PTKQaZMGKe6Hzm5jdY8Mzus
|
||||
[{"txid":"17e55956fe10117b7e65a272fed473efa2dd387ab794932eebb9924e434719f0","vout":1,"address":"RFcH8p3Ke5y4UL3pdL9KCkJWp3aRdBwWpg","account":"RFcH8p3Ke5y4UL3pdL9KCkJWp3aRdBwWpg","scriptPubKey":"76a914456ce1134c5d03c560d89e8e3b7793c2aa72de2888ac","amount":7746.52199500,"interest":0,"confirmations":4,"spendable":false}]
|
||||
7746.52199500 <- expected amount RFcH8p3Ke5y4UL3pdL9KCkJWp3aRdBwWpg
|
||||
[{"txid":"4499caf8325016189dc4cbaf102d3c5a358105c135defd90afbc000fbed92795","vout":1,"address":"RJDkJJd66n4Q4jVWbZJQKyXTf29ZqzeXac","account":"RJDkJJd66n4Q4jVWbZJQKyXTf29ZqzeXac","scriptPubKey":"76a91462125d512b346307062b4765c7a31c97a2e5009b88ac","amount":16670.51967129,"interest":0,"confirmations":4,"spendable":false}]
|
||||
16670.51967129 <- expected amount RJDkJJd66n4Q4jVWbZJQKyXTf29ZqzeXac
|
||||
[{"txid":"41d0583c6f0720b27976f717d729c7445e10264b0663af6baa43e2ad0fe5fff0","vout":1,"address":"RKzELkcNJu4g9DWQsFFeQtFZQE5u9vevuK","account":"RKzELkcNJu4g9DWQsFFeQtFZQE5u9vevuK","scriptPubKey":"76a91475743379e40aef621dd016895b2b6ac6fc0f249e88ac","amount":7746.52199500,"interest":0,"confirmations":4,"spendable":false}]
|
||||
7746.52199500 <- expected amount RKzELkcNJu4g9DWQsFFeQtFZQE5u9vevuK
|
||||
[{"txid":"eb979d5a6d79b6e0466fc3dbdd2a2f73812fb5788bfcad2b160da1e1b96828c5","vout":1,"address":"RKpUFnxUn9mJCZmNECEQT7xEubHECUPCem","account":"RKpUFnxUn9mJCZmNECEQT7xEubHECUPCem","scriptPubKey":"76a914739ba81d02c31e35940325047864f6cdd03949ae88ac","amount":74455.81274009,"interest":0,"confirmations":4,"spendable":false}]
|
||||
74455.81274009 <- expected amount RKpUFnxUn9mJCZmNECEQT7xEubHECUPCem
|
||||
[{"txid":"2ec16b1596c2daa8d14642478d0ad6e6fa5d143980794f1c717c4e7ba2765749","vout":1,"address":"RXX1kbdye39h9g7oFnP6cMZ6EEePCPRYnc","account":"RXX1kbdye39h9g7oFnP6cMZ6EEePCPRYnc","scriptPubKey":"76a914f3eff889cfe08d87c71c28e3af5ff038a26c6cda88ac","amount":98858.55994787,"interest":0,"confirmations":4,"spendable":false}]
|
||||
98858.55994787 <- expected amount RXX1kbdye39h9g7oFnP6cMZ6EEePCPRYnc
|
||||
[{"txid":"4d59bf3a6dcd11242c3a7c20402c38e41fb8f936d63e0c5b3f6490248fd989ed","vout":1,"address":"RUV5xgcHVavuxKkvMduhjXPVKA7oa1QCK9","account":"RUV5xgcHVavuxKkvMduhjXPVKA7oa1QCK9","scriptPubKey":"76a914d2aa464906f8b040486709d266b6ae2d5d6cae4b88ac","amount":5226.14889591,"interest":0,"confirmations":4,"spendable":false}]
|
||||
5226.14889591 <- expected amount RUV5xgcHVavuxKkvMduhjXPVKA7oa1QCK9
|
||||
[{"txid":"505e5b9d3e9ac0ee9a435e7fdb9819b53fd1169fceb9c6e4b3b2173031beac16","vout":1,"address":"RBtfFBdYiryB6fyWoubm4XNqZwXqzAbJEK","account":"RBtfFBdYiryB6fyWoubm4XNqZwXqzAbJEK","scriptPubKey":"76a9141ca57ce3280d8ee671d16fd5258dfdc0cab1e4b288ac","amount":753.34926401,"interest":0,"confirmations":4,"spendable":false}]
|
||||
753.34926401 <- expected amount RBtfFBdYiryB6fyWoubm4XNqZwXqzAbJEK
|
||||
[{"txid":"b2243873085e98d346e3f2341a203c3644f1fb78fe60294f5838eff96f2121dd","vout":1,"address":"RGFv6LBE1xgiu34SqSh6wjn3fpr973sREK","account":"RGFv6LBE1xgiu34SqSh6wjn3fpr973sREK","scriptPubKey":"76a9144c8b1ec101418919761e57a213a0f036d4a1cc8588ac","amount":159251.95713851,"interest":0,"confirmations":4,"spendable":false}]
|
||||
159251.95713851 <- expected amount RGFv6LBE1xgiu34SqSh6wjn3fpr973sREK
|
||||
[{"txid":"75740f609901350eebc9493aff3dcfb070e107b493a2b51aa1acccfb9dedd88c","vout":1,"address":"RAaszCNodXXu9rJL6qqVMZDykXncDecTMS","account":"RAaszCNodXXu9rJL6qqVMZDykXncDecTMS","scriptPubKey":"76a9140e5082ca36cc024a4dca642c987ac4dd5947800988ac","amount":693.08132289,"interest":0,"confirmations":4,"spendable":false}]
|
||||
693.08132289 <- expected amount RAaszCNodXXu9rJL6qqVMZDykXncDecTMS
|
||||
[{"txid":"9beeaaa5dd83e3967f35d60073f88a320276e7a3aa61a4a06b7f8b46079fa4b4","vout":1,"address":"RT1xC82iwXtZeDLLYz3tgQRCHKsRD62Jt5","account":"RT1xC82iwXtZeDLLYz3tgQRCHKsRD62Jt5","scriptPubKey":"76a914c2906ee2992a7faf8071f21e1055fbdff2f0ec1888ac","amount":2304.59029350,"interest":0,"confirmations":4,"spendable":false}]
|
||||
2304.59029350 <- expected amount RT1xC82iwXtZeDLLYz3tgQRCHKsRD62Jt5
|
||||
[{"txid":"b7508390ec18fc559112de1f5ddcd6f27c74f9a41415ae97c89b01c6718afc64","vout":1,"address":"RGPEHHmPFaMPSLMQxEao2uVPTfN8vBCmym","account":"RGPEHHmPFaMPSLMQxEao2uVPTfN8vBCmym","scriptPubKey":"76a9144ded37191110ece533642022e4f111704a4b7e2388ac","amount":6506.14889316,"interest":0,"confirmations":4,"spendable":false}]
|
||||
6506.14889316 <- expected amount RGPEHHmPFaMPSLMQxEao2uVPTfN8vBCmym
|
||||
[{"txid":"c6eb29abc0c447043f94cac4df49b3ce640d27be2730d18c7ba3f0fe7d21861b","vout":1,"address":"RBUEoAzoydjckYewPsW2kfTr8TGFgnR2Ec","account":"RBUEoAzoydjckYewPsW2kfTr8TGFgnR2Ec","scriptPubKey":"76a914180718a117d700a0a99a7c63f0fb813005707dc388ac","amount":38732.60997500,"interest":0,"confirmations":4,"spendable":false}]
|
||||
38732.60997500 <- expected amount RBUEoAzoydjckYewPsW2kfTr8TGFgnR2Ec
|
||||
[{"txid":"bf0e8dff8de3ce4c07b7cc09703978d7db0dc7660f312186b4c3eff2a97fd638","vout":1,"address":"RVQS9NGKsbBJuKDhJnPssTRevrE428dxDK","account":"RVQS9NGKsbBJuKDhJnPssTRevrE428dxDK","scriptPubKey":"76a914dcc12b611414b821b9c621fff879526d068ec65d88ac","amount":916.79536397,"interest":0,"confirmations":4,"spendable":false}]
|
||||
916.79536397 <- expected amount RVQS9NGKsbBJuKDhJnPssTRevrE428dxDK
|
||||
[{"txid":"186e0d779d5a6a644e7d972aecafe4fb1739059933a0e50ad9a82ced1c8974e4","vout":1,"address":"RHiUqYUohv49bvB2wbDe1mAkwyEFwUEnrb","account":"RHiUqYUohv49bvB2wbDe1mAkwyEFwUEnrb","scriptPubKey":"76a9145c89652575910848a90b06df692f8b5d9ce4d61f88ac","amount":48415.76246875,"interest":0,"confirmations":4,"spendable":false}]
|
||||
48415.76246875 <- expected amount RHiUqYUohv49bvB2wbDe1mAkwyEFwUEnrb
|
||||
[{"txid":"37ed3649d5e2f83a0c4ee11748b076fffe8a2fb16650cad7fa39cbbe3ddc9246","vout":1,"address":"RSWPtfGaHPL1g7SMqbLm1YZ8o3QM6krzo1","account":"RSWPtfGaHPL1g7SMqbLm1YZ8o3QM6krzo1","scriptPubKey":"76a914bcf9681ca9cecff0e61db4a57848c03830dd45c888ac","amount":16542.25810519,"interest":0,"confirmations":4,"spendable":false}]
|
||||
16542.25810519 <- expected amount RSWPtfGaHPL1g7SMqbLm1YZ8o3QM6krzo1
|
||||
[{"txid":"2dc98a59906d57f9e57b3231d19749eb9979533d3a2c35ec5adb3cb91bfd7c7b","vout":1,"address":"RFMcTK36Wzjo5QEk1wAH2CbATqsYvzgwXH","account":"RFMcTK36Wzjo5QEk1wAH2CbATqsYvzgwXH","scriptPubKey":"76a91442a6c434f7384860d9b89e8e234115f76b8e820b88ac","amount":2322923.09575692,"interest":0,"confirmations":4,"spendable":false}]
|
||||
2322923.09575692 <- expected amount RFMcTK36Wzjo5QEk1wAH2CbATqsYvzgwXH
|
||||
[{"txid":"35a28b0551bbe3d3e5cfa989b5a073bea55784a9df162ebcafc61bffb8ff5834","vout":1,"address":"RQFihaDjPvCwhENGhB163D7e8Wc8LURtKq","account":"RQFihaDjPvCwhENGhB163D7e8Wc8LURtKq","scriptPubKey":"76a914a4429dd4986d23a69d0ec24ce3ad0bc87e6338f888ac","amount":28529.48507541,"interest":0,"confirmations":4,"spendable":false}]
|
||||
28529.48507541 <- expected amount RQFihaDjPvCwhENGhB163D7e8Wc8LURtKq
|
||||
[{"txid":"3b3aabeb6483d8c37265d24ef76389f96158970485866de1005ba28d8069877b","vout":1,"address":"RDjm2Xec5UTWiz3Yku8sUce8ZWxe8mTh72","account":"RDjm2Xec5UTWiz3Yku8sUce8ZWxe8mTh72","scriptPubKey":"76a91430e6d27986cc9c167eb3349f2fa504ac3a834f2788ac","amount":8637.01756743,"interest":0,"confirmations":4,"spendable":false}]
|
||||
8637.01756743 <- expected amount RDjm2Xec5UTWiz3Yku8sUce8ZWxe8mTh72
|
||||
[{"txid":"adf2fd2eee75f5d9fdce44b4fe4d32f62d79f5e1b0362640c76eb109b1ceb30b","vout":1,"address":"RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf","account":"RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf","scriptPubKey":"76a914240f48f11c4b0674afa8b58dab11bdb780a3a47d88ac","amount":1212.14061568,"interest":0.20475348,"confirmations":1721,"spendable":false}, {"txid":"684728bb5ff281762990da11e7463c6e992b5e98cb0cc7965a3470b8a664484a","vout":1,"address":"RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf","account":"RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf","scriptPubKey":"76a914240f48f11c4b0674afa8b58dab11bdb780a3a47d88ac","amount":1212.26932063,"interest":0,"confirmations":4,"spendable":false}]
|
||||
1212.26932063 <- expected amount RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf
|
||||
[{"txid":"a021d23ab591ed687f7ba0bccbd98ecbb7d8d1f967176bb2f2e1e6fe1d83af34","vout":1,"address":"RBD72Bh4wxGi8q8xQbLfwMF2RAkTZ7sVZT","account":"RBD72Bh4wxGi8q8xQbLfwMF2RAkTZ7sVZT","scriptPubKey":"76a914152a5db1913e3d29ebc1e00039b4c6f2683285b788ac","amount":32148.06627925,"interest":0,"confirmations":4,"spendable":false}]
|
||||
32148.06627925 <- expected amount RBD72Bh4wxGi8q8xQbLfwMF2RAkTZ7sVZT
|
||||
[{"txid":"b9ab02076864711a964c149346141f01f686b50fd345e6eb5bc3f218b40c4c50","vout":1,"address":"RVih8N9Qh1jf4CCF5ySsAY8DR42eTxYqpB","account":"RVih8N9Qh1jf4CCF5ySsAY8DR42eTxYqpB","scriptPubKey":"76a914e03529e8e1369103276ee88e809ed790d5ebc52c88ac","amount":1924.55258644,"interest":0,"confirmations":4,"spendable":false}]
|
||||
1924.55258644 <- expected amount RVih8N9Qh1jf4CCF5ySsAY8DR42eTxYqpB
|
||||
[{"txid":"d5760b4049c8818f6486d1b81b0715f6971f88b0f49e8daab4382fe6980ddd85","vout":1,"address":"RWez2L8rPoTmqj8kYKqxLdeD9BFuDibMyJ","account":"RWez2L8rPoTmqj8kYKqxLdeD9BFuDibMyJ","scriptPubKey":"76a914ea79bacc39de430afa5fab1b389e1771e156919288ac","amount":44542.50147125,"interest":0,"confirmations":4,"spendable":false}]
|
||||
44542.50147125 <- expected amount RWez2L8rPoTmqj8kYKqxLdeD9BFuDibMyJ
|
||||
[{"txid":"c9bb31764aab4cd631fa733940c0b35470cad48d247ef227372cc84375cd8d8b","vout":1,"address":"RUuWvTwNAMGLpuY3GLPBAmMp8ptShkMSyN","account":"RUuWvTwNAMGLpuY3GLPBAmMp8ptShkMSyN","scriptPubKey":"76a914d749183b4beeae17edc5c89e7c9660ae592712ab88ac","amount":49199.88128813,"interest":0,"confirmations":4,"spendable":false}, {"txid":"585da7006a6572f1c0b7b909060349ad46910deab6915c5f7df48171bf1766d9","vout":1,"address":"RUuWvTwNAMGLpuY3GLPBAmMp8ptShkMSyN","account":"RUuWvTwNAMGLpuY3GLPBAmMp8ptShkMSyN","scriptPubKey":"76a914d749183b4beeae17edc5c89e7c9660ae592712ab88ac","amount":11760.26545254,"interest":4.66677200,"confirmations":4051,"spendable":false}, {"txid":"82fa5756cba3af6b06f1dde3080e3e1eaf67f7fe10b1242f038f9e6780819ff3","vout":1,"address":"RUuWvTwNAMGLpuY3GLPBAmMp8ptShkMSyN","account":"RUuWvTwNAMGLpuY3GLPBAmMp8ptShkMSyN","scriptPubKey":"76a914d749183b4beeae17edc5c89e7c9660ae592712ab88ac","amount":139007.63452726,"interest":23.48101934,"confirmations":1722,"spendable":false}]
|
||||
49199.88128813 <- expected amount RUuWvTwNAMGLpuY3GLPBAmMp8ptShkMSyN
|
||||
[{"txid":"08075d8b984266c27ed5f029b88b682596ace07cc43b2db50d4491dc810ced04","vout":1,"address":"RRTks3iwSe4oR3UDmRfGszcNcfAv6Rb5es","account":"RRTks3iwSe4oR3UDmRfGszcNcfAv6Rb5es","scriptPubKey":"76a914b1818a2b43514d215a43505933b79cd36a91214c88ac","amount":30170.24616125,"interest":0,"confirmations":4,"spendable":false}]
|
||||
30170.24616125 <- expected amount RRTks3iwSe4oR3UDmRfGszcNcfAv6Rb5es
|
||||
251
src/KMD.batch4
251
src/KMD.batch4
@@ -1,251 +0,0 @@
|
||||
sleep 999999
|
||||
# RKmeJpSRwBouZgkTXA1mre8EMNjQ7CawzH KMD 1999.45556678
|
||||
./komodo-cli sendtoaddress RKmeJpSRwBouZgkTXA1mre8EMNjQ7CawzH 1999.45556678
|
||||
sleep 3
|
||||
echo "1999.45556678 <- expected amount RKmeJpSRwBouZgkTXA1mre8EMNjQ7CawzH"
|
||||
|
||||
# RChSVFn3Bi8kW2vRkohcaGw2QEzapdyjA7 KMD 15493.04399000
|
||||
./komodo-cli sendtoaddress RChSVFn3Bi8kW2vRkohcaGw2QEzapdyjA7 15493.04399000
|
||||
sleep 3
|
||||
echo "15493.04399000 <- expected amount RChSVFn3Bi8kW2vRkohcaGw2QEzapdyjA7"
|
||||
|
||||
# RPYGEUfYMHizer5siX2CNpQ6xHAbjtgQuB KMD 843.49707566, REVS 16.72927581
|
||||
# RPYGEUfYMHizer5siX2CNpQ6xHAbjtgQuB KMD 843.49707566
|
||||
./komodo-cli sendtoaddress RPYGEUfYMHizer5siX2CNpQ6xHAbjtgQuB 843.49707566
|
||||
sleep 3
|
||||
echo "843.49707566 <- expected amount RPYGEUfYMHizer5siX2CNpQ6xHAbjtgQuB"
|
||||
|
||||
# RLiYLy1TMui1iVGMhfks6Go1y1mopSkc7T KMD 9678.31091750
|
||||
./komodo-cli sendtoaddress RLiYLy1TMui1iVGMhfks6Go1y1mopSkc7T 9678.31091750
|
||||
sleep 3
|
||||
echo "9678.31091750 <- expected amount RLiYLy1TMui1iVGMhfks6Go1y1mopSkc7T"
|
||||
|
||||
# RRLtUwtSG5oQUL6TPk5gtWPSFa4j1eBDxQ KMD 1219.26382940
|
||||
./komodo-cli sendtoaddress RRLtUwtSG5oQUL6TPk5gtWPSFa4j1eBDxQ 1219.26382940
|
||||
sleep 3
|
||||
echo "1219.26382940 <- expected amount RRLtUwtSG5oQUL6TPk5gtWPSFa4j1eBDxQ"
|
||||
|
||||
# RVT4P7mbHcdRmRHBotapx2BsEC1MMcTCMC KMD 1841.49885836
|
||||
./komodo-cli sendtoaddress RVT4P7mbHcdRmRHBotapx2BsEC1MMcTCMC 1841.49885836
|
||||
sleep 3
|
||||
echo "1841.49885836 <- expected amount RVT4P7mbHcdRmRHBotapx2BsEC1MMcTCMC"
|
||||
|
||||
# RNrQxuKtPSrJg6fcp665Q7j8A7WTDSbwjU KMD 681.69393556
|
||||
./komodo-cli sendtoaddress RNrQxuKtPSrJg6fcp665Q7j8A7WTDSbwjU 681.69393556
|
||||
sleep 3
|
||||
echo "681.69393556 <- expected amount RNrQxuKtPSrJg6fcp665Q7j8A7WTDSbwjU"
|
||||
|
||||
# RTrZWBu7SUZWf4ZdyUVddRPxsnDhZnre7n KMD 3090.02793673, REVS 3.67077856
|
||||
# RTrZWBu7SUZWf4ZdyUVddRPxsnDhZnre7n KMD 3090.02793673
|
||||
./komodo-cli sendtoaddress RTrZWBu7SUZWf4ZdyUVddRPxsnDhZnre7n 3090.02793673
|
||||
sleep 3
|
||||
echo "3090.02793673 <- expected amount RTrZWBu7SUZWf4ZdyUVddRPxsnDhZnre7n"
|
||||
|
||||
# RU2MYeg8uicVE28k6iiBXUxbxzeZwULwKi KMD 759.15915551
|
||||
./komodo-cli sendtoaddress RU2MYeg8uicVE28k6iiBXUxbxzeZwULwKi 759.15915551
|
||||
sleep 3
|
||||
echo "759.15915551 <- expected amount RU2MYeg8uicVE28k6iiBXUxbxzeZwULwKi"
|
||||
|
||||
# RL5Mi7TdaXCWpQNtbs4zUBdHQEurPuRYh8 KMD 158029.04869800
|
||||
./komodo-cli sendtoaddress RL5Mi7TdaXCWpQNtbs4zUBdHQEurPuRYh8 158029.04869800
|
||||
sleep 3
|
||||
echo "158029.04869800 <- expected amount RL5Mi7TdaXCWpQNtbs4zUBdHQEurPuRYh8"
|
||||
|
||||
# RGEkGiZQxqTZjsARMzu2exjPkFegXSGT9o KMD 2298.00667939
|
||||
./komodo-cli sendtoaddress RGEkGiZQxqTZjsARMzu2exjPkFegXSGT9o 2298.00667939
|
||||
sleep 3
|
||||
echo "2298.00667939 <- expected amount RGEkGiZQxqTZjsARMzu2exjPkFegXSGT9o"
|
||||
|
||||
# RAYp48ZaMJGmaKCJxeMLzWQXajW7Hd2Yjr KMD 2788.74791820
|
||||
./komodo-cli sendtoaddress RAYp48ZaMJGmaKCJxeMLzWQXajW7Hd2Yjr 2788.74791820
|
||||
sleep 3
|
||||
echo "2788.74791820 <- expected amount RAYp48ZaMJGmaKCJxeMLzWQXajW7Hd2Yjr"
|
||||
|
||||
# RAryshRkyDqKp3cgavp8CD77yS9A4U5jQz KMD 710.78619077
|
||||
./komodo-cli sendtoaddress RAryshRkyDqKp3cgavp8CD77yS9A4U5jQz 710.78619077
|
||||
sleep 3
|
||||
echo "710.78619077 <- expected amount RAryshRkyDqKp3cgavp8CD77yS9A4U5jQz"
|
||||
|
||||
# RRbLh1gaRgxRXMRVwGvNw2yESgRyNzscnd KMD 1118.59777607
|
||||
./komodo-cli sendtoaddress RRbLh1gaRgxRXMRVwGvNw2yESgRyNzscnd 1118.59777607
|
||||
sleep 3
|
||||
echo "1118.59777607 <- expected amount RRbLh1gaRgxRXMRVwGvNw2yESgRyNzscnd"
|
||||
|
||||
# RJtnDNrMY8pzcwwKyUvGLTjDot5jR74FRw KMD 8811.66876930
|
||||
./komodo-cli sendtoaddress RJtnDNrMY8pzcwwKyUvGLTjDot5jR74FRw 8811.66876930
|
||||
sleep 3
|
||||
echo "8811.66876930 <- expected amount RJtnDNrMY8pzcwwKyUvGLTjDot5jR74FRw"
|
||||
|
||||
# RRixT2CqGcr5cdPoP3G2rhrWDfSbVZR6sk KMD 79613.96546024, REVS 1579.43521640
|
||||
# RRixT2CqGcr5cdPoP3G2rhrWDfSbVZR6sk KMD 79613.96546024
|
||||
./komodo-cli sendtoaddress RRixT2CqGcr5cdPoP3G2rhrWDfSbVZR6sk 79613.96546024
|
||||
sleep 3
|
||||
echo "79613.96546024 <- expected amount RRixT2CqGcr5cdPoP3G2rhrWDfSbVZR6sk"
|
||||
|
||||
# RHvVq3gKrEhXkXJSfxEzweGXRBjRMX1HwR KMD 854.63736305
|
||||
./komodo-cli sendtoaddress RHvVq3gKrEhXkXJSfxEzweGXRBjRMX1HwR 854.63736305
|
||||
sleep 3
|
||||
echo "854.63736305 <- expected amount RHvVq3gKrEhXkXJSfxEzweGXRBjRMX1HwR"
|
||||
|
||||
# RSqXWQNJTdiiP2L6Q8Pd6nzd3DyN7TzpNF KMD 87148.37244375
|
||||
./komodo-cli sendtoaddress RSqXWQNJTdiiP2L6Q8Pd6nzd3DyN7TzpNF 87148.37244375
|
||||
sleep 3
|
||||
echo "87148.37244375 <- expected amount RSqXWQNJTdiiP2L6Q8Pd6nzd3DyN7TzpNF"
|
||||
|
||||
# RRRWieSx6e2ANSukRrFaRSyF2ikYiqTqbH KMD 96831.52493750
|
||||
./komodo-cli sendtoaddress RRRWieSx6e2ANSukRrFaRSyF2ikYiqTqbH 96831.52493750
|
||||
sleep 3
|
||||
echo "96831.52493750 <- expected amount RRRWieSx6e2ANSukRrFaRSyF2ikYiqTqbH"
|
||||
|
||||
# RBhKUj4dmHDDd8Yhm8npoh9ii5V5ZUjtpu KMD 1935.66218350
|
||||
./komodo-cli sendtoaddress RBhKUj4dmHDDd8Yhm8npoh9ii5V5ZUjtpu 1935.66218350
|
||||
sleep 3
|
||||
echo "1935.66218350 <- expected amount RBhKUj4dmHDDd8Yhm8npoh9ii5V5ZUjtpu"
|
||||
|
||||
# RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct KMD 50303.39904535
|
||||
./komodo-cli sendtoaddress RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct 50303.39904535
|
||||
sleep 3
|
||||
echo "50303.39904535 <- expected amount RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct"
|
||||
|
||||
# RBopZSXfCKrvi6kELKu9Cn3TYDapxpVr8d KMD 106514.67743125
|
||||
./komodo-cli sendtoaddress RBopZSXfCKrvi6kELKu9Cn3TYDapxpVr8d 106514.67743125
|
||||
sleep 3
|
||||
echo "106514.67743125 <- expected amount RBopZSXfCKrvi6kELKu9Cn3TYDapxpVr8d"
|
||||
|
||||
# RFEHFqHrwcwnTBzvYsuEttQ4rQQZw9qQsH KMD 1526.39979262
|
||||
./komodo-cli sendtoaddress RFEHFqHrwcwnTBzvYsuEttQ4rQQZw9qQsH 1526.39979262
|
||||
sleep 3
|
||||
echo "1526.39979262 <- expected amount RFEHFqHrwcwnTBzvYsuEttQ4rQQZw9qQsH"
|
||||
|
||||
# RJzu13gJQjtS6aQdNEaQMrv7TSL4wQBien KMD 2130.29354862
|
||||
./komodo-cli sendtoaddress RJzu13gJQjtS6aQdNEaQMrv7TSL4wQBien 2130.29354862
|
||||
sleep 3
|
||||
echo "2130.29354862 <- expected amount RJzu13gJQjtS6aQdNEaQMrv7TSL4wQBien"
|
||||
|
||||
# RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut KMD 20106.39865075, REVS 0.09000000
|
||||
# RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut KMD 20106.39865075
|
||||
./komodo-cli sendtoaddress RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut 20106.39865075
|
||||
sleep 3
|
||||
echo "20106.39865075 <- expected amount RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut"
|
||||
|
||||
# RBcmNwoFVZ5kWZB8LMjgGbqvVmByD1DeTJ KMD 12526.83053462
|
||||
./komodo-cli sendtoaddress RBcmNwoFVZ5kWZB8LMjgGbqvVmByD1DeTJ 12526.83053462
|
||||
sleep 3
|
||||
echo "12526.83053462 <- expected amount RBcmNwoFVZ5kWZB8LMjgGbqvVmByD1DeTJ"
|
||||
|
||||
# REwf8D6dyFevVSZc6wjTAwmTgntUM5KWGd KMD 273706.84143501
|
||||
./komodo-cli sendtoaddress REwf8D6dyFevVSZc6wjTAwmTgntUM5KWGd 273706.84143501
|
||||
sleep 3
|
||||
echo "273706.84143501 <- expected amount REwf8D6dyFevVSZc6wjTAwmTgntUM5KWGd"
|
||||
|
||||
# RJQNje5EiBV2C7f28YLcm9LEm8AvrSFtVc KMD 3880.03920424
|
||||
./komodo-cli sendtoaddress RJQNje5EiBV2C7f28YLcm9LEm8AvrSFtVc 3880.03920424
|
||||
sleep 3
|
||||
echo "3880.03920424 <- expected amount RJQNje5EiBV2C7f28YLcm9LEm8AvrSFtVc"
|
||||
|
||||
# RBFuL5swKoyZnLUTVEPjsuwh7pvP5sAz7P KMD 116.48367000
|
||||
./komodo-cli sendtoaddress RBFuL5swKoyZnLUTVEPjsuwh7pvP5sAz7P 116.48367000
|
||||
sleep 3
|
||||
echo "116.48367000 <- expected amount RBFuL5swKoyZnLUTVEPjsuwh7pvP5sAz7P"
|
||||
|
||||
# RJA8Qe3xtpSjXEXeBa8F54fW9HU3ETHCXd KMD 4646.98361435
|
||||
./komodo-cli sendtoaddress RJA8Qe3xtpSjXEXeBa8F54fW9HU3ETHCXd 4646.98361435
|
||||
sleep 3
|
||||
echo "4646.98361435 <- expected amount RJA8Qe3xtpSjXEXeBa8F54fW9HU3ETHCXd"
|
||||
|
||||
# RFVp94ZGAAbFhKZG9BwuCBwEjDG9gCpY1g KMD 4893.17953483
|
||||
./komodo-cli sendtoaddress RFVp94ZGAAbFhKZG9BwuCBwEjDG9gCpY1g 4893.17953483
|
||||
sleep 3
|
||||
echo "4893.17953483 <- expected amount RFVp94ZGAAbFhKZG9BwuCBwEjDG9gCpY1g"
|
||||
|
||||
# RJcBCXAPp8VYuv87Xz9mNuNCBGJmYCKDFw KMD 13750.07654112
|
||||
./komodo-cli sendtoaddress RJcBCXAPp8VYuv87Xz9mNuNCBGJmYCKDFw 13750.07654112
|
||||
sleep 3
|
||||
echo "13750.07654112 <- expected amount RJcBCXAPp8VYuv87Xz9mNuNCBGJmYCKDFw"
|
||||
|
||||
# RKhFZqq9ErJBMH36bSA3sgDfd51nAMdRck KMD 6399.50717276
|
||||
./komodo-cli sendtoaddress RKhFZqq9ErJBMH36bSA3sgDfd51nAMdRck 6399.50717276
|
||||
sleep 3
|
||||
echo "6399.50717276 <- expected amount RKhFZqq9ErJBMH36bSA3sgDfd51nAMdRck"
|
||||
|
||||
# RDEbPLoUKK5sbRmJyhouhk3kx2MzTKt6d4 KMD 740.16851028
|
||||
./komodo-cli sendtoaddress RDEbPLoUKK5sbRmJyhouhk3kx2MzTKt6d4 740.16851028
|
||||
sleep 3
|
||||
echo "740.16851028 <- expected amount RDEbPLoUKK5sbRmJyhouhk3kx2MzTKt6d4"
|
||||
|
||||
# RAaszCNodXXu9rJL6qqVMZDykXncDecTMS KMD 693.08132289
|
||||
./komodo-cli sendtoaddress RAaszCNodXXu9rJL6qqVMZDykXncDecTMS 693.08132289
|
||||
sleep 3
|
||||
echo "693.08132289 <- expected amount RAaszCNodXXu9rJL6qqVMZDykXncDecTMS"
|
||||
|
||||
# RHhBfhEDW88fopZfCasn6omtFr7QKa4wSk KMD 41443.89267324
|
||||
./komodo-cli sendtoaddress RHhBfhEDW88fopZfCasn6omtFr7QKa4wSk 41443.89267324
|
||||
sleep 3
|
||||
echo "41443.89267324 <- expected amount RHhBfhEDW88fopZfCasn6omtFr7QKa4wSk"
|
||||
|
||||
# RMg5XaC6Lsj3YT2FtCtSDCAa5i715NYxrf KMD 16344.19309420
|
||||
./komodo-cli sendtoaddress RMg5XaC6Lsj3YT2FtCtSDCAa5i715NYxrf 16344.19309420
|
||||
sleep 3
|
||||
echo "16344.19309420 <- expected amount RMg5XaC6Lsj3YT2FtCtSDCAa5i715NYxrf"
|
||||
|
||||
# RA9G36WwA9K95bn8Cbycq5ZnoxhSzzhhBw KMD 867960.91662544, REVS 11685.48356181
|
||||
# RA9G36WwA9K95bn8Cbycq5ZnoxhSzzhhBw KMD 867960.91662544
|
||||
./komodo-cli sendtoaddress RA9G36WwA9K95bn8Cbycq5ZnoxhSzzhhBw 867960.91662544
|
||||
sleep 3
|
||||
echo "867960.91662544 <- expected amount RA9G36WwA9K95bn8Cbycq5ZnoxhSzzhhBw"
|
||||
|
||||
# RVZEqmLd5e8FBfF9Y6uaKL5hEbdKSaRyCY KMD 1086.09863742
|
||||
./komodo-cli sendtoaddress RVZEqmLd5e8FBfF9Y6uaKL5hEbdKSaRyCY 1086.09863742
|
||||
sleep 3
|
||||
echo "1086.09863742 <- expected amount RVZEqmLd5e8FBfF9Y6uaKL5hEbdKSaRyCY"
|
||||
|
||||
# RMHJhEJau3JWyvsuWSm7MnzxqY4QgEXXQm KMD 4319.91306129
|
||||
./komodo-cli sendtoaddress RMHJhEJau3JWyvsuWSm7MnzxqY4QgEXXQm 4319.91306129
|
||||
sleep 3
|
||||
echo "4319.91306129 <- expected amount RMHJhEJau3JWyvsuWSm7MnzxqY4QgEXXQm"
|
||||
|
||||
# RHfwxdGyRKD1P9ZAY3wPRNErGjuokg5hgi KMD 38732.60997500
|
||||
./komodo-cli sendtoaddress RHfwxdGyRKD1P9ZAY3wPRNErGjuokg5hgi 38732.60997500
|
||||
sleep 3
|
||||
echo "38732.60997500 <- expected amount RHfwxdGyRKD1P9ZAY3wPRNErGjuokg5hgi"
|
||||
|
||||
# RVcSdFR5fC3Qjk3CARvQSkra5PQwC8U3uj KMD 19695.58704144, REVS 390.89494454
|
||||
# RVcSdFR5fC3Qjk3CARvQSkra5PQwC8U3uj KMD 19695.58704144
|
||||
./komodo-cli sendtoaddress RVcSdFR5fC3Qjk3CARvQSkra5PQwC8U3uj 19695.58704144
|
||||
sleep 3
|
||||
echo "19695.58704144 <- expected amount RVcSdFR5fC3Qjk3CARvQSkra5PQwC8U3uj"
|
||||
|
||||
# RQokxkBAizLmegMeWK5TyTpSHn2vP5adjo KMD 2981.62619009, REVS 30.35300490
|
||||
# RQokxkBAizLmegMeWK5TyTpSHn2vP5adjo KMD 2981.62619009
|
||||
./komodo-cli sendtoaddress RQokxkBAizLmegMeWK5TyTpSHn2vP5adjo 2981.62619009
|
||||
sleep 3
|
||||
echo "2981.62619009 <- expected amount RQokxkBAizLmegMeWK5TyTpSHn2vP5adjo"
|
||||
|
||||
# RXTuSxW7zs1enAXAq3xSaimTR4NYUTQL6Q KMD 968.31524937
|
||||
./komodo-cli sendtoaddress RXTuSxW7zs1enAXAq3xSaimTR4NYUTQL6Q 968.31524937
|
||||
sleep 3
|
||||
echo "968.31524937 <- expected amount RXTuSxW7zs1enAXAq3xSaimTR4NYUTQL6Q"
|
||||
|
||||
# RNg2LQHqauerqtv6yCVXVLug2VFAqc7JaG KMD 3205.27840587
|
||||
./komodo-cli sendtoaddress RNg2LQHqauerqtv6yCVXVLug2VFAqc7JaG 3205.27840587
|
||||
sleep 3
|
||||
echo "3205.27840587 <- expected amount RNg2LQHqauerqtv6yCVXVLug2VFAqc7JaG"
|
||||
|
||||
# RAMvDwi58oyArqfGseWZsYbR2BN3L7ghVX KMD 40914.30625015, REVS 476.17156540
|
||||
# RAMvDwi58oyArqfGseWZsYbR2BN3L7ghVX KMD 40914.30625015
|
||||
./komodo-cli sendtoaddress RAMvDwi58oyArqfGseWZsYbR2BN3L7ghVX 40914.30625015
|
||||
sleep 3
|
||||
echo "40914.30625015 <- expected amount RAMvDwi58oyArqfGseWZsYbR2BN3L7ghVX"
|
||||
|
||||
# RPUoGZEYGV32m6sU1qYr375mgELoMxVEJu KMD 48415.76246875
|
||||
./komodo-cli sendtoaddress RPUoGZEYGV32m6sU1qYr375mgELoMxVEJu 48415.76246875
|
||||
sleep 3
|
||||
echo "48415.76246875 <- expected amount RPUoGZEYGV32m6sU1qYr375mgELoMxVEJu"
|
||||
|
||||
# RGH3G91bdgu1WrmiN4aBNREpm8EZwddmvw KMD 1363.38787112
|
||||
./komodo-cli sendtoaddress RGH3G91bdgu1WrmiN4aBNREpm8EZwddmvw 1363.38787112
|
||||
sleep 3
|
||||
echo "1363.38787112 <- expected amount RGH3G91bdgu1WrmiN4aBNREpm8EZwddmvw"
|
||||
|
||||
|
||||
# total KMD 2065113.21723734 REVS 0.00000000
|
||||
@@ -1,97 +0,0 @@
|
||||
root@devbox2:~/komodo/src# ./KMD.batch4
|
||||
6fad08580a1077f3eefa28fcb30e25c81cfe853b48fa1c4dd180f9844e6ec318
|
||||
1999.45556678 <- expected amount RKmeJpSRwBouZgkTXA1mre8EMNjQ7CawzH
|
||||
4b4965c30015f501b5566ed5635e38ae964aaba8c99af6f56e496111d434d71c
|
||||
15493.04399000 <- expected amount RChSVFn3Bi8kW2vRkohcaGw2QEzapdyjA7
|
||||
735d7f914eb9777fd7c9c44883c876baa53bb58e36a7d89760909ce1e92a706d
|
||||
843.49707566 <- expected amount RPYGEUfYMHizer5siX2CNpQ6xHAbjtgQuB
|
||||
8f4ea67ce7366804fe211f4c11a40bd364f8a6774e99c7d814f3778abf582dfa
|
||||
9678.31091750 <- expected amount RLiYLy1TMui1iVGMhfks6Go1y1mopSkc7T
|
||||
35aefffe9854b64ede72955ea546f84de618d5ab67426599e7a92e203a53b0c8
|
||||
1219.26382940 <- expected amount RRLtUwtSG5oQUL6TPk5gtWPSFa4j1eBDxQ
|
||||
77c71b6be1be68661be35b4c41ec43f8e79fa723caf5c4e7c86b9369ee2ebecf
|
||||
1841.49885836 <- expected amount RVT4P7mbHcdRmRHBotapx2BsEC1MMcTCMC
|
||||
9d0e39eb0a11d33544e17c607ad1aebcfdba06d214f99bb83464e92ad8cd3eba
|
||||
681.69393556 <- expected amount RNrQxuKtPSrJg6fcp665Q7j8A7WTDSbwjU
|
||||
7041e1cc57a518eac2da5381ba3eaf7d5703f2dde1076a5217727aafd58c57e6
|
||||
3090.02793673 <- expected amount RTrZWBu7SUZWf4ZdyUVddRPxsnDhZnre7n
|
||||
aa667173c69495f01b1e065596978f365580ed0303f4daa43dd3efc11345acb4
|
||||
759.15915551 <- expected amount RU2MYeg8uicVE28k6iiBXUxbxzeZwULwKi
|
||||
83ed733e584b29b82ab59aa314dd4692a3e26ee612c209fb83fb3c8ac1832776
|
||||
158029.04869800 <- expected amount RL5Mi7TdaXCWpQNtbs4zUBdHQEurPuRYh8
|
||||
f7f5190e2f1e33c1c6c3eab6f8ddfaeee289b839f57568f1c690c1ec8a6d59cd
|
||||
2298.00667939 <- expected amount RGEkGiZQxqTZjsARMzu2exjPkFegXSGT9o
|
||||
af503537b2d1f590ee60cd7fd4bd20428a5e13c69ce70a4debfb4d4cb4c12bda
|
||||
2788.74791820 <- expected amount RAYp48ZaMJGmaKCJxeMLzWQXajW7Hd2Yjr
|
||||
1f9b726760e70c55e0a56b14decda061ee6794951f0515bce5cfeeb52757ed8d
|
||||
710.78619077 <- expected amount RAryshRkyDqKp3cgavp8CD77yS9A4U5jQz
|
||||
38a982374bffb59fb7b10cbdd097e9b28b274b8dd54fb1dae396144d8c879e92
|
||||
1118.59777607 <- expected amount RRbLh1gaRgxRXMRVwGvNw2yESgRyNzscnd
|
||||
089bd0a9dd2b712554791a4f575f62f2abda25031382795af1dd5a3f920f4e32
|
||||
8811.66876930 <- expected amount RJtnDNrMY8pzcwwKyUvGLTjDot5jR74FRw
|
||||
8346c1963fd4a5e70d61163bbe44868c12f42fec8c88597a412e960f500d50d9
|
||||
79613.96546024 <- expected amount RRixT2CqGcr5cdPoP3G2rhrWDfSbVZR6sk
|
||||
83f24e4276e6aefce21000c4d444cd0d909f25da717862cb87ed28ef9ffb37c1
|
||||
854.63736305 <- expected amount RHvVq3gKrEhXkXJSfxEzweGXRBjRMX1HwR
|
||||
4dc40c9aeffb9f0732614ebbdde8787e4945b0b017cbc858bdddba195cffdb63
|
||||
87148.37244375 <- expected amount RSqXWQNJTdiiP2L6Q8Pd6nzd3DyN7TzpNF
|
||||
d2de8684bf2cb239f379a0be089c21dda90fc11ac8745275618c08189c3c9bc6
|
||||
96831.52493750 <- expected amount RRRWieSx6e2ANSukRrFaRSyF2ikYiqTqbH
|
||||
f86fbac5375a85a8c2d8651673c339772d98e069a481e2c2e291ed2c06e69b41
|
||||
1935.66218350 <- expected amount RBhKUj4dmHDDd8Yhm8npoh9ii5V5ZUjtpu
|
||||
eb6734a2f9ff4b8297fa91867286264cf8998e33d11474773bfd3fe5e0278d0b
|
||||
50303.39904535 <- expected amount RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct
|
||||
0e32fb1cb0887c98da24c5e5ed425f52f542de0c3ee73e73ca3d4416033654a4
|
||||
106514.67743125 <- expected amount RBopZSXfCKrvi6kELKu9Cn3TYDapxpVr8d
|
||||
744aaa9d311c1edbd8f358dd4023a7cc030ad43482a6d5c5c8d53dc42deb7250
|
||||
1526.39979262 <- expected amount RFEHFqHrwcwnTBzvYsuEttQ4rQQZw9qQsH
|
||||
d68213f76d7e6809bcaf0a1c522220ff9457aa9747182396deacb85330c717b3
|
||||
2130.29354862 <- expected amount RJzu13gJQjtS6aQdNEaQMrv7TSL4wQBien
|
||||
acd786f5b7bab14737a25d0ac2eb0e1a61743899f83571a694191a5317cc3c67
|
||||
20106.39865075 <- expected amount RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut
|
||||
0a6832c3878dc82afe539a3a54f56b1a6d02fc21f0b03ca78d48124d3634ded1
|
||||
12526.83053462 <- expected amount RBcmNwoFVZ5kWZB8LMjgGbqvVmByD1DeTJ
|
||||
3872f0a52c4e6c84a0041a09725874517adb3908d48037dce1811197640956d2
|
||||
273706.84143501 <- expected amount REwf8D6dyFevVSZc6wjTAwmTgntUM5KWGd
|
||||
2048f44673413d3a3c36c3f38df77bd1453bc9dd2a93edbaa35ae9c99dd64ee7
|
||||
3880.03920424 <- expected amount RJQNje5EiBV2C7f28YLcm9LEm8AvrSFtVc
|
||||
4698dd7471c0e12421ea777216b66a112c9e1817761e0d801f9e4845c258a3cb
|
||||
116.48367000 <- expected amount RBFuL5swKoyZnLUTVEPjsuwh7pvP5sAz7P
|
||||
cc32e43ba80e3895630f99a5b0a8e7183ce74c4aa2a93af8baa76a1d2cc1c15c
|
||||
4646.98361435 <- expected amount RJA8Qe3xtpSjXEXeBa8F54fW9HU3ETHCXd
|
||||
4c465385ef27929c1077d4b37a205bec302bea710574453b42792f3c6bc7df7d
|
||||
4893.17953483 <- expected amount RFVp94ZGAAbFhKZG9BwuCBwEjDG9gCpY1g
|
||||
8f282eab9df0a277c2b786bfd2f02db951131ecb7423a93c46a323dda8b85ea4
|
||||
13750.07654112 <- expected amount RJcBCXAPp8VYuv87Xz9mNuNCBGJmYCKDFw
|
||||
543851d36fb88fd8c046211dd6e73ea75a8006b7e195812bbacb14a00ab3b266
|
||||
6399.50717276 <- expected amount RKhFZqq9ErJBMH36bSA3sgDfd51nAMdRck
|
||||
7632267444ae27246e0fe876d272b8876b96ec47d2d578e02330cb766793ae0e
|
||||
740.16851028 <- expected amount RDEbPLoUKK5sbRmJyhouhk3kx2MzTKt6d4
|
||||
516cf5887eaa2e024881b27b71a767090e168dea7dfccbbe6cf6bd86741bf200
|
||||
693.08132289 <- expected amount RAaszCNodXXu9rJL6qqVMZDykXncDecTMS
|
||||
23a7f95e28ec90550f5e73fa509e3a7f614801dffe4e1e29aa02c2492c9e6302
|
||||
41443.89267324 <- expected amount RHhBfhEDW88fopZfCasn6omtFr7QKa4wSk
|
||||
cbca63c95d6e016ab816de044d9ef295f630468d1596bb66f3e0dbbfec879168
|
||||
16344.19309420 <- expected amount RMg5XaC6Lsj3YT2FtCtSDCAa5i715NYxrf
|
||||
1dd5519298d6689602e56541dc3dd96a7f6a237b1ebaa67b247fa9ee3f9739b5
|
||||
867960.91662544 <- expected amount RA9G36WwA9K95bn8Cbycq5ZnoxhSzzhhBw
|
||||
065a059be54fe184bfc9d43d7dd5bc6b71d300c7796ca45e70acbb99634ef2e2
|
||||
1086.09863742 <- expected amount RVZEqmLd5e8FBfF9Y6uaKL5hEbdKSaRyCY
|
||||
4d0498e9b38daa2705b35555d95b5cc5addcf8b9915c38f01e7422bb3c1474a5
|
||||
4319.91306129 <- expected amount RMHJhEJau3JWyvsuWSm7MnzxqY4QgEXXQm
|
||||
fb58e59e86673c017a32717d7ff933dd5ebf6275b91bbde46c7ecd9242e2b01a
|
||||
38732.60997500 <- expected amount RHfwxdGyRKD1P9ZAY3wPRNErGjuokg5hgi
|
||||
11cb10a33a2a7f028220460a4752c8684a465d1038913f0e31c7e110997c4d37
|
||||
19695.58704144 <- expected amount RVcSdFR5fC3Qjk3CARvQSkra5PQwC8U3uj
|
||||
d785685b205ffd0ab13cf4660be5262b7727228dd3f6e1b8f1bea8b97f800ee0
|
||||
2981.62619009 <- expected amount RQokxkBAizLmegMeWK5TyTpSHn2vP5adjo
|
||||
78cac40448f57823dddbaed6f69eaaa2d7b6cf407d8c5fa90b186fdab7c1d9b8
|
||||
968.31524937 <- expected amount RXTuSxW7zs1enAXAq3xSaimTR4NYUTQL6Q
|
||||
48cae9a4889082a43ea0ee8e481b89a4b35e544070827736336cc860f59b7954
|
||||
3205.27840587 <- expected amount RNg2LQHqauerqtv6yCVXVLug2VFAqc7JaG
|
||||
ba761c5bcab251499de8af6ebca8dd6f71e4697b69ad38a63ac6ed3f51e20705
|
||||
40914.30625015 <- expected amount RAMvDwi58oyArqfGseWZsYbR2BN3L7ghVX
|
||||
4540c58133dbc87880e91bb961cb59531778eefeb3de8c1550e3245e973e032b
|
||||
48415.76246875 <- expected amount RPUoGZEYGV32m6sU1qYr375mgELoMxVEJu
|
||||
77aee8dc84ddfc55aae94eab7eef3af07adf80079361a9c865424fe913a9f7f2
|
||||
1363.38787112 <- expected amount RGH3G91bdgu1WrmiN4aBNREpm8EZwddmvw
|
||||
@@ -46,8 +46,6 @@ LIBBITCOIN_COMMON=libbitcoin_common.a
|
||||
LIBBITCOIN_CLI=libbitcoin_cli.a
|
||||
LIBBITCOIN_UTIL=libbitcoin_util.a
|
||||
LIBBITCOIN_CRYPTO=crypto/libbitcoin_crypto.a
|
||||
LIBVERUS_CRYPTO=crypto/libverus_crypto.a
|
||||
LIBVERUS_PORTABLE_CRYPTO=crypto/libverus_portable_crypto.a
|
||||
LIBSECP256K1=secp256k1/libsecp256k1.la
|
||||
LIBCRYPTOCONDITIONS=cryptoconditions/libcryptoconditions_core.la
|
||||
LIBSNARK=snark/libsnark.a
|
||||
@@ -95,8 +93,6 @@ $(LIBCRYPTOCONDITIONS): $(wildcard cryptoconditions/src/*) $(wildcard cryptocond
|
||||
# But to build the less dependent modules first, we manually select their order here:
|
||||
EXTRA_LIBRARIES += \
|
||||
$(LIBBITCOIN_CRYPTO) \
|
||||
$(LIBVERUS_CRYPTO) \
|
||||
$(LIBVERUS_PORTABLE_CRYPTO) \
|
||||
$(LIBBITCOIN_UTIL) \
|
||||
$(LIBBITCOIN_COMMON) \
|
||||
$(LIBBITCOIN_SERVER) \
|
||||
@@ -183,9 +179,6 @@ BITCOIN_CORE_H = \
|
||||
consensus/validation.h \
|
||||
core_io.h \
|
||||
core_memusage.h \
|
||||
crypto/haraka.h \
|
||||
crypto/haraka_portable.h \
|
||||
crypto/verus_hash.h \
|
||||
deprecation.h \
|
||||
hash.h \
|
||||
httprpc.h \
|
||||
@@ -304,7 +297,6 @@ libbitcoin_server_a_SOURCES = \
|
||||
cc/oracles.cpp \
|
||||
cc/prices.cpp \
|
||||
cc/pegs.cpp \
|
||||
cc/marmara.cpp \
|
||||
cc/payments.cpp \
|
||||
cc/gateways.cpp \
|
||||
cc/channels.cpp \
|
||||
@@ -314,10 +306,6 @@ libbitcoin_server_a_SOURCES = \
|
||||
checkpoints.cpp \
|
||||
crosschain.cpp \
|
||||
crosschain_authority.cpp \
|
||||
crypto/haraka.h \
|
||||
crypto/haraka_portable.h \
|
||||
crypto/verus_hash.h \
|
||||
crypto/verus_hash.cpp \
|
||||
deprecation.cpp \
|
||||
httprpc.cpp \
|
||||
httpserver.cpp \
|
||||
@@ -420,11 +408,12 @@ crypto_libbitcoin_crypto_a_SOURCES = \
|
||||
crypto/sha256.cpp \
|
||||
crypto/sha256.h \
|
||||
crypto/sha512.cpp \
|
||||
crypto/sha512.h \
|
||||
crypto/haraka.h \
|
||||
crypto/haraka_portable.h \
|
||||
crypto/verus_hash.h \
|
||||
crypto/verus_hash.cpp
|
||||
crypto/sha512.h
|
||||
|
||||
if EXPERIMENTAL_ASM
|
||||
crypto_libbitcoin_crypto_a_SOURCES += crypto/sha256_sse4.cpp
|
||||
endif
|
||||
|
||||
|
||||
if ENABLE_MINING
|
||||
EQUIHASH_TROMP_SOURCES = \
|
||||
@@ -438,20 +427,6 @@ crypto_libbitcoin_crypto_a_SOURCES += \
|
||||
${EQUIHASH_TROMP_SOURCES}
|
||||
endif
|
||||
|
||||
# Verus hash specific library - optimized
|
||||
crypto_libverus_crypto_a_CPPFLAGS = -O3 -Wint-conversion -march=x86-64 -msse4 -msse4.1 -msse4.2 -mssse3 -mavx -maes -g -funroll-loops -fomit-frame-pointer -fPIC $(AM_CPPFLAGS)
|
||||
crypto_libverus_crypto_a_CXXFLAGS = -O3 -Wint-conversion -march=x86-64 -msse4 -msse4.1 -msse4.2 -mssse3 -mavx -maes -g -funroll-loops -fomit-frame-pointer -fPIC $(AM_CXXFLAGS)
|
||||
crypto_libverus_crypto_a_SOURCES = \
|
||||
crypto/haraka.h \
|
||||
crypto/haraka.c
|
||||
|
||||
# Verus hash specific library - portable
|
||||
crypto_libverus_portable_crypto_a_CPPFLAGS = -O3 -Wint-conversion -march=x86-64 -g -funroll-loops -fomit-frame-pointer -fPIC $(AM_CPPFLAGS)
|
||||
crypto_libverus_portable_crypto_a_CXXFLAGS = -O3 -Wint-conversion -march=x86-64 -g -funroll-loops -fomit-frame-pointer -fPIC $(AM_CXXFLAGS)
|
||||
crypto_libverus_portable_crypto_a_SOURCES = \
|
||||
crypto/haraka_portable.h \
|
||||
crypto/haraka_portable.c
|
||||
|
||||
# common: shared between zcashd and non-server tools
|
||||
libbitcoin_common_a_CPPFLAGS = -fPIC $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
|
||||
libbitcoin_common_a_CXXFLAGS = -fPIC $(AM_CXXFLAGS) $(PIE_FLAGS)
|
||||
@@ -466,10 +441,6 @@ libbitcoin_common_a_SOURCES = \
|
||||
consensus/upgrades.cpp \
|
||||
core_read.cpp \
|
||||
core_write.cpp \
|
||||
crypto/haraka.h \
|
||||
crypto/haraka_portable.h \
|
||||
crypto/verus_hash.h \
|
||||
crypto/verus_hash.cpp \
|
||||
hash.cpp \
|
||||
importcoin.cpp \
|
||||
key.cpp \
|
||||
@@ -486,7 +457,6 @@ libbitcoin_common_a_SOURCES = \
|
||||
script/cc.cpp \
|
||||
script/interpreter.cpp \
|
||||
script/script.cpp \
|
||||
script/script_ext.cpp \
|
||||
script/script_error.cpp \
|
||||
script/sign.cpp \
|
||||
script/standard.cpp \
|
||||
@@ -558,8 +528,6 @@ komodod_LDADD = \
|
||||
$(LIBBITCOIN_ZMQ) \
|
||||
$(LIBBITCOIN_PROTON) \
|
||||
$(LIBBITCOIN_CRYPTO) \
|
||||
$(LIBVERUS_CRYPTO) \
|
||||
$(LIBVERUS_PORTABLE_CRYPTO) \
|
||||
$(LIBZCASH) \
|
||||
$(LIBSNARK) \
|
||||
$(LIBLEVELDB) \
|
||||
@@ -581,8 +549,6 @@ komodod_LDADD += \
|
||||
$(ZMQ_LIBS) \
|
||||
$(PROTON_LIBS) \
|
||||
$(LIBBITCOIN_CRYPTO) \
|
||||
$(LIBVERUS_CRYPTO) \
|
||||
$(LIBVERUS_PORTABLE_CRYPTO) \
|
||||
$(LIBZCASH_LIBS)
|
||||
|
||||
if TARGET_DARWIN
|
||||
@@ -635,8 +601,6 @@ komodo_cli_LDADD = \
|
||||
$(EVENT_LIBS) \
|
||||
$(LIBZCASH) \
|
||||
$(LIBBITCOIN_CRYPTO) \
|
||||
$(LIBVERUS_CRYPTO) \
|
||||
$(LIBVERUS_PORTABLE_CRYPTO) \
|
||||
$(LIBZCASH_LIBS)
|
||||
|
||||
if ENABLE_WALLET
|
||||
@@ -644,8 +608,6 @@ wallet_utility_LDADD = \
|
||||
libbitcoin_wallet.a \
|
||||
$(LIBBITCOIN_COMMON) \
|
||||
$(LIBBITCOIN_CRYPTO) \
|
||||
$(LIBVERUS_CRYPTO) \
|
||||
$(LIBVERUS_PORTABLE_CRYPTO) \
|
||||
$(LIBSECP256K1) \
|
||||
$(LIBBITCOIN_UTIL) \
|
||||
$(BOOST_LIBS) \
|
||||
@@ -667,7 +629,7 @@ if TARGET_WINDOWS
|
||||
komodo_tx_SOURCES += bitcoin-tx-res.rc
|
||||
endif
|
||||
|
||||
# FIXME: Is libzcash needed for zcash_tx?
|
||||
# FIXME: Is libzcash needed for hush-tx ?
|
||||
komodo_tx_LDADD = \
|
||||
$(LIBUNIVALUE) \
|
||||
$(LIBBITCOIN_COMMON) \
|
||||
@@ -676,8 +638,6 @@ komodo_tx_LDADD = \
|
||||
$(LIBZCASH) \
|
||||
$(LIBSNARK) \
|
||||
$(LIBBITCOIN_CRYPTO) \
|
||||
$(LIBVERUS_CRYPTO) \
|
||||
$(LIBVERUS_PORTABLE_CRYPTO) \
|
||||
$(LIBZCASH_LIBS) \
|
||||
$(LIBCRYPTOCONDITIONS)
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ endif
|
||||
komodo_gtest_CPPFLAGS = $(AM_CPPFLAGS) -DMULTICORE -fopenmp -DBINARY_OUTPUT -DCURVE_ALT_BN128 -DSTATIC $(BITCOIN_INCLUDES)
|
||||
komodo_gtest_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
|
||||
|
||||
komodo_gtest_LDADD = -lgtest -lgmock $(LIBBITCOIN_SERVER) $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CRYPTO) $(LIBVERUS_CRYPTO) $(LIBBITCOIN_UNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \
|
||||
komodo_gtest_LDADD = -lgtest -lgmock $(LIBBITCOIN_SERVER) $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CRYPTO) $(LIBBITCOIN_UNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \
|
||||
$(BOOST_LIBS) $(BOOST_UNIT_TEST_FRAMEWORK_LIB) $(LIBSECP256K1)
|
||||
if ENABLE_ZMQ
|
||||
zcash_gtest_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)
|
||||
|
||||
@@ -1,418 +0,0 @@
|
||||
bin_PROGRAMS += qt/komodo-qt
|
||||
EXTRA_LIBRARIES += qt/libbitcoinqt.a
|
||||
|
||||
# bitcoin qt core #
|
||||
QT_TS = \
|
||||
qt/locale/bitcoin_ach.ts \
|
||||
qt/locale/bitcoin_af_ZA.ts \
|
||||
qt/locale/bitcoin_ar.ts \
|
||||
qt/locale/bitcoin_be_BY.ts \
|
||||
qt/locale/bitcoin_bg.ts \
|
||||
qt/locale/bitcoin_bs.ts \
|
||||
qt/locale/bitcoin_ca_ES.ts \
|
||||
qt/locale/bitcoin_ca.ts \
|
||||
qt/locale/bitcoin_ca@valencia.ts \
|
||||
qt/locale/bitcoin_cmn.ts \
|
||||
qt/locale/bitcoin_cs.ts \
|
||||
qt/locale/bitcoin_cy.ts \
|
||||
qt/locale/bitcoin_da.ts \
|
||||
qt/locale/bitcoin_de.ts \
|
||||
qt/locale/bitcoin_el_GR.ts \
|
||||
qt/locale/bitcoin_en.ts \
|
||||
qt/locale/bitcoin_eo.ts \
|
||||
qt/locale/bitcoin_es_CL.ts \
|
||||
qt/locale/bitcoin_es_DO.ts \
|
||||
qt/locale/bitcoin_es_MX.ts \
|
||||
qt/locale/bitcoin_es.ts \
|
||||
qt/locale/bitcoin_es_UY.ts \
|
||||
qt/locale/bitcoin_et.ts \
|
||||
qt/locale/bitcoin_eu_ES.ts \
|
||||
qt/locale/bitcoin_fa_IR.ts \
|
||||
qt/locale/bitcoin_fa.ts \
|
||||
qt/locale/bitcoin_fi.ts \
|
||||
qt/locale/bitcoin_fr_CA.ts \
|
||||
qt/locale/bitcoin_fr.ts \
|
||||
qt/locale/bitcoin_gl.ts \
|
||||
qt/locale/bitcoin_gu_IN.ts \
|
||||
qt/locale/bitcoin_he.ts \
|
||||
qt/locale/bitcoin_hi_IN.ts \
|
||||
qt/locale/bitcoin_hr.ts \
|
||||
qt/locale/bitcoin_hu.ts \
|
||||
qt/locale/bitcoin_id_ID.ts \
|
||||
qt/locale/bitcoin_it.ts \
|
||||
qt/locale/bitcoin_ja.ts \
|
||||
qt/locale/bitcoin_ka.ts \
|
||||
qt/locale/bitcoin_kk_KZ.ts \
|
||||
qt/locale/bitcoin_ko_KR.ts \
|
||||
qt/locale/bitcoin_ky.ts \
|
||||
qt/locale/bitcoin_la.ts \
|
||||
qt/locale/bitcoin_lt.ts \
|
||||
qt/locale/bitcoin_lv_LV.ts \
|
||||
qt/locale/bitcoin_mn.ts \
|
||||
qt/locale/bitcoin_ms_MY.ts \
|
||||
qt/locale/bitcoin_nb.ts \
|
||||
qt/locale/bitcoin_nl.ts \
|
||||
qt/locale/bitcoin_pam.ts \
|
||||
qt/locale/bitcoin_pl.ts \
|
||||
qt/locale/bitcoin_pt_BR.ts \
|
||||
qt/locale/bitcoin_pt_PT.ts \
|
||||
qt/locale/bitcoin_ro_RO.ts \
|
||||
qt/locale/bitcoin_ru.ts \
|
||||
qt/locale/bitcoin_sah.ts \
|
||||
qt/locale/bitcoin_sk.ts \
|
||||
qt/locale/bitcoin_sl_SI.ts \
|
||||
qt/locale/bitcoin_sq.ts \
|
||||
qt/locale/bitcoin_sr.ts \
|
||||
qt/locale/bitcoin_sv.ts \
|
||||
qt/locale/bitcoin_th_TH.ts \
|
||||
qt/locale/bitcoin_tr.ts \
|
||||
qt/locale/bitcoin_uk.ts \
|
||||
qt/locale/bitcoin_ur_PK.ts \
|
||||
qt/locale/bitcoin_uz@Cyrl.ts \
|
||||
qt/locale/bitcoin_vi.ts \
|
||||
qt/locale/bitcoin_vi_VN.ts \
|
||||
qt/locale/bitcoin_zh_CN.ts \
|
||||
qt/locale/bitcoin_zh_HK.ts \
|
||||
qt/locale/bitcoin_zh_TW.ts
|
||||
|
||||
QT_FORMS_UI = \
|
||||
qt/forms/addressbookpage.ui \
|
||||
qt/forms/askpassphrasedialog.ui \
|
||||
qt/forms/coincontroldialog.ui \
|
||||
qt/forms/editaddressdialog.ui \
|
||||
qt/forms/helpmessagedialog.ui \
|
||||
qt/forms/intro.ui \
|
||||
qt/forms/openuridialog.ui \
|
||||
qt/forms/optionsdialog.ui \
|
||||
qt/forms/overviewpage.ui \
|
||||
qt/forms/receivecoinsdialog.ui \
|
||||
qt/forms/receiverequestdialog.ui \
|
||||
qt/forms/rpcconsole.ui \
|
||||
qt/forms/sendcoinsdialog.ui \
|
||||
qt/forms/sendcoinsentry.ui \
|
||||
qt/forms/signverifymessagedialog.ui \
|
||||
qt/forms/transactiondescdialog.ui
|
||||
|
||||
QT_MOC_CPP = \
|
||||
qt/moc_addressbookpage.cpp \
|
||||
qt/moc_addresstablemodel.cpp \
|
||||
qt/moc_askpassphrasedialog.cpp \
|
||||
qt/moc_bitcoinaddressvalidator.cpp \
|
||||
qt/moc_bitcoinamountfield.cpp \
|
||||
qt/moc_bitcoingui.cpp \
|
||||
qt/moc_bitcoinunits.cpp \
|
||||
qt/moc_clientmodel.cpp \
|
||||
qt/moc_coincontroldialog.cpp \
|
||||
qt/moc_coincontroltreewidget.cpp \
|
||||
qt/moc_csvmodelwriter.cpp \
|
||||
qt/moc_editaddressdialog.cpp \
|
||||
qt/moc_guiutil.cpp \
|
||||
qt/moc_intro.cpp \
|
||||
qt/moc_macdockiconhandler.cpp \
|
||||
qt/moc_macnotificationhandler.cpp \
|
||||
qt/moc_notificator.cpp \
|
||||
qt/moc_openuridialog.cpp \
|
||||
qt/moc_optionsdialog.cpp \
|
||||
qt/moc_optionsmodel.cpp \
|
||||
qt/moc_overviewpage.cpp \
|
||||
qt/moc_peertablemodel.cpp \
|
||||
qt/moc_paymentserver.cpp \
|
||||
qt/moc_qvalidatedlineedit.cpp \
|
||||
qt/moc_qvaluecombobox.cpp \
|
||||
qt/moc_receivecoinsdialog.cpp \
|
||||
qt/moc_receiverequestdialog.cpp \
|
||||
qt/moc_recentrequeststablemodel.cpp \
|
||||
qt/moc_rpcconsole.cpp \
|
||||
qt/moc_sendcoinsdialog.cpp \
|
||||
qt/moc_sendcoinsentry.cpp \
|
||||
qt/moc_signverifymessagedialog.cpp \
|
||||
qt/moc_splashscreen.cpp \
|
||||
qt/moc_trafficgraphwidget.cpp \
|
||||
qt/moc_transactiondesc.cpp \
|
||||
qt/moc_transactiondescdialog.cpp \
|
||||
qt/moc_transactionfilterproxy.cpp \
|
||||
qt/moc_transactiontablemodel.cpp \
|
||||
qt/moc_transactionview.cpp \
|
||||
qt/moc_utilitydialog.cpp \
|
||||
qt/moc_walletframe.cpp \
|
||||
qt/moc_walletmodel.cpp \
|
||||
qt/moc_walletview.cpp
|
||||
|
||||
BITCOIN_MM = \
|
||||
qt/macdockiconhandler.mm \
|
||||
qt/macnotificationhandler.mm
|
||||
|
||||
QT_MOC = \
|
||||
qt/bitcoin.moc \
|
||||
qt/bitcoinamountfield.moc \
|
||||
qt/intro.moc \
|
||||
qt/overviewpage.moc \
|
||||
qt/rpcconsole.moc
|
||||
|
||||
QT_QRC_CPP = qt/qrc_bitcoin.cpp
|
||||
QT_QRC = qt/bitcoin.qrc
|
||||
QT_QRC_LOCALE_CPP = qt/qrc_bitcoin_locale.cpp
|
||||
QT_QRC_LOCALE = qt/bitcoin_locale.qrc
|
||||
|
||||
PROTOBUF_CC = qt/paymentrequest.pb.cc
|
||||
PROTOBUF_H = qt/paymentrequest.pb.h
|
||||
PROTOBUF_PROTO = qt/paymentrequest.proto
|
||||
|
||||
BITCOIN_QT_H = \
|
||||
qt/addressbookpage.h \
|
||||
qt/addresstablemodel.h \
|
||||
qt/askpassphrasedialog.h \
|
||||
qt/bitcoinaddressvalidator.h \
|
||||
qt/bitcoinamountfield.h \
|
||||
qt/bitcoingui.h \
|
||||
qt/bitcoinunits.h \
|
||||
qt/clientmodel.h \
|
||||
qt/coincontroldialog.h \
|
||||
qt/coincontroltreewidget.h \
|
||||
qt/csvmodelwriter.h \
|
||||
qt/editaddressdialog.h \
|
||||
qt/guiconstants.h \
|
||||
qt/guiutil.h \
|
||||
qt/intro.h \
|
||||
qt/macdockiconhandler.h \
|
||||
qt/macnotificationhandler.h \
|
||||
qt/networkstyle.h \
|
||||
qt/notificator.h \
|
||||
qt/openuridialog.h \
|
||||
qt/optionsdialog.h \
|
||||
qt/optionsmodel.h \
|
||||
qt/overviewpage.h \
|
||||
qt/paymentrequestplus.h \
|
||||
qt/paymentserver.h \
|
||||
qt/peertablemodel.h \
|
||||
qt/qvalidatedlineedit.h \
|
||||
qt/qvaluecombobox.h \
|
||||
qt/receivecoinsdialog.h \
|
||||
qt/receiverequestdialog.h \
|
||||
qt/recentrequeststablemodel.h \
|
||||
qt/rpcconsole.h \
|
||||
qt/scicon.h \
|
||||
qt/sendcoinsdialog.h \
|
||||
qt/sendcoinsentry.h \
|
||||
qt/signverifymessagedialog.h \
|
||||
qt/splashscreen.h \
|
||||
qt/trafficgraphwidget.h \
|
||||
qt/transactiondesc.h \
|
||||
qt/transactiondescdialog.h \
|
||||
qt/transactionfilterproxy.h \
|
||||
qt/transactionrecord.h \
|
||||
qt/transactiontablemodel.h \
|
||||
qt/transactionview.h \
|
||||
qt/utilitydialog.h \
|
||||
qt/walletframe.h \
|
||||
qt/walletmodel.h \
|
||||
qt/walletmodeltransaction.h \
|
||||
qt/walletview.h \
|
||||
qt/winshutdownmonitor.h
|
||||
|
||||
RES_ICONS = \
|
||||
qt/res/icons/add.png \
|
||||
qt/res/icons/address-book.png \
|
||||
qt/res/icons/about.png \
|
||||
qt/res/icons/about_qt.png \
|
||||
qt/res/icons/bitcoin.ico \
|
||||
qt/res/icons/bitcoin.png \
|
||||
qt/res/icons/clock1.png \
|
||||
qt/res/icons/clock2.png \
|
||||
qt/res/icons/clock3.png \
|
||||
qt/res/icons/clock4.png \
|
||||
qt/res/icons/clock5.png \
|
||||
qt/res/icons/configure.png \
|
||||
qt/res/icons/connect0.png \
|
||||
qt/res/icons/connect1.png \
|
||||
qt/res/icons/connect2.png \
|
||||
qt/res/icons/connect3.png \
|
||||
qt/res/icons/connect4.png \
|
||||
qt/res/icons/debugwindow.png \
|
||||
qt/res/icons/edit.png \
|
||||
qt/res/icons/editcopy.png \
|
||||
qt/res/icons/editpaste.png \
|
||||
qt/res/icons/export.png \
|
||||
qt/res/icons/eye.png \
|
||||
qt/res/icons/eye_minus.png \
|
||||
qt/res/icons/eye_plus.png \
|
||||
qt/res/icons/filesave.png \
|
||||
qt/res/icons/history.png \
|
||||
qt/res/icons/info.png \
|
||||
qt/res/icons/key.png \
|
||||
qt/res/icons/lock_closed.png \
|
||||
qt/res/icons/lock_open.png \
|
||||
qt/res/icons/open.png \
|
||||
qt/res/icons/overview.png \
|
||||
qt/res/icons/quit.png \
|
||||
qt/res/icons/receive.png \
|
||||
qt/res/icons/remove.png \
|
||||
qt/res/icons/send.png \
|
||||
qt/res/icons/synced.png \
|
||||
qt/res/icons/transaction0.png \
|
||||
qt/res/icons/transaction2.png \
|
||||
qt/res/icons/transaction_conflicted.png \
|
||||
qt/res/icons/tx_inout.png \
|
||||
qt/res/icons/tx_input.png \
|
||||
qt/res/icons/tx_output.png \
|
||||
qt/res/icons/tx_mined.png \
|
||||
qt/res/icons/warning.png \
|
||||
qt/res/icons/verify.png
|
||||
|
||||
BITCOIN_QT_CPP = \
|
||||
qt/bitcoinaddressvalidator.cpp \
|
||||
qt/bitcoinamountfield.cpp \
|
||||
qt/bitcoingui.cpp \
|
||||
qt/bitcoinunits.cpp \
|
||||
qt/clientmodel.cpp \
|
||||
qt/csvmodelwriter.cpp \
|
||||
qt/guiutil.cpp \
|
||||
qt/intro.cpp \
|
||||
qt/networkstyle.cpp \
|
||||
qt/notificator.cpp \
|
||||
qt/optionsdialog.cpp \
|
||||
qt/optionsmodel.cpp \
|
||||
qt/peertablemodel.cpp \
|
||||
qt/qvalidatedlineedit.cpp \
|
||||
qt/qvaluecombobox.cpp \
|
||||
qt/rpcconsole.cpp \
|
||||
qt/scicon.cpp \
|
||||
qt/splashscreen.cpp \
|
||||
qt/trafficgraphwidget.cpp \
|
||||
qt/utilitydialog.cpp
|
||||
|
||||
if TARGET_WINDOWS
|
||||
BITCOIN_QT_CPP += qt/winshutdownmonitor.cpp
|
||||
endif
|
||||
|
||||
if ENABLE_WALLET
|
||||
BITCOIN_QT_CPP += \
|
||||
qt/addressbookpage.cpp \
|
||||
qt/addresstablemodel.cpp \
|
||||
qt/askpassphrasedialog.cpp \
|
||||
qt/coincontroldialog.cpp \
|
||||
qt/coincontroltreewidget.cpp \
|
||||
qt/editaddressdialog.cpp \
|
||||
qt/openuridialog.cpp \
|
||||
qt/overviewpage.cpp \
|
||||
qt/paymentrequestplus.cpp \
|
||||
qt/paymentserver.cpp \
|
||||
qt/receivecoinsdialog.cpp \
|
||||
qt/receiverequestdialog.cpp \
|
||||
qt/recentrequeststablemodel.cpp \
|
||||
qt/sendcoinsdialog.cpp \
|
||||
qt/sendcoinsentry.cpp \
|
||||
qt/signverifymessagedialog.cpp \
|
||||
qt/transactiondesc.cpp \
|
||||
qt/transactiondescdialog.cpp \
|
||||
qt/transactionfilterproxy.cpp \
|
||||
qt/transactionrecord.cpp \
|
||||
qt/transactiontablemodel.cpp \
|
||||
qt/transactionview.cpp \
|
||||
qt/walletframe.cpp \
|
||||
qt/walletmodel.cpp \
|
||||
qt/walletmodeltransaction.cpp \
|
||||
qt/walletview.cpp
|
||||
endif
|
||||
|
||||
RES_IMAGES =
|
||||
|
||||
RES_MOVIES = $(wildcard qt/res/movies/spinner-*.png)
|
||||
|
||||
BITCOIN_RC = qt/res/komodo-qt-res.rc
|
||||
|
||||
BITCOIN_QT_INCLUDES = -I$(builddir)/qt -I$(srcdir)/qt -I$(srcdir)/qt/forms \
|
||||
-I$(builddir)/qt/forms -DQT_NO_KEYWORDS
|
||||
|
||||
qt_libbitcoinqt_a_CPPFLAGS = $(BITCOIN_INCLUDES) $(BITCOIN_QT_INCLUDES) \
|
||||
$(QT_INCLUDES) $(QT_DBUS_INCLUDES) $(PROTOBUF_CFLAGS) $(QR_CFLAGS)
|
||||
|
||||
qt_libbitcoinqt_a_SOURCES = $(BITCOIN_QT_CPP) $(BITCOIN_QT_H) $(QT_FORMS_UI) \
|
||||
$(QT_QRC) $(QT_QRC_LOCALE) $(QT_TS) $(PROTOBUF_PROTO) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES)
|
||||
|
||||
nodist_qt_libbitcoinqt_a_SOURCES = $(QT_MOC_CPP) $(QT_MOC) $(PROTOBUF_CC) \
|
||||
$(PROTOBUF_H) $(QT_QRC_CPP) $(QT_QRC_LOCALE_CPP)
|
||||
|
||||
# forms/foo.h -> forms/ui_foo.h
|
||||
QT_FORMS_H=$(join $(dir $(QT_FORMS_UI)),$(addprefix ui_, $(notdir $(QT_FORMS_UI:.ui=.h))))
|
||||
|
||||
# Most files will depend on the forms and moc files as includes. Generate them
|
||||
# before anything else.
|
||||
$(QT_MOC): $(QT_FORMS_H)
|
||||
$(qt_libbitcoinqt_a_OBJECTS) $(qt_komodo_qt_OBJECTS) : | $(QT_MOC)
|
||||
|
||||
#Generating these with a half-written protobuf header leads to wacky results.
|
||||
#This makes sure it's done.
|
||||
$(QT_MOC): $(PROTOBUF_H)
|
||||
$(QT_MOC_CPP): $(PROTOBUF_H)
|
||||
|
||||
# bitcoin-qt binary #
|
||||
qt_komodo_qt_CPPFLAGS = $(BITCOIN_INCLUDES) $(BITCOIN_QT_INCLUDES) \
|
||||
$(QT_INCLUDES) $(PROTOBUF_CFLAGS) $(QR_CFLAGS)
|
||||
|
||||
qt_komodo_qt_SOURCES = qt/bitcoin.cpp
|
||||
if TARGET_DARWIN
|
||||
qt_komodo_qt_SOURCES += $(BITCOIN_MM)
|
||||
endif
|
||||
if TARGET_WINDOWS
|
||||
qt_komodo_qt_SOURCES += $(BITCOIN_RC)
|
||||
endif
|
||||
qt_komodo_qt_LDADD = qt/libbitcoinqt.a $(LIBBITCOIN_SERVER)
|
||||
if ENABLE_WALLET
|
||||
qt_komodo_qt_LDADD += $(LIBBITCOIN_WALLET)
|
||||
endif
|
||||
qt_komodo_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CRYPTO) $(LIBVERUS_CRYPTO) $(LIBBITCOIN_UNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \
|
||||
$(BOOST_LIBS) $(QT_LIBS) $(QT_DBUS_LIBS) $(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(LIBSECP256K1) $(LIBZCASH_LIBS)
|
||||
qt_komodo_qt_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
|
||||
qt_komodo_qt_LIBTOOLFLAGS = --tag CXX
|
||||
|
||||
#locale/foo.ts -> locale/foo.qm
|
||||
QT_QM=$(QT_TS:.ts=.qm)
|
||||
|
||||
SECONDARY: $(QT_QM)
|
||||
|
||||
qt/bitcoinstrings.cpp: $(libbitcoin_server_a_SOURCES) $(libbitcoin_wallet_a_SOURCES)
|
||||
@test -n $(XGETTEXT) || echo "xgettext is required for updating translations"
|
||||
$(AM_V_GEN) cd $(srcdir); XGETTEXT=$(XGETTEXT) ../share/qt/extract_strings_qt.py $^
|
||||
|
||||
translate: qt/bitcoinstrings.cpp $(QT_FORMS_UI) $(QT_FORMS_UI) $(BITCOIN_QT_CPP) $(BITCOIN_QT_H) $(BITCOIN_MM)
|
||||
@test -n $(LUPDATE) || echo "lupdate is required for updating translations"
|
||||
$(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(LUPDATE) $^ -locations relative -no-obsolete -ts qt/locale/bitcoin_en.ts
|
||||
|
||||
$(QT_QRC_LOCALE_CPP): $(QT_QRC_LOCALE) $(QT_QM)
|
||||
@test -f $(RCC)
|
||||
@test -f $(@D)/$(<F) || cp -f $< $(@D)
|
||||
$(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(RCC) -name bitcoin_locale $(@D)/$(<F) | \
|
||||
$(SED) -e '/^\*\*.*Created:/d' -e '/^\*\*.*by:/d' > $@
|
||||
|
||||
$(QT_QRC_CPP): $(QT_QRC) $(QT_FORMS_H) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) $(PROTOBUF_H)
|
||||
@test -f $(RCC)
|
||||
$(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(RCC) -name bitcoin $< | \
|
||||
$(SED) -e '/^\*\*.*Created:/d' -e '/^\*\*.*by:/d' > $@
|
||||
|
||||
CLEAN_QT = $(nodist_qt_libbitcoinqt_a_SOURCES) $(QT_QM) $(QT_FORMS_H) qt/*.gcda qt/*.gcno
|
||||
|
||||
CLEANFILES += $(CLEAN_QT)
|
||||
|
||||
komodo_qt_clean: FORCE
|
||||
rm -f $(CLEAN_QT) $(qt_libbitcoinqt_a_OBJECTS) $(qt_komodo_qt_OBJECTS) qt/bitcoin-qt$(EXEEXT) $(LIBBITCOINQT)
|
||||
|
||||
komodo_qt : qt/bitcoin-qt$(EXEEXT)
|
||||
|
||||
ui_%.h: %.ui
|
||||
@test -f $(UIC)
|
||||
@$(MKDIR_P) $(@D)
|
||||
$(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(UIC) -o $@ $< || (echo "Error creating $@"; false)
|
||||
|
||||
%.moc: %.cpp
|
||||
$(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(MOC) $(QT_INCLUDES) $(MOC_DEFS) $< | \
|
||||
$(SED) -e '/^\*\*.*Created:/d' -e '/^\*\*.*by:/d' > $@
|
||||
|
||||
moc_%.cpp: %.h
|
||||
$(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(MOC) $(QT_INCLUDES) $(MOC_DEFS) $< | \
|
||||
$(SED) -e '/^\*\*.*Created:/d' -e '/^\*\*.*by:/d' > $@
|
||||
|
||||
%.qm: %.ts
|
||||
@test -f $(LRELEASE)
|
||||
@$(MKDIR_P) $(@D)
|
||||
$(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(LRELEASE) -silent $< -qm $@
|
||||
@@ -1,48 +0,0 @@
|
||||
bin_PROGRAMS += qt/test/test_bitcoin-qt
|
||||
TESTS += qt/test/test_bitcoin-qt
|
||||
|
||||
TEST_QT_MOC_CPP = qt/test/moc_uritests.cpp
|
||||
|
||||
if ENABLE_WALLET
|
||||
TEST_QT_MOC_CPP += qt/test/moc_paymentservertests.cpp
|
||||
endif
|
||||
|
||||
TEST_QT_H = \
|
||||
qt/test/uritests.h \
|
||||
qt/test/paymentrequestdata.h \
|
||||
qt/test/paymentservertests.h
|
||||
|
||||
qt_test_test_komodo_qt_CPPFLAGS = $(BITCOIN_INCLUDES) $(BITCOIN_QT_INCLUDES) \
|
||||
$(QT_INCLUDES) $(QT_TEST_INCLUDES) $(PROTOBUF_CFLAGS)
|
||||
|
||||
qt_test_test_komodo_qt_SOURCES = \
|
||||
qt/test/test_main.cpp \
|
||||
qt/test/uritests.cpp \
|
||||
$(TEST_QT_H)
|
||||
if ENABLE_WALLET
|
||||
qt_test_test_komodo_qt_SOURCES += \
|
||||
qt/test/paymentservertests.cpp
|
||||
endif
|
||||
|
||||
nodist_qt_test_test_komodo_qt_SOURCES = $(TEST_QT_MOC_CPP)
|
||||
|
||||
qt_test_test_komodo_qt_LDADD = $(LIBBITCOINQT) $(LIBBITCOIN_SERVER)
|
||||
if ENABLE_WALLET
|
||||
qt_test_test_komodo_qt_LDADD += $(LIBBITCOIN_WALLET)
|
||||
endif
|
||||
qt_test_test_komodo_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CRYPTO) $(LIBVERUS_CRYPTO) $(LIBBITCOIN_UNIVALUE) $(LIBLEVELDB) \
|
||||
$(LIBMEMENV) $(BOOST_LIBS) $(QT_DBUS_LIBS) $(QT_TEST_LIBS) $(QT_LIBS) \
|
||||
$(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(LIBSECP256K1) $(LIBZCASH_LIBS)
|
||||
qt_test_test_komodo_qt_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
|
||||
|
||||
CLEAN_BITCOIN_QT_TEST = $(TEST_QT_MOC_CPP) qt/test/*.gcda qt/test/*.gcno
|
||||
|
||||
CLEANFILES += $(CLEAN_BITCOIN_QT_TEST)
|
||||
|
||||
test_komodo_qt : qt/test/test_bitcoin-qt$(EXEEXT)
|
||||
|
||||
test_komodo_qt_check : qt/test/test_bitcoin-qt$(EXEEXT) FORCE
|
||||
$(MAKE) check-TESTS TESTS=$^
|
||||
|
||||
test_komodo_qt_clean: FORCE
|
||||
rm -f $(CLEAN_BITCOIN_QT_TEST) $(qt_test_test_komodo_qt_OBJECTS)
|
||||
@@ -113,7 +113,7 @@ endif
|
||||
|
||||
test_test_bitcoin_SOURCES = $(BITCOIN_TESTS) $(JSON_TEST_FILES) $(RAW_TEST_FILES)
|
||||
test_test_bitcoin_CPPFLAGS = $(AM_CPPFLAGS) -fopenmp $(BITCOIN_INCLUDES) -I$(builddir)/test/ $(TESTDEFS) $(EVENT_CFLAGS)
|
||||
test_test_bitcoin_LDADD = $(LIBBITCOIN_SERVER) $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CRYPTO) $(LIBVERUS_CRYPTO) $(LIBUNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \
|
||||
test_test_bitcoin_LDADD = $(LIBBITCOIN_SERVER) $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \
|
||||
$(BOOST_LIBS) $(BOOST_UNIT_TEST_FRAMEWORK_LIB) $(LIBSECP256K1) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS)
|
||||
test_test_bitcoin_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
|
||||
if ENABLE_WALLET
|
||||
|
||||
@@ -24,7 +24,6 @@ zcash_CreateJoinSplit_LDADD = \
|
||||
$(LIBSNARK) \
|
||||
$(LIBBITCOIN_UTIL) \
|
||||
$(LIBBITCOIN_CRYPTO) \
|
||||
$(LIBVERUS_CRYPTO) \
|
||||
$(BOOST_LIBS) \
|
||||
$(LIBZCASH_LIBS) \
|
||||
$(LIBCRYPTOCONDITIONS) \
|
||||
|
||||
323
src/REVS.batch0
323
src/REVS.batch0
@@ -1,323 +0,0 @@
|
||||
# RG1QE6hTqu4dadL2XSNWS9VCHjd8xNVo58 KMD 16462.32091533, REVS 289.86606506
|
||||
fiat/revs sendtoaddress RG1QE6hTqu4dadL2XSNWS9VCHjd8xNVo58 289.86606506
|
||||
sleep 1
|
||||
# RFVvyUAnQe5yon6wq7B73Z1BzfFeZKyAZA KMD 74417.52897713, REVS 500.77700000
|
||||
fiat/revs sendtoaddress RFVvyUAnQe5yon6wq7B73Z1BzfFeZKyAZA 500.77700000
|
||||
sleep 1
|
||||
# RWfaj9ZNmHq5A4jV411xpt1FJoyvKfVJ6c KMD 616895.10028203, REVS 3685.61452692
|
||||
fiat/revs sendtoaddress RWfaj9ZNmHq5A4jV411xpt1FJoyvKfVJ6c 3685.61452692
|
||||
sleep 1
|
||||
# R9dTcQWVDuaRdFqDzq4xPaFDjGbaLK6t8n KMD 1053.37494565, REVS 4.29070721
|
||||
fiat/revs sendtoaddress R9dTcQWVDuaRdFqDzq4xPaFDjGbaLK6t8n 4.29070721
|
||||
sleep 1
|
||||
# REvJWEuwqmwTnanZ8bWt85wnjfrsAjnvgE KMD 3945.67461320, REVS 30.24757576
|
||||
fiat/revs sendtoaddress REvJWEuwqmwTnanZ8bWt85wnjfrsAjnvgE 30.24757576
|
||||
sleep 1
|
||||
# RBpEnyzuQNj1hNdAG1pKLALpAWEUS67PBj KMD 2729058.03025689, REVS 54178.00103054
|
||||
fiat/revs sendtoaddress RBpEnyzuQNj1hNdAG1pKLALpAWEUS67PBj 54178.00103054
|
||||
sleep 1
|
||||
# RHSZ1CWDNhkNbbQRDrqLHRAdCshueMrt2r KMD 8661.80183095, REVS 171.90929822
|
||||
fiat/revs sendtoaddress RHSZ1CWDNhkNbbQRDrqLHRAdCshueMrt2r 171.90929822
|
||||
sleep 1
|
||||
# RTqh7gEJMJDpnBp62FZZAfXctj8X7sRRia KMD 18367.01200788, REVS 350.00000000
|
||||
fiat/revs sendtoaddress RTqh7gEJMJDpnBp62FZZAfXctj8X7sRRia 350.00000000
|
||||
sleep 1
|
||||
# RNhyF9U3o4hTgWqnwQjHwrD1o4GqWiP1T6 KMD 7816.63087181, REVS 78.63808960
|
||||
fiat/revs sendtoaddress RNhyF9U3o4hTgWqnwQjHwrD1o4GqWiP1T6 78.63808960
|
||||
sleep 1
|
||||
# RE3yR2mCeG15ARgvENMbb573VqoQJcM3po KMD 17738.87416605, REVS 18.61556549
|
||||
fiat/revs sendtoaddress RE3yR2mCeG15ARgvENMbb573VqoQJcM3po 18.61556549
|
||||
sleep 1
|
||||
# RT7ENMvL46nwrFfNj1TLa5FEqJzTztHefH KMD 26696.69308472, REVS 529.99000000
|
||||
fiat/revs sendtoaddress RT7ENMvL46nwrFfNj1TLa5FEqJzTztHefH 529.99000000
|
||||
sleep 1
|
||||
# RDTcqgh4MMHLtu9FBCcULqZmP761DFmk9b KMD 82906.87674571, REVS 1438.93600000
|
||||
fiat/revs sendtoaddress RDTcqgh4MMHLtu9FBCcULqZmP761DFmk9b 1438.93600000
|
||||
sleep 1
|
||||
# RHSUmLRyJwpbdsRtytkGs9GmpZghQWHje3 KMD 2197.34858012, REVS 43.61040113
|
||||
fiat/revs sendtoaddress RHSUmLRyJwpbdsRtytkGs9GmpZghQWHje3 43.61040113
|
||||
sleep 1
|
||||
# RJEQbNrMQUHELrYPVLPepR2Y3ruAag3hEP KMD 64966.39751162, REVS 1035.00000000
|
||||
fiat/revs sendtoaddress RJEQbNrMQUHELrYPVLPepR2Y3ruAag3hEP 1035.00000000
|
||||
sleep 1
|
||||
# RJ1DUUySYib5LcwJKFJ78PD3so2GQ89jKJ KMD 377892.70160675, REVS 7501.00000000
|
||||
fiat/revs sendtoaddress RJ1DUUySYib5LcwJKFJ78PD3so2GQ89jKJ 7501.00000000
|
||||
sleep 1
|
||||
# RC2nLGhFUc5Q9QFG1b38gAi9WgSgzQ9hJR KMD 41.38832712, REVS 0.82090537
|
||||
fiat/revs sendtoaddress RC2nLGhFUc5Q9QFG1b38gAi9WgSgzQ9hJR 0.82090537
|
||||
sleep 1
|
||||
# RCJHEogA7SW6PxuctPLtaVnXwiu49PyZY8 KMD 1350076.86672091, REVS 100.00000000
|
||||
fiat/revs sendtoaddress RCJHEogA7SW6PxuctPLtaVnXwiu49PyZY8 100.00000000
|
||||
sleep 1
|
||||
# RJbudEMb7wEEN8QZ18fEkptxjE4QnMECUu KMD 50567.04202258, REVS 1003.32000000
|
||||
fiat/revs sendtoaddress RJbudEMb7wEEN8QZ18fEkptxjE4QnMECUu 1003.32000000
|
||||
sleep 1
|
||||
# RSdVypRznJsboL6MaP1shkaLhrVFcNx2KL KMD 589187.66272894, REVS 11685.49743445
|
||||
fiat/revs sendtoaddress RSdVypRznJsboL6MaP1shkaLhrVFcNx2KL 11685.49743445
|
||||
sleep 1
|
||||
# RWXwZyGf4q7cBakkY4tgupptBbCSvcBsBH KMD 1012.75625347, REVS 20.10000000
|
||||
fiat/revs sendtoaddress RWXwZyGf4q7cBakkY4tgupptBbCSvcBsBH 20.10000000
|
||||
sleep 1
|
||||
# RA7UJPwPxqgPHn4YscYWRH5EPQVaFaaaPa KMD 45132.81116316, REVS 342.26137428
|
||||
fiat/revs sendtoaddress RA7UJPwPxqgPHn4YscYWRH5EPQVaFaaaPa 342.26137428
|
||||
sleep 1
|
||||
# RRFFxsc6kkfahR7v4paTaUZrPFisuz9Nkq KMD 155.36852443, REVS 3.08314987
|
||||
fiat/revs sendtoaddress RRFFxsc6kkfahR7v4paTaUZrPFisuz9Nkq 3.08314987
|
||||
sleep 1
|
||||
# RWFSbi9ECuZWVE37jpkbiKGw7DaFYdNtts KMD 23963.90703474, REVS 475.60756080
|
||||
fiat/revs sendtoaddress RWFSbi9ECuZWVE37jpkbiKGw7DaFYdNtts 475.60756080
|
||||
sleep 1
|
||||
# RUVkn1F9g7TxoPbYtegiQoFnPTusP2gzDr KMD 43088.75849296, REVS 470.88002226
|
||||
fiat/revs sendtoaddress RUVkn1F9g7TxoPbYtegiQoFnPTusP2gzDr 470.88002226
|
||||
sleep 1
|
||||
# R9vBYQw9tSBhu2c1g4SQhZdhuZeeQrEBoN KMD 111664.10821907, REVS 2023.42268720
|
||||
fiat/revs sendtoaddress R9vBYQw9tSBhu2c1g4SQhZdhuZeeQrEBoN 2023.42268720
|
||||
sleep 1
|
||||
# RG8g7LjK7hdyKp3aoKBRdwzpLy31XMXMLk KMD 972.80557592, REVS 19.29916914
|
||||
fiat/revs sendtoaddress RG8g7LjK7hdyKp3aoKBRdwzpLy31XMXMLk 19.29916914
|
||||
sleep 1
|
||||
# RJ7RfZfip4qL9uEJs7Wr9FYtGusQiryMqE KMD 43251.49599262, REVS 857.93461385
|
||||
fiat/revs sendtoaddress RJ7RfZfip4qL9uEJs7Wr9FYtGusQiryMqE 857.93461385
|
||||
sleep 1
|
||||
# RNW6Kkcdktbeemd2n8NVPCfgnRirzWoiZY KMD 53585.08128315, REVS 731.01000000
|
||||
fiat/revs sendtoaddress RNW6Kkcdktbeemd2n8NVPCfgnRirzWoiZY 731.01000000
|
||||
sleep 1
|
||||
# RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3 KMD 57862.44847739, REVS 464.78017965
|
||||
fiat/revs sendtoaddress RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3 464.78017965
|
||||
sleep 1
|
||||
# RTkvmxME9rVZBY6ABNqkkbqKvn8WUqgQqr KMD 215743.93040290, REVS 4280.65926868
|
||||
fiat/revs sendtoaddress RTkvmxME9rVZBY6ABNqkkbqKvn8WUqgQqr 4280.65926868
|
||||
sleep 1
|
||||
# RS9erX84xJG17efdZ66qHxhsUMG15fnCsH KMD 977546.42205511, REVS 19403.85638743
|
||||
fiat/revs sendtoaddress RS9erX84xJG17efdZ66qHxhsUMG15fnCsH 19403.85638743
|
||||
sleep 1
|
||||
# RE1wsrDNwW2NnNWM5eE162yp6haLtm5uh7 KMD 14588.33036215, REVS 289.61149547
|
||||
fiat/revs sendtoaddress RE1wsrDNwW2NnNWM5eE162yp6haLtm5uh7 289.61149547
|
||||
sleep 1
|
||||
# RK5BnRzCP52qsTE4xR3Qysn6m6KeTgpZA6 KMD 3170.70655908, REVS 37.96790925
|
||||
fiat/revs sendtoaddress RK5BnRzCP52qsTE4xR3Qysn6m6KeTgpZA6 37.96790925
|
||||
sleep 1
|
||||
# RN6TfTEYHdvFAeosYrvDaMBb2yBco47Q5a KMD 7073.16782615, REVS 44.30216197
|
||||
fiat/revs sendtoaddress RN6TfTEYHdvFAeosYrvDaMBb2yBco47Q5a 44.30216197
|
||||
sleep 1
|
||||
# RV4Hf22arBv4P4s5eFsUAnXC6N11T8x9tv KMD 117108.97863641, REVS 1631.49836519
|
||||
fiat/revs sendtoaddress RV4Hf22arBv4P4s5eFsUAnXC6N11T8x9tv 1631.49836519
|
||||
sleep 1
|
||||
# RYBH6Ha8RJa3CcE91yxJP6z2E6mDFm3bBt KMD 163386.58575808, REVS 50.00000000
|
||||
fiat/revs sendtoaddress RYBH6Ha8RJa3CcE91yxJP6z2E6mDFm3bBt 50.00000000
|
||||
sleep 1
|
||||
# RUY7YW1WmTD3hCvkXmUKLeRnNg5UsJoLbU KMD 6742.29255596, REVS 105.00000000
|
||||
fiat/revs sendtoaddress RUY7YW1WmTD3hCvkXmUKLeRnNg5UsJoLbU 105.00000000
|
||||
sleep 1
|
||||
# RNVwzuZynZ7d4DE5CfT8CWkxsp9TtCY3BF KMD 1598.36899361, REVS 11.75449303
|
||||
fiat/revs sendtoaddress RNVwzuZynZ7d4DE5CfT8CWkxsp9TtCY3BF 11.75449303
|
||||
sleep 1
|
||||
# RPriQZfzzgin7y2Ns6vxdrMAa4XgZqdY6y KMD 21671.70738465, REVS 170.69524117
|
||||
fiat/revs sendtoaddress RPriQZfzzgin7y2Ns6vxdrMAa4XgZqdY6y 170.69524117
|
||||
sleep 1
|
||||
# RSCdeeWvzpBhg2tKnCWZWKw9iAMyYWiREG KMD 12075.12037906, REVS 239.62000000
|
||||
fiat/revs sendtoaddress RSCdeeWvzpBhg2tKnCWZWKw9iAMyYWiREG 239.62000000
|
||||
sleep 1
|
||||
# RUAvb7FFPvxjNTVhABeS2EbbdUi2LfGNMj KMD 25710.06172178, REVS 510.00000000
|
||||
fiat/revs sendtoaddress RUAvb7FFPvxjNTVhABeS2EbbdUi2LfGNMj 510.00000000
|
||||
sleep 1
|
||||
# RQuMEMn1TG7CCpbmYCVcDfPqesEvEkisjC KMD 34758.47429765, REVS 689.94006658
|
||||
fiat/revs sendtoaddress RQuMEMn1TG7CCpbmYCVcDfPqesEvEkisjC 689.94006658
|
||||
sleep 1
|
||||
# RBNB5mKstG86jYRjrKFgJuFoUFvZKJb9Wq KMD 816561.67159376, REVS 16199.49755302
|
||||
fiat/revs sendtoaddress RBNB5mKstG86jYRjrKFgJuFoUFvZKJb9Wq 16199.49755302
|
||||
sleep 1
|
||||
# RHoouCBBapEHE6uyX7CxHGFcRwUQFGMot5 KMD 88331.27512150, REVS 1398.88449696
|
||||
fiat/revs sendtoaddress RHoouCBBapEHE6uyX7CxHGFcRwUQFGMot5 1398.88449696
|
||||
sleep 1
|
||||
# RLHEGDwXuXQwhYkrhwSRGSJMFuvv7EAT7i KMD 22366.16022678, REVS 443.95821128
|
||||
fiat/revs sendtoaddress RLHEGDwXuXQwhYkrhwSRGSJMFuvv7EAT7i 443.95821128
|
||||
sleep 1
|
||||
# RAEtFUqe3jwVxLywCga2eKQxT2DiewsUuN KMD 25.54297774, REVS 0.50680815
|
||||
fiat/revs sendtoaddress RAEtFUqe3jwVxLywCga2eKQxT2DiewsUuN 0.50680815
|
||||
sleep 1
|
||||
# RUcDMtu7fA3ATbHHsDTsZ8KThgd1ivawym KMD 21446.21749875, REVS 241.00000000
|
||||
fiat/revs sendtoaddress RUcDMtu7fA3ATbHHsDTsZ8KThgd1ivawym 241.00000000
|
||||
sleep 1
|
||||
# RG2cAef3JbCXiQkzPgrqS52HAQrBzJiAy4 KMD 102137.83664315, REVS 2027.11216000
|
||||
fiat/revs sendtoaddress RG2cAef3JbCXiQkzPgrqS52HAQrBzJiAy4 2027.11216000
|
||||
sleep 1
|
||||
# REzcqBkARMCCxkA5rVdp61f7rovmFtq5kf KMD 130928.69826981, REVS 2597.54928401
|
||||
fiat/revs sendtoaddress REzcqBkARMCCxkA5rVdp61f7rovmFtq5kf 2597.54928401
|
||||
sleep 1
|
||||
# RXKZmFmmpfAV2DAdUUXhA88RqCoyPRXcnA KMD 28641.72782430, REVS 337.66808110
|
||||
fiat/revs sendtoaddress RXKZmFmmpfAV2DAdUUXhA88RqCoyPRXcnA 337.66808110
|
||||
sleep 1
|
||||
# RCxnQhmYdpK9vTS7PLRtXBtDk2HaRNo1qk KMD 2171.04073365, REVS 43.05910000
|
||||
fiat/revs sendtoaddress RCxnQhmYdpK9vTS7PLRtXBtDk2HaRNo1qk 43.05910000
|
||||
sleep 1
|
||||
# RPtwW4UejbAxs5PU6a1zMPcPqW7SVghMDS KMD 31741.86724191, REVS 514.45537037
|
||||
fiat/revs sendtoaddress RPtwW4UejbAxs5PU6a1zMPcPqW7SVghMDS 514.45537037
|
||||
sleep 1
|
||||
# RYMzZx5nxKrMtTm3TNeheVn4RooTGvhsNd KMD 12756.16332851, REVS 253.10000000
|
||||
fiat/revs sendtoaddress RYMzZx5nxKrMtTm3TNeheVn4RooTGvhsNd 253.10000000
|
||||
sleep 1
|
||||
# RPyKbtBPVb3FYv5iFULNUB6bq9DdvekZuz KMD 3422.63549310, REVS 51.90683618
|
||||
fiat/revs sendtoaddress RPyKbtBPVb3FYv5iFULNUB6bq9DdvekZuz 51.90683618
|
||||
sleep 1
|
||||
# RVcGdBT2N6Fbqbptj3R4zhZYNB4WJQWEns KMD 77986.19708921, REVS 1548.20316000
|
||||
fiat/revs sendtoaddress RVcGdBT2N6Fbqbptj3R4zhZYNB4WJQWEns 1548.20316000
|
||||
sleep 1
|
||||
# RH4SXj2zZqfG4TfejyHcVpaoPoDv1Uonnf KMD 11621.99031627, REVS 192.14192021
|
||||
fiat/revs sendtoaddress RH4SXj2zZqfG4TfejyHcVpaoPoDv1Uonnf 192.14192021
|
||||
sleep 1
|
||||
# REtq1LtbLVo6bz68f9TGFduNmUTKqG7vnH KMD 25088.84725730, REVS 305.62849999
|
||||
fiat/revs sendtoaddress REtq1LtbLVo6bz68f9TGFduNmUTKqG7vnH 305.62849999
|
||||
sleep 1
|
||||
# RS3rMPEGouBWbHKStyQg8TxVmtwFQ6ebh3 KMD 3546.25060143, REVS 39.99000000
|
||||
fiat/revs sendtoaddress RS3rMPEGouBWbHKStyQg8TxVmtwFQ6ebh3 39.99000000
|
||||
sleep 1
|
||||
# RGzvr4JSHDLDQAGBwdyoUiUuaYn5sUwKNd KMD 69108.92543895, REVS 314.51750000
|
||||
fiat/revs sendtoaddress RGzvr4JSHDLDQAGBwdyoUiUuaYn5sUwKNd 314.51750000
|
||||
sleep 1
|
||||
# RMD1wVnzMmKn8uMTHaP9pYfCWkxf3QVWWE KMD 2931.50081538, REVS 40.37145505
|
||||
fiat/revs sendtoaddress RMD1wVnzMmKn8uMTHaP9pYfCWkxf3QVWWE 40.37145505
|
||||
sleep 1
|
||||
# RQCEEEprmqghZHN73iG1C2XvYTTQ6FB2wE KMD 5506.18026103, REVS 90.00054364
|
||||
fiat/revs sendtoaddress RQCEEEprmqghZHN73iG1C2XvYTTQ6FB2wE 90.00054364
|
||||
sleep 1
|
||||
# RCmLc2JBpPw9T9g1skg7J5Xr5kz1fyd7mx KMD 529.41438680, REVS 10.50000000
|
||||
fiat/revs sendtoaddress RCmLc2JBpPw9T9g1skg7J5Xr5kz1fyd7mx 10.50000000
|
||||
sleep 1
|
||||
# R9ULUWEvzmHPZ4rYL5FtwkMyTWvGDZX43J KMD 15051.18125683, REVS 298.60000000
|
||||
fiat/revs sendtoaddress R9ULUWEvzmHPZ4rYL5FtwkMyTWvGDZX43J 298.60000000
|
||||
sleep 1
|
||||
# RW2xS8dpxjudqBX1hqxShP7FWn8EHYH4Rb KMD 166779.58408020, REVS 3310.49966000
|
||||
fiat/revs sendtoaddress RW2xS8dpxjudqBX1hqxShP7FWn8EHYH4Rb 3310.49966000
|
||||
sleep 1
|
||||
# RALRwXaEN3yS5damdDwAkmEMKvdAkVs361 KMD 25746.96382302, REVS 510.64558668
|
||||
fiat/revs sendtoaddress RALRwXaEN3yS5damdDwAkmEMKvdAkVs361 510.64558668
|
||||
sleep 1
|
||||
# RPVNUvVq4BgKrrB3E1uULja2hjPW6Hv6r9 KMD 16872.68860925, REVS 334.64000000
|
||||
fiat/revs sendtoaddress RPVNUvVq4BgKrrB3E1uULja2hjPW6Hv6r9 334.64000000
|
||||
sleep 1
|
||||
# RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A KMD 19616.45270312, REVS 389.05771834
|
||||
fiat/revs sendtoaddress RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A 389.05771834
|
||||
sleep 1
|
||||
# RXFr5VB9gQYC5QYv7yVvkxtjDY3zwYuvDx KMD 327.74801651, REVS 6.50475878
|
||||
fiat/revs sendtoaddress RXFr5VB9gQYC5QYv7yVvkxtjDY3zwYuvDx 6.50475878
|
||||
sleep 1
|
||||
# RHUpvFhHv1umX1JsV5S8smAKAsN5CxA4HD KMD 2183.96436714, REVS 2.36599993
|
||||
fiat/revs sendtoaddress RHUpvFhHv1umX1JsV5S8smAKAsN5CxA4HD 2.36599993
|
||||
sleep 1
|
||||
# RAhvJHePdAb1PF9jjZhP2F7r72ebL9pA1f KMD 3457.02047726, REVS 68.56389987
|
||||
fiat/revs sendtoaddress RAhvJHePdAb1PF9jjZhP2F7r72ebL9pA1f 68.56389987
|
||||
sleep 1
|
||||
# RDCjGgoZ1tvCWop6m5wPYkr83wdFrofF6M KMD 76598.36955552, REVS 1519.19347187
|
||||
fiat/revs sendtoaddress RDCjGgoZ1tvCWop6m5wPYkr83wdFrofF6M 1519.19347187
|
||||
sleep 1
|
||||
# RLAEm3H2LMSNzJmveLkcf2nS18AnqWR7pJ KMD 82831.36892196, REVS 1643.94000000
|
||||
fiat/revs sendtoaddress RLAEm3H2LMSNzJmveLkcf2nS18AnqWR7pJ 1643.94000000
|
||||
sleep 1
|
||||
# RSUfnwTLE36E3Nx8PptxVoAfSRtMeGQsFL KMD 67327.03192299, REVS 1282.48928243
|
||||
fiat/revs sendtoaddress RSUfnwTLE36E3Nx8PptxVoAfSRtMeGQsFL 1282.48928243
|
||||
sleep 1
|
||||
# RPkkQmMmyLQe8Th7ZP5GoF6kSUs1DTNfAf KMD 1538.42929417, REVS 30.51202988
|
||||
fiat/revs sendtoaddress RPkkQmMmyLQe8Th7ZP5GoF6kSUs1DTNfAf 30.51202988
|
||||
sleep 1
|
||||
# RSkhXmiPCxqdp4bM4ux7VxAwMoCv2Uar6d KMD 73542.70261753, REVS 1459.56877203
|
||||
fiat/revs sendtoaddress RSkhXmiPCxqdp4bM4ux7VxAwMoCv2Uar6d 1459.56877203
|
||||
sleep 1
|
||||
# RUJvR3TXCAcizk7dXdFc6GKRFS6jZfjtyY KMD 10419.10088055, REVS 206.75776925
|
||||
fiat/revs sendtoaddress RUJvR3TXCAcizk7dXdFc6GKRFS6jZfjtyY 206.75776925
|
||||
sleep 1
|
||||
# RLZmhbeB2tXTas9grzAeqaL2RFAXVmDVpU KMD 43480.56469698, REVS 50.30001915
|
||||
fiat/revs sendtoaddress RLZmhbeB2tXTas9grzAeqaL2RFAXVmDVpU 50.30001915
|
||||
sleep 1
|
||||
# RLCDEXwfJ75P1iKgWGfR9geJmjZ84A4XXJ KMD 105141.23597043, REVS 1006.07261743
|
||||
fiat/revs sendtoaddress RLCDEXwfJ75P1iKgWGfR9geJmjZ84A4XXJ 1006.07261743
|
||||
sleep 1
|
||||
# RW1FmQGcpPv87WZVSCaMgjj74shMb3Y6Zi KMD 33700.59190315, REVS 380.47576230
|
||||
fiat/revs sendtoaddress RW1FmQGcpPv87WZVSCaMgjj74shMb3Y6Zi 380.47576230
|
||||
sleep 1
|
||||
# RQUMrGYr4SsHgbN56WP7tuEpWUcd62KidP KMD 61230.10078656, REVS 600.00100000
|
||||
fiat/revs sendtoaddress RQUMrGYr4SsHgbN56WP7tuEpWUcd62KidP 600.00100000
|
||||
sleep 1
|
||||
# RP8CkGhyfhdoVpGqGbVmEmRL7gGdqKBdkt KMD 153725.02014837, REVS 3049.70000000
|
||||
fiat/revs sendtoaddress RP8CkGhyfhdoVpGqGbVmEmRL7gGdqKBdkt 3049.70000000
|
||||
sleep 1
|
||||
# RRupn47XfLSMhXEuShtCCPBCv8P6LYXrLN KMD 790607.74140148, REVS 15691.16324116
|
||||
fiat/revs sendtoaddress RRupn47XfLSMhXEuShtCCPBCv8P6LYXrLN 15691.16324116
|
||||
sleep 1
|
||||
# RRX73tynW4sxCmqyYBQrS9nMcDUcXuX1yG KMD 26022.54788263, REVS 5.39446042
|
||||
fiat/revs sendtoaddress RRX73tynW4sxCmqyYBQrS9nMcDUcXuX1yG 5.39446042
|
||||
sleep 1
|
||||
# R9u7V63TLwJPH1shvAGHRG61aci61yy7RN KMD 20764.40163902, REVS 291.83028199
|
||||
fiat/revs sendtoaddress R9u7V63TLwJPH1shvAGHRG61aci61yy7RN 291.83028199
|
||||
sleep 1
|
||||
# RKAxvqvC3apzrb8udG9trBxiNhhNXaLkz4 KMD 6483.53169406, REVS 5.41696484
|
||||
fiat/revs sendtoaddress RKAxvqvC3apzrb8udG9trBxiNhhNXaLkz4 5.41696484
|
||||
sleep 1
|
||||
# RV5cgPjqt37QBHr94VL5HnXWqcwdqoqoC3 KMD 81008.20903630, REVS 1607.10337790
|
||||
fiat/revs sendtoaddress RV5cgPjqt37QBHr94VL5HnXWqcwdqoqoC3 1607.10337790
|
||||
sleep 1
|
||||
# RMnuGgpEzWcxYi861E7BjGMURCFX2Szj2v KMD 14010.00244099, REVS 277.86367220
|
||||
fiat/revs sendtoaddress RMnuGgpEzWcxYi861E7BjGMURCFX2Szj2v 277.86367220
|
||||
sleep 1
|
||||
# RF4iG6huXb9u6Pt8281WvnBjhdEtiVUnp4 KMD 674.21697725, REVS 13.37190382
|
||||
fiat/revs sendtoaddress RF4iG6huXb9u6Pt8281WvnBjhdEtiVUnp4 13.37190382
|
||||
sleep 1
|
||||
# RW3gz9fEadohRLZerK9r8zXkugk5swWHrf KMD 21219.62483892, REVS 421.20000000
|
||||
fiat/revs sendtoaddress RW3gz9fEadohRLZerK9r8zXkugk5swWHrf 421.20000000
|
||||
sleep 1
|
||||
# RJ89radoRzRr5oDsf71QZ7BXUTiHcyVSUu KMD 52588.80320859, REVS 1043.00609779
|
||||
fiat/revs sendtoaddress RJ89radoRzRr5oDsf71QZ7BXUTiHcyVSUu 1043.00609779
|
||||
sleep 1
|
||||
# RKenAzKZyD58qPu2zVdjwPjDn71T34sWE4 KMD 668547.16129881, REVS 13259.45302721
|
||||
fiat/revs sendtoaddress RKenAzKZyD58qPu2zVdjwPjDn71T34sWE4 13259.45302721
|
||||
sleep 1
|
||||
# R9ibGGfsFHD8MxLRL4q2a6ezxAaHHPJvLc KMD 241619.45649268, REVS 4792.09548598
|
||||
fiat/revs sendtoaddress R9ibGGfsFHD8MxLRL4q2a6ezxAaHHPJvLc 4792.09548598
|
||||
sleep 1
|
||||
# RGwuMmW1ZBMrHJwJucEy5JEV3BZWv7eQnm KMD 9071868.91817425, REVS 180010.00000000
|
||||
fiat/revs sendtoaddress RGwuMmW1ZBMrHJwJucEy5JEV3BZWv7eQnm 180010.00000000
|
||||
sleep 1
|
||||
# RT6Ckpw8yM2Q7yaCxejiVTrxELGQPtnGPm KMD 25778.27244764, REVS 225.87592741
|
||||
fiat/revs sendtoaddress RT6Ckpw8yM2Q7yaCxejiVTrxELGQPtnGPm 225.87592741
|
||||
sleep 1
|
||||
# RGf4wwbHVYYZrVPVZg6XdS3mWvbzHSebzu KMD 6387.59296405, REVS 126.73871740
|
||||
fiat/revs sendtoaddress RGf4wwbHVYYZrVPVZg6XdS3mWvbzHSebzu 126.73871740
|
||||
sleep 1
|
||||
# RJAbNiCSRaMxUky9h8as6orZY3cu2rSW8z KMD 492782.94486222, REVS 9773.48000000
|
||||
fiat/revs sendtoaddress RJAbNiCSRaMxUky9h8as6orZY3cu2rSW8z 9773.48000000
|
||||
sleep 1
|
||||
# RSW5SvtjWiGYN3iwb2mteYP7Hn223Zk1tP KMD 343847.33707184, REVS 6001.47957339
|
||||
fiat/revs sendtoaddress RSW5SvtjWiGYN3iwb2mteYP7Hn223Zk1tP 6001.47957339
|
||||
sleep 1
|
||||
# RFPKxBL8iLQGmkoUukXdFU7VkXyGJLSsGw KMD 36335.50253541, REVS 413.60001059
|
||||
fiat/revs sendtoaddress RFPKxBL8iLQGmkoUukXdFU7VkXyGJLSsGw 413.60001059
|
||||
sleep 1
|
||||
# RVFspAKoUpDMAiiEUiQQEpqdqXDMB48Jqp KMD 47464.51702590, REVS 634.55156126
|
||||
fiat/revs sendtoaddress RVFspAKoUpDMAiiEUiQQEpqdqXDMB48Jqp 634.55156126
|
||||
sleep 1
|
||||
# RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1 KMD 36359.70475507, REVS 100.00000000
|
||||
fiat/revs sendtoaddress RCPys8hvEfFSDkMZL7GtYA8a5GSwih67Q1 100.00000000
|
||||
sleep 1
|
||||
# R9ce1xHEaWnRRP5jrWozEfPf9ZJgX7jnxd KMD 915808.36366861, REVS 18163.44258555
|
||||
fiat/revs sendtoaddress R9ce1xHEaWnRRP5jrWozEfPf9ZJgX7jnxd 18163.44258555
|
||||
sleep 1
|
||||
# RS1rdGqAhXvwFFTVyUCx695y84E3N3emcU KMD 18822.21903353, REVS 360.77089072
|
||||
fiat/revs sendtoaddress RS1rdGqAhXvwFFTVyUCx695y84E3N3emcU 360.77089072
|
||||
sleep 1
|
||||
# RLgKsmgdzwNCt8CgqZ5J6cZhTat9HeZgxG KMD 62376.97840244, REVS 1045.22605497
|
||||
fiat/revs sendtoaddress RLgKsmgdzwNCt8CgqZ5J6cZhTat9HeZgxG 1045.22605497
|
||||
sleep 1
|
||||
# RUBESyzjgZUts3fD6W7abpgMj4qRFSSszC KMD 541390.42407502, REVS 10592.65522652
|
||||
fiat/revs sendtoaddress RUBESyzjgZUts3fD6W7abpgMj4qRFSSszC 10592.65522652
|
||||
sleep 1
|
||||
# RSNu7Kd9p33aDrgT2AM8buy7fUSQZ2N3Gs KMD 130769.80646849, REVS 2593.58831601
|
||||
fiat/revs sendtoaddress RSNu7Kd9p33aDrgT2AM8buy7fUSQZ2N3Gs 2593.58831601
|
||||
sleep 1
|
||||
# RCrCe4dsMzXzzp7GLahubjg73VGK2rnczC KMD 6843.04832293, REVS 25.10000000
|
||||
fiat/revs sendtoaddress RCrCe4dsMzXzzp7GLahubjg73VGK2rnczC 25.10000000
|
||||
sleep 1
|
||||
# RVTCRzofA2cV6FwGcvn1uGjZJmP5s9G1o9 KMD 95283.12042643, REVS 497.50723875
|
||||
fiat/revs sendtoaddress RVTCRzofA2cV6FwGcvn1uGjZJmP5s9G1o9 497.50723875
|
||||
sleep 1
|
||||
# total KMD 45769105.32172734 REVS 426291.27268935
|
||||
|
||||
@@ -1,78 +0,0 @@
|
||||
sleep 9999999
|
||||
# RA4nyddYYzEzoUqnpLCvTm8d4nKvqQavs4 KMD 205767.24475092, REVS 4084.38717211
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RA4nyddYYzEzoUqnpLCvTm8d4nKvqQavs4 4084.38717211
|
||||
# RFppcFo1bKQzD4zxrxCbicpAvnrqo99hPx KMD 138163.01002402, REVS 2740.59474723
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RFppcFo1bKQzD4zxrxCbicpAvnrqo99hPx 2740.59474723
|
||||
# RHfHV1LTG5rz3T2HApavCto9973puD93qt KMD 243998.92767004, REVS 4839.53600000
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RHfHV1LTG5rz3T2HApavCto9973puD93qt 4839.53600000
|
||||
# RPNRr6efhaPYKHzRyemxYowUbNQ6crBtcy KMD 36785.74330117, REVS 730.28056435
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RPNRr6efhaPYKHzRyemxYowUbNQ6crBtcy 730.28056435
|
||||
# RTnhkYHVoApyX8Fc2ZEHB2rtW7cLHqZEMB KMD 567760.05597770, REVS 11191.99000000
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RTnhkYHVoApyX8Fc2ZEHB2rtW7cLHqZEMB 11191.99000000
|
||||
# RER2vwRLHFT4HNQLzyqT1PhbeMCitDaY1u KMD 7771.42052436, REVS 0.62700000
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RER2vwRLHFT4HNQLzyqT1PhbeMCitDaY1u 0.62700000
|
||||
# RM3onNDjZbjypoN8wqo7Rzz3QEv6EiCfwK KMD 18186.86986853, REVS 143.39272495
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RM3onNDjZbjypoN8wqo7Rzz3QEv6EiCfwK 143.39272495
|
||||
# RVXTirtRaZkYk1wjAE3mwhdUjTXWKrTnFu KMD 2375.16051963, REVS 47.12337252
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RVXTirtRaZkYk1wjAE3mwhdUjTXWKrTnFu 47.12337252
|
||||
# RJJBtg8XfxMmb6rg6UMWME6zhxM1n8Umta KMD 70173.29001640, REVS 1392.33555151
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RJJBtg8XfxMmb6rg6UMWME6zhxM1n8Umta 1392.33555151
|
||||
# REbMisMicS8W7LUqBPJwkVfYHxNfSeW7d8 KMD 220390.81840860, REVS 1384.18511377
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress REbMisMicS8W7LUqBPJwkVfYHxNfSeW7d8 1384.18511377
|
||||
# RRDmaG64XZjdERzojAQ3DwHewBZbXfqpcJ KMD 479029.87110523, REVS 9502.00000000
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RRDmaG64XZjdERzojAQ3DwHewBZbXfqpcJ 9502.00000000
|
||||
# RTBeZc5Biq3BY1hB1dXi6XTaH8j6FsyGuz KMD 230594.13977661, REVS 8.48502608
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RTBeZc5Biq3BY1hB1dXi6XTaH8j6FsyGuz 8.48502608
|
||||
# RGbLr8CsszoGATo6uy7fZJ5GJPuXYbA6sv KMD 25505.74161232, REVS 506.00000000
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RGbLr8CsszoGATo6uy7fZJ5GJPuXYbA6sv 506.00000000
|
||||
# RP7HdvokCK1yJmpVCY49q4LXsVe3qhnEU5 KMD 4516.65527532, REVS 31.96541397
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RP7HdvokCK1yJmpVCY49q4LXsVe3qhnEU5 31.96541397
|
||||
# RMvpp3QwvYch8hFCjZNXvXkzoFWEw9R5QH KMD 35011.78668474, REVS 310.59835083
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RMvpp3QwvYch8hFCjZNXvXkzoFWEw9R5QH 310.59835083
|
||||
# R9whNiPsV9NHvyPqg6ranxDFvsM8HsDtks KMD 201.26853079, REVS 3.99180609
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress R9whNiPsV9NHvyPqg6ranxDFvsM8HsDtks 3.99180609
|
||||
# RFfJkcC1fnFZB2G2MUPYdNEeRrZk6njPig KMD 663.13491046, REVS 13.16292943
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RFfJkcC1fnFZB2G2MUPYdNEeRrZk6njPig 13.16292943
|
||||
# RV49vYgGa9kdzTQ5hq5ra88DkX4wwVdzmK KMD 29548.60287586, REVS 586.04438779
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RV49vYgGa9kdzTQ5hq5ra88DkX4wwVdzmK 586.04438779
|
||||
# RMYqPrPpgosrjcoS34WmBtG9KDRmE7WcXK KMD 100186.19238242, REVS 1944.84440292
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RMYqPrPpgosrjcoS34WmBtG9KDRmE7WcXK 1944.84440292
|
||||
# RH1Ug5jz6S5DbJyLENhMthMEAoSBbkXRMq KMD 1853646.03638691, REVS 415.68775429
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RH1Ug5jz6S5DbJyLENhMthMEAoSBbkXRMq 415.68775429
|
||||
# RFREgr9p32GanT4YcM25hMcPYkvRLDNkja KMD 151544.96672946, REVS 3005.62695376
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RFREgr9p32GanT4YcM25hMcPYkvRLDNkja 3005.62695376
|
||||
# RFjddDTCuobaHatQtd7kTiSjYv94Mp9Cu4 KMD 295382.69930466, REVS 5860.00000000
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RFjddDTCuobaHatQtd7kTiSjYv94Mp9Cu4 5860.00000000
|
||||
# RVNWkGzsFG1ZhzKBzzUj7UPzHMu8s1JWfT KMD 59621.32507756, REVS 606.36817953
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RVNWkGzsFG1ZhzKBzzUj7UPzHMu8s1JWfT 606.36817953
|
||||
# RGwu8hcD19TKuqzPbjdnzKmkMsUUrdsw5p KMD 23159.75532541, REVS 459.58469952
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RGwu8hcD19TKuqzPbjdnzKmkMsUUrdsw5p 459.58469952
|
||||
# RMwP7F2QRMprthjNwT7gHWjHvvqtefwRsJ KMD 77304.58455563, REVS 1533.20000000
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RMwP7F2QRMprthjNwT7gHWjHvvqtefwRsJ 1533.20000000
|
||||
|
||||
# total KMD 0.00000000 REVS 51342.01215065
|
||||
@@ -1,25 +0,0 @@
|
||||
b35af354357e56e2cb628d6b871b29ccecc9451d81428920e99e096be6769f7a
|
||||
826e2d89119eb6bef82515cbe13c155cdbda7fe6f69f7710e9cc5ce8e9e32c0d
|
||||
9f9e1bc5277765087b5a1102599745eccd88ba7e5480bcd67a326e9450c8c3ce
|
||||
74c469d3659d3a21354fe29abd611ad536bb1525bd05e3ddd208860c1d195b60
|
||||
4863817beae6277158d4993a3919b5285706743d24865cd3d8cdd02f595abc13
|
||||
727210250e6144f72ed11bbcc14a6c4f49293fcd6e3140e431268e9645a2c000
|
||||
221fa9b9d8904c669bf5404d4c2bd23f3de85cfb1638550d94b8eaa3880c7442
|
||||
5d8e3dcc179dfe9610bb7f55fe14674924abb8049e44e797beb1117651a679f4
|
||||
3fa7ecd3ced13aebdbba27d1f276f19ba6787a118c1db9a5d70b60b49ce8b4c7
|
||||
a48c18753fa85a9b8a4d8dd33ae984828277d1f0b3105479f838bdb9339efc1a
|
||||
fdffe296333e9101e6c86b0d4d6562c6e53e303ea26d0741caa94d681d1764aa
|
||||
6d4a5569b3f02148e579a09829d732ce6a4adada2eaacf5be2656619599818ea
|
||||
8628904bff0ee39c4f70275e9011a6606bacad8a5ffa3d81a82b0ca659e04f0f
|
||||
62ee7a9f2aecbb287a6f589a803fc9164ab3132f3c48b19be8de29ee6f07ac3b
|
||||
d7093749b27f66af626c716aec55abb35c19f7d06b0006d0340b8f5f902b74e3
|
||||
4e6893dc5cc35cae915f5fb29cc8780bff9c1c92975a83ca779f74a5efcba3fd
|
||||
0f089e6e19c490ff25f8df648a3c692a4ebbc439c6e21962d8fc4c19749b5df3
|
||||
d790f0c31ef22d61cab33fd067b004093b5b39dccda0015df5cf096d666f81b5
|
||||
0193eb50a1c1f255f391e03a83a11ea3f59dff8aa66fad44eeb20bc10b3eff66
|
||||
07157664c81db45d96a3e92f2719cffa058e4b1e61fbf83873470a1ceb195a70
|
||||
f311706621dc0e5abb2af3e75fbabeb42fc08fe6a2ef73689089374f724a024f
|
||||
800c9a65a0a1e7ad1381dc1770aed25fc0c7869d84f24de55861accb679f228b
|
||||
40cd628126f1b9791e67c2fc2ef091c1a1fdf9a59739cb048084d76054235f23
|
||||
9786cfe6f46932d70282ff9252bcc088bce2a4aab2f03a369a2596c9964eea51
|
||||
bed3728d27935b12889559b05133418becd7daac6b12155e4bfc60c32bc6720f
|
||||
@@ -1,48 +0,0 @@
|
||||
sleep 999999
|
||||
# RU18xoQZeK4Kno2ER7mv8ZEKLHiTECRhkU KMD 501.64865701, REVS 9.95750000
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RU18xoQZeK4Kno2ER7mv8ZEKLHiTECRhkU 9.95750000
|
||||
# RJxiu5FTx2Nqr9xHvwdq1xynExUjFKVPdf KMD 62103.45021354, REVS 50.00000000
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RJxiu5FTx2Nqr9xHvwdq1xynExUjFKVPdf 50.00000000
|
||||
# RB95bkGifi94Z4VSHGULKhCU8ML7tUbQ71 KMD 12520.16564088, REVS 138.94305839
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RB95bkGifi94Z4VSHGULKhCU8ML7tUbQ71 138.94305839
|
||||
# RKb5ay26iSzmBoqm51vPveyErH9BYG3dry KMD 3674.15911735, REVS 72.89043156
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RKb5ay26iSzmBoqm51vPveyErH9BYG3dry 72.89043156
|
||||
# RVeVZrr24524LhN3VRhLqNG6qgH9tBPixx KMD 612851.03780014, REVS 5433.13031755
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RVeVZrr24524LhN3VRhLqNG6qgH9tBPixx 5433.13031755
|
||||
# RFBxwyTKGy5DtxR5CLLZSjKL5jU6fm13kp KMD 519232.27493854, REVS 10298.05578171
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RFBxwyTKGy5DtxR5CLLZSjKL5jU6fm13kp 10298.05578171
|
||||
# RB1cuwtKBpwZPZnwyJeznaij53ovj8Dm8i KMD 19106.59220646, REVS 374.39305755
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RB1cuwtKBpwZPZnwyJeznaij53ovj8Dm8i 374.39305755
|
||||
# RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf KMD 1212.14061568, REVS 24.05385000
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf 24.05385000
|
||||
# RDx4sokytAASudNuMDDdk4R6RHJ4P8aPza KMD 10347.76210933, REVS 205.22959870
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RDx4sokytAASudNuMDDdk4R6RHJ4P8aPza 205.22959870
|
||||
# RAPJuPCGMoPwfeHuckiea21LMek8BkH8Zr KMD 71712.83911390, REVS 500.67180183
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RAPJuPCGMoPwfeHuckiea21LMek8BkH8Zr 500.67180183
|
||||
# RSWsxgczqH1uYyY6MMPePJY5jNjj7uD7Xr KMD 16435.34703311, REVS 114.80740001
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RSWsxgczqH1uYyY6MMPePJY5jNjj7uD7Xr 114.80740001
|
||||
# RVxvCQ393MRnsQ8Fn8qiKm5yP6pk9GVgEr KMD 17137.93285029, REVS 340.00462653
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RVxvCQ393MRnsQ8Fn8qiKm5yP6pk9GVgEr 340.00462653
|
||||
# RG5eabU8sYvrfWrCu1wb2Go5vxhyVXsbAF KMD 409543.68954327, REVS 8123.68911362
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RG5eabU8sYvrfWrCu1wb2Go5vxhyVXsbAF 8123.68911362
|
||||
# RYTMDSu1BjaQAdvh6a9CQFCr7h1rsGi48d KMD 302.06577591, REVS 5.99094155
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RYTMDSu1BjaQAdvh6a9CQFCr7h1rsGi48d 5.99094155
|
||||
# RVLd4HkkB8SsyXfXHQeHHNouNer7nv3mkL KMD 30407.13753317, REVS 411.30538288
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RVLd4HkkB8SsyXfXHQeHHNouNer7nv3mkL 411.30538288
|
||||
|
||||
# total KMD 0.00000000 REVS 26103.12286188
|
||||
@@ -1,15 +0,0 @@
|
||||
bc4eca8000603d16ae491bf1bf4f5fda622f54d3b0ffdaefe12337461bb88d5f
|
||||
cda5da13119d348565085119b37951f0ee2f6866d677bbca2295d5d44e365b4a
|
||||
ce9516059a943070ec233716c878e90bfcf6456c9a35c587fc9f6c74008d2d72
|
||||
c1f32cbd341d9e7e51046378ad072b0aaa55d1fc3b970b606ed708d3bb02d7d6
|
||||
f2a2f2a2b4cc99b5cc89fefe8340252b0bbb7ecd83df809f2bf782a06d9bcdd0
|
||||
5e44a6d50cd1cb64fa6349b49d5793d12988c4c3d517bb271f396a9fd66d3cae
|
||||
6f6771ef52833bf504397c80f06e58a77e58387d809b42c8ae3bb6301796dcf0
|
||||
96d12c7828f3f3fa7983aac02b724f5a53897856b7419e0728d78ae7e3756765
|
||||
84fde41cd955564a18f6141349dffb26dc8ad498fcb3494052a8aeb0157ffb3c
|
||||
93d6d89195f5332f7bae6e9ffc65d5892fa169446d90ed3d7d5017389a2a3ff6
|
||||
2dc7e37ff11703c01e1a6301746d2586549fe091bbf6cf7bf80c6b49c1f38d1c
|
||||
1732b6942035ba7482f9a6c77a47f90b529c51d8b22c4d14a7a430d7b8cf3303
|
||||
733a0ef1b7ef603664271f7a3667e39809f9a4f7b618a4a9c00c3e8a6876d57c
|
||||
cf2ed6deeaf6600b2fff0b5db13c5f950dc655b06420eee816edbfad7c07c991
|
||||
16ae9bf3ed2d47c8b8fc088a6773c3316642c97ff573d5f2e185f89dadf39b14
|
||||
@@ -1,44 +0,0 @@
|
||||
sleep 9999999
|
||||
# RSVzs8BLvCrmvNF1MbqEpAwx9VHinmAxDg KMD 5669.98491054, REVS 112.56208000
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RSVzs8BLvCrmvNF1MbqEpAwx9VHinmAxDg 112.56208000
|
||||
# RLqqYX4oMVz6c6s52bLnYdfi9qZ56bEK3W KMD 43088.74729573, REVS 470.87980000
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RLqqYX4oMVz6c6s52bLnYdfi9qZ56bEK3W 470.87980000
|
||||
# RY5qhTwDGWQy4LsG2M3R8zyJz51KaMgCLW KMD 55892.82951156, REVS 1070.41924580
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RY5qhTwDGWQy4LsG2M3R8zyJz51KaMgCLW 1070.41924580
|
||||
# RMx1MCvzuaiuRpS3rXV4LURWgZVRnLJCYK KMD 335.54240549, REVS 6.65853993
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RMx1MCvzuaiuRpS3rXV4LURWgZVRnLJCYK 6.65853993
|
||||
# RNdQAbnuehuF5RnYiaLkWoWktpaxzfvNXh KMD 163589.49612623, REVS 3245.93000000
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RNdQAbnuehuF5RnYiaLkWoWktpaxzfvNXh 3245.93000000
|
||||
# RXX1kbdye39h9g7oFnP6cMZ6EEePCPRYnc KMD 98858.55994787, REVS 1384.95819177
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RXX1kbdye39h9g7oFnP6cMZ6EEePCPRYnc 1384.95819177
|
||||
# RUV5xgcHVavuxKkvMduhjXPVKA7oa1QCK9 KMD 5226.14889591, REVS 103.72248253
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RUV5xgcHVavuxKkvMduhjXPVKA7oa1QCK9 103.72248253
|
||||
# RGFv6LBE1xgiu34SqSh6wjn3fpr973sREK KMD 159251.95713851, REVS 3160.13095281
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RGFv6LBE1xgiu34SqSh6wjn3fpr973sREK 3160.13095281
|
||||
# RQFihaDjPvCwhENGhB163D7e8Wc8LURtKq KMD 28529.48507541, REVS 566.06461415
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RQFihaDjPvCwhENGhB163D7e8Wc8LURtKq 566.06461415
|
||||
# RDjm2Xec5UTWiz3Yku8sUce8ZWxe8mTh72 KMD 8637.01756743, REVS 171.30000000
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RDjm2Xec5UTWiz3Yku8sUce8ZWxe8mTh72 171.30000000
|
||||
|
||||
# total KMD 0.00000000 REVS 10292.62590699
|
||||
17f76404644686bdc3f58c562fb86036d9d13e540486a13f9c89daa26449ca45
|
||||
df9e8d5430fd80035a4397a464a5a1b75a168e94c660a7f5eb9ac30f992ba3df
|
||||
0a6c099f5dd33803223e743f099530df86d7a0bd3c2ab29d1de99ccf8d854b46
|
||||
4ed406ac9e171d930460659d9a5f3c806d51313516b4fbf3812c1bc3f27e1106
|
||||
83d733a0004ab00dc2106368405ec00f2a641721c9bdbdf24d7e88ce5f99df5c
|
||||
76eb52c04c27566aa6181d1523e2cb6db413419b3a1ffe1b18ade8669de9f20b
|
||||
be8fbc1408d013e586add3ca8c3677c17079d52f9d10a6e3fc08ed51dabc2598
|
||||
cec00429c9802cea98789c73426294ba065d99dc29400a329c2a510a50160651
|
||||
30500a29f6e9da29c67ea51a2718421e0ca945018f8a6eee1622c7462b9fed4a
|
||||
ebc16e614204d51e09c23df54d0888741d3a40bea3c05bf3898a64fbf9826444
|
||||
|
||||
@@ -1,94 +0,0 @@
|
||||
8f7d4648657dd7f8aa70d8e83539ae0592cbfafc6a961fe75d7f7f613b4d5737
|
||||
5669.98491054 <- expected amount RSVzs8BLvCrmvNF1MbqEpAwx9VHinmAxDg
|
||||
0f5681bbc1441e39cd3226847e3863489bc3ffe6b00c161e453a897b6a4e1268
|
||||
8353.36815152 <- expected amount RXbWQbnpsQ3iSBBj5bn2HDq3WvqRPJg5Ek
|
||||
34cfb92756c33c9fc2b0f1126884044711a83a6deb05c8b38cc744b7a87f34f5
|
||||
9683.15249375 <- expected amount RKCDBxUx7mbCnViLt423jdLt6oNpW7SH7z
|
||||
cad96a82897ec8d240bb410a1c1b54922444d7bc6383ef31ae153646d4cb0837
|
||||
43088.74729573 <- expected amount RLqqYX4oMVz6c6s52bLnYdfi9qZ56bEK3W
|
||||
ccef457f43908a2f18c86c3c1431a9b3857263413a756ca46117655fae2acec3
|
||||
50806.03038250 <- expected amount RRCvM3vVV6FPwayTevCCvkpXY2V8RxjEct
|
||||
216f60dff778c0701def1ea8eb582959591369c7a67864bf2ef20ca99178138b
|
||||
2015.79933830 <- expected amount RDqaDbfFHrnPAnyLY6b9A3CFZZjivhdYSJ
|
||||
96e0916f1598824cfa1e2a590a0dc683be93c6fa8dbffb6153b341906de84398
|
||||
48415.76246875 <- expected amount RBGX2Z43Fiey6tkgRCL9rzc3gNhdcvQyzf
|
||||
e0b44fb9e74984823a307c82b70ddb7a173976fa43aec61440d9cd53654a8e93
|
||||
7885.04483652 <- expected amount RWdo833bYVhMUHRdr8hMs7HHVcG2UNPwcZ
|
||||
6bff9d66cafe0f249de24a6be6312f75ea97cce10c40bd2ffd4a785758787782
|
||||
2076.57141858 <- expected amount RVUby7nAZAEKQc1mNu89KGchwgVN6H74Pb
|
||||
d4c509d86d3ddeb3be1ea733e2c79c816c0639f3ba1738d1f50140915292949e
|
||||
55892.82951156 <- expected amount RY5qhTwDGWQy4LsG2M3R8zyJz51KaMgCLW
|
||||
615c5efe7cbddd2e07d2282d215f307cbdc7e102ce4e3c1e134b96086736e459
|
||||
110983.78643539 <- expected amount RPAueErz2MDLv1T4VNVRkkWRPmUKDXxNyW
|
||||
1baad4f5d826832d13b0ddc7379b7235a38caa42b5098f273811109b974a6dbf
|
||||
135104.07865436 <- expected amount RQ2pMNHbPGagXKQoVzrgF2o718GmP7A74Z
|
||||
c70b43c915aac7f917026d6229f5a7ce15184de37ed5f8aa4756d8416a3cde70
|
||||
8376.94442691 <- expected amount RE1NYFqFG2vmhhHVY7QFC7sTp7zBxvSSP3
|
||||
8ceab84b76f983a4bc0ba4743027666fae243fa463f3b51bfd4cb26c39bc7731
|
||||
47849.00411034 <- expected amount RHSA9ocZc77tHiFvVQ2h26AJQFsionWAXK
|
||||
4b08e4b3ea8608e97d8ccdd30c4785f03c443002127269c1936134c9f2cc717d
|
||||
15163.82967582 <- expected amount RS8F3LcQ8DUSoBacUKBKzMR2Wxe3hCSToY
|
||||
d2c320a2fafa054cd166b331937fd5fe005f07ec02f9fd5977ca466ed663d0eb
|
||||
3002.22564175 <- expected amount RLijku3v2wyCcGykdbsUViqDCNaVkVkQpc
|
||||
cf93b70a0ff58ec115c03e0a395a5b413610437f40bd496707ae426df1a46aa8
|
||||
14101.70011189 <- expected amount RMeaeKG7vrTpryBGVEWQ8twjQDnRVAhpqH
|
||||
6be9eb9a87781ebcbd633946c891b98499001d38c934e827371a7b79d57b0de0
|
||||
5832.55634776 <- expected amount RUDEQESpyWvpwdfrieiBoNo93WHaKhGxGf
|
||||
e63deddaf983e5cf537f34b9777a65f001f4dda5bb86dc8b1c8f5d0ead105435
|
||||
890.85002942 <- expected amount RMat1mSDDigFHhVL74mjBia9uHo5w24MLQ
|
||||
f382d7ec4a9f9cf4283776449521e6c2c73a44863f119a6fa3ddd319c042f08c
|
||||
335.54240549 <- expected amount RMx1MCvzuaiuRpS3rXV4LURWgZVRnLJCYK
|
||||
f04aaada09059b8df995cf29c7f6d0c7ca20ed7e70d698bd21df1e61c70d2cca
|
||||
19366.30498750 <- expected amount RVcMp4KgwCg6GnUJAAU2dmCvPjAa9JrEds
|
||||
8496fcbe66360a2753f1795dc4b0bb1a93fa121de4b521410e046611bc04f2e5
|
||||
163589.49612623 <- expected amount RNdQAbnuehuF5RnYiaLkWoWktpaxzfvNXh
|
||||
9b3e499b36112979a084534143826776699b2a5def69e656d7aa7dc98a381501
|
||||
3873.26099750 <- expected amount RB1j3QidCF9PTKQaZMGKe6Hzm5jdY8Mzus
|
||||
17e55956fe10117b7e65a272fed473efa2dd387ab794932eebb9924e434719f0
|
||||
7746.52199500 <- expected amount RFcH8p3Ke5y4UL3pdL9KCkJWp3aRdBwWpg
|
||||
4499caf8325016189dc4cbaf102d3c5a358105c135defd90afbc000fbed92795
|
||||
16670.51967129 <- expected amount RJDkJJd66n4Q4jVWbZJQKyXTf29ZqzeXac
|
||||
41d0583c6f0720b27976f717d729c7445e10264b0663af6baa43e2ad0fe5fff0
|
||||
7746.52199500 <- expected amount RKzELkcNJu4g9DWQsFFeQtFZQE5u9vevuK
|
||||
eb979d5a6d79b6e0466fc3dbdd2a2f73812fb5788bfcad2b160da1e1b96828c5
|
||||
74455.81274009 <- expected amount RKpUFnxUn9mJCZmNECEQT7xEubHECUPCem
|
||||
2ec16b1596c2daa8d14642478d0ad6e6fa5d143980794f1c717c4e7ba2765749
|
||||
98858.55994787 <- expected amount RXX1kbdye39h9g7oFnP6cMZ6EEePCPRYnc
|
||||
4d59bf3a6dcd11242c3a7c20402c38e41fb8f936d63e0c5b3f6490248fd989ed
|
||||
5226.14889591 <- expected amount RUV5xgcHVavuxKkvMduhjXPVKA7oa1QCK9
|
||||
505e5b9d3e9ac0ee9a435e7fdb9819b53fd1169fceb9c6e4b3b2173031beac16
|
||||
753.34926401 <- expected amount RBtfFBdYiryB6fyWoubm4XNqZwXqzAbJEK
|
||||
b2243873085e98d346e3f2341a203c3644f1fb78fe60294f5838eff96f2121dd
|
||||
159251.95713851 <- expected amount RGFv6LBE1xgiu34SqSh6wjn3fpr973sREK
|
||||
75740f609901350eebc9493aff3dcfb070e107b493a2b51aa1acccfb9dedd88c
|
||||
693.08132289 <- expected amount RAaszCNodXXu9rJL6qqVMZDykXncDecTMS
|
||||
9beeaaa5dd83e3967f35d60073f88a320276e7a3aa61a4a06b7f8b46079fa4b4
|
||||
2304.59029350 <- expected amount RT1xC82iwXtZeDLLYz3tgQRCHKsRD62Jt5
|
||||
b7508390ec18fc559112de1f5ddcd6f27c74f9a41415ae97c89b01c6718afc64
|
||||
6506.14889316 <- expected amount RGPEHHmPFaMPSLMQxEao2uVPTfN8vBCmym
|
||||
c6eb29abc0c447043f94cac4df49b3ce640d27be2730d18c7ba3f0fe7d21861b
|
||||
38732.60997500 <- expected amount RBUEoAzoydjckYewPsW2kfTr8TGFgnR2Ec
|
||||
bf0e8dff8de3ce4c07b7cc09703978d7db0dc7660f312186b4c3eff2a97fd638
|
||||
916.79536397 <- expected amount RVQS9NGKsbBJuKDhJnPssTRevrE428dxDK
|
||||
186e0d779d5a6a644e7d972aecafe4fb1739059933a0e50ad9a82ced1c8974e4
|
||||
48415.76246875 <- expected amount RHiUqYUohv49bvB2wbDe1mAkwyEFwUEnrb
|
||||
37ed3649d5e2f83a0c4ee11748b076fffe8a2fb16650cad7fa39cbbe3ddc9246
|
||||
16542.25810519 <- expected amount RSWPtfGaHPL1g7SMqbLm1YZ8o3QM6krzo1
|
||||
2dc98a59906d57f9e57b3231d19749eb9979533d3a2c35ec5adb3cb91bfd7c7b
|
||||
2322923.09575692 <- expected amount RFMcTK36Wzjo5QEk1wAH2CbATqsYvzgwXH
|
||||
35a28b0551bbe3d3e5cfa989b5a073bea55784a9df162ebcafc61bffb8ff5834
|
||||
28529.48507541 <- expected amount RQFihaDjPvCwhENGhB163D7e8Wc8LURtKq
|
||||
3b3aabeb6483d8c37265d24ef76389f96158970485866de1005ba28d8069877b
|
||||
8637.01756743 <- expected amount RDjm2Xec5UTWiz3Yku8sUce8ZWxe8mTh72
|
||||
684728bb5ff281762990da11e7463c6e992b5e98cb0cc7965a3470b8a664484a
|
||||
1212.26932063 <- expected amount RCZriSKpiSSmgwjumuiMP2XEC2FgYgTrBf
|
||||
a021d23ab591ed687f7ba0bccbd98ecbb7d8d1f967176bb2f2e1e6fe1d83af34
|
||||
32148.06627925 <- expected amount RBD72Bh4wxGi8q8xQbLfwMF2RAkTZ7sVZT
|
||||
b9ab02076864711a964c149346141f01f686b50fd345e6eb5bc3f218b40c4c50
|
||||
1924.55258644 <- expected amount RVih8N9Qh1jf4CCF5ySsAY8DR42eTxYqpB
|
||||
d5760b4049c8818f6486d1b81b0715f6971f88b0f49e8daab4382fe6980ddd85
|
||||
44542.50147125 <- expected amount RWez2L8rPoTmqj8kYKqxLdeD9BFuDibMyJ
|
||||
c9bb31764aab4cd631fa733940c0b35470cad48d247ef227372cc84375cd8d8b
|
||||
49199.88128813 <- expected amount RUuWvTwNAMGLpuY3GLPBAmMp8ptShkMSyN
|
||||
08075d8b984266c27ed5f029b88b682596ace07cc43b2db50d4491dc810ced04
|
||||
30170.24616125 <- expected amount RRTks3iwSe4oR3UDmRfGszcNcfAv6Rb5es
|
||||
@@ -1,27 +0,0 @@
|
||||
sleep 999999
|
||||
# RPYGEUfYMHizer5siX2CNpQ6xHAbjtgQuB KMD 843.49707566, REVS 16.72927581
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RPYGEUfYMHizer5siX2CNpQ6xHAbjtgQuB 16.72927581
|
||||
# RTrZWBu7SUZWf4ZdyUVddRPxsnDhZnre7n KMD 3090.02793673, REVS 3.67077856
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RTrZWBu7SUZWf4ZdyUVddRPxsnDhZnre7n 3.67077856
|
||||
# RRixT2CqGcr5cdPoP3G2rhrWDfSbVZR6sk KMD 79613.96546024, REVS 1579.43521640
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RRixT2CqGcr5cdPoP3G2rhrWDfSbVZR6sk 1579.43521640
|
||||
# RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut KMD 20106.39865075, REVS 0.09000000
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut 0.09000000
|
||||
# RA9G36WwA9K95bn8Cbycq5ZnoxhSzzhhBw KMD 867960.91662544, REVS 11685.48356181
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RA9G36WwA9K95bn8Cbycq5ZnoxhSzzhhBw 11685.48356181
|
||||
# RVcSdFR5fC3Qjk3CARvQSkra5PQwC8U3uj KMD 19695.58704144, REVS 390.89494454
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RVcSdFR5fC3Qjk3CARvQSkra5PQwC8U3uj 390.89494454
|
||||
# RQokxkBAizLmegMeWK5TyTpSHn2vP5adjo KMD 2981.62619009, REVS 30.35300490
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RQokxkBAizLmegMeWK5TyTpSHn2vP5adjo 30.35300490
|
||||
# RAMvDwi58oyArqfGseWZsYbR2BN3L7ghVX KMD 40914.30625015, REVS 476.17156540
|
||||
sleep 1
|
||||
fiat/revs sendtoaddress RAMvDwi58oyArqfGseWZsYbR2BN3L7ghVX 476.17156540
|
||||
|
||||
# total KMD 0.00000000 REVS 14182.82834742
|
||||
@@ -1,107 +0,0 @@
|
||||
f8b8a27ca722196f5f745f7778fc8aed873c3b040a1a964e704e63ebf5185edd
|
||||
b7e28fadcedd54f973a9e91df42c3d02bd1436f2377f28e6c866cafadf2c947b
|
||||
dc3adb9035b939ce50e4144920acb9fc4ff1fc36b226bf6cca13e1d2a7ab36c8
|
||||
8c64142d44edd729b9972361b8dbd14e5f3f022daee1b2ec1ff3b3f69a755884
|
||||
d15d1de5f494c22bcd4b9717ba416efbecb78d9d143209b31fd9362be13b9dea
|
||||
4b99586c873574fd4e6f2055130a85e194ea7da61303ccd2b6839f7d6754ad92
|
||||
0645a7c8a584e9fe3f5dce8cb5972b9ab15f580abcd4fd12bdd19bd2bbca5d4b
|
||||
a8ca857443e07b225d8a6271ab761e7636c568159582e7d8540998fe47b37b86
|
||||
20b13d8b02b1f728c2b19a09876e2eeab68aa3a51cd1c0b539c18f980e244106
|
||||
84491a5ed8421013e546f32e6407d4d916297176944fbc1daa99b4b7d30673db
|
||||
0ff635aadfdbdb4d6887d04a1ecaed449bf708c36da782781dec0601057c6ede
|
||||
4034cf5a74b9a0c5ea725ff6d227b738b1015dafb88e610d2c42bc2e56f4cd9a
|
||||
7644c293c0b80e186ac8f73eeef1390458b1a2febbffe6e03442809c7a1b52ca
|
||||
f6f2ceee809d3a02d32c08839965f90cc9783c7c0c979df48f17f63702bc26e2
|
||||
8be21cf583d6fff597bba5fb537ae2c29b9f797f31c5d33641e377332a14396e
|
||||
32652dd110bc58128354a8f1b55d027c21cf805f34183c746494d763dc5f944a
|
||||
26a8db0f5dfa4f8dc0ac40f409070e7ba0bb507bb99138639382f503dbbaa11b
|
||||
5f8ca3d9d4360990b7f164b0c8a6f8541e449395a17c0024b593346454cee653
|
||||
6ef36fb6b117c326819d644ad59eaa17834b1bd4d2565906f39d0c239b3ee5fa
|
||||
6a9664882c7fa2c033db4fba4d25d10db381e0005e10d08034d569c97849046e
|
||||
0ef90e1eb2c1d73dca4270e16511bca3458f040ad066965859aec3c660609aaf
|
||||
c6ece66a5a6254774b799ca3a167d3d28567e0239ff2738d90497a271b5e1113
|
||||
feaaa2e13f87b1116969f1eba327d9a1ce9f3bdf900c5413a12172b4b425421d
|
||||
411823d20770f587c4b77140680516964f178e143249da0fd643141b422bb4e5
|
||||
15c646b807f0bfde249e7db39cf2734712ab35487bd69797473973c87ea96945
|
||||
7a8a83984b699741d2ecad3c8cba537762106648bae8a590bb8468e84d1749a5
|
||||
4bcd8c28879d255d53c56475a0d8aa2be0bf831db6f7e15ad1f77a0841e950a6
|
||||
d472c0868258d14810ceeaaac010bb1f927ece44b55d7e2cda42214baddb0ea0
|
||||
69acf622b21eb4eba6af5d506d4d11831ee4533814ba6a0300072354de25a625
|
||||
20bcdf8d19f96fea65b7130193e0d5ab54b5e4a2150b8a6ade3bf4e98bf98d0c
|
||||
0c5bad3e366c301e730fbf58a83b219f5265f0a596feb89bbe0306bd87a4b72b
|
||||
33744e5ee5df4dd46a7e133825a5af4734baafbe3f1d3c849e5d36e8c038b282
|
||||
d4cce84308b475327d6fec1505cb12f30a1cd266b34c9dc810a14df5eac5f825
|
||||
eafe1f16f6bf6ef1fe987039e2daf80723fc78752d2896ff6d99ae9cd0143a26
|
||||
a7033c2b1772e461a897012c9ecca796a9f3f9f0622beb006f3dbabdcbeaa5f1
|
||||
bb35fa7bed699d2c1188a0df41371e4fac1ca34eefdcfb4cd7cba398300493c3
|
||||
3de0201d7b0e0d531116c457dd857e1b92ad4ba99b1283f4e6ea346641ba270b
|
||||
fa1641370e84b65f43086c90f37a0c79d918cb7330f95977849560f5db90ec7a
|
||||
0dcbe1b19e716b2ae5ebe7ecce917e26fb09a8890480f2b7e8315f7b6fdf9de8
|
||||
35a134a0ca04f3cf402827df17616f64e0b488ddfa277f9d287a3aa524258a0b
|
||||
08e7c05da62f384287ed42ac138d1d5da6968d3320fb855cf66a3a72685f6ec7
|
||||
fa0b0b65fb2f66f26379c6eb7f0b299d916ed0dbf7a569d7bae4fc455cb6cfc2
|
||||
88794bbb699f130951c40dc99a27d2c7c7016e12824fd1040cbedf86980de04d
|
||||
3d2b8a2bd53af7f871d9c5c3ada5a8742b9ca14918efbdc0b50655fbd6a9c43c
|
||||
91928c3a9e0ab6710cf6b517234420ba8455592af3c9da7662f8a3ce2fa1e823
|
||||
1e311229a68642300d6e4cae166334df4a3e87c0e52e86760ccc0234d2ebecd1
|
||||
9a82ddea65986359f0e69bd9d06db7f0f3ab99bf6be2ae2cfaa24e3de74ec170
|
||||
c0a151d520e4c11eb23f75a0b3b3a09c5dcdb4283edc5f7aaa5082336337e3c4
|
||||
ca850ff82776e1e72d82a2d0c4c35235e4841cec6f2b36d8d4e37aa46d06a5e4
|
||||
5b4060b77f23488e5f2ad57c775dfb62e235140f42d57720cb985ee218d97d64
|
||||
403183a0ab2a672c6968e9c88190910d8949bd03808b353291e150ac6e5e49a4
|
||||
5a86136b1ecf2d9a43dd42d3d902653ca24c8ecc71001097ca035e3750ba8998
|
||||
780ea40a7fea9bab8547c2917c60c90a7a88ce38bb1f3af06197dd3341504987
|
||||
4e1b419e3d67c35351fe18e2f001a404c08c04f8b6148412c7a5d7ee01f91a73
|
||||
4231eb801746ac3bd08e57533498a74400570c28f4bc4c2f8a1424be3d4b1bb1
|
||||
e1bc9dcf2dd758717480f29e62a24a9e250b356d5ef275de46bc580002ed85d0
|
||||
25e0a1f1c0d8db40acedfd491ae445e2242d6fa0ca39b18ccb4e9d6eff86dbb0
|
||||
053839195f085b1586d46ab54dd05b17e91e4f0876d0a53832543774a8fb0b1d
|
||||
9deeabbcaca2e613254eca4b15dea6e86d6fa7ec8893baffe713b8ed796fc3cb
|
||||
c6e0f0089b9741e4c75d3080a1549cd5ea87e7605501e2419ee9186817c60a8a
|
||||
a1bca1dd1011c23bde3babeff2120ebd48282b3a9b41c10a0b80dc38e3efdef9
|
||||
563f1812684dc33528418877fa5bbcb15b83c4d3496b076f4f3bdad38f0fdb6a
|
||||
06a3ca90a32455b03b5f6008737d25fab7fc02f0126b40e25f440d4ad8c98caf
|
||||
36b8f751739ec405427830b06b8020f9975bc29ea93faf72e1e99c22231bed88
|
||||
ef9247fd847739e2ec786a23663da32efff73c6e4b9b02f43411332ad1eac945
|
||||
1d3fe9e86a4692029ea13b153f423fc9be211dd3d7207f374e5360a8a1812f0a
|
||||
afe379fcb8d097448decdcaebc8669c2b6f05c9a593f89265b44280231d900f2
|
||||
07873c642e76432ae77193bdee90fb21c3fe1d2d47cb87689d20feb47ecf6884
|
||||
904c0e81c754b190b459be69c5ac925d274aa91e8d69639375adfc7bc3659c23
|
||||
34cbc40d34fcc916845b7a991f3d430831a919c782556a0dab5b4083cf0b277d
|
||||
38c0d0d6055d6e37513af175c5232a97a04e16a6c64d2e5711e0ed0e01868264
|
||||
e1988acd516c445a36a425d4e881b6ba620ec31be7fc2e86ff40113030611a41
|
||||
0472010fbe40e01a55bdca2bfe06b9383c41ec8a4d70c54ecb32b7f1765a85f4
|
||||
4058e9174d9fbdf611c481552a0c9038b4905341ad31156fadb62e924156b971
|
||||
c0b23f4f41480765fda1efb44af0eb118685e70392e004e5b5a68ae4cb741452
|
||||
dde373fff9ce038d5b2524506038f0986b459fca9550452e3248c34b40041ece
|
||||
98e70c5491278d48f0ee5fbaf63a1ffac7ab7975ec8def8e711f8821df214c32
|
||||
45e995c9a816a7ccfd34823ae88375f7e7b2d52a9fe5f1953748d06c8c9f920b
|
||||
d3196f666e093f6295ff5d9bbb5fad3d735c79efc3a0ef2682a5d10abbc047d9
|
||||
47819cadf315ee1931a475219d61fa2367a73310749f23cfa994ef9e0324fff3
|
||||
aa4719fd7745191531c68c140ec52728cb9d3ffaea5875967f75dbb7ab7a2b57
|
||||
83dfacc40a05c80e1a8e4cae7a0cbb98a30f76ad010efb63b9a515b490f7676e
|
||||
4c118313fff51fc72ec2c49045679e6bb9a9aeb7143b576b1f3eb07429a0b806
|
||||
f208fd7abeb82b6aa0218db68421045078cde1521129029dd2ffafa759208cbc
|
||||
cf58359f2b61ab6fd73f176bd094154d04f83752a86bd91a2b7879123a51cbf0
|
||||
3e10f831b75abd7bb89fa74dd6b74d5f07a2d818c44eccec496896dfadac9534
|
||||
250204ddd107ece1d5092a4cd1163115ede9e754ef136d80d912ccfc132e0ac5
|
||||
676d1ea16b0fd80025953ecc999213d4e0b1b002f2b4193d7616ec97a269a49f
|
||||
4ca289d052c847b502ce756ed65f035e38e78575ee9fa0e68df89595151967fb
|
||||
ccdec5f135b9dee61540fb3f0cca5a372189d69c1461242eaa11c788557740d8
|
||||
f3ebba346b9ad00771ce1ee67dafab3f875c307ba39ab8439f63822d4c78c656
|
||||
4496f369401f0e7778fbaa9199505f8ab093c0cc22fdefe3a6d0a465b3c0d078
|
||||
b0eb34108101f19e10248066d9a339596bded6dd7a84d0be64c701e837b5f596
|
||||
796577570b9a7dce40bcc476c95c72d903531367db6ebc9d5d457d77634d0123
|
||||
26ee642aaa9f2fbeb1603ac695ce13dcfa8709af07e0cd71bce85c2ccb3ac4cf
|
||||
ada15a386b1ded5afb41bd30946b9bac14a5bf8912ffcd12f086f29dfe31b3b2
|
||||
073202790ae224da09b17aed4c18d8395433d5e6ea910bd04c1b952444b8a239
|
||||
cb38a03e8afa8b0dfcdbe13070ea6d048ea1cc9a1054ba86c6ab88511e2661d4
|
||||
e8dba03f46da7dfa258be5376fc1dec714c0104423191b3ad14a476bbcbce929
|
||||
6c9dd8171202deab1d5d8af6aa1b7c1ea6f4cb8654cb3241040659674b700308
|
||||
49f2add7db2978cacc1798cd08b67f33d435606d2b3dc877a673dfdeaa7617b3
|
||||
84ae90011844413779316580fc2731e391829237e7b356354ae1266e5712ac3d
|
||||
efffc292acaa38e458ef396c818dda28c9e2971065f65abeaa0a4d951b141dfe
|
||||
f03e0af2f1fd32263d5a4149fedd9128c3bc7616088c208abbd5c1f065cb5249
|
||||
1814b8d5550ceb07acecc3c4995dd2d582af9bf6f6e6b5a40319f824570f18c9
|
||||
73e622d891f13d8c136214eaeeddc2c9e7d721844abf797916fb0c4b2a9e9e49
|
||||
6cee8ae520488bbe9cb516490e94876e0828c27bffdb72f7e9695d5ec9ee3b2c
|
||||
5492
src/REVS.raw
5492
src/REVS.raw
File diff suppressed because it is too large
Load Diff
5492
src/REVS.rawtxids
5492
src/REVS.rawtxids
File diff suppressed because it is too large
Load Diff
5653
src/REVS.snapshot
5653
src/REVS.snapshot
File diff suppressed because it is too large
Load Diff
3683
src/REVS.txids
3683
src/REVS.txids
File diff suppressed because it is too large
Load Diff
5650
src/REVS.txids0
5650
src/REVS.txids0
File diff suppressed because it is too large
Load Diff
@@ -307,5 +307,31 @@
|
||||
"157.230.45.184",
|
||||
"165.22.52.123"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"ac_name": "COMMOD",
|
||||
"ac_supply": "0",
|
||||
"ac_reward": "204800000000,100000000",
|
||||
"ac_end": "482130,0",
|
||||
"ac_halving": "43830,525960",
|
||||
"ac_decay": "50000000,10000000",
|
||||
"ac_eras": "2",
|
||||
"ac_cc": "777",
|
||||
"ac_public": "1",
|
||||
"addnode": [
|
||||
"34.246.186.176",
|
||||
"34.251.151.148"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ac_name": "WLC21",
|
||||
"ac_supply": "21000000",
|
||||
"ac_reward": "190258751",
|
||||
"ac_staked": "90",
|
||||
"ac_public": "1",
|
||||
"addnode": [
|
||||
"37.187.225.231",
|
||||
"51.38.38.134"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
@@ -35,7 +35,6 @@ echo $pubkey
|
||||
./komodod -pubkey=$pubkey -ac_name=EQL -ac_supply=500000000 -ac_ccactivate=205000 -addnode=46.101.124.153 &
|
||||
./komodod -pubkey=$pubkey -ac_name=ZILLA -ac_supply=11000000 -ac_sapling=5000000 -addnode=51.68.215.104 &
|
||||
./komodod -pubkey=$pubkey -ac_name=RFOX -ac_supply=1000000000 -ac_reward=100000000 -addnode=95.213.238.98 &
|
||||
~/VerusCoin/src/komodod -pubkey=$pubkey -ac_name=VRSC -ac_algo=verushash -ac_cc=1 -ac_veruspos=50 -ac_supply=0 -ac_eras=3 -ac_reward=0,38400000000,2400000000 -ac_halving=1,43200,1051920 -ac_decay=100000000,0,0 -ac_end=10080,226080,0 -ac_timelockgte=19200000000 -ac_timeunlockfrom=129600 -ac_timeunlockto=1180800 -addnode=185.25.48.236 -addnode=185.64.105.111 &
|
||||
./komodod -pubkey=$pubkey -ac_name=SEC -ac_cc=333 -ac_supply=1000000000 -addnode=185.148.145.43 &
|
||||
./komodod -pubkey=$pubkey -ac_name=CCL -ac_supply=200000000 -ac_end=1 -ac_cc=2 -addressindex=1 -spentindex=1 -addnode=142.93.136.89 -addnode=195.201.22.89 &
|
||||
./komodod -pubkey=$pubkey -ac_name=PIRATE -ac_supply=0 -ac_reward=25600000000 -ac_halving=77777 -ac_private=1 -addnode=178.63.77.56 &
|
||||
@@ -48,10 +47,7 @@ echo $pubkey
|
||||
./komodod -pubkey=$pubkey -ac_name=ILN -ac_supply=10000000000 -ac_cc=2 -addressindex=1 -spentindex=1 -addnode=51.75.122.83 &
|
||||
./komodod -pubkey=$pubkey -ac_name=RICK -ac_supply=90000000000 -ac_reward=100000000 -ac_cc=3 -ac_staked=10 -addnode=95.217.44.58 -addnode=138.201.136.145 &
|
||||
./komodod -pubkey=$pubkey -ac_name=MORTY -ac_supply=90000000000 -ac_reward=100000000 -ac_cc=3 -ac_staked=10 -addnode=95.217.44.58 -addnode=138.201.136.145 &
|
||||
<<<<<<< HEAD
|
||||
./komodod -pubkey=$pubkey -ac_name=VOTE2019 -ac_supply=123651638 -ac_public=1 -addnode=95.213.238.98 &
|
||||
=======
|
||||
>>>>>>> beta
|
||||
./komodod -pubkey=$pubkey -ac_name=KOIN -ac_supply=125000000 -addnode=3.0.32.10 &
|
||||
./komodod -pubkey=$pubkey -ac_name=ZEXO -ac_supply=100000000 -ac_reward=1478310502 -ac_halving=525600 -ac_cc=42 -ac_ccenable=236 -ac_perc=77700 -ac_staked=93 -ac_pubkey=02713bd85e054db923694b6b7a85306264edf4d6bd6d331814f2b40af444b3ebbc -ac_public=1 -addnode=80.240.17.222 &
|
||||
./komodod -pubkey=$pubkey -ac_name=K64 -ac_supply=64000777 -ac_reward=0 -ac_staked=10 -addnode=18.197.20.211 &
|
||||
|
||||
@@ -16,14 +16,14 @@ BEGIN
|
||||
BEGIN
|
||||
BLOCK "040904E4" // U.S. English - multilingual (hex)
|
||||
BEGIN
|
||||
VALUE "CompanyName", "Zcash"
|
||||
VALUE "FileDescription", "zcash-tx (CLI Zcash transaction editor utility)"
|
||||
VALUE "CompanyName", "Hush"
|
||||
VALUE "FileDescription", "hush-tx (CLI Zcash transaction editor utility)"
|
||||
VALUE "FileVersion", VER_FILEVERSION_STR
|
||||
VALUE "InternalName", "zcash-tx"
|
||||
VALUE "InternalName", "hush-tx"
|
||||
VALUE "LegalCopyright", COPYRIGHT_STR
|
||||
VALUE "LegalTrademarks1", "Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php."
|
||||
VALUE "OriginalFilename", "zcash-tx.exe"
|
||||
VALUE "ProductName", "zcash-tx"
|
||||
VALUE "OriginalFilename", "hush-tx.exe"
|
||||
VALUE "ProductName", "hush-tx"
|
||||
VALUE "ProductVersion", VER_PRODUCTVERSION_STR
|
||||
END
|
||||
END
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
// Copyright (c) 2009-2013 The Bitcoin Core developers
|
||||
// Copyright (c) 2019 The Hush developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
@@ -71,11 +72,14 @@ void WaitForShutdown(boost::thread_group* threadGroup)
|
||||
{
|
||||
int32_t i,height; CBlockIndex *pindex; bool fShutdown = ShutdownRequested(); const uint256 zeroid;
|
||||
// Tell the main threads to shutdown.
|
||||
/*
|
||||
if (komodo_currentheight()>KOMODO_EARLYTXID_HEIGHT && KOMODO_EARLYTXID!=zeroid && ((height=tx_height(KOMODO_EARLYTXID))==0 || height>KOMODO_EARLYTXID_HEIGHT))
|
||||
{
|
||||
fprintf(stderr,"error: earlytx must be before block height %d or tx does not exist\n",KOMODO_EARLYTXID_HEIGHT);
|
||||
fprintf(stderr,"%s: error: earlytx must be before block height %d or tx does not exist\n",__FUNCTION__, KOMODO_EARLYTXID_HEIGHT);
|
||||
fprintf(stderr,"%s: earlytxid=%s, tx_height=%d, komodo_currentheight=%d\n", __FUNCTION__, KOMODO_EARLYTXID.GetHex().c_str(), tx_height(KOMODO_EARLYTXID), komodo_currentheight() );
|
||||
StartShutdown();
|
||||
}
|
||||
*/
|
||||
/*if ( ASSETCHAINS_STAKED == 0 && ASSETCHAINS_ADAPTIVEPOW == 0 && (pindex= komodo_chainactive(1)) != 0 )
|
||||
{
|
||||
if ( pindex->nTime > ADAPTIVEPOW_CHANGETO_DEFAULTON )
|
||||
@@ -84,8 +88,11 @@ void WaitForShutdown(boost::thread_group* threadGroup)
|
||||
fprintf(stderr,"default activate adaptivepow\n");
|
||||
} else fprintf(stderr,"height1 time %u vs %u\n",pindex->nTime,ADAPTIVEPOW_CHANGETO_DEFAULTON);
|
||||
} //else fprintf(stderr,"cant find height 1\n");*/
|
||||
if ( ASSETCHAINS_CBOPRET != 0 )
|
||||
|
||||
if ( ASSETCHAINS_CBOPRET != 0 ) {
|
||||
komodo_pricesinit();
|
||||
}
|
||||
|
||||
while (!fShutdown)
|
||||
{
|
||||
//fprintf(stderr,"call passport iteration\n");
|
||||
@@ -100,9 +107,7 @@ void WaitForShutdown(boost::thread_group* threadGroup)
|
||||
break;
|
||||
MilliSleep(1000);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
//komodo_interestsum();
|
||||
//komodo_longestchain();
|
||||
if ( ASSETCHAINS_CBOPRET != 0 )
|
||||
@@ -117,6 +122,8 @@ void WaitForShutdown(boost::thread_group* threadGroup)
|
||||
}
|
||||
fShutdown = ShutdownRequested();
|
||||
}
|
||||
//fprintf(stderr,"%s: fShutdown=%d\n", __FUNCTION__, fShutdown);
|
||||
|
||||
if (threadGroup)
|
||||
{
|
||||
Interrupt(*threadGroup);
|
||||
@@ -141,6 +148,8 @@ bool AppInit(int argc, char* argv[])
|
||||
|
||||
bool fRet = false;
|
||||
|
||||
|
||||
//fprintf(stderr, "%s start, argc=%d\n", __FUNCTION__, argc);
|
||||
//
|
||||
// Parameters
|
||||
//
|
||||
@@ -150,7 +159,7 @@ bool AppInit(int argc, char* argv[])
|
||||
// Process help and version before taking care about datadir
|
||||
if (mapArgs.count("-?") || mapArgs.count("-h") || mapArgs.count("-help") || mapArgs.count("-version"))
|
||||
{
|
||||
std::string strUsage = _("Komodo Daemon") + " " + _("version") + " " + FormatFullVersion() + "\n" + PrivacyInfo();
|
||||
std::string strUsage = _("Hush Daemon") + " " + _("version") + " " + FormatFullVersion() + "\n" + PrivacyInfo();
|
||||
|
||||
if (mapArgs.count("-version"))
|
||||
{
|
||||
@@ -159,7 +168,7 @@ bool AppInit(int argc, char* argv[])
|
||||
else
|
||||
{
|
||||
strUsage += "\n" + _("Usage:") + "\n" +
|
||||
" komodod [options] " + _("Start Komodo Daemon") + "\n";
|
||||
" komodod [options] " + _("Start Hush-flavored Komodo Daemon") + "\n";
|
||||
|
||||
strUsage += "\n" + HelpMessage(HMM_BITCOIND);
|
||||
}
|
||||
@@ -189,24 +198,26 @@ bool AppInit(int argc, char* argv[])
|
||||
}
|
||||
try
|
||||
{
|
||||
fprintf(stderr, "%s reading config file\n", __FUNCTION__);
|
||||
ReadConfigFile(mapArgs, mapMultiArgs);
|
||||
} catch (const missing_zcash_conf& e) {
|
||||
fprintf(stderr,
|
||||
(_("Before starting komodod, you need to create a configuration file:\n"
|
||||
(_("Before starting hushd, you need to create a configuration file:\n"
|
||||
"%s\n"
|
||||
"It can be completely empty! That indicates you are happy with the default\n"
|
||||
"configuration of komodod. But requiring a configuration file to start ensures\n"
|
||||
"that komodod won't accidentally compromise your privacy if there was a default\n"
|
||||
"configuration of hushd. But requiring a configuration file to start ensures\n"
|
||||
"that hushd won't accidentally compromise your privacy if there was a default\n"
|
||||
"option you needed to change.\n"
|
||||
"\n"
|
||||
"You can look at the example configuration file for suggestions of default\n"
|
||||
"options that you may want to change. It should be in one of these locations,\n"
|
||||
"depending on how you installed Komodo:\n") +
|
||||
"depending on how you installed Hush\n") +
|
||||
_("- Source code: %s\n"
|
||||
"- .deb package: %s\n")).c_str(),
|
||||
GetConfigFile().string().c_str(),
|
||||
"contrib/debian/examples/komodo.conf",
|
||||
"/usr/share/doc/komodo/examples/komodo.conf");
|
||||
"contrib/debian/examples/HUSH3.conf",
|
||||
"/usr/share/doc/hush/examples/HUSH3.conf",
|
||||
"https://github.com/MyHush/hush3/blob/master/contrib/debian/examples/HUSH3.conf");
|
||||
return false;
|
||||
} catch (const std::exception& e) {
|
||||
fprintf(stderr,"Error reading configuration file: %s\n", e.what());
|
||||
@@ -215,9 +226,12 @@ bool AppInit(int argc, char* argv[])
|
||||
|
||||
// Command-line RPC
|
||||
bool fCommandLine = false;
|
||||
for (int i = 1; i < argc; i++)
|
||||
if (!IsSwitchChar(argv[i][0]) && !boost::algorithm::istarts_with(argv[i], "komodo:"))
|
||||
for (int i = 1; i < argc; i++) {
|
||||
//TODO: should this be hush: or komodo: ??
|
||||
if (!IsSwitchChar(argv[i][0]) && !boost::algorithm::istarts_with(argv[i], "komodo:")) {
|
||||
fCommandLine = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (fCommandLine)
|
||||
{
|
||||
@@ -251,20 +265,23 @@ bool AppInit(int argc, char* argv[])
|
||||
#endif
|
||||
SoftSetBoolArg("-server", true);
|
||||
|
||||
//fprintf(stderr,"%s: Running AppInit2()\n", __FUNCTION__);
|
||||
fRet = AppInit2(threadGroup, scheduler);
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
//fprintf(stderr,"%s: Finished AppInit2(), fRet=%d\n", __FUNCTION__, fRet);
|
||||
} catch (const std::exception& e) {
|
||||
PrintExceptionContinue(&e, "AppInit()");
|
||||
} catch (...) {
|
||||
PrintExceptionContinue(NULL, "AppInit()");
|
||||
}
|
||||
if (!fRet)
|
||||
{
|
||||
//fprintf(stderr,"%s: Interrupting threadGroup\n", __FUNCTION__);
|
||||
Interrupt(threadGroup);
|
||||
// threadGroup.join_all(); was left out intentionally here, because we didn't re-test all of
|
||||
// the startup-failure cases to make sure they don't result in a hang due to some
|
||||
// thread-blocking-waiting-for-another-thread-during-startup case
|
||||
} else {
|
||||
//fprintf(stderr,"%s: Waiting for Shutdown\n", __FUNCTION__);
|
||||
WaitForShutdown(&threadGroup);
|
||||
}
|
||||
Shutdown();
|
||||
|
||||
@@ -20,16 +20,16 @@
|
||||
#include "CCinclude.h"
|
||||
|
||||
bool GatewaysValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx, uint32_t nIn);
|
||||
std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t totalsupply,uint256 oracletxid,uint8_t M,uint8_t N,std::vector<CPubKey> pubkeys,uint8_t p1,uint8_t p2,uint8_t p3,uint8_t p4);
|
||||
std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std::string refcoin,uint256 cointxid,int32_t claimvout,std::string deposithex,std::vector<uint8_t>proof,CPubKey destpub,int64_t amount);
|
||||
std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,uint256 deposittxid,CPubKey destpub,int64_t amount);
|
||||
std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,CPubKey withdrawpub,int64_t amount);
|
||||
std::string GatewaysPartialSign(uint64_t txfee,uint256 txidaddr,std::string refcoin,std::string hex);
|
||||
std::string GatewaysCompleteSigning(uint64_t txfee,uint256 txidaddr,std::string refcoin,std::string hex);
|
||||
std::string GatewaysMarkDone(uint64_t txfee,uint256 withdrawtxid,std::string refcoin);
|
||||
UniValue GatewaysPendingDeposits(uint256 bindtxid,std::string refcoin);
|
||||
UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin);
|
||||
UniValue GatewaysProcessedWithdraws(uint256 bindtxid,std::string refcoin);
|
||||
UniValue GatewaysBind(const CPubKey& pk, uint64_t txfee,std::string coin,uint256 tokenid,int64_t totalsupply,uint256 oracletxid,uint8_t M,uint8_t N,std::vector<CPubKey> pubkeys,uint8_t p1,uint8_t p2,uint8_t p3,uint8_t p4);
|
||||
UniValue GatewaysDeposit(const CPubKey& pk, uint64_t txfee,uint256 bindtxid,int32_t height,std::string refcoin,uint256 cointxid,int32_t claimvout,std::string deposithex,std::vector<uint8_t>proof,CPubKey destpub,int64_t amount);
|
||||
UniValue GatewaysClaim(const CPubKey& pk, uint64_t txfee,uint256 bindtxid,std::string refcoin,uint256 deposittxid,CPubKey destpub,int64_t amount);
|
||||
UniValue GatewaysWithdraw(const CPubKey& pk, uint64_t txfee,uint256 bindtxid,std::string refcoin,CPubKey withdrawpub,int64_t amount);
|
||||
UniValue GatewaysPartialSign(const CPubKey& pk, uint64_t txfee,uint256 txidaddr,std::string refcoin,std::string hex);
|
||||
UniValue GatewaysCompleteSigning(const CPubKey& pk, uint64_t txfee,uint256 txidaddr,std::string refcoin,std::string hex);
|
||||
UniValue GatewaysMarkDone(const CPubKey& pk, uint64_t txfee,uint256 withdrawtxid,std::string refcoin);
|
||||
UniValue GatewaysPendingDeposits(const CPubKey& pk, uint256 bindtxid,std::string refcoin);
|
||||
UniValue GatewaysPendingWithdraws(const CPubKey& pk, uint256 bindtxid,std::string refcoin);
|
||||
UniValue GatewaysProcessedWithdraws(const CPubKey& pk, uint256 bindtxid,std::string refcoin);
|
||||
|
||||
// CCcustom
|
||||
UniValue GatewaysInfo(uint256 bindtxid);
|
||||
|
||||
@@ -20,11 +20,11 @@
|
||||
#include "CCinclude.h"
|
||||
|
||||
bool OraclesValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx, uint32_t nIn);
|
||||
std::string OracleCreate(int64_t txfee,std::string name,std::string description,std::string format);
|
||||
std::string OracleFund(int64_t txfee,uint256 oracletxid);
|
||||
std::string OracleRegister(int64_t txfee,uint256 oracletxid,int64_t datafee);
|
||||
std::string OracleSubscribe(int64_t txfee,uint256 oracletxid,CPubKey publisher,int64_t amount);
|
||||
std::string OracleData(int64_t txfee,uint256 oracletxid,std::vector <uint8_t> data);
|
||||
UniValue OracleCreate(const CPubKey& pk, int64_t txfee,std::string name,std::string description,std::string format);
|
||||
UniValue OracleFund(const CPubKey& pk, int64_t txfee,uint256 oracletxid);
|
||||
UniValue OracleRegister(const CPubKey& pk, int64_t txfee,uint256 oracletxid,int64_t datafee);
|
||||
UniValue OracleSubscribe(const CPubKey& pk, int64_t txfee,uint256 oracletxid,CPubKey publisher,int64_t amount);
|
||||
UniValue OracleData(const CPubKey& pk, int64_t txfee,uint256 oracletxid,std::vector <uint8_t> data);
|
||||
// CCcustom
|
||||
UniValue OracleDataSample(uint256 reforacletxid,uint256 txid);
|
||||
UniValue OracleDataSamples(uint256 reforacletxid,char* batonaddr,int32_t num);
|
||||
|
||||
@@ -22,14 +22,14 @@
|
||||
bool PegsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx, uint32_t nIn);
|
||||
|
||||
// CCcustom
|
||||
std::string PegsCreate(uint64_t txfee,int64_t amount,std::vector<uint256> bindtxids);
|
||||
std::string PegsFund(uint64_t txfee,uint256 pegstxid, uint256 tokenid, int64_t amount);
|
||||
std::string PegsGet(uint64_t txfee,uint256 pegstxid, uint256 tokenid, int64_t amount);
|
||||
std::string PegsRedeem(uint64_t txfee,uint256 pegstxid, uint256 tokenid);
|
||||
std::string PegsLiquidate(uint64_t txfee,uint256 pegstxid, uint256 tokenid, uint256 liquidatetxid);
|
||||
std::string PegsExchange(uint64_t txfee,uint256 pegstxid, uint256 tokenid, int64_t amount);
|
||||
UniValue PegsAccountHistory(uint256 pegstxid);
|
||||
UniValue PegsAccountInfo(uint256 pegstxid);
|
||||
UniValue PegsCreate(const CPubKey& pk,uint64_t txfee,int64_t amount,std::vector<uint256> bindtxids);
|
||||
UniValue PegsFund(const CPubKey& pk,uint64_t txfee,uint256 pegstxid, uint256 tokenid, int64_t amount);
|
||||
UniValue PegsGet(const CPubKey& pk,uint64_t txfee,uint256 pegstxid, uint256 tokenid, int64_t amount);
|
||||
UniValue PegsRedeem(const CPubKey& pk,uint64_t txfee,uint256 pegstxid, uint256 tokenid);
|
||||
UniValue PegsLiquidate(const CPubKey& pk,uint64_t txfee,uint256 pegstxid, uint256 tokenid, uint256 liquidatetxid);
|
||||
UniValue PegsExchange(const CPubKey& pk,uint64_t txfee,uint256 pegstxid, uint256 tokenid, int64_t amount);
|
||||
UniValue PegsAccountHistory(const CPubKey& pk,uint256 pegstxid);
|
||||
UniValue PegsAccountInfo(const CPubKey& pk,uint256 pegstxid);
|
||||
UniValue PegsWorstAccounts(uint256 pegstxid);
|
||||
UniValue PegsInfo(uint256 pegstxid);
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
|
||||
#include "komodo_defs.h"
|
||||
#include "CCinclude.h"
|
||||
|
||||
int32_t komodo_priceget(int64_t *buf64,int32_t ind,int32_t height,int32_t numblocks);
|
||||
extern void GetKomodoEarlytxidScriptPub();
|
||||
extern CScript KOMODO_EARLYTXID_SCRIPTPUB;
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
|
||||
UniValue AssetOrders(uint256 refassetid, CPubKey pk, uint8_t additionalEvalCode)
|
||||
{
|
||||
static uint256 zero;
|
||||
UniValue result(UniValue::VARR);
|
||||
|
||||
struct CCcontract_info *cpAssets, assetsC;
|
||||
@@ -35,7 +34,7 @@ UniValue AssetOrders(uint256 refassetid, CPubKey pk, uint8_t additionalEvalCode)
|
||||
std::vector<uint8_t> origpubkey;
|
||||
CTransaction ordertx;
|
||||
uint8_t funcid, evalCode;
|
||||
char numstr[32], funcidstr[16], origaddr[64], origtokenaddr[64], assetidstr[65];
|
||||
char numstr[32], funcidstr[16], origaddr[64], origtokenaddr[64];
|
||||
|
||||
txid = it->first.txhash;
|
||||
LOGSTREAM("ccassets", CCLOG_DEBUG2, stream << "addOrders() checking txid=" << txid.GetHex() << std::endl);
|
||||
@@ -46,8 +45,8 @@ UniValue AssetOrders(uint256 refassetid, CPubKey pk, uint8_t additionalEvalCode)
|
||||
{
|
||||
LOGSTREAM("ccassets", CCLOG_DEBUG2, stream << "addOrders() checking ordertx.vout.size()=" << ordertx.vout.size() << " funcid=" << (char)(funcid ? funcid : ' ') << " assetid=" << assetid.GetHex() << std::endl);
|
||||
|
||||
if (refassetid != zero && assetid == refassetid ||
|
||||
pk != CPubKey() && pk == pubkey2pk(origpubkey) && (funcid == 'S' || funcid == 's'))
|
||||
if (pk == CPubKey() && (refassetid == zeroid || assetid == refassetid) // tokenorders
|
||||
|| pk != CPubKey() && pk == pubkey2pk(origpubkey) && (funcid == 'S' || funcid == 's')) // mytokenorders, returns only asks (is this correct?)
|
||||
{
|
||||
|
||||
LOGSTREAM("ccassets", CCLOG_DEBUG2, stream << "addOrders() it->first.index=" << it->first.index << " ordertx.vout[it->first.index].nValue=" << ordertx.vout[it->first.index].nValue << std::endl);
|
||||
@@ -61,7 +60,7 @@ UniValue AssetOrders(uint256 refassetid, CPubKey pk, uint8_t additionalEvalCode)
|
||||
funcidstr[0] = funcid;
|
||||
funcidstr[1] = 0;
|
||||
item.push_back(Pair("funcid", funcidstr));
|
||||
item.push_back(Pair("txid", uint256_str(assetidstr, txid)));
|
||||
item.push_back(Pair("txid", txid.GetHex()));
|
||||
item.push_back(Pair("vout", (int64_t)it->first.index));
|
||||
if (funcid == 'b' || funcid == 'B')
|
||||
{
|
||||
@@ -77,18 +76,17 @@ UniValue AssetOrders(uint256 refassetid, CPubKey pk, uint8_t additionalEvalCode)
|
||||
sprintf(numstr, "%llu", (long long)ordertx.vout[0].nValue);
|
||||
item.push_back(Pair("askamount", numstr));
|
||||
}
|
||||
if (origpubkey.size() == 33)
|
||||
if (origpubkey.size() == CPubKey::COMPRESSED_PUBLIC_KEY_SIZE)
|
||||
{
|
||||
GetCCaddress(cp, origaddr, pubkey2pk(origpubkey));
|
||||
item.push_back(Pair("origaddress", origaddr));
|
||||
GetTokensCCaddress(cpTokens, origtokenaddr, pubkey2pk(origpubkey));
|
||||
item.push_back(Pair("origtokenaddress", origtokenaddr));
|
||||
|
||||
}
|
||||
if (assetid != zeroid)
|
||||
item.push_back(Pair("tokenid", uint256_str(assetidstr, assetid)));
|
||||
item.push_back(Pair("tokenid", assetid.GetHex()));
|
||||
if (assetid2 != zeroid)
|
||||
item.push_back(Pair("otherid", uint256_str(assetidstr, assetid2)));
|
||||
item.push_back(Pair("otherid", assetid2.GetHex()));
|
||||
if (price > 0)
|
||||
{
|
||||
if (funcid == 's' || funcid == 'S' || funcid == 'e' || funcid == 'e')
|
||||
|
||||
@@ -21,12 +21,12 @@
|
||||
#define CHANNELS_MAXPAYMENTS 1000
|
||||
|
||||
bool ChannelsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx, uint32_t nIn);
|
||||
std::string ChannelOpen(uint64_t txfee,CPubKey destpub,int32_t numpayments,int64_t payment,uint256 tokenid);
|
||||
std::string ChannelPayment(uint64_t txfee,uint256 opentxid,int64_t amount, uint256 secret);
|
||||
std::string ChannelClose(uint64_t txfee,uint256 opentxid);
|
||||
std::string ChannelRefund(uint64_t txfee,uint256 opentxid,uint256 closetxid);
|
||||
UniValue ChannelsList();
|
||||
UniValue ChannelOpen(const CPubKey& pk,uint64_t txfee,CPubKey destpub,int32_t numpayments,int64_t payment,uint256 tokenid);
|
||||
UniValue ChannelPayment(const CPubKey& pk,uint64_t txfee,uint256 opentxid,int64_t amount, uint256 secret);
|
||||
UniValue ChannelClose(const CPubKey& pk,uint64_t txfee,uint256 opentxid);
|
||||
UniValue ChannelRefund(const CPubKey& pk,uint64_t txfee,uint256 opentxid,uint256 closetxid);
|
||||
UniValue ChannelsList(const CPubKey& pk);
|
||||
// CCcustom
|
||||
UniValue ChannelsInfo(uint256 opentxid);
|
||||
UniValue ChannelsInfo(const CPubKey& pk,uint256 opentxid);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -402,14 +402,6 @@ struct CCcontract_info *CCinit(struct CCcontract_info *cp, uint8_t evalcode)
|
||||
cp->validate = PegsValidate;
|
||||
cp->ismyvin = IsPegsInput;
|
||||
break;
|
||||
case EVAL_MARMARA:
|
||||
strcpy(cp->unspendableCCaddr,MarmaraCCaddr);
|
||||
strcpy(cp->normaladdr,MarmaraNormaladdr);
|
||||
strcpy(cp->CChexstr,MarmaraCChexstr);
|
||||
memcpy(cp->CCpriv,MarmaraCCpriv,32);
|
||||
cp->validate = MarmaraValidate;
|
||||
cp->ismyvin = IsMarmaraInput;
|
||||
break;
|
||||
case EVAL_PAYMENTS:
|
||||
strcpy(cp->unspendableCCaddr,PaymentsCCaddr);
|
||||
strcpy(cp->normaladdr,PaymentsNormaladdr);
|
||||
|
||||
@@ -25,8 +25,8 @@
|
||||
bool FaucetValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx, uint32_t nIn);
|
||||
|
||||
// CCcustom
|
||||
std::string FaucetFund(uint64_t txfee,int64_t funds);
|
||||
std::string FaucetGet(uint64_t txfee);
|
||||
UniValue FaucetFund(const CPubKey& mypk,uint64_t txfee,int64_t funds);
|
||||
UniValue FaucetGet(const CPubKey& mypk,uint64_t txfee);
|
||||
UniValue FaucetInfo();
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -18,6 +18,7 @@
|
||||
#define CC_REWARDS_H
|
||||
|
||||
#include "CCinclude.h"
|
||||
#include <gmp.h>
|
||||
|
||||
#define EVAL_REWARDS 0xe5
|
||||
#define REWARDSCC_MAXAPR (COIN * 25)
|
||||
|
||||
@@ -824,9 +824,8 @@ std::string CreateToken(int64_t txfee, int64_t tokensupply, std::string name, st
|
||||
txfee = 10000;
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
|
||||
if (AddNormalinputs(mtx, mypk, tokensupply + 2 * txfee, 64) > 0)
|
||||
if (AddNormalinputs2(mtx, tokensupply + 2 * txfee, 64) > 0) // add normal inputs only from mypk
|
||||
{
|
||||
|
||||
int64_t mypkInputs = TotalPubkeyNormalInputs(mtx, mypk);
|
||||
if (mypkInputs < tokensupply) { // check that tokens amount are really issued with mypk (because in the wallet there maybe other privkeys)
|
||||
CCerror = "some inputs signed not with -pubkey=pk";
|
||||
|
||||
143
src/cc/CCtx.cpp
143
src/cc/CCtx.cpp
@@ -19,14 +19,7 @@
|
||||
std::vector<CPubKey> NULL_pubkeys;
|
||||
struct NSPV_CCmtxinfo NSPV_U;
|
||||
|
||||
/*
|
||||
FinalizeCCTx is a very useful function that will properly sign both CC and normal inputs, adds normal change and the opreturn.
|
||||
|
||||
This allows the contract transaction functions to create the appropriate vins and vouts and have FinalizeCCTx create a properly signed transaction.
|
||||
|
||||
By using -addressindex=1, it allows tracking of all the CC addresses
|
||||
*/
|
||||
|
||||
/* see description to function definition in CCinclude.h */
|
||||
bool SignTx(CMutableTransaction &mtx,int32_t vini,int64_t utxovalue,const CScript scriptPubKey)
|
||||
{
|
||||
#ifdef ENABLE_WALLET
|
||||
@@ -41,17 +34,35 @@ bool SignTx(CMutableTransaction &mtx,int32_t vini,int64_t utxovalue,const CScrip
|
||||
return(false);
|
||||
}
|
||||
|
||||
std::string FinalizeCCTx(uint64_t CCmask,struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey mypk,uint64_t txfee,CScript opret,std::vector<CPubKey> pubkeys)
|
||||
/*
|
||||
FinalizeCCTx is a very useful function that will properly sign both CC and normal inputs, adds normal change and the opreturn.
|
||||
|
||||
This allows the contract transaction functions to create the appropriate vins and vouts and have FinalizeCCTx create a properly signed transaction.
|
||||
|
||||
By using -addressindex=1, it allows tracking of all the CC addresses
|
||||
*/
|
||||
std::string FinalizeCCTx(uint64_t CCmask, struct CCcontract_info *cp, CMutableTransaction &mtx, CPubKey mypk, uint64_t txfee, CScript opret, std::vector<CPubKey> pubkeys)
|
||||
{
|
||||
UniValue sigData = FinalizeCCTxExt(false, CCmask, cp, mtx, mypk, txfee, opret, pubkeys);
|
||||
return sigData[JSON_HEXTX].getValStr();
|
||||
}
|
||||
|
||||
|
||||
// extended version that supports signInfo object with conds to vins map for remote cc calls
|
||||
UniValue FinalizeCCTxExt(bool remote, uint64_t CCmask, struct CCcontract_info *cp, CMutableTransaction &mtx, CPubKey mypk, uint64_t txfee, CScript opret, std::vector<CPubKey> pubkeys)
|
||||
{
|
||||
auto consensusBranchId = CurrentEpochBranchId(chainActive.Height() + 1, Params().GetConsensus());
|
||||
CTransaction vintx; std::string hex; CPubKey globalpk; uint256 hashBlock; uint64_t mask=0,nmask=0,vinimask=0;
|
||||
int64_t utxovalues[CC_MAXVINS],change,normalinputs=0,totaloutputs=0,normaloutputs=0,totalinputs=0,normalvins=0,ccvins=0;
|
||||
int32_t i,flag,mgret,utxovout,n,err = 0;
|
||||
char myaddr[64], destaddr[64], unspendable[64], mytokensaddr[64], mysingletokensaddr[64], unspendabletokensaddr[64],CC1of2CCaddr[64];
|
||||
uint8_t *privkey, myprivkey[32], unspendablepriv[32], /*tokensunspendablepriv[32],*/ *msg32 = 0;
|
||||
uint8_t *privkey = NULL, myprivkey[32] = { '\0' }, unspendablepriv[32] = { '\0' }, /*tokensunspendablepriv[32],*/ *msg32 = 0;
|
||||
CC *mycond=0, *othercond=0, *othercond2=0,*othercond4=0, *othercond3=0, *othercond1of2=NULL, *othercond1of2tokens = NULL, *cond=0, *condCC2=0,*mytokenscond = NULL, *mysingletokenscond = NULL, *othertokenscond = NULL;
|
||||
CPubKey unspendablepk /*, tokensunspendablepk*/;
|
||||
struct CCcontract_info *cpTokens, tokensC;
|
||||
UniValue sigData(UniValue::VARR),result(UniValue::VOBJ);
|
||||
const UniValue sigDataNull = NullUniValue;
|
||||
|
||||
globalpk = GetUnspendable(cp,0);
|
||||
n = mtx.vout.size();
|
||||
for (i=0; i<n; i++)
|
||||
@@ -63,9 +74,18 @@ std::string FinalizeCCTx(uint64_t CCmask,struct CCcontract_info *cp,CMutableTran
|
||||
if ( (n= mtx.vin.size()) > CC_MAXVINS )
|
||||
{
|
||||
fprintf(stderr,"FinalizeCCTx: %d is too many vins\n",n);
|
||||
return("0");
|
||||
result.push_back(Pair(JSON_HEXTX, "0"));
|
||||
return result;
|
||||
}
|
||||
Myprivkey(myprivkey);
|
||||
|
||||
//Myprivkey(myprivkey); // for NSPV mode we need to add myprivkey for the explicitly defined mypk param
|
||||
#ifdef ENABLE_WALLET
|
||||
// get privkey for mypk
|
||||
CKeyID keyID = mypk.GetID();
|
||||
CKey vchSecret;
|
||||
if (pwalletMain->GetKey(keyID, vchSecret))
|
||||
memcpy(myprivkey, vchSecret.begin(), sizeof(myprivkey));
|
||||
#endif
|
||||
|
||||
GetCCaddress(cp,myaddr,mypk);
|
||||
mycond = MakeCCcond1(cp->evalcode,mypk);
|
||||
@@ -109,7 +129,7 @@ std::string FinalizeCCTx(uint64_t CCmask,struct CCcontract_info *cp,CMutableTran
|
||||
{
|
||||
fprintf(stderr,"vin.%d vout.%d is bigger than vintx.%d\n",i,mtx.vin[i].prevout.n,(int32_t)vintx.vout.size());
|
||||
memset(myprivkey,0,32);
|
||||
return("");
|
||||
return UniValue(UniValue::VOBJ);
|
||||
}
|
||||
}
|
||||
if (normalvins>1 && ccvins)
|
||||
@@ -164,8 +184,18 @@ std::string FinalizeCCTx(uint64_t CCmask,struct CCcontract_info *cp,CMutableTran
|
||||
{
|
||||
if ( KOMODO_NSPV_FULLNODE )
|
||||
{
|
||||
if ( SignTx(mtx,i,vintx.vout[utxovout].nValue,vintx.vout[utxovout].scriptPubKey) == 0 )
|
||||
fprintf(stderr,"signing error for vini.%d of %llx\n",i,(long long)vinimask);
|
||||
if (!remote)
|
||||
{
|
||||
if (SignTx(mtx, i, vintx.vout[utxovout].nValue, vintx.vout[utxovout].scriptPubKey) == 0)
|
||||
fprintf(stderr, "signing error for vini.%d of %llx\n", i, (long long)vinimask);
|
||||
}
|
||||
else
|
||||
{
|
||||
// if no myprivkey for mypk it means remote call from nspv superlite client
|
||||
// add sigData for superlite client
|
||||
UniValue cc(UniValue::VNULL);
|
||||
AddSigData2UniValue(sigData, i, cc, HexStr(vintx.vout[utxovout].scriptPubKey), vintx.vout[utxovout].nValue ); // store vin i with scriptPubKey
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -282,7 +312,7 @@ std::string FinalizeCCTx(uint64_t CCmask,struct CCcontract_info *cp,CMutableTran
|
||||
{
|
||||
fprintf(stderr,"CC signing error: vini.%d has unknown CC address.(%s)\n",i,destaddr);
|
||||
memset(myprivkey,0,32);
|
||||
return("");
|
||||
return sigDataNull;
|
||||
}
|
||||
}
|
||||
uint256 sighash = SignatureHash(CCPubKey(cond), mtx, i, SIGHASH_ALL,utxovalues[i],consensusBranchId, &txdata);
|
||||
@@ -296,15 +326,33 @@ std::string FinalizeCCTx(uint64_t CCmask,struct CCcontract_info *cp,CMutableTran
|
||||
fprintf(stderr,"%02x",((uint8_t *)sighash.begin())[z]);
|
||||
fprintf(stderr," sighash [%d] %.8f %x\n",i,(double)utxovalues[i]/COIN,consensusBranchId);
|
||||
}
|
||||
if ( cc_signTreeSecp256k1Msg32(cond,privkey,sighash.begin()) != 0 )
|
||||
|
||||
if (!remote) // we have privkey in the wallet
|
||||
{
|
||||
mtx.vin[i].scriptSig = CCSig(cond);
|
||||
if (cc_signTreeSecp256k1Msg32(cond, privkey, sighash.begin()) != 0)
|
||||
{
|
||||
mtx.vin[i].scriptSig = CCSig(cond);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "vini.%d has CC signing error address.(%s) %s\n", i, destaddr, EncodeHexTx(mtx).c_str());
|
||||
memset(myprivkey, 0, sizeof(myprivkey));
|
||||
return sigDataNull;
|
||||
}
|
||||
}
|
||||
else
|
||||
else // no privkey locally - remote call
|
||||
{
|
||||
fprintf(stderr,"vini.%d has CC signing error address.(%s) %s\n",i,destaddr,EncodeHexTx(mtx).c_str());
|
||||
memset(myprivkey,0,sizeof(myprivkey));
|
||||
return("");
|
||||
// serialize cc:
|
||||
UniValue ccjson;
|
||||
ccjson.read(cc_conditionToJSONString(cond));
|
||||
if (ccjson.empty())
|
||||
{
|
||||
fprintf(stderr, "vini.%d can't serialize CC.(%s) %s\n", i, destaddr, EncodeHexTx(mtx).c_str());
|
||||
memset(myprivkey, 0, sizeof(myprivkey));
|
||||
return sigDataNull;
|
||||
}
|
||||
|
||||
AddSigData2UniValue(sigData, i, ccjson, std::string(), vintx.vout[utxovout].nValue); // store vin i with scriptPubKey
|
||||
}
|
||||
}
|
||||
} else fprintf(stderr,"FinalizeCCTx2 couldnt find %s mgret.%d\n",mtx.vin[i].prevout.hash.ToString().c_str(),mgret);
|
||||
@@ -334,8 +382,12 @@ std::string FinalizeCCTx(uint64_t CCmask,struct CCcontract_info *cp,CMutableTran
|
||||
memset(myprivkey,0,sizeof(myprivkey));
|
||||
std::string strHex = EncodeHexTx(mtx);
|
||||
if ( strHex.size() > 0 )
|
||||
return(strHex);
|
||||
else return("0");
|
||||
result.push_back(Pair(JSON_HEXTX, strHex));
|
||||
else {
|
||||
result.push_back(Pair(JSON_HEXTX, "0"));
|
||||
}
|
||||
if (sigData.size() > 0) result.push_back(Pair(JSON_SIGDATA,sigData));
|
||||
return result;
|
||||
}
|
||||
|
||||
void NSPV_CCunspents(std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > &unspentOutputs,char *coinaddr,bool ccflag);
|
||||
@@ -412,7 +464,10 @@ void SetCCtxids(std::vector<uint256> &txids,char *coinaddr,bool ccflag, uint8_t
|
||||
{
|
||||
if ( GetAddressIndex((*it).first, (*it).second, addressIndex) == 0 )
|
||||
return;
|
||||
for (std::vector<std::pair<CAddressIndexKey, CAmount> >::const_iterator it1=addressIndex.begin(); it1!=addressIndex.end(); it1++) txids.push_back(it1->first.txhash);
|
||||
for (std::vector<std::pair<CAddressIndexKey, CAmount> >::const_iterator it1=addressIndex.begin(); it1!=addressIndex.end(); it1++)
|
||||
{
|
||||
if (it1->second>=0) txids.push_back(it1->first.txhash);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -579,11 +634,15 @@ int32_t CC_vinselect(int32_t *aboveip,int64_t *abovep,int32_t *belowip,int64_t *
|
||||
else return(belowi);
|
||||
}
|
||||
|
||||
int64_t AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,int64_t total,int32_t maxinputs)
|
||||
int64_t AddNormalinputsLocal(CMutableTransaction &mtx,CPubKey mypk,int64_t total,int32_t maxinputs)
|
||||
{
|
||||
int32_t abovei,belowi,ind,vout,i,n = 0; int64_t sum,threshold,above,below; int64_t remains,nValue,totalinputs = 0; uint256 txid,hashBlock; std::vector<COutput> vecOutputs; CTransaction tx; struct CC_utxo *utxos,*up;
|
||||
if ( KOMODO_NSPV_SUPERLITE )
|
||||
return(NSPV_AddNormalinputs(mtx,mypk,total,maxinputs,&NSPV_U));
|
||||
|
||||
// if (mypk != pubkey2pk(Mypubkey())) //remote superlite mypk, do not use wallet since it is not locked for non-equal pks (see rpcs with nspv support)!
|
||||
// return(AddNormalinputs3(mtx, mypk, total, maxinputs));
|
||||
|
||||
#ifdef ENABLE_WALLET
|
||||
assert(pwalletMain != NULL);
|
||||
const CKeyStore& keystore = *pwalletMain;
|
||||
@@ -675,12 +734,20 @@ int64_t AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,int64_t total,int3
|
||||
return(0);
|
||||
}
|
||||
|
||||
int64_t AddNormalinputs2(CMutableTransaction &mtx,int64_t total,int32_t maxinputs)
|
||||
// always uses -pubkey param as mypk
|
||||
int64_t AddNormalinputs2(CMutableTransaction &mtx, int64_t total, int32_t maxinputs)
|
||||
{
|
||||
CPubKey mypk = pubkey2pk(Mypubkey());
|
||||
return AddNormalinputsRemote(mtx, mypk, total, maxinputs);
|
||||
}
|
||||
|
||||
// has additional mypk param for nspv calls
|
||||
int64_t AddNormalinputsRemote(CMutableTransaction &mtx, CPubKey mypk, int64_t total, int32_t maxinputs)
|
||||
{
|
||||
int32_t abovei,belowi,ind,vout,i,n = 0; int64_t sum,threshold,above,below; int64_t remains,nValue,totalinputs = 0; char coinaddr[64]; uint256 txid,hashBlock; CTransaction tx; struct CC_utxo *utxos,*up;
|
||||
std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > unspentOutputs;
|
||||
if ( KOMODO_NSPV_SUPERLITE )
|
||||
return(NSPV_AddNormalinputs(mtx,pubkey2pk(Mypubkey()),total,maxinputs,&NSPV_U));
|
||||
return(NSPV_AddNormalinputs(mtx,mypk,total,maxinputs,&NSPV_U));
|
||||
utxos = (struct CC_utxo *)calloc(CC_MAXVINS,sizeof(*utxos));
|
||||
if ( maxinputs > CC_MAXVINS )
|
||||
maxinputs = CC_MAXVINS;
|
||||
@@ -688,7 +755,7 @@ int64_t AddNormalinputs2(CMutableTransaction &mtx,int64_t total,int32_t maxinput
|
||||
threshold = total/maxinputs;
|
||||
else threshold = total;
|
||||
sum = 0;
|
||||
Getscriptaddress(coinaddr,CScript() << Mypubkey() << OP_CHECKSIG);
|
||||
Getscriptaddress(coinaddr,CScript() << vscript_t(mypk.begin(), mypk.end()) << OP_CHECKSIG);
|
||||
SetCCunspents(unspentOutputs,coinaddr,false);
|
||||
for (std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++)
|
||||
{
|
||||
@@ -766,3 +833,21 @@ int64_t AddNormalinputs2(CMutableTransaction &mtx,int64_t total,int32_t maxinput
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
int64_t AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,int64_t total,int32_t maxinputs,bool remote)
|
||||
{
|
||||
if (!remote) return (AddNormalinputsLocal(mtx,mypk,total,maxinputs));
|
||||
else return (AddNormalinputsRemote(mtx,mypk,total,maxinputs));
|
||||
}
|
||||
|
||||
void AddSigData2UniValue(UniValue &sigdata, int32_t vini, UniValue& ccjson, std::string sscriptpubkey, int64_t amount)
|
||||
{
|
||||
UniValue elem(UniValue::VOBJ);
|
||||
elem.push_back(Pair("vin", vini));
|
||||
if (!ccjson.empty())
|
||||
elem.push_back(Pair("cc", ccjson));
|
||||
if (!sscriptpubkey.empty())
|
||||
elem.push_back(Pair("scriptPubKey", sscriptpubkey));
|
||||
elem.push_back(Pair("amount", amount));
|
||||
sigdata.push_back(elem);
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/******************************************************************************
|
||||
* Copyright © 2014-2019 The SuperNET Developers. *
|
||||
* Copyright <EFBFBD> 2014-2019 The SuperNET Developers. *
|
||||
* *
|
||||
* See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at *
|
||||
* the top-level directory of this distribution for the individual copyright *
|
||||
@@ -93,13 +93,23 @@ CPubKey buf2pk(uint8_t *buf33)
|
||||
return(pk);
|
||||
}
|
||||
|
||||
CPubKey pubkey2pk(std::vector<uint8_t> pubkey)
|
||||
CPubKey pubkey2pk(std::vector<uint8_t> vpubkey)
|
||||
{
|
||||
CPubKey pk; int32_t i,n; uint8_t *dest,*pubkey33;
|
||||
n = pubkey.size();
|
||||
dest = (uint8_t *)pk.begin();
|
||||
pubkey33 = (uint8_t *)pubkey.data();
|
||||
for (i=0; i<n; i++)
|
||||
dest[i] = pubkey33[i];
|
||||
CPubKey pk;
|
||||
pk.Set(vpubkey.begin(), vpubkey.end());
|
||||
return(pk);
|
||||
}
|
||||
|
||||
void CCLogPrintStr(const char *category, int level, const std::string &str)
|
||||
{
|
||||
if (level < 0)
|
||||
level = 0;
|
||||
if (level > CCLOG_MAXLEVEL)
|
||||
level = CCLOG_MAXLEVEL;
|
||||
for (int i = level; i <= CCLOG_MAXLEVEL; i++)
|
||||
if (LogAcceptCategory((std::string(category) + std::string("-") + std::to_string(i)).c_str()) || // '-debug=cctokens-0', '-debug=cctokens-1',...
|
||||
i == 0 && LogAcceptCategory(std::string(category).c_str())) { // also supporting '-debug=cctokens' for CCLOG_INFO
|
||||
LogPrintStr(str);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
/*
|
||||
CCutils has low level functions that are universally useful for all contracts.
|
||||
*/
|
||||
|
||||
#include "CCinclude.h"
|
||||
#include "komodo_structs.h"
|
||||
#include "key_io.h"
|
||||
@@ -169,7 +170,12 @@ bool CheckTxFee(const CTransaction &tx, uint64_t txfee, uint32_t height, uint64_
|
||||
return true;
|
||||
}
|
||||
|
||||
// set additional 'unspendable' addr
|
||||
uint32_t GetLatestTimestamp(int32_t height)
|
||||
{
|
||||
if ( KOMODO_NSPV_SUPERLITE ) return ((uint32_t)NSPV_blocktime(height));
|
||||
return(komodo_heightstamp(height));
|
||||
} // :P
|
||||
|
||||
void CCaddr2set(struct CCcontract_info *cp,uint8_t evalcode,CPubKey pk,uint8_t *priv,char *coinaddr)
|
||||
{
|
||||
cp->unspendableEvalcode2 = evalcode;
|
||||
@@ -178,7 +184,6 @@ void CCaddr2set(struct CCcontract_info *cp,uint8_t evalcode,CPubKey pk,uint8_t *
|
||||
strcpy(cp->unspendableaddr2,coinaddr);
|
||||
}
|
||||
|
||||
// set yet another additional 'unspendable' addr
|
||||
void CCaddr3set(struct CCcontract_info *cp,uint8_t evalcode,CPubKey pk,uint8_t *priv,char *coinaddr)
|
||||
{
|
||||
cp->unspendableEvalcode3 = evalcode;
|
||||
@@ -187,7 +192,6 @@ void CCaddr3set(struct CCcontract_info *cp,uint8_t evalcode,CPubKey pk,uint8_t *
|
||||
strcpy(cp->unspendableaddr3,coinaddr);
|
||||
}
|
||||
|
||||
// set pubkeys, myprivkey and 1of2 cc addr for spending from 1of2 cryptocondition vout:
|
||||
void CCaddr1of2set(struct CCcontract_info *cp, CPubKey pk1, CPubKey pk2, uint8_t *priv, char *coinaddr)
|
||||
{
|
||||
cp->coins1of2pk[0] = pk1;
|
||||
@@ -196,8 +200,6 @@ void CCaddr1of2set(struct CCcontract_info *cp, CPubKey pk1, CPubKey pk2, uint8_t
|
||||
strcpy(cp->coins1of2addr,coinaddr);
|
||||
}
|
||||
|
||||
// set pubkeys, myprivkey and 1of2 cc addr for spending from 1of2 token cryptocondition vout
|
||||
// to get tokenaddr use GetTokensCCaddress()
|
||||
void CCaddrTokens1of2set(struct CCcontract_info *cp, CPubKey pk1, CPubKey pk2, uint8_t *priv, char *tokenaddr)
|
||||
{
|
||||
cp->tokens1of2pk[0] = pk1;
|
||||
@@ -358,7 +360,6 @@ bool GetCCaddress1of2(struct CCcontract_info *cp,char *destaddr,CPubKey pk,CPubK
|
||||
return(destaddr[0] != 0);
|
||||
}
|
||||
|
||||
// get scriptPubKey adddress for three/dual eval token 1of2 cc vout
|
||||
bool GetTokensCCaddress1of2(struct CCcontract_info *cp, char *destaddr, CPubKey pk, CPubKey pk2)
|
||||
{
|
||||
CC *payoutCond;
|
||||
|
||||
@@ -570,7 +570,7 @@ std::string Faucet2Fund(struct CCcontract_info *cp,uint64_t txfee,int64_t funds)
|
||||
txfee = 10000;
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
cclibpk = GetUnspendable(cp,0);
|
||||
if ( AddNormalinputs(mtx,mypk,funds+txfee,64) > 0 )
|
||||
if ( AddNormalinputs2(mtx,funds+txfee,64) > 0 )
|
||||
{
|
||||
mtx.vout.push_back(MakeCC1vout(cp->evalcode,funds,cclibpk));
|
||||
return(FinalizeCCTx(0,cp,mtx,mypk,txfee,opret));
|
||||
|
||||
@@ -461,30 +461,32 @@ int64_t AddChannelsInputs(struct CCcontract_info *cp,CMutableTransaction &mtx, C
|
||||
else return 0;
|
||||
}
|
||||
|
||||
std::string ChannelOpen(uint64_t txfee,CPubKey destpub,int32_t numpayments,int64_t payment, uint256 tokenid)
|
||||
UniValue ChannelOpen(const CPubKey& pk, uint64_t txfee,CPubKey destpub,int32_t numpayments,int64_t payment, uint256 tokenid)
|
||||
{
|
||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||
uint8_t hash[32],hashdest[32]; uint64_t amount,tokens=0,funds; int32_t i; uint256 hashchain,entropy,hentropy;
|
||||
CPubKey mypk; struct CCcontract_info *cp,*cpTokens,C,CTokens;
|
||||
|
||||
if ( numpayments <= 0 || payment <= 0 || numpayments > CHANNELS_MAXPAYMENTS )
|
||||
{
|
||||
CCerror = strprintf("invalid ChannelOpen param numpayments.%d max.%d payment.%lld\n",numpayments,CHANNELS_MAXPAYMENTS,(long long)payment);
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "invalid ChannelOpen param numpayments." << numpayments << " payment." << payment << " - max_numpayments." << CHANNELS_MAXPAYMENTS);
|
||||
if (!destpub.IsFullyValid())
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "invalid destination pubkey");
|
||||
if (numpayments <1)
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "invalid number of payments, must be greater than 0");
|
||||
if (payment <1)
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "invalid payment amount, must be greater than 0");
|
||||
cp = CCinit(&C,EVAL_CHANNELS);
|
||||
cpTokens = CCinit(&CTokens,EVAL_TOKENS);
|
||||
if ( txfee == 0 )
|
||||
txfee = 10000;
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
funds = numpayments * payment;
|
||||
if (tokenid!=zeroid)
|
||||
{
|
||||
amount=AddNormalinputs(mtx,mypk,txfee+2*CC_MARKER_VALUE,5);
|
||||
amount=AddNormalinputs(mtx,mypk,txfee+2*CC_MARKER_VALUE,5,pk.IsValid());
|
||||
tokens=AddTokenCCInputs(cpTokens, mtx, mypk, tokenid, funds, 64);
|
||||
}
|
||||
else amount=AddNormalinputs(mtx,mypk,funds+txfee+2*CC_MARKER_VALUE,64);
|
||||
else amount=AddNormalinputs(mtx,mypk,funds+txfee+2*CC_MARKER_VALUE,64,pk.IsValid());
|
||||
if (amount+tokens >= funds+txfee+2*CC_MARKER_VALUE)
|
||||
{
|
||||
hentropy = DiceHashEntropy(entropy,mtx.vin[0].prevout.hash,mtx.vin[0].prevout.n,1);
|
||||
@@ -500,14 +502,12 @@ std::string ChannelOpen(uint64_t txfee,CPubKey destpub,int32_t numpayments,int64
|
||||
mtx.vout.push_back(MakeCC1vout(EVAL_CHANNELS,CC_MARKER_VALUE,mypk));
|
||||
mtx.vout.push_back(MakeCC1vout(EVAL_CHANNELS,CC_MARKER_VALUE,destpub));
|
||||
if (tokenid!=zeroid && tokens>funds) mtx.vout.push_back(MakeCC1vout(EVAL_TOKENS,tokens-funds,mypk));
|
||||
return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeChannelsOpRet('O',tokenid,zeroid,mypk,destpub,numpayments,payment,hashchain)));
|
||||
return(FinalizeCCTxExt(pk.IsValid(),0,cp,mtx,mypk,txfee,EncodeChannelsOpRet('O',tokenid,zeroid,mypk,destpub,numpayments,payment,hashchain)));
|
||||
}
|
||||
CCerror = strprintf("error adding funds");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "error adding funds");
|
||||
}
|
||||
|
||||
std::string ChannelPayment(uint64_t txfee,uint256 opentxid,int64_t amount, uint256 secret)
|
||||
UniValue ChannelPayment(const CPubKey& pk, uint64_t txfee,uint256 opentxid,int64_t amount, uint256 secret)
|
||||
{
|
||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||
CPubKey mypk,srcpub,destpub; uint256 txid,hashchain,gensecret,hashblock,entropy,hentropy,prevtxid,param3,tokenid;
|
||||
@@ -519,41 +519,23 @@ std::string ChannelPayment(uint64_t txfee,uint256 opentxid,int64_t amount, uint2
|
||||
cp = CCinit(&C,EVAL_CHANNELS);
|
||||
if ( txfee == 0 )
|
||||
txfee = 10000;
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
if (myGetTransaction(opentxid,channelOpenTx,hashblock) == 0)
|
||||
{
|
||||
CCerror = strprintf("invalid channel open txid");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
if (amount <1)
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "invalid payment amount, must be greater than 0");
|
||||
if (myGetTransaction(opentxid,channelOpenTx,hashblock) == 0)
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "invalid channel open txid");
|
||||
if ((numvouts=channelOpenTx.vout.size()) > 0 && DecodeChannelsOpRet(channelOpenTx.vout[numvouts-1].scriptPubKey, tokenid, txid, srcpub, destpub, totalnumpayments, payment, hashchain)=='O')
|
||||
{
|
||||
if (mypk != srcpub && mypk != destpub)
|
||||
{
|
||||
CCerror = strprintf("this is not our channel");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
if (mypk != srcpub && mypk != destpub)
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "this is not our channel");
|
||||
else if (amount % payment != 0 || amount<payment)
|
||||
{
|
||||
CCerror = strprintf("invalid amount, not a magnitude of payment size");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return ("");
|
||||
}
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "invalid amount, not a magnitude of payment size");
|
||||
else if (mypk == destpub && secret==zeroid) CCERR_RESULT("channelscc",CCLOG_INFO, stream << "invalid secret, secret is necessary when making payment from destination");
|
||||
}
|
||||
else
|
||||
{
|
||||
CCerror = strprintf("invalid channel open tx");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return ("");
|
||||
}
|
||||
if (komodo_txnotarizedconfirmed(opentxid)==false)
|
||||
{
|
||||
CCerror = strprintf("channelsopen tx not yet confirmed/notarized");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
if (AddNormalinputs(mtx,mypk,txfee+CC_MARKER_VALUE,3) > 0)
|
||||
else
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "invalid channel open tx");
|
||||
if (komodo_txnotarizedconfirmed(opentxid)==false) CCERR_RESULT("channelscc",CCLOG_INFO, stream << "channelsopen tx not yet confirmed/notarized");
|
||||
if (AddNormalinputs(mtx,mypk,txfee+CC_MARKER_VALUE,3,pk.IsValid()) > 0)
|
||||
{
|
||||
if ((funds=AddChannelsInputs(cp,mtx,channelOpenTx,prevtxid,mypk)) !=0 && (change=funds-amount)>=0)
|
||||
{
|
||||
@@ -563,16 +545,9 @@ std::string ChannelPayment(uint64_t txfee,uint256 opentxid,int64_t amount, uint2
|
||||
(funcid == 'P' || funcid=='O'))
|
||||
{
|
||||
if (numpayments > prevdepth)
|
||||
{
|
||||
CCerror = strprintf("not enough funds in channel for that amount");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return ("");
|
||||
} else if (numpayments == 0)
|
||||
{
|
||||
CCerror = strprintf("invalid amount");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return ("");
|
||||
}
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "not enough funds in channel for that amount");
|
||||
else if (numpayments == 0)
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "invalid amount");
|
||||
if (secret!=zeroid)
|
||||
{
|
||||
endiancpy(hash, (uint8_t * ) & secret, 32);
|
||||
@@ -582,12 +557,7 @@ std::string ChannelPayment(uint64_t txfee,uint256 opentxid,int64_t amount, uint2
|
||||
memcpy(hash, hashdest, 32);
|
||||
}
|
||||
endiancpy((uint8_t * ) & gensecret, hashdest, 32);
|
||||
if (gensecret!=hashchain)
|
||||
{
|
||||
CCerror = strprintf("invalid secret supplied");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
if (gensecret!=hashchain) CCERR_RESULT("channelscc",CCLOG_INFO, stream << "invalid secret supplied");
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -605,33 +575,23 @@ std::string ChannelPayment(uint64_t txfee,uint256 opentxid,int64_t amount, uint2
|
||||
else endiancpy((uint8_t * ) & secret, (uint8_t * ) & hentropy, 32);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
CCerror = strprintf("invalid previous tx");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
else
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "invalid previous tx");
|
||||
if (tokenid!=zeroid) mtx.vout.push_back(MakeTokensCC1of2vout(EVAL_CHANNELS, change, srcpub, destpub));
|
||||
else mtx.vout.push_back(MakeCC1of2vout(EVAL_CHANNELS, change, srcpub, destpub));
|
||||
mtx.vout.push_back(MakeCC1vout(EVAL_CHANNELS,CC_MARKER_VALUE,srcpub));
|
||||
mtx.vout.push_back(MakeCC1vout(EVAL_CHANNELS,CC_MARKER_VALUE,destpub));
|
||||
if (tokenid!=zeroid) mtx.vout.push_back(MakeCC1vout(EVAL_TOKENS, amount, destpub));
|
||||
else mtx.vout.push_back(CTxOut(amount, CScript() << ParseHex(HexStr(destpub)) << OP_CHECKSIG));
|
||||
return (FinalizeCCTx(0, cp, mtx, mypk, txfee, EncodeChannelsOpRet('P', tokenid, opentxid, srcpub, destpub, prevdepth-numpayments, numpayments, secret)));
|
||||
}
|
||||
else
|
||||
{
|
||||
CCerror = strprintf("error adding CC inputs");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
return (FinalizeCCTxExt(pk.IsValid(), 0, cp, mtx, mypk, txfee, EncodeChannelsOpRet('P', tokenid, opentxid, srcpub, destpub, prevdepth-numpayments, numpayments, secret)));
|
||||
}
|
||||
else
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "error adding CC inputs");
|
||||
}
|
||||
CCerror = strprintf("error adding normal inputs");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "error adding normal inputs");
|
||||
}
|
||||
|
||||
std::string ChannelClose(uint64_t txfee,uint256 opentxid)
|
||||
UniValue ChannelClose(const CPubKey& pk, uint64_t txfee,uint256 opentxid)
|
||||
{
|
||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||
CPubKey mypk,srcpub,destpub; struct CCcontract_info *cp,C;
|
||||
@@ -644,32 +604,16 @@ std::string ChannelClose(uint64_t txfee,uint256 opentxid)
|
||||
cp = CCinit(&C,EVAL_CHANNELS);
|
||||
if ( txfee == 0 )
|
||||
txfee = 10000;
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
if (myGetTransaction(opentxid,channelOpenTx,hashblock) == 0)
|
||||
{
|
||||
CCerror = strprintf("invalid channel open txid");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return ("");
|
||||
}
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
if (myGetTransaction(opentxid,channelOpenTx,hashblock) == 0)
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "invalid channel open txid");
|
||||
if ((numvouts=channelOpenTx.vout.size()) < 1 || DecodeChannelsOpRet(channelOpenTx.vout[numvouts-1].scriptPubKey,tokenid,tmp_txid,srcpub,destpub,numpayments,payment,hashchain)!='O')
|
||||
{
|
||||
CCerror = strprintf("invalid channel open tx");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return ("");
|
||||
}
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "invalid channel open tx");
|
||||
if (komodo_txnotarizedconfirmed(opentxid)==false)
|
||||
{
|
||||
CCerror = strprintf("channelsopen tx not yet confirmed/notarized");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream <<"channelsopen tx not yet confirmed/notarized");
|
||||
if (mypk != srcpub)
|
||||
{
|
||||
CCerror = strprintf("cannot close, you are not channel owner");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
if ( AddNormalinputs(mtx,mypk,txfee+CC_MARKER_VALUE,3) > 0 )
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "cannot close, you are not channel owner");
|
||||
if ( AddNormalinputs(mtx,mypk,txfee+CC_MARKER_VALUE,3,pk.IsValid()) > 0 )
|
||||
{
|
||||
if ((funds=AddChannelsInputs(cp,mtx,channelOpenTx,prevtxid,mypk)) !=0 && funds>0)
|
||||
{
|
||||
@@ -680,18 +624,12 @@ std::string ChannelClose(uint64_t txfee,uint256 opentxid)
|
||||
return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeChannelsOpRet('C',tokenid,opentxid,mypk,destpub,funds/payment,payment,zeroid)));
|
||||
}
|
||||
else
|
||||
{
|
||||
CCerror = strprintf("error adding CC inputs");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "error adding CC inputs");
|
||||
}
|
||||
CCerror = strprintf("error adding normal inputs");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "error adding normal inputs");
|
||||
}
|
||||
|
||||
std::string ChannelRefund(uint64_t txfee,uint256 opentxid,uint256 closetxid)
|
||||
UniValue ChannelRefund(const CPubKey& pk, uint64_t txfee,uint256 opentxid,uint256 closetxid)
|
||||
{
|
||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||
CPubKey mypk; struct CCcontract_info *cp,C; int64_t funds,payment,param2;
|
||||
@@ -704,56 +642,24 @@ std::string ChannelRefund(uint64_t txfee,uint256 opentxid,uint256 closetxid)
|
||||
cp = CCinit(&C,EVAL_CHANNELS);
|
||||
if ( txfee == 0 )
|
||||
txfee = 10000;
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
if (myGetTransaction(closetxid,channelCloseTx,hashblock) == 0)
|
||||
{
|
||||
CCerror = strprintf("invalid channel close txid");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return ("");
|
||||
}
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "invalid channel close txid");
|
||||
if ((numvouts=channelCloseTx.vout.size()) < 1 || DecodeChannelsOpRet(channelCloseTx.vout[numvouts-1].scriptPubKey,tokenid,txid,srcpub,destpub,param1,param2,param3)!='C')
|
||||
{
|
||||
CCerror = strprintf("invalid channel close tx");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return ("");
|
||||
}
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "invalid channel close tx");
|
||||
if (komodo_txnotarizedconfirmed(closetxid)==false)
|
||||
{
|
||||
CCerror = strprintf("channelsclose tx not yet confirmed/notarized");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "channelsclose tx not yet confirmed/notarized");
|
||||
if (txid!=opentxid)
|
||||
{
|
||||
CCerror = strprintf("open and close txid are not from same channel");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return ("");
|
||||
}
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "open and close txid are not from same channel");
|
||||
if (myGetTransaction(opentxid,channelOpenTx,hashblock) == 0)
|
||||
{
|
||||
CCerror = strprintf("invalid channel open txid");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return ("");
|
||||
}
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "invalid channel open txid");
|
||||
if (komodo_txnotarizedconfirmed(opentxid)==false)
|
||||
{
|
||||
CCerror = strprintf("channelsopen tx not yet confirmed/notarized");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "channelsopen tx not yet confirmed/notarized");
|
||||
if ((numvouts=channelOpenTx.vout.size()) < 1 || DecodeChannelsOpRet(channelOpenTx.vout[numvouts-1].scriptPubKey,tokenid,txid,srcpub,destpub,numpayments,payment,hashchain)!='O')
|
||||
{
|
||||
CCerror = strprintf("invalid channel open tx");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return ("");
|
||||
}
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "invalid channel open tx");
|
||||
if (mypk != srcpub)
|
||||
{
|
||||
CCerror = strprintf("cannot refund, you are not the channel owner");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
if ( AddNormalinputs(mtx,mypk,txfee+CC_MARKER_VALUE,3) > 0 )
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "cannot refund, you are not the channel owner");
|
||||
if ( AddNormalinputs(mtx,mypk,txfee+CC_MARKER_VALUE,3,pk.IsValid()) > 0 )
|
||||
{
|
||||
if ((funds=AddChannelsInputs(cp,mtx,channelOpenTx,prevtxid,mypk)) !=0 && funds>0)
|
||||
{
|
||||
@@ -767,32 +673,22 @@ std::string ChannelRefund(uint64_t txfee,uint256 opentxid,uint256 closetxid)
|
||||
return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeChannelsOpRet('R',tokenid,opentxid,mypk,destpub,funds/payment,payment,closetxid)));
|
||||
}
|
||||
else
|
||||
{
|
||||
CCerror = strprintf("previous tx is invalid");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "previous tx is invalid");
|
||||
}
|
||||
else
|
||||
{
|
||||
CCerror = strprintf("error adding CC inputs");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "error adding CC inputs");
|
||||
}
|
||||
CCerror = strprintf("error adding normal inputs");
|
||||
LOGSTREAM("channelscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
CCERR_RESULT("channelscc",CCLOG_INFO, stream << "error adding normal inputs");
|
||||
}
|
||||
|
||||
UniValue ChannelsList()
|
||||
UniValue ChannelsList(const CPubKey& pk)
|
||||
{
|
||||
UniValue result(UniValue::VOBJ); std::vector<uint256> txids; struct CCcontract_info *cp,C; uint256 txid,hashBlock,tmp_txid,param3,tokenid;
|
||||
CTransaction tx; char myCCaddr[65],addr[65],str[256]; CPubKey mypk,srcpub,destpub; int32_t vout,numvouts,param1;
|
||||
CTransaction tx; char myCCaddr[65],str[512],pub[34]; CPubKey mypk,srcpub,destpub; int32_t vout,numvouts,param1;
|
||||
int64_t nValue,param2;
|
||||
|
||||
cp = CCinit(&C,EVAL_CHANNELS);
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
GetCCaddress(cp,myCCaddr,mypk);
|
||||
SetCCtxids(txids,myCCaddr,true,EVAL_CHANNELS,zeroid,'O');
|
||||
result.push_back(Pair("result","success"));
|
||||
@@ -804,8 +700,7 @@ UniValue ChannelsList()
|
||||
{
|
||||
if (DecodeChannelsOpRet(tx.vout[numvouts-1].scriptPubKey,tokenid,tmp_txid,srcpub,destpub,param1,param2,param3) == 'O')
|
||||
{
|
||||
GetCCaddress1of2(cp,addr,srcpub,destpub);
|
||||
sprintf(str,"%s - %lld payments of %lld satoshi",addr,(long long)param1,(long long)param2);
|
||||
sprintf(str,"%lld payments of %lld satoshi to %s",(long long)param1,(long long)param2,pubkey33_str(pub,(uint8_t *)&destpub));
|
||||
result.push_back(Pair(txid.GetHex().data(),str));
|
||||
}
|
||||
}
|
||||
@@ -813,7 +708,7 @@ UniValue ChannelsList()
|
||||
return(result);
|
||||
}
|
||||
|
||||
UniValue ChannelsInfo(uint256 channeltxid)
|
||||
UniValue ChannelsInfo(const CPubKey& pk,uint256 channeltxid)
|
||||
{
|
||||
UniValue result(UniValue::VOBJ),array(UniValue::VARR); CTransaction tx,opentx; uint256 txid,tmp_txid,hashBlock,param3,opentxid,hashchain,tokenid;
|
||||
struct CCcontract_info *cp,C; char CCaddr[65],addr[65],str[512]; int32_t vout,numvouts,param1,numpayments;
|
||||
@@ -821,7 +716,7 @@ UniValue ChannelsInfo(uint256 channeltxid)
|
||||
std::vector<uint256> txids; std::vector<CTransaction> txs;
|
||||
|
||||
cp = CCinit(&C,EVAL_CHANNELS);
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
|
||||
if (myGetTransaction(channeltxid,tx,hashBlock) != 0 && (numvouts= tx.vout.size()) > 0 &&
|
||||
(DecodeChannelsOpRet(tx.vout[numvouts-1].scriptPubKey,tokenid,opentxid,srcpub,destpub,param1,param2,param3) == 'O'))
|
||||
|
||||
@@ -62,7 +62,7 @@ UniValue custom_func1(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||
if ( txfee == 0 )
|
||||
txfee = CUSTOM_TXFEE;
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
if ( AddNormalinputs(mtx,mypk,COIN+txfee,64) >= COIN+txfee ) // add utxo to mtx
|
||||
if ( AddNormalinputs2(mtx,COIN+txfee,64) >= COIN+txfee ) // add utxo to mtx
|
||||
{
|
||||
// make op_return payload as normal.
|
||||
CScript opret = custom_opret('1',mypk);
|
||||
|
||||
@@ -15,12 +15,22 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <unistd.h>
|
||||
#include <memory.h>
|
||||
#include "cJSON.c"
|
||||
|
||||
bits256 zeroid;
|
||||
|
||||
void myprintf(const char* format, ...)
|
||||
{
|
||||
va_list marker;
|
||||
va_start( marker, format );
|
||||
vfprintf(stdout, format, marker);
|
||||
fflush(stdout);
|
||||
va_end( marker );
|
||||
}
|
||||
|
||||
char hexbyte(int32_t c)
|
||||
{
|
||||
c &= 0xf;
|
||||
@@ -64,7 +74,7 @@ int32_t unhex(char c)
|
||||
int32_t hex;
|
||||
if ( (hex= _unhex(c)) < 0 )
|
||||
{
|
||||
//printf("unhex: illegal hexchar.(%c)\n",c);
|
||||
//myprintf("unhex: illegal hexchar.(%c)\n",c);
|
||||
}
|
||||
return(hex);
|
||||
}
|
||||
@@ -74,7 +84,7 @@ unsigned char _decode_hex(char *hex) { return((unhex(hex[0])<<4) | unhex(hex[1])
|
||||
int32_t decode_hex(unsigned char *bytes,int32_t n,char *hex)
|
||||
{
|
||||
int32_t adjust,i = 0;
|
||||
//printf("decode.(%s)\n",hex);
|
||||
//myprintf("decode.(%s)\n",hex);
|
||||
if ( is_hexstr(hex,n) <= 0 )
|
||||
{
|
||||
memset(bytes,0,n);
|
||||
@@ -89,7 +99,7 @@ int32_t decode_hex(unsigned char *bytes,int32_t n,char *hex)
|
||||
if ( n > 0 )
|
||||
{
|
||||
bytes[0] = unhex(hex[0]);
|
||||
printf("decode_hex n.%d hex[0] (%c) -> %d hex.(%s) [n*2+1: %d] [n*2: %d %c] len.%ld\n",n,hex[0],bytes[0],hex,hex[n*2+1],hex[n*2],hex[n*2],(long)strlen(hex));
|
||||
myprintf("decode_hex n.%d hex[0] (%c) -> %d hex.(%s) [n*2+1: %d] [n*2: %d %c] len.%ld\n",n,hex[0],bytes[0],hex,hex[n*2+1],hex[n*2],hex[n*2],(long)strlen(hex));
|
||||
}
|
||||
bytes++;
|
||||
hex++;
|
||||
@@ -116,10 +126,10 @@ int32_t init_hexbytes_noT(char *hexbytes,unsigned char *message,long len)
|
||||
{
|
||||
hexbytes[i*2] = hexbyte((message[i]>>4) & 0xf);
|
||||
hexbytes[i*2 + 1] = hexbyte(message[i] & 0xf);
|
||||
//printf("i.%d (%02x) [%c%c]\n",i,message[i],hexbytes[i*2],hexbytes[i*2+1]);
|
||||
//myprintf("i.%d (%02x) [%c%c]\n",i,message[i],hexbytes[i*2],hexbytes[i*2+1]);
|
||||
}
|
||||
hexbytes[len*2] = 0;
|
||||
//printf("len.%ld\n",len*2+1);
|
||||
//myprintf("len.%ld\n",len*2+1);
|
||||
return((int32_t)len*2+1);
|
||||
}
|
||||
|
||||
@@ -143,7 +153,7 @@ char *clonestr(char *str)
|
||||
char *clone;
|
||||
if ( str == 0 || str[0]==0)
|
||||
{
|
||||
printf("warning cloning nullstr.%p\n",str);
|
||||
myprintf("warning cloning nullstr.%p\n",str);
|
||||
//#ifdef __APPLE__
|
||||
// while ( 1 ) sleep(1);
|
||||
//#endif
|
||||
@@ -165,8 +175,8 @@ int32_t safecopy(char *dest,char *src,long len)
|
||||
dest[i] = src[i];
|
||||
if ( i == len )
|
||||
{
|
||||
printf("safecopy: %s too long %ld\n",src,len);
|
||||
//printf("divide by zero! %d\n",1/zeroval());
|
||||
myprintf("safecopy: %s too long %ld\n",src,len);
|
||||
//myprintf("divide by zero! %d\n",1/zeroval());
|
||||
#ifdef __APPLE__
|
||||
//getchar();
|
||||
#endif
|
||||
@@ -236,7 +246,7 @@ void *loadfile(char *fname,uint8_t **bufp,long *lenp,long *allocsizep)
|
||||
{
|
||||
fclose(fp);
|
||||
*lenp = 0;
|
||||
//printf("loadfile null size.(%s)\n",fname);
|
||||
//myprintf("loadfile null size.(%s)\n",fname);
|
||||
return(0);
|
||||
}
|
||||
if ( filesize > buflen )
|
||||
@@ -246,17 +256,17 @@ void *loadfile(char *fname,uint8_t **bufp,long *lenp,long *allocsizep)
|
||||
}
|
||||
rewind(fp);
|
||||
if ( buf == 0 )
|
||||
printf("Null buf ???\n");
|
||||
myprintf("Null buf ???\n");
|
||||
else
|
||||
{
|
||||
if ( fread(buf,1,(long)filesize,fp) != (unsigned long)filesize )
|
||||
printf("error reading filesize.%ld\n",(long)filesize);
|
||||
myprintf("error reading filesize.%ld\n",(long)filesize);
|
||||
buf[filesize] = 0;
|
||||
}
|
||||
fclose(fp);
|
||||
*lenp = filesize;
|
||||
//printf("loaded.(%s)\n",buf);
|
||||
} //else printf("OS_loadfile couldnt load.(%s)\n",fname);
|
||||
//myprintf("loaded.(%s)\n",buf);
|
||||
} //else myprintf("OS_loadfile couldnt load.(%s)\n",fname);
|
||||
return(buf);
|
||||
}
|
||||
|
||||
@@ -284,7 +294,7 @@ cJSON *get_urljson(char *url,char *fname)
|
||||
char *jsonstr; cJSON *json = 0;
|
||||
if ( (jsonstr= send_curl(url,fname)) != 0 )
|
||||
{
|
||||
//printf("(%s) -> (%s)\n",url,jsonstr);
|
||||
//myprintf("(%s) -> (%s)\n",url,jsonstr);
|
||||
json = cJSON_Parse(jsonstr);
|
||||
free(jsonstr);
|
||||
}
|
||||
@@ -303,7 +313,7 @@ uint64_t get_btcusd()
|
||||
if ( (bpi= jobj(pjson,"bpi")) != 0 && (usd= jobj(bpi,"USD")) != 0 )
|
||||
{
|
||||
btcusd = jdouble(usd,"rate_float") * SATOSHIDEN;
|
||||
printf("BTC/USD %.4f\n",dstr(btcusd));
|
||||
myprintf("BTC/USD %.4f\n",dstr(btcusd));
|
||||
}
|
||||
free_json(pjson);
|
||||
}
|
||||
@@ -319,13 +329,13 @@ cJSON *get_cli(char *refcoin,char **retstrp,char *acname,char *method,char *arg0
|
||||
if ( acname[0] != 0 )
|
||||
{
|
||||
if ( refcoin[0] == 0 )
|
||||
printf("must supply reference coin\n");
|
||||
myprintf("must supply reference coin\n");
|
||||
sprintf(cmdstr,"./komodo-cli -ac_name=%s %s %s %s %s %s > %s 2>/tmp/oraclefeed.error\n",acname,method,arg0,arg1,arg2,arg3,fname);
|
||||
}
|
||||
else if ( REFCOIN_CLI != 0 && REFCOIN_CLI[0] != 0 )
|
||||
{
|
||||
sprintf(cmdstr,"%s %s %s %s %s %s > %s 2>/tmp/oraclefeed.error\n",REFCOIN_CLI,method,arg0,arg1,arg2,arg3,fname);
|
||||
//printf("ref.(%s) REFCOIN_CLI (%s)\n",refcoin,cmdstr);
|
||||
//myprintf("ref.(%s) REFCOIN_CLI (%s)\n",refcoin,cmdstr);
|
||||
}
|
||||
#ifdef TESTMODE
|
||||
fprintf(stderr,"cmd: %s\n",cmdstr);
|
||||
@@ -355,7 +365,7 @@ bits256 broadcasttx(char *refcoin,char *acname,cJSON *hexjson)
|
||||
{
|
||||
if ( (retjson= get_cli(refcoin,&retstr,acname,"sendrawtransaction",hexstr,"","","")) != 0 )
|
||||
{
|
||||
if (strcmp("error",jstr(retjson,"result"))==0) printf("%s\n",jstr(retjson,"error"));
|
||||
if (strcmp("error",jstr(retjson,"result"))==0) myprintf("%s\n",jstr(retjson,"error"));
|
||||
free_json(retjson);
|
||||
}
|
||||
else if ( retstr != 0 )
|
||||
@@ -457,7 +467,7 @@ cJSON *get_gatewayspending(int8_t type,char *refcoin,char *acname,char *bindtxid
|
||||
else if (type==1) sprintf(function,"%s","importgatewaypendingwithdraws");
|
||||
if ( (retjson= get_cli(refcoin,&retstr,acname,function,bindtxidstr,refcoin,"","")) != 0 )
|
||||
{
|
||||
//printf("pending.(%s)\n",jprint(retjson,0));
|
||||
//myprintf("pending.(%s)\n",jprint(retjson,0));
|
||||
return(retjson);
|
||||
}
|
||||
else if ( retstr != 0 )
|
||||
@@ -476,7 +486,7 @@ cJSON *get_gatewaysprocessed(int8_t type,char *refcoin,char *acname,char *bindtx
|
||||
else if (type==1) sprintf(function,"%s","importgatewayprocessed");
|
||||
if ( (retjson= get_cli(refcoin,&retstr,acname,function,bindtxidstr,refcoin,"","")) != 0 )
|
||||
{
|
||||
//printf("pending.(%s)\n",jprint(retjson,0));
|
||||
//myprintf("pending.(%s)\n",jprint(retjson,0));
|
||||
return(retjson);
|
||||
}
|
||||
else if ( retstr != 0 )
|
||||
@@ -492,7 +502,7 @@ cJSON *get_rawmempool(char *refcoin,char *acname)
|
||||
cJSON *retjson; char *retstr;
|
||||
if ( (retjson= get_cli(refcoin,&retstr,acname,"getrawmempool","","","","")) != 0 )
|
||||
{
|
||||
//printf("mempool.(%s)\n",jprint(retjson,0));
|
||||
//myprintf("mempool.(%s)\n",jprint(retjson,0));
|
||||
return(retjson);
|
||||
}
|
||||
else if ( retstr != 0 )
|
||||
@@ -507,11 +517,11 @@ cJSON *get_addressutxos(char *refcoin,char *acname,char *coinaddr)
|
||||
{
|
||||
cJSON *retjson; char *retstr,jsonbuf[256];
|
||||
if ( refcoin[0] != 0 && strcmp(refcoin,"KMD") != 0 )
|
||||
printf("warning: assumes %s has addressindex enabled\n",refcoin);
|
||||
myprintf("warning: assumes %s has addressindex enabled\n",refcoin);
|
||||
sprintf(jsonbuf,"{\\\"addresses\\\":[\\\"%s\\\"]}",coinaddr);
|
||||
if ( (retjson= get_cli(refcoin,&retstr,acname,"getaddressutxos",jsonbuf,"","","")) != 0 )
|
||||
{
|
||||
//printf("addressutxos.(%s)\n",jprint(retjson,0));
|
||||
//myprintf("addressutxos.(%s)\n",jprint(retjson,0));
|
||||
return(retjson);
|
||||
}
|
||||
else if ( retstr != 0 )
|
||||
@@ -561,7 +571,7 @@ void importaddress(char *refcoin,char *acname,char *depositaddr, char *label,int
|
||||
else strcpy(rescanstr,"false");
|
||||
if ( (retjson= get_cli(refcoin,&retstr,acname,"importaddress",depositaddr,label,rescanstr,"")) != 0 )
|
||||
{
|
||||
printf("importaddress.(%s)\n",jprint(retjson,0));
|
||||
myprintf("importaddress.(%s)\n",jprint(retjson,0));
|
||||
free_json(retjson);
|
||||
}
|
||||
else if ( retstr != 0 )
|
||||
@@ -585,7 +595,7 @@ void addmultisigaddress(char *refcoin,char *acname,int32_t M, char *pubkeys)
|
||||
{
|
||||
sprintf(addr,"\"%s\"",retstr);
|
||||
get_cli(refcoin,&retstr,acname,"importaddress",addr,"\"\"","false","");
|
||||
printf("addmultisigaddress.(%s)\n",retstr);
|
||||
myprintf("addmultisigaddress.(%s)\n",retstr);
|
||||
free_json(retjson);
|
||||
}
|
||||
}
|
||||
@@ -628,7 +638,7 @@ char *createrawtx(char *refcoin,char *acname,char *depositaddr,char *withdrawadd
|
||||
else txfee = 10000;
|
||||
if ( satoshis < txfee )
|
||||
{
|
||||
printf("createrawtx: satoshis %.8f < txfee %.8f\n",(double)satoshis/SATOSHIDEN,(double)txfee/SATOSHIDEN);
|
||||
myprintf("createrawtx: satoshis %.8f < txfee %.8f\n",(double)satoshis/SATOSHIDEN,(double)txfee/SATOSHIDEN);
|
||||
return(0);
|
||||
}
|
||||
sprintf(array,"\'[\"%s\"]\'",depositaddr);
|
||||
@@ -655,26 +665,26 @@ char *createrawtx(char *refcoin,char *acname,char *depositaddr,char *withdrawadd
|
||||
sprintf(argB,"\'%s\'",tmpB);
|
||||
if ( (retjson2= get_cli(refcoin,&txstr,acname,"createrawtransaction",argA,argB,"","")) != 0 )
|
||||
{
|
||||
printf("createrawtx: unexpected JSON2.(%s)\n",jprint(retjson2,0));
|
||||
myprintf("createrawtx: unexpected JSON2.(%s)\n",jprint(retjson2,0));
|
||||
free_json(retjson2);
|
||||
}
|
||||
else if ( txstr == 0 )
|
||||
printf("createrawtx: null txstr and JSON2\n");
|
||||
myprintf("createrawtx: null txstr and JSON2\n");
|
||||
free(tmpA);
|
||||
free(tmpB);
|
||||
free(argA);
|
||||
free(argB);
|
||||
}
|
||||
else printf("not enough funds to create withdraw tx\n");
|
||||
else myprintf("not enough funds to create withdraw tx\n");
|
||||
}
|
||||
free_json(retjson);
|
||||
}
|
||||
else if ( retstr != 0 )
|
||||
{
|
||||
printf("createrawtx: unexpected null JSON, retstr.(%s)\n",retstr);
|
||||
myprintf("createrawtx: unexpected null JSON, retstr.(%s)\n",retstr);
|
||||
free(retstr);
|
||||
}
|
||||
else printf("createrawtx: null retstr and JSON\n");
|
||||
else myprintf("createrawtx: null retstr and JSON\n");
|
||||
return(txstr);
|
||||
}
|
||||
|
||||
@@ -694,7 +704,7 @@ cJSON *addsignature(char *refcoin,char *acname,char *rawtx, int M)
|
||||
}
|
||||
else if ( retstr != 0 )
|
||||
{
|
||||
printf("error parsing signrawtransaction.(%s)\n",retstr);
|
||||
myprintf("error parsing signrawtransaction.(%s)\n",retstr);
|
||||
free(retstr);
|
||||
}
|
||||
return(0);
|
||||
@@ -708,13 +718,13 @@ bits256 gatewayspartialsign(int8_t type,char *refcoin,char *acname,bits256 txid,
|
||||
if ( (retjson= get_cli(refcoin,&retstr,acname,function,bits256_str(str,txid),refcoin,hex,"")) != 0 )
|
||||
{
|
||||
if (strcmp("error",jstr(retjson,"result"))!=0) txid=broadcasttx(refcoin,acname,retjson);
|
||||
else printf("%s\n",jstr(retjson,"error"));
|
||||
else myprintf("%s\n",jstr(retjson,"error"));
|
||||
free(retjson);
|
||||
return (txid);
|
||||
}
|
||||
else if ( retstr != 0 )
|
||||
{
|
||||
printf("error parsing gatewayspartialsing.(%s)\n",retstr);
|
||||
myprintf("error parsing gatewayspartialsing.(%s)\n",retstr);
|
||||
free(retstr);
|
||||
}
|
||||
return (zeroid);
|
||||
@@ -729,13 +739,13 @@ bits256 gatewayscompletesigning(int8_t type,char *refcoin,char *acname,bits256 w
|
||||
if ( (retjson= get_cli(refcoin,&retstr,acname,function,bits256_str(str,withtxid),refcoin,hex,"")) != 0 )
|
||||
{
|
||||
if (strcmp("error",jstr(retjson,"result"))!=0) txid=broadcasttx(refcoin,acname,retjson);
|
||||
else printf("%s\n",jstr(retjson,"error"));
|
||||
else myprintf("%s\n",jstr(retjson,"error"));
|
||||
free(retjson);
|
||||
return (txid);
|
||||
}
|
||||
else if ( retstr != 0 )
|
||||
{
|
||||
printf("error parsing gatewayscompletesigning.(%s)\n",retstr);
|
||||
myprintf("error parsing gatewayscompletesigning.(%s)\n",retstr);
|
||||
free(retstr);
|
||||
}
|
||||
return (zeroid);
|
||||
@@ -750,13 +760,13 @@ bits256 gatewaysmarkdone(int8_t type,char *refcoin,char *acname,bits256 withtxid
|
||||
if ( (retjson= get_cli(refcoin,&retstr,acname,function,bits256_str(str,withtxid),refcoin,"","")) != 0 )
|
||||
{
|
||||
if (strcmp("error",jstr(retjson,"result"))!=0) txid=broadcasttx(refcoin,acname,retjson);
|
||||
else printf("%s\n",jstr(retjson,"error"));
|
||||
else myprintf("%s\n",jstr(retjson,"error"));
|
||||
free(retjson);
|
||||
return (txid);
|
||||
}
|
||||
else if ( retstr != 0 )
|
||||
{
|
||||
printf("error parsing gatewaysmarkdone.(%s)\n",retstr);
|
||||
myprintf("error parsing gatewaysmarkdone.(%s)\n",retstr);
|
||||
free(retstr);
|
||||
}
|
||||
return (zeroid);
|
||||
@@ -778,7 +788,7 @@ int32_t get_gatewaysinfo(int8_t type,char *refcoin,char *acname,char *depositadd
|
||||
*Mp = jint(retjson,"M");
|
||||
*Np = jint(retjson,"N");
|
||||
}
|
||||
else printf("coin.%s vs %s\n",jstr(retjson,"coin"),coin);
|
||||
else myprintf("coin.%s vs %s\n",jstr(retjson,"coin"),coin);
|
||||
if ((pubarray=jarray(&n,retjson,"pubkeys"))!=0)
|
||||
{
|
||||
*pubkeys=malloc((sizeof(char)*70*n)+64);
|
||||
@@ -797,7 +807,7 @@ int32_t get_gatewaysinfo(int8_t type,char *refcoin,char *acname,char *depositadd
|
||||
}
|
||||
else if ( retstr != 0 )
|
||||
{
|
||||
printf("error parsing get_gatewaysinfo.(%s)\n",retstr);
|
||||
myprintf("error parsing get_gatewaysinfo.(%s)\n",retstr);
|
||||
free(retstr);
|
||||
}
|
||||
if ( *Mp <= 0 || *Np <= 0 )
|
||||
@@ -1049,10 +1059,10 @@ int32_t main(int32_t argc,char **argv)
|
||||
cJSON *clijson,*clijson2,*regjson,*item; int32_t type,i,retval,M,N,n,height,prevheight = 0; char *pubkeys,*format,*acname,*oraclestr,*bindtxidstr,*pkstr,*pubstr,*retstr,*retstr2,depositaddr[64],hexstr[4096],refcoin[64]; uint64_t price; bits256 txid;
|
||||
if ( argc < 6 )
|
||||
{
|
||||
printf("usage: oraclefeed $ACNAME $ORACLETXID $MYPUBKEY $FORMAT $BINDTXID [refcoin_cli]\n");
|
||||
myprintf("usage: oraclefeed $ACNAME $ORACLETXID $MYPUBKEY $FORMAT $BINDTXID [refcoin_cli]\n");
|
||||
return(-1);
|
||||
}
|
||||
printf("Powered by CoinDesk (%s) %.8f\n","https://www.coindesk.com/price/",dstr(get_btcusd()));
|
||||
myprintf("Powered by CoinDesk (%s) %.8f\n","https://www.coindesk.com/price/",dstr(get_btcusd()));
|
||||
acname = argv[1];
|
||||
oraclestr = argv[2];
|
||||
pkstr = argv[3];
|
||||
@@ -1063,7 +1073,7 @@ int32_t main(int32_t argc,char **argv)
|
||||
else REFCOIN_CLI = "./komodo-cli";
|
||||
if ( strncmp(format,"Ihh",3) != 0 && format[0] != 'L' )
|
||||
{
|
||||
printf("only formats of L and Ihh are supported now\n");
|
||||
myprintf("only formats of L and Ihh are supported now\n");
|
||||
return(-1);
|
||||
}
|
||||
M = N = 0;
|
||||
@@ -1078,7 +1088,7 @@ int32_t main(int32_t argc,char **argv)
|
||||
strcpy(refcoin,jstr(clijson,"name"));
|
||||
if ( strcmp("KMD",refcoin) != 0 && argc != 7 )
|
||||
{
|
||||
printf("need to specify path to refcoin's cli as last argv\n");
|
||||
myprintf("need to specify path to refcoin's cli as last argv\n");
|
||||
exit(0);
|
||||
}
|
||||
pubkeys=0;
|
||||
@@ -1086,7 +1096,7 @@ int32_t main(int32_t argc,char **argv)
|
||||
else if ( get_gatewaysinfo(1,refcoin,acname,depositaddr,&M,&N,bindtxidstr,refcoin,oraclestr,&pubkeys) == 0 ) type=1;
|
||||
else
|
||||
{
|
||||
printf("cant find bindtxid.(%s)\n",bindtxidstr);
|
||||
myprintf("cant find bindtxid.(%s)\n",bindtxidstr);
|
||||
exit(0);
|
||||
}
|
||||
if (validateaddress(refcoin,"",depositaddr,"iswatchonly")==0 && validateaddress(refcoin,"",depositaddr,"ismine")==0)
|
||||
@@ -1095,7 +1105,7 @@ int32_t main(int32_t argc,char **argv)
|
||||
else addmultisigaddress(refcoin,"",M,pubkeys);
|
||||
}
|
||||
if (pubkeys!=0) free(pubkeys);
|
||||
printf("set refcoin %s <- %s [%s] M.%d of N.%d\n",depositaddr,refcoin,REFCOIN_CLI,M,N);
|
||||
myprintf("set refcoin %s <- %s [%s] M.%d of N.%d\n",depositaddr,refcoin,REFCOIN_CLI,M,N);
|
||||
}
|
||||
if ( (regjson= jarray(&n,clijson,"registered")) != 0 )
|
||||
{
|
||||
@@ -1112,14 +1122,14 @@ int32_t main(int32_t argc,char **argv)
|
||||
if ( bits256_nonz(txid) != 0 )
|
||||
{
|
||||
prevheight = height;
|
||||
printf("%s ht.%d <- %s\n",refcoin,height,hexstr);
|
||||
myprintf("%s ht.%d <- %s\n",refcoin,height,hexstr);
|
||||
update_gatewayspending(type,refcoin,acname,bindtxidstr,M,N);
|
||||
}
|
||||
free_json(clijson2);
|
||||
}
|
||||
else if ( retstr2 != 0 )
|
||||
{
|
||||
printf("error parsing oraclesdata.(%s)\n",retstr2);
|
||||
myprintf("error parsing oraclesdata.(%s)\n",retstr2);
|
||||
free(retstr2);
|
||||
}
|
||||
}
|
||||
@@ -1131,7 +1141,7 @@ int32_t main(int32_t argc,char **argv)
|
||||
}
|
||||
if ( retstr != 0 )
|
||||
{
|
||||
printf("got json parse error.(%s)\n",retstr);
|
||||
myprintf("got json parse error.(%s)\n",retstr);
|
||||
free(retstr);
|
||||
}
|
||||
sleep(10);
|
||||
|
||||
@@ -172,20 +172,20 @@ int64_t AddFaucetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPub
|
||||
if ( (total > 0 && totalinputs >= total) || (maxinputs > 0 && n >= maxinputs) )
|
||||
break;
|
||||
} else fprintf(stderr,"vout.%d nValue %.8f too small or already spent in mempool\n",vout,(double)nValue/COIN);
|
||||
} else fprintf(stderr,"couldnt get tx\n");
|
||||
} else fprintf(stderr,"couldn't get tx\n");
|
||||
}
|
||||
return(totalinputs);
|
||||
}
|
||||
|
||||
std::string FaucetGet(uint64_t txfee)
|
||||
UniValue FaucetGet(const CPubKey& pk, uint64_t txfee)
|
||||
{
|
||||
CMutableTransaction tmpmtx,mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||
CPubKey mypk,faucetpk; int64_t inputs,CCchange=0,nValue=FAUCETSIZE; struct CCcontract_info *cp,C; std::string rawhex; uint32_t j; int32_t i,len; uint8_t buf[32768]; bits256 hash;
|
||||
CPubKey faucetpk; int64_t inputs,CCchange=0,nValue=FAUCETSIZE; struct CCcontract_info *cp,C; std::string rawhex; uint32_t j; int32_t i,len; uint8_t buf[32768]; bits256 hash;
|
||||
cp = CCinit(&C,EVAL_FAUCET);
|
||||
if ( txfee == 0 )
|
||||
txfee = 10000;
|
||||
faucetpk = GetUnspendable(cp,0);
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
CPubKey mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
if ( (inputs= AddFaucetInputs(cp,mtx,faucetpk,nValue+txfee,60)) > 0 )
|
||||
{
|
||||
if ( inputs > nValue )
|
||||
@@ -198,42 +198,40 @@ std::string FaucetGet(uint64_t txfee)
|
||||
for (i=0; i<1000000; i++,j++)
|
||||
{
|
||||
tmpmtx = mtx;
|
||||
rawhex = FinalizeCCTx(-1LL,cp,tmpmtx,mypk,txfee,CScript() << OP_RETURN << E_MARSHAL(ss << (uint8_t)EVAL_FAUCET << (uint8_t)'G' << j));
|
||||
if ( (len= (int32_t)rawhex.size()) > 0 && len < 65536 )
|
||||
UniValue result = FinalizeCCTxExt(pk.IsValid (),-1LL,cp,tmpmtx,mypk,txfee,CScript() << OP_RETURN << E_MARSHAL(ss << (uint8_t)EVAL_FAUCET << (uint8_t)'G' << j));
|
||||
if ( (len= (int32_t)result[JSON_HEXTX].getValStr().size()) > 0 && len < 65536 )
|
||||
{
|
||||
len >>= 1;
|
||||
decode_hex(buf,len,(char *)rawhex.c_str());
|
||||
decode_hex(buf,len,(char *)result[JSON_HEXTX].getValStr().c_str());
|
||||
hash = bits256_doublesha256(0,buf,len);
|
||||
if ( (hash.bytes[0] & 0xff) == 0 && (hash.bytes[31] & 0xff) == 0 )
|
||||
{
|
||||
fprintf(stderr,"found valid txid after %d iterations %u\n",i,(uint32_t)time(NULL));
|
||||
return(rawhex);
|
||||
return result;
|
||||
}
|
||||
//fprintf(stderr,"%02x%02x ",hash.bytes[0],hash.bytes[31]);
|
||||
}
|
||||
}
|
||||
fprintf(stderr,"couldnt generate valid txid %u\n",(uint32_t)time(NULL));
|
||||
return("");
|
||||
} else fprintf(stderr,"cant find faucet inputs\n");
|
||||
return("");
|
||||
CCERR_RESULT("faucet",CCLOG_ERROR, stream << "couldn't generate valid txid " << (uint32_t)time(NULL));
|
||||
} else CCERR_RESULT("faucet",CCLOG_ERROR, stream << "can't find faucet inputs");
|
||||
}
|
||||
|
||||
std::string FaucetFund(uint64_t txfee,int64_t funds)
|
||||
UniValue FaucetFund(const CPubKey& pk, uint64_t txfee,int64_t funds)
|
||||
{
|
||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||
CPubKey mypk,faucetpk; CScript opret; struct CCcontract_info *cp,C;
|
||||
CPubKey faucetpk; CScript opret; struct CCcontract_info *cp,C;
|
||||
|
||||
cp = CCinit(&C,EVAL_FAUCET);
|
||||
if ( txfee == 0 )
|
||||
txfee = 10000;
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
CPubKey mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
faucetpk = GetUnspendable(cp,0);
|
||||
if ( AddNormalinputs(mtx,mypk,funds+txfee,64) > 0 )
|
||||
if ( AddNormalinputs(mtx,mypk,funds+txfee,64,pk.IsValid()) > 0 )
|
||||
{
|
||||
mtx.vout.push_back(MakeCC1vout(EVAL_FAUCET,funds,faucetpk));
|
||||
return(FinalizeCCTx(0,cp,mtx,mypk,txfee,opret));
|
||||
return(FinalizeCCTxExt(pk.IsValid(),0,cp,mtx,mypk,txfee,opret));
|
||||
}
|
||||
return("");
|
||||
CCERR_RESULT("faucet",CCLOG_ERROR, stream << "can't find normal inputs");
|
||||
}
|
||||
|
||||
UniValue FaucetInfo()
|
||||
|
||||
@@ -862,12 +862,12 @@ int64_t AddGatewaysInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CP
|
||||
return(0);
|
||||
}
|
||||
|
||||
std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t totalsupply,uint256 oracletxid,uint8_t M,uint8_t N,std::vector<CPubKey> pubkeys,uint8_t p1,uint8_t p2,uint8_t p3,uint8_t p4)
|
||||
UniValue GatewaysBind(const CPubKey& pk, uint64_t txfee,std::string coin,uint256 tokenid,int64_t totalsupply,uint256 oracletxid,uint8_t M,uint8_t N,std::vector<CPubKey> pubkeys,uint8_t p1,uint8_t p2,uint8_t p3,uint8_t p4)
|
||||
{
|
||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||
CTransaction oracletx; uint8_t taddr,prefix,prefix2,wiftype; CPubKey mypk,gatewayspk; CScript opret; uint256 hashBlock;
|
||||
struct CCcontract_info *cp,*cpTokens,C,CTokens; std::string name,description,format; int32_t i,numvouts; int64_t fullsupply;
|
||||
char destaddr[64],coinaddr[64],myTokenCCaddr[64],str[65],*fstr;
|
||||
char destaddr[64],coinaddr[64],myTokenCCaddr[64],*fstr;
|
||||
|
||||
cp = CCinit(&C,EVAL_GATEWAYS);
|
||||
cpTokens = CCinit(&CTokens,EVAL_TOKENS);
|
||||
@@ -887,118 +887,64 @@ std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t
|
||||
LOGSTREAM("gatewayscc",CCLOG_DEBUG1, stream << "set prefix " << prefix << ", prefix2 " << prefix2 << ", wiftype " << wiftype << ", taddr " << taddr << " for " << coin << std::endl);
|
||||
}
|
||||
if ( N == 0 || N > 15 || M > N )
|
||||
{
|
||||
CCerror = strprintf("illegal M.%d or N.%d",M,N);
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "illegal M." << M << " or N." << N);
|
||||
if ( pubkeys.size() != N )
|
||||
{
|
||||
CCerror = strprintf("M.%d N.%d but pubkeys[%d]",M,N,(int32_t)pubkeys.size());
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "M."<< M << " N." << N << " but pubkeys[" <<( int32_t)pubkeys.size() << "]");
|
||||
for (i=0; i<N; i++)
|
||||
{
|
||||
Getscriptaddress(coinaddr,CScript() << ParseHex(HexStr(pubkeys[i])) << OP_CHECKSIG);
|
||||
if ( CCaddress_balance(coinaddr,0) == 0 )
|
||||
{
|
||||
CCerror = strprintf("M.%d N.%d but pubkeys[%d] has no balance",M,N,i);
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "M." << M << " N." << N << " but pubkeys[" << i << "] has no balance");
|
||||
}
|
||||
if ( txfee == 0 )
|
||||
txfee = 10000;
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
_GetCCaddress(myTokenCCaddr,EVAL_TOKENS,mypk);
|
||||
gatewayspk = GetUnspendable(cp,0);
|
||||
if ( _GetCCaddress(destaddr,EVAL_GATEWAYS,gatewayspk) == 0 )
|
||||
{
|
||||
CCerror = strprintf("Gateway bind.%s (%s) cant create globaladdr",coin.c_str(),uint256_str(str,tokenid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "Gateway bind." << coin << " (" << tokenid.GetHex() << ") cant create globaladdr");
|
||||
if ( (fullsupply=CCfullsupply(tokenid)) != totalsupply )
|
||||
{
|
||||
CCerror = strprintf("Gateway bind.%s (%s) globaladdr.%s totalsupply %.8f != fullsupply %.8f",coin.c_str(),uint256_str(str,tokenid),cp->unspendableCCaddr,(double)totalsupply/COIN,(double)fullsupply/COIN);
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "Gateway bind." << coin << " ("<< tokenid.GetHex() << ") globaladdr." <<cp->unspendableCCaddr << " totalsupply " << (double)totalsupply/COIN << " != fullsupply " << (double)fullsupply/COIN);
|
||||
if ( CCtoken_balance(myTokenCCaddr,tokenid) != totalsupply )
|
||||
{
|
||||
CCerror = strprintf("token balance on %s %.8f != %.8f",myTokenCCaddr,(double)CCtoken_balance(myTokenCCaddr,tokenid)/COIN,(double)totalsupply/COIN);
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "token balance on " << myTokenCCaddr << " " << (double)CCtoken_balance((char *)myTokenCCaddr,tokenid)/COIN << "!=" << (double)totalsupply/COIN);
|
||||
if ( myGetTransaction(oracletxid,oracletx,hashBlock) == 0 || (numvouts= oracletx.vout.size()) <= 0 )
|
||||
{
|
||||
CCerror = strprintf("cant find oracletxid %s",uint256_str(str,oracletxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "cant find oracletxid " << oracletxid.GetHex());
|
||||
if ( DecodeOraclesCreateOpRet(oracletx.vout[numvouts-1].scriptPubKey,name,description,format) != 'C' )
|
||||
{
|
||||
CCerror = strprintf("mismatched oracle name %s != %s",name.c_str(),coin.c_str());
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "mismatched oracle name " << name << " != " << coin);
|
||||
if ( (fstr=(char *)format.c_str()) == 0 || strncmp(fstr,"Ihh",3) != 0 )
|
||||
{
|
||||
CCerror = strprintf("illegal format (%s) != (%s)",fstr,(char *)"Ihh");
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "illegal format (" << fstr << ") != (Ihh)");
|
||||
if ( GatewaysBindExists(cp,gatewayspk,tokenid) != 0 )
|
||||
{
|
||||
CCerror = strprintf("Gateway bind.%s (%s) already exists",coin.c_str(),uint256_str(str,tokenid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
if ( AddNormalinputs(mtx,mypk,txfee+CC_MARKER_VALUE,2) > 0 )
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "Gateway bind." << coin << " (" << tokenid.GetHex() << ") already exists");
|
||||
if ( AddNormalinputs(mtx,mypk,txfee+CC_MARKER_VALUE,2,pk.IsValid()) > 0 )
|
||||
{
|
||||
if (AddTokenCCInputs(cpTokens, mtx, mypk, tokenid, totalsupply, 64)>0)
|
||||
{
|
||||
mtx.vout.push_back(MakeTokensCC1vout(cp->evalcode,totalsupply,gatewayspk));
|
||||
mtx.vout.push_back(MakeCC1vout(cp->evalcode,CC_MARKER_VALUE,gatewayspk));
|
||||
return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeGatewaysBindOpRet('B',tokenid,coin,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2,wiftype)));
|
||||
return(FinalizeCCTxExt(pk.IsValid(),0,cp,mtx,mypk,txfee,EncodeGatewaysBindOpRet('B',tokenid,coin,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2,wiftype)));
|
||||
}
|
||||
}
|
||||
CCerror = strprintf("cant find enough inputs");
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "cant find enough inputs");
|
||||
}
|
||||
|
||||
std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std::string refcoin,uint256 cointxid,int32_t claimvout,std::string deposithex,std::vector<uint8_t>proof,CPubKey destpub,int64_t amount)
|
||||
UniValue GatewaysDeposit(const CPubKey& pk, uint64_t txfee,uint256 bindtxid,int32_t height,std::string refcoin,uint256 cointxid,int32_t claimvout,std::string deposithex,std::vector<uint8_t>proof,CPubKey destpub,int64_t amount)
|
||||
{
|
||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||
CTransaction bindtx; CPubKey mypk; uint256 oracletxid,merkleroot,mhash,hashBlock,tokenid,txid;
|
||||
CTransaction tx; CPubKey mypk; uint256 oracletxid,merkleroot,mhash,hashBlock,tokenid,txid;
|
||||
int64_t totalsupply; int32_t i,m,n,numvouts; uint8_t M,N,taddr,prefix,prefix2,wiftype; std::string coin; struct CCcontract_info *cp,C;
|
||||
std::vector<CPubKey> pubkeys,publishers; std::vector<uint256>txids; char str[67],depositaddr[64],txidaddr[64];
|
||||
std::vector<CPubKey> pubkeys,publishers; std::vector<uint256>txids; char str[65],depositaddr[64],txidaddr[64];
|
||||
|
||||
cp = CCinit(&C,EVAL_GATEWAYS);
|
||||
if ( txfee == 0 )
|
||||
txfee = 10000;
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
LOGSTREAM("gatewayscc",CCLOG_DEBUG1, stream << "GatewaysDeposit ht." << height << " " << refcoin << " " << (double)amount/COIN << " numpks." << (int32_t)pubkeys.size() << std::endl);
|
||||
if ( myGetTransaction(bindtxid,bindtx,hashBlock) == 0 || (numvouts= bindtx.vout.size()) <= 0 )
|
||||
{
|
||||
CCerror = strprintf("cant find bindtxid %s",uint256_str(str,bindtxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
if ( DecodeGatewaysBindOpRet(depositaddr,bindtx.vout[numvouts-1].scriptPubKey,tokenid,coin,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2,wiftype) != 'B' || refcoin != coin )
|
||||
{
|
||||
CCerror = strprintf("invalid coin - bindtxid %s coin.%s",uint256_str(str,bindtxid),coin.c_str());
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
if ( myGetTransaction(bindtxid,tx,hashBlock) == 0 || (numvouts= tx.vout.size()) <= 0 )
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "cant find bindtxid " << bindtxid.GetHex());
|
||||
if ( DecodeGatewaysBindOpRet(depositaddr,tx.vout[numvouts-1].scriptPubKey,tokenid,coin,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2,wiftype) != 'B' || refcoin != coin )
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "invalid coin - bindtxid " << bindtxid.GetHex() << " coin." << coin);
|
||||
if (komodo_txnotarizedconfirmed(bindtxid)==false)
|
||||
{
|
||||
CCerror = strprintf("gatewaysbind tx not yet confirmed/notarized");
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "gatewaysbind tx not yet confirmed/notarized");
|
||||
n = (int32_t)pubkeys.size();
|
||||
merkleroot = zeroid;
|
||||
for (i=m=0; i<n; i++)
|
||||
@@ -1017,141 +963,80 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std::
|
||||
}
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << "cointxid." << cointxid.GetHex() << " m." << m << " of n." << n << std::endl);
|
||||
if ( merkleroot == zeroid || m < n/2 )
|
||||
{
|
||||
CCerror = strprintf("couldnt find merkleroot for ht.%d %s oracle.%s m.%d vs n.%d",height,coin.c_str(),uint256_str(str,oracletxid),m,n);
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "couldnt find merkleroot for ht." << height << " " << coin << " oracle." << oracletxid.GetHex() << " m." << m << " vs n." << n);
|
||||
if ( CCCointxidExists("gatewayscc-1",cointxid) != 0 )
|
||||
{
|
||||
CCerror = strprintf("cointxid.%s already exists",uint256_str(str,cointxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "cointxid." << cointxid.GetHex() << " already exists");
|
||||
if ( GatewaysVerify(depositaddr,oracletxid,claimvout,coin,cointxid,deposithex,proof,merkleroot,destpub,taddr,prefix,prefix2) != amount )
|
||||
{
|
||||
CCerror = strprintf("deposittxid didnt validate");
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
if ( AddNormalinputs(mtx,mypk,txfee+2*CC_MARKER_VALUE,3) > 0 )
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "deposittxid didnt validate");
|
||||
if ( AddNormalinputs(mtx,mypk,txfee+2*CC_MARKER_VALUE,3,pk.IsValid()) > 0 )
|
||||
{
|
||||
mtx.vout.push_back(MakeCC1vout(cp->evalcode,CC_MARKER_VALUE,destpub));
|
||||
mtx.vout.push_back(CTxOut(CC_MARKER_VALUE,CScript() << ParseHex(HexStr(CCtxidaddr(txidaddr,cointxid))) << OP_CHECKSIG));
|
||||
return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeGatewaysDepositOpRet('D',bindtxid,coin,publishers,txids,height,cointxid,claimvout,deposithex,proof,destpub,amount)));
|
||||
return(FinalizeCCTxExt(pk.IsValid(),0,cp,mtx,mypk,txfee,EncodeGatewaysDepositOpRet('D',bindtxid,coin,publishers,txids,height,cointxid,claimvout,deposithex,proof,destpub,amount)));
|
||||
}
|
||||
CCerror = strprintf("cant find enough inputs");
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "cant find enough inputs");
|
||||
}
|
||||
|
||||
std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,uint256 deposittxid,CPubKey destpub,int64_t amount)
|
||||
UniValue GatewaysClaim(const CPubKey& pk, uint64_t txfee,uint256 bindtxid,std::string refcoin,uint256 deposittxid,CPubKey destpub,int64_t amount)
|
||||
{
|
||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||
CTransaction tx; CPubKey mypk,gatewayspk,tmpdestpub; struct CCcontract_info *cp,C; uint8_t M,N,taddr,prefix,prefix2,wiftype;
|
||||
std::string coin, deposithex; std::vector<CPubKey> msigpubkeys,publishers; int64_t totalsupply,depositamount,tmpamount,inputs,CCchange=0;
|
||||
std::string coin, deposithex; std::vector<CPubKey> pubkeys,publishers; int64_t totalsupply,depositamount,tmpamount,inputs,CCchange=0;
|
||||
int32_t numvouts,claimvout,height; std::vector<uint8_t> proof;
|
||||
uint256 hashBlock,tokenid,oracletxid,tmptxid,cointxid; char str[65],depositaddr[64],coinaddr[64],destaddr[64]; std::vector<uint256> txids;
|
||||
uint256 hashBlock,tokenid,oracletxid,tmptxid,cointxid; char depositaddr[64],coinaddr[64],destaddr[64]; std::vector<uint256> txids;
|
||||
|
||||
cp = CCinit(&C,EVAL_GATEWAYS);
|
||||
if ( txfee == 0 )
|
||||
txfee = 10000;
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
gatewayspk = GetUnspendable(cp,0);
|
||||
if ( myGetTransaction(bindtxid,tx,hashBlock) == 0 || (numvouts= tx.vout.size()) <= 0 )
|
||||
{
|
||||
CCerror = strprintf("cant find bindtxid %s",uint256_str(str,bindtxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
if ( DecodeGatewaysBindOpRet(depositaddr,tx.vout[numvouts-1].scriptPubKey,tokenid,coin,totalsupply,oracletxid,M,N,msigpubkeys,taddr,prefix,prefix2,wiftype) != 'B' || coin != refcoin )
|
||||
{
|
||||
CCerror = strprintf("invalid coin - bindtxid %s coin.%s",uint256_str(str,bindtxid),coin.c_str());
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "cant find bindtxid " << bindtxid.GetHex());
|
||||
if ( DecodeGatewaysBindOpRet(depositaddr,tx.vout[numvouts-1].scriptPubKey,tokenid,coin,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2,wiftype) != 'B' || refcoin != coin )
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "invalid coin - bindtxid " << bindtxid.GetHex() << " coin." << coin);
|
||||
if (komodo_txnotarizedconfirmed(bindtxid)==false)
|
||||
{
|
||||
CCerror = strprintf("gatewaysbind tx not yet confirmed/notarized");
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "gatewaysbind tx not yet confirmed/notarized");
|
||||
if ( myGetTransaction(deposittxid,tx,hashBlock) == 0 || (numvouts= tx.vout.size()) <= 0 )
|
||||
{
|
||||
CCerror = strprintf("cant find deposittxid %s",uint256_str(str,bindtxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "cant find deposittxid " << bindtxid.GetHex());
|
||||
if (DecodeGatewaysDepositOpRet(tx.vout[numvouts-1].scriptPubKey,tmptxid,coin,publishers,txids,height,cointxid,claimvout,deposithex,proof,tmpdestpub,tmpamount) != 'D' || coin != refcoin)
|
||||
{
|
||||
CCerror = strprintf("invalid coin - deposittxid %s coin.%s",uint256_str(str,bindtxid),coin.c_str());
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "invalid coin - deposittxid " << bindtxid.GetHex() << " coin." << coin);
|
||||
if (komodo_txnotarizedconfirmed(deposittxid)==false)
|
||||
{
|
||||
CCerror = strprintf("gatewaysdeposit tx not yet confirmed/notarized");
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "gatewaysdeposit tx not yet confirmed/notarized");
|
||||
if (tmpdestpub!=destpub)
|
||||
{
|
||||
CCerror = strprintf("different destination pubkey from desdeposit tx");
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "different destination pubkey from desdeposit tx");
|
||||
if ( (depositamount=GatewaysDepositval(tx,mypk)) != amount )
|
||||
{
|
||||
CCerror = strprintf("invalid Gateways deposittxid %s %.8f != %.8f",uint256_str(str,deposittxid),(double)depositamount/COIN,(double)amount/COIN);
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "invalid Gateways deposittxid " << deposittxid.GetHex() << " " << (double)depositamount/COIN << " != " << (double)amount/COIN << ", remember claim must be done from destination pubkey from deposit tx!");
|
||||
if ((inputs=AddGatewaysInputs(cp, mtx, gatewayspk, bindtxid, amount, 60)) > 0)
|
||||
{
|
||||
if ( inputs > amount ) CCchange = (inputs - amount);
|
||||
mtx.vin.push_back(CTxIn(deposittxid,0,CScript()));
|
||||
mtx.vout.push_back(MakeCC1vout(EVAL_TOKENS,amount,destpub));
|
||||
if ( CCchange != 0 ) mtx.vout.push_back(MakeTokensCC1vout(EVAL_GATEWAYS,CCchange,gatewayspk));
|
||||
return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeGatewaysClaimOpRet('C',tokenid,bindtxid,refcoin,deposittxid,destpub,amount)));
|
||||
return(FinalizeCCTxExt(pk.IsValid(),0,cp,mtx,mypk,txfee,EncodeGatewaysClaimOpRet('C',tokenid,bindtxid,refcoin,deposittxid,destpub,amount)));
|
||||
}
|
||||
CCerror = strprintf("cant find enough tokens in gateways address for given amount");
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "cant find enough tokens in gateways address for given amount");
|
||||
}
|
||||
|
||||
std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,CPubKey withdrawpub,int64_t amount)
|
||||
UniValue GatewaysWithdraw(const CPubKey& pk, uint64_t txfee,uint256 bindtxid,std::string refcoin,CPubKey withdrawpub,int64_t amount)
|
||||
{
|
||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||
CTransaction tx; CPubKey mypk,gatewayspk,signerpk; uint256 txid,tokenid,hashBlock,oracletxid,tmptokenid,tmpbindtxid,withdrawtxid; int32_t vout,numvouts;
|
||||
int64_t nValue,totalsupply,inputs,CCchange=0,tmpamount; uint8_t funcid,K,M,N,taddr,prefix,prefix2,wiftype; std::string coin,hex;
|
||||
std::vector<CPubKey> msigpubkeys; char depositaddr[64],str[65],coinaddr[64]; struct CCcontract_info *cp,C,*cpTokens,CTokens;
|
||||
std::vector<CPubKey> pubkeys; char depositaddr[64],coinaddr[64]; struct CCcontract_info *cp,C,*cpTokens,CTokens;
|
||||
std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > unspentOutputs;
|
||||
|
||||
cp = CCinit(&C,EVAL_GATEWAYS);
|
||||
cpTokens = CCinit(&CTokens,EVAL_TOKENS);
|
||||
if ( txfee == 0 )
|
||||
txfee = 10000;
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
gatewayspk = GetUnspendable(cp, 0);
|
||||
|
||||
if( myGetTransaction(bindtxid,tx,hashBlock) == 0 || (numvouts= tx.vout.size()) <= 0 )
|
||||
{
|
||||
CCerror = strprintf("cant find bindtxid %s",uint256_str(str,bindtxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
if( DecodeGatewaysBindOpRet(depositaddr,tx.vout[numvouts-1].scriptPubKey,tokenid,coin,totalsupply,oracletxid,M,N,msigpubkeys,taddr,prefix,prefix2,wiftype) != 'B' || coin != refcoin )
|
||||
{
|
||||
CCerror = strprintf("invalid bindtxid %s coin.%s",uint256_str(str,bindtxid),coin.c_str());
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
if ( myGetTransaction(bindtxid,tx,hashBlock) == 0 || (numvouts= tx.vout.size()) <= 0 )
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "cant find bindtxid " << bindtxid.GetHex());
|
||||
if ( DecodeGatewaysBindOpRet(depositaddr,tx.vout[numvouts-1].scriptPubKey,tokenid,coin,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2,wiftype) != 'B' || refcoin != coin )
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "invalid coin - bindtxid " << bindtxid.GetHex() << " coin." << coin);
|
||||
if (komodo_txnotarizedconfirmed(bindtxid)==false)
|
||||
{
|
||||
CCerror = strprintf("gatewaysbind tx not yet confirmed/notarized");
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "gatewaysbind tx not yet confirmed/notarized");
|
||||
_GetCCaddress(coinaddr,EVAL_GATEWAYS,gatewayspk);
|
||||
SetCCunspents(unspentOutputs,coinaddr,true);
|
||||
for (std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++)
|
||||
@@ -1165,23 +1050,14 @@ std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin
|
||||
{
|
||||
if (funcid=='W' && DecodeGatewaysWithdrawOpRet(tx.vout[numvouts-1].scriptPubKey,tmptokenid,tmpbindtxid,coin,withdrawpub,tmpamount)=='W'
|
||||
&& refcoin==coin && tmptokenid==tokenid && tmpbindtxid==bindtxid)
|
||||
{
|
||||
CCerror = strprintf("unable to create withdraw, another withdraw pending");
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "unable to create withdraw, another withdraw pending");
|
||||
else if (funcid=='P' && DecodeGatewaysPartialOpRet(tx.vout[numvouts-1].scriptPubKey,withdrawtxid,coin,K,signerpk,hex)=='P' &&
|
||||
myGetTransaction(withdrawtxid,tx,hashBlock)!=0 && (numvouts=tx.vout.size())>0 && DecodeGatewaysWithdrawOpRet(tx.vout[numvouts-1].scriptPubKey,tmptokenid,tmpbindtxid,coin,withdrawpub,tmpamount)=='W'
|
||||
&& refcoin==coin && tmptokenid==tokenid && tmpbindtxid==bindtxid)
|
||||
{
|
||||
CCerror = strprintf("unable to create withdraw, another withdraw pending");
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "unable to create withdraw, another withdraw pending");
|
||||
}
|
||||
}
|
||||
if( AddNormalinputs(mtx, mypk, txfee+CC_MARKER_VALUE, 2) > 0 )
|
||||
if( AddNormalinputs(mtx, mypk, txfee+CC_MARKER_VALUE, 2,pk.IsValid()) > 0 )
|
||||
{
|
||||
if ((inputs = AddTokenCCInputs(cpTokens, mtx, mypk, tokenid, amount, 60)) > 0)
|
||||
{
|
||||
@@ -1189,286 +1065,159 @@ std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin
|
||||
mtx.vout.push_back(MakeCC1vout(EVAL_GATEWAYS,CC_MARKER_VALUE,gatewayspk));
|
||||
mtx.vout.push_back(MakeTokensCC1vout(EVAL_GATEWAYS,amount,gatewayspk));
|
||||
if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_TOKENS, CCchange, mypk));
|
||||
return(FinalizeCCTx(0, cpTokens, mtx, mypk, txfee,EncodeGatewaysWithdrawOpRet('W',tokenid,bindtxid,refcoin,withdrawpub,amount)));
|
||||
return(FinalizeCCTxExt(pk.IsValid(),0, cpTokens, mtx, mypk, txfee,EncodeGatewaysWithdrawOpRet('W',tokenid,bindtxid,refcoin,withdrawpub,amount)));
|
||||
}
|
||||
else
|
||||
{
|
||||
CCerror = strprintf("not enough balance of tokens for withdraw");
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "not enough balance of tokens for withdraw");
|
||||
}
|
||||
CCerror = strprintf("cant find enough normal inputs");
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "cant find enough normal inputs");
|
||||
}
|
||||
|
||||
std::string GatewaysPartialSign(uint64_t txfee,uint256 lasttxid,std::string refcoin, std::string hex)
|
||||
UniValue GatewaysPartialSign(const CPubKey& pk, uint64_t txfee,uint256 lasttxid,std::string refcoin, std::string hex)
|
||||
{
|
||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||
CPubKey mypk,withdrawpub,signerpk,gatewayspk; struct CCcontract_info *cp,C; CTransaction tx,tmptx;
|
||||
std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > unspentOutputs; char funcid,str[65],depositaddr[64];
|
||||
std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > unspentOutputs; char funcid,depositaddr[64];
|
||||
int32_t numvouts; uint256 withdrawtxid,hashBlock,bindtxid,tokenid,oracletxid,tmptokenid; std::string coin,tmphex; int64_t amount,totalsupply;
|
||||
uint8_t K=0,M,N,taddr,prefix,prefix2,wiftype; std::vector<CPubKey> pubkeys;
|
||||
|
||||
cp = CCinit(&C,EVAL_GATEWAYS);
|
||||
if ( txfee == 0 )
|
||||
txfee = 10000;
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
gatewayspk = GetUnspendable(cp,0);
|
||||
if (myGetTransaction(lasttxid,tx,hashBlock)==0 || (numvouts= tx.vout.size())<=0
|
||||
|| (funcid=DecodeGatewaysOpRet(tx.vout[numvouts-1].scriptPubKey))==0 || (funcid!='W' && funcid!='P'))
|
||||
{
|
||||
CCerror = strprintf("can't find last tx %s",uint256_str(str,lasttxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "can't find last tx " << lasttxid.GetHex());
|
||||
if (funcid=='W')
|
||||
{
|
||||
withdrawtxid=lasttxid;
|
||||
if (DecodeGatewaysWithdrawOpRet(tx.vout[numvouts-1].scriptPubKey,tmptokenid,bindtxid,coin,withdrawpub,amount)!='W' || refcoin!=coin)
|
||||
{
|
||||
CCerror = strprintf("invalid withdraw tx %s",uint256_str(str,lasttxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "invalid withdraw tx " << lasttxid.GetHex());
|
||||
else if (komodo_txnotarizedconfirmed(withdrawtxid)==false)
|
||||
{
|
||||
CCerror = strprintf("gatewayswithdraw tx not yet confirmed/notarized");
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "gatewayswithdraw tx not yet confirmed/notarized");
|
||||
else if (myGetTransaction(bindtxid,tmptx,hashBlock)==0 || (numvouts=tmptx.vout.size())<=0)
|
||||
{
|
||||
CCerror = strprintf("can't find bind tx %s",uint256_str(str,bindtxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "can't find bind tx " << bindtxid.GetHex());
|
||||
else if (DecodeGatewaysBindOpRet(depositaddr,tmptx.vout[numvouts-1].scriptPubKey,tokenid,coin,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2,wiftype) != 'B'
|
||||
|| refcoin!=coin || tokenid!=tmptokenid)
|
||||
{
|
||||
CCerror = strprintf("invalid bind tx %s",uint256_str(str,bindtxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "invalid bind tx " << bindtxid.GetHex());
|
||||
}
|
||||
else if (funcid=='P')
|
||||
{
|
||||
if (DecodeGatewaysPartialOpRet(tx.vout[numvouts-1].scriptPubKey,withdrawtxid,coin,K,signerpk,tmphex)!='P' || refcoin!=coin)
|
||||
{
|
||||
CCerror = strprintf("cannot decode partialsign tx opret %s",uint256_str(str,lasttxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "cannot decode partialsign tx opret " << lasttxid.GetHex());
|
||||
else if (myGetTransaction(withdrawtxid,tmptx,hashBlock)==0 || (numvouts= tmptx.vout.size())<=0)
|
||||
{
|
||||
CCerror = strprintf("can't find withdraw tx %s",uint256_str(str,withdrawtxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "can't find withdraw tx " << withdrawtxid.GetHex());
|
||||
else if (DecodeGatewaysWithdrawOpRet(tmptx.vout[numvouts-1].scriptPubKey,tmptokenid,bindtxid,coin,withdrawpub,amount)!='W'
|
||||
|| refcoin!=coin)
|
||||
{
|
||||
CCerror = strprintf("invalid withdraw tx %s",uint256_str(str,lasttxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "invalid withdraw tx " << withdrawtxid.GetHex());
|
||||
else if (komodo_txnotarizedconfirmed(withdrawtxid)==false)
|
||||
{
|
||||
CCerror = strprintf("gatewayswithdraw tx not yet confirmed/notarized");
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "gatewayswithdraw tx not yet confirmed/notarized");
|
||||
else if (myGetTransaction(bindtxid,tmptx,hashBlock)==0 || (numvouts=tmptx.vout.size())<=0)
|
||||
{
|
||||
CCerror = strprintf("can't find bind tx %s",uint256_str(str,bindtxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "can't find bind tx " << bindtxid.GetHex());
|
||||
else if (DecodeGatewaysBindOpRet(depositaddr,tmptx.vout[numvouts-1].scriptPubKey,tokenid,coin,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2,wiftype) != 'B'
|
||||
|| refcoin!=coin || tokenid!=tmptokenid)
|
||||
{
|
||||
CCerror = strprintf("invalid bind tx %s",uint256_str(str,bindtxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "invalid bind tx " << bindtxid.GetHex());
|
||||
}
|
||||
if (AddNormalinputs(mtx,mypk,txfee,1)!=0)
|
||||
if (AddNormalinputs(mtx,mypk,txfee,1,pk.IsValid())!=0)
|
||||
{
|
||||
mtx.vin.push_back(CTxIn(tx.GetHash(),0,CScript()));
|
||||
mtx.vout.push_back(MakeCC1vout(EVAL_GATEWAYS,CC_MARKER_VALUE,gatewayspk));
|
||||
return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeGatewaysPartialOpRet('P',withdrawtxid,refcoin,K+1,mypk,hex)));
|
||||
return(FinalizeCCTxExt(pk.IsValid(),0,cp,mtx,mypk,txfee,EncodeGatewaysPartialOpRet('P',withdrawtxid,refcoin,K+1,mypk,hex)));
|
||||
}
|
||||
CCerror = strprintf("error adding funds for partialsign");
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "error adding funds for partialsign");
|
||||
}
|
||||
|
||||
std::string GatewaysCompleteSigning(uint64_t txfee,uint256 lasttxid,std::string refcoin,std::string hex)
|
||||
UniValue GatewaysCompleteSigning(const CPubKey& pk, uint64_t txfee,uint256 lasttxid,std::string refcoin,std::string hex)
|
||||
{
|
||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||
CPubKey mypk,gatewayspk,signerpk,withdrawpub; struct CCcontract_info *cp,C; char funcid,str[65],depositaddr[64]; int64_t amount,totalsupply;
|
||||
CPubKey mypk,gatewayspk,signerpk,withdrawpub; struct CCcontract_info *cp,C; char funcid,depositaddr[64]; int64_t amount,totalsupply;
|
||||
std::string coin,tmphex; CTransaction tx,tmptx; uint256 withdrawtxid,hashBlock,tokenid,tmptokenid,bindtxid,oracletxid; int32_t numvouts;
|
||||
uint8_t K=0,M,N,taddr,prefix,prefix2,wiftype; std::vector<CPubKey> pubkeys;
|
||||
|
||||
cp = CCinit(&C,EVAL_GATEWAYS);
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
gatewayspk = GetUnspendable(cp,0);
|
||||
if ( txfee == 0 )
|
||||
txfee = 10000;
|
||||
if (myGetTransaction(lasttxid,tx,hashBlock)==0 || (numvouts= tx.vout.size())<=0
|
||||
|| (funcid=DecodeGatewaysOpRet(tx.vout[numvouts-1].scriptPubKey))==0 || (funcid!='W' && funcid!='P'))
|
||||
{
|
||||
CCerror = strprintf("invalid last txid %s",uint256_str(str,lasttxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "invalid last txid " << lasttxid.GetHex());
|
||||
if (funcid=='W')
|
||||
{
|
||||
withdrawtxid=lasttxid;
|
||||
if (DecodeGatewaysWithdrawOpRet(tx.vout[numvouts-1].scriptPubKey,tmptokenid,bindtxid,coin,withdrawpub,amount)!='W' || refcoin!=coin)
|
||||
{
|
||||
CCerror = strprintf("cannot decode withdraw tx opret %s",uint256_str(str,lasttxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
else if (myGetTransaction(bindtxid,tmptx,hashBlock)==0 || (numvouts=tmptx.vout.size())<=0)
|
||||
{
|
||||
CCerror = strprintf("can't find bind tx %s",uint256_str(str,bindtxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "invalid withdraw tx " << lasttxid.GetHex());
|
||||
else if (komodo_txnotarizedconfirmed(withdrawtxid)==false)
|
||||
{
|
||||
CCerror = strprintf("gatewayswithdraw tx not yet confirmed/notarized");
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "gatewayswithdraw tx not yet confirmed/notarized");
|
||||
else if (myGetTransaction(bindtxid,tmptx,hashBlock)==0 || (numvouts=tmptx.vout.size())<=0)
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "can't find bind tx " << bindtxid.GetHex());
|
||||
else if (DecodeGatewaysBindOpRet(depositaddr,tmptx.vout[numvouts-1].scriptPubKey,tokenid,coin,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2,wiftype) != 'B'
|
||||
|| refcoin!=coin || tokenid!=tmptokenid)
|
||||
{
|
||||
CCerror = strprintf("invalid bind tx %s",uint256_str(str,bindtxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "invalid bind tx " << bindtxid.GetHex());
|
||||
}
|
||||
else if (funcid=='P')
|
||||
{
|
||||
if (DecodeGatewaysPartialOpRet(tx.vout[numvouts-1].scriptPubKey,withdrawtxid,coin,K,signerpk,tmphex)!='P' || refcoin!=coin)
|
||||
{
|
||||
CCerror = strprintf("cannot decode partialsign tx opret %s",uint256_str(str,lasttxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
else if (myGetTransaction(withdrawtxid,tmptx,hashBlock)==0 || (numvouts=tmptx.vout.size())==0)
|
||||
{
|
||||
CCerror = strprintf("invalid withdraw txid %s",uint256_str(str,withdrawtxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
else if (DecodeGatewaysWithdrawOpRet(tmptx.vout[numvouts-1].scriptPubKey,tmptokenid,bindtxid,coin,withdrawpub,amount)!='W' || refcoin!=coin)
|
||||
{
|
||||
CCerror = strprintf("cannot decode withdraw tx opret %s",uint256_str(str,withdrawtxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
if (DecodeGatewaysPartialOpRet(tx.vout[numvouts-1].scriptPubKey,withdrawtxid,coin,K,signerpk,tmphex)!='P' || refcoin!=coin)
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "cannot decode partialsign tx opret " << lasttxid.GetHex());
|
||||
else if (myGetTransaction(withdrawtxid,tmptx,hashBlock)==0 || (numvouts= tmptx.vout.size())<=0)
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "can't find withdraw tx " << withdrawtxid.GetHex());
|
||||
else if (DecodeGatewaysWithdrawOpRet(tmptx.vout[numvouts-1].scriptPubKey,tmptokenid,bindtxid,coin,withdrawpub,amount)!='W'
|
||||
|| refcoin!=coin)
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "invalid withdraw tx " << withdrawtxid.GetHex());
|
||||
else if (komodo_txnotarizedconfirmed(withdrawtxid)==false)
|
||||
{
|
||||
CCerror = strprintf("gatewayswithdraw tx not yet confirmed/notarized");
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "gatewayswithdraw tx not yet confirmed/notarized");
|
||||
else if (myGetTransaction(bindtxid,tmptx,hashBlock)==0 || (numvouts=tmptx.vout.size())<=0)
|
||||
{
|
||||
CCerror = strprintf("can't find bind tx %s",uint256_str(str,bindtxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "can't find bind tx " << bindtxid.GetHex());
|
||||
else if (DecodeGatewaysBindOpRet(depositaddr,tmptx.vout[numvouts-1].scriptPubKey,tokenid,coin,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2,wiftype) != 'B'
|
||||
|| refcoin!=coin || tokenid!=tmptokenid)
|
||||
{
|
||||
CCerror = strprintf("invalid bind tx %s",uint256_str(str,bindtxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "invalid bind tx " << bindtxid.GetHex());
|
||||
}
|
||||
if (AddNormalinputs(mtx,mypk,txfee,1)!=0)
|
||||
if (AddNormalinputs(mtx,mypk,txfee,1,pk.IsValid())!=0)
|
||||
{
|
||||
mtx.vin.push_back(CTxIn(lasttxid,0,CScript()));
|
||||
mtx.vout.push_back(MakeCC1vout(EVAL_GATEWAYS,CC_MARKER_VALUE,gatewayspk));
|
||||
return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeGatewaysCompleteSigningOpRet('S',withdrawtxid,refcoin,K+1,hex)));
|
||||
return(FinalizeCCTxExt(pk.IsValid(),0,cp,mtx,mypk,txfee,EncodeGatewaysCompleteSigningOpRet('S',withdrawtxid,refcoin,K+1,hex)));
|
||||
}
|
||||
CCerror = strprintf("error adding funds for completesigning");
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "error adding funds for completesigning");
|
||||
}
|
||||
|
||||
std::string GatewaysMarkDone(uint64_t txfee,uint256 completetxid,std::string refcoin)
|
||||
UniValue GatewaysMarkDone(const CPubKey& pk, uint64_t txfee,uint256 completetxid,std::string refcoin)
|
||||
{
|
||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||
CPubKey mypk; struct CCcontract_info *cp,C; char str[65],depositaddr[64]; CTransaction tx; int32_t numvouts;
|
||||
CPubKey mypk; struct CCcontract_info *cp,C; char depositaddr[64]; CTransaction tx; int32_t numvouts;
|
||||
uint256 withdrawtxid,bindtxid,oracletxid,tokenid,tmptokenid,hashBlock; std::string coin,hex;
|
||||
uint8_t K,M,N,taddr,prefix,prefix2,wiftype; std::vector<CPubKey> pubkeys; int64_t amount,totalsupply; CPubKey withdrawpub;
|
||||
|
||||
cp = CCinit(&C,EVAL_GATEWAYS);
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
if ( txfee == 0 )
|
||||
txfee = 10000;
|
||||
if (myGetTransaction(completetxid,tx,hashBlock)==0 || (numvouts= tx.vout.size())<=0)
|
||||
{
|
||||
CCerror = strprintf("invalid completesigning txid %s",uint256_str(str,completetxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "invalid completesigning txid " << completetxid.GetHex());
|
||||
else if (DecodeGatewaysCompleteSigningOpRet(tx.vout[numvouts-1].scriptPubKey,withdrawtxid,coin,K,hex)!='S' || refcoin!=coin)
|
||||
{
|
||||
CCerror = strprintf("cannot decode completesigning tx opret %s",uint256_str(str,completetxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "cannot decode completesigning tx opret " << completetxid.GetHex());
|
||||
if (komodo_txnotarizedconfirmed(completetxid)==false)
|
||||
{
|
||||
CCerror = strprintf("gatewayscompletesigning tx not yet confirmed/notarized");
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "gatewayscompletesigning tx not yet confirmed/notarized");
|
||||
else if (myGetTransaction(withdrawtxid,tx,hashBlock)==0 || (numvouts= tx.vout.size())==0)
|
||||
{
|
||||
CCerror = strprintf("invalid withdraw txid %s",uint256_str(str,withdrawtxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "invalid withdraw txid " << withdrawtxid.GetHex());
|
||||
else if (DecodeGatewaysWithdrawOpRet(tx.vout[numvouts-1].scriptPubKey,tmptokenid,bindtxid,coin,withdrawpub,amount)!='W' || refcoin!=coin)
|
||||
{
|
||||
CCerror = strprintf("cannot decode withdraw tx opret %s\n",uint256_str(str,withdrawtxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "cannot decode withdraw tx opret " << withdrawtxid.GetHex());
|
||||
else if (myGetTransaction(bindtxid,tx,hashBlock)==0 || (numvouts=tx.vout.size())<=0)
|
||||
{
|
||||
CCerror = strprintf("can't find bind tx %s",uint256_str(str,bindtxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "can't find bind tx " << bindtxid.GetHex());
|
||||
else if (DecodeGatewaysBindOpRet(depositaddr,tx.vout[numvouts-1].scriptPubKey,tokenid,coin,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2,wiftype) != 'B'
|
||||
|| refcoin!=coin || tokenid!=tmptokenid)
|
||||
{
|
||||
CCerror = strprintf("invalid bind tx %s",uint256_str(str,bindtxid));
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
if (AddNormalinputs(mtx,mypk,txfee,1)!=0)
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "invalid bind tx " << bindtxid.GetHex());
|
||||
if (AddNormalinputs(mtx,mypk,txfee,1,pk.IsValid())!=0)
|
||||
{
|
||||
mtx.vin.push_back(CTxIn(completetxid,0,CScript()));
|
||||
mtx.vout.push_back(CTxOut(CC_MARKER_VALUE,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG));
|
||||
return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeGatewaysMarkDoneOpRet('M',withdrawtxid,refcoin,completetxid)));
|
||||
return(FinalizeCCTxExt(pk.IsValid(),0,cp,mtx,mypk,txfee,EncodeGatewaysMarkDoneOpRet('M',withdrawtxid,refcoin,completetxid)));
|
||||
}
|
||||
CCerror = strprintf("error adding funds for markdone");
|
||||
LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
CCERR_RESULT("gatewayscc",CCLOG_INFO, stream << "error adding funds for markdone");
|
||||
}
|
||||
|
||||
UniValue GatewaysPendingDeposits(uint256 bindtxid,std::string refcoin)
|
||||
UniValue GatewaysPendingDeposits(const CPubKey& pk, uint256 bindtxid,std::string refcoin)
|
||||
{
|
||||
UniValue result(UniValue::VOBJ),pending(UniValue::VARR); CTransaction tx; std::string coin,hex,pub;
|
||||
CPubKey mypk,gatewayspk,destpub; std::vector<CPubKey> pubkeys,publishers; std::vector<uint256> txids;
|
||||
@@ -1478,7 +1227,7 @@ UniValue GatewaysPendingDeposits(uint256 bindtxid,std::string refcoin)
|
||||
std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > unspentOutputs;
|
||||
|
||||
cp = CCinit(&C,EVAL_GATEWAYS);
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
gatewayspk = GetUnspendable(cp,0);
|
||||
_GetCCaddress(coinaddr,EVAL_GATEWAYS,mypk);
|
||||
if ( myGetTransaction(bindtxid,tx,hashBlock) == 0 || (numvouts= tx.vout.size()) <= 0 )
|
||||
@@ -1523,7 +1272,7 @@ UniValue GatewaysPendingDeposits(uint256 bindtxid,std::string refcoin)
|
||||
return(result);
|
||||
}
|
||||
|
||||
UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin)
|
||||
UniValue GatewaysPendingWithdraws(const CPubKey& pk, uint256 bindtxid,std::string refcoin)
|
||||
{
|
||||
UniValue result(UniValue::VOBJ),pending(UniValue::VARR); CTransaction tx; std::string coin,hex; CPubKey mypk,gatewayspk,withdrawpub,signerpk;
|
||||
std::vector<CPubKey> msigpubkeys; uint256 hashBlock,tokenid,txid,tmpbindtxid,tmptokenid,oracletxid,withdrawtxid; uint8_t K,M,N,taddr,prefix,prefix2,wiftype;
|
||||
@@ -1532,7 +1281,7 @@ UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin)
|
||||
std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > unspentOutputs;
|
||||
|
||||
cp = CCinit(&C,EVAL_GATEWAYS);
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
gatewayspk = GetUnspendable(cp,0);
|
||||
_GetCCaddress(coinaddr,EVAL_GATEWAYS,gatewayspk);
|
||||
GetTokensCCaddress(cp,tokensaddr,gatewayspk);
|
||||
@@ -1611,7 +1360,7 @@ UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin)
|
||||
return(result);
|
||||
}
|
||||
|
||||
UniValue GatewaysProcessedWithdraws(uint256 bindtxid,std::string refcoin)
|
||||
UniValue GatewaysProcessedWithdraws(const CPubKey& pk, uint256 bindtxid,std::string refcoin)
|
||||
{
|
||||
UniValue result(UniValue::VOBJ),processed(UniValue::VARR); CTransaction tx; std::string coin,hex;
|
||||
CPubKey mypk,gatewayspk,withdrawpub; std::vector<CPubKey> msigpubkeys;
|
||||
@@ -1621,7 +1370,7 @@ UniValue GatewaysProcessedWithdraws(uint256 bindtxid,std::string refcoin)
|
||||
std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > unspentOutputs;
|
||||
|
||||
cp = CCinit(&C,EVAL_GATEWAYS);
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
gatewayspk = GetUnspendable(cp,0);
|
||||
_GetCCaddress(coinaddr,EVAL_GATEWAYS,gatewayspk);
|
||||
if ( myGetTransaction(bindtxid,tx,hashBlock) == 0 || (numvouts= tx.vout.size()) <= 0 )
|
||||
|
||||
312
src/cc/heir.cpp
312
src/cc/heir.cpp
@@ -628,72 +628,79 @@ template <typename Helper> UniValue _HeirFund(int64_t txfee, int64_t amount, std
|
||||
|
||||
CPubKey myPubkey = pubkey2pk(Mypubkey());
|
||||
|
||||
if (AddNormalinputs(mtx, myPubkey, markerfee, 3) > 0) {
|
||||
int64_t inputs, change;
|
||||
|
||||
if ((inputs=Helper::addOwnerInputs(tokenid, mtx, myPubkey, amount, (int32_t)64)) > 0) {
|
||||
|
||||
mtx.vout.push_back(Helper::make1of2Vout(amount, myPubkey, heirPubkey));
|
||||
|
||||
// add a marker for finding all plans in HeirList()
|
||||
// TODO: change marker either to cc or normal txidaddr unspendable
|
||||
struct CCcontract_info *cpHeir, heirC;
|
||||
cpHeir = CCinit(&heirC, EVAL_HEIR);
|
||||
CPubKey heirUnspendablePubKey = GetUnspendable(cpHeir, 0);
|
||||
// mtx.vout.push_back(CTxOut(txfee, CScript() << ParseHex(HexStr(heirUnspendablePubKey)) << OP_CHECKSIG)); <-- bad marker cause it was spendable by anyone
|
||||
mtx.vout.push_back(MakeCC1vout(EVAL_HEIR, markerfee, heirUnspendablePubKey)); // this marker spending is disabled in the validation code
|
||||
|
||||
// calc and add change vout:
|
||||
if (inputs > amount)
|
||||
change = (inputs - amount); // -txfee <-- txfee pays user
|
||||
|
||||
//std::cerr << "HeirFund() inputs=" << inputs << " amount=" << amount << " txfee=" << txfee << " change=" << change << '\n';
|
||||
|
||||
if (change != 0) { // vout[1]
|
||||
mtx.vout.push_back(Helper::makeUserVout(change, myPubkey));
|
||||
}
|
||||
|
||||
// check owner pubkey in vins
|
||||
bool hasMypubkey = false;
|
||||
bool hasNotMypubkey = false;
|
||||
|
||||
CheckVinPubkey(mtx.vin, myPubkey, hasMypubkey, hasNotMypubkey);
|
||||
|
||||
// for initial funding do not allow to sign by non-owner key:
|
||||
if (hasNotMypubkey) {
|
||||
result.push_back(Pair("result", "error"));
|
||||
result.push_back(Pair("error", "using non-owner inputs not allowed"));
|
||||
return result;
|
||||
}
|
||||
|
||||
// add 1of2 vout validation pubkeys:
|
||||
std::vector<CPubKey> voutTokenPubkeys;
|
||||
voutTokenPubkeys.push_back(myPubkey);
|
||||
voutTokenPubkeys.push_back(heirPubkey);
|
||||
|
||||
// add change for txfee and opreturn vouts and sign tx:
|
||||
std::string rawhextx = FinalizeCCTx(0, cp, mtx, myPubkey, txfee,
|
||||
Helper::makeCreateOpRet(tokenid, voutTokenPubkeys, myPubkey, heirPubkey, inactivityTimeSec, heirName, memo));
|
||||
if (!rawhextx.empty()) {
|
||||
result.push_back(Pair("result", "success"));
|
||||
result.push_back(Pair("hex", rawhextx));
|
||||
}
|
||||
else {
|
||||
std::cerr << "HeirAdd error in FinalizeCCtx" << std::endl;
|
||||
result.push_back(Pair("result", "error"));
|
||||
result.push_back(Pair("error", "sign error"));
|
||||
}
|
||||
}
|
||||
else { // TODO: need result return unification with heiradd and claim
|
||||
std::cerr << "HeirFund() could not find owner cc inputs" << std::endl;
|
||||
if (!tokenid.IsNull()) // add normals only for tokens
|
||||
{
|
||||
if (AddNormalinputs(mtx, myPubkey, txfee + markerfee, 4) < txfee + markerfee)
|
||||
{
|
||||
std::cerr << "HeirFund() could not find normal inputs for txfee" << std::endl;
|
||||
result.push_back(Pair("result", "error"));
|
||||
result.push_back(Pair("error", "could not find owner cc inputs"));
|
||||
result.push_back(Pair("error", "could not find normal inputs for txfee"));
|
||||
return result;
|
||||
}
|
||||
}
|
||||
else {
|
||||
std::cerr << "HeirFund() could not find normal inputs" << std::endl;
|
||||
|
||||
int64_t inputs;
|
||||
int64_t addAmount = tokenid.IsNull() ? (txfee + markerfee + amount) : amount; // for coins add txfee markerfee amount in one call
|
||||
if ((inputs=Helper::addOwnerInputs(tokenid, mtx, myPubkey, addAmount, (int32_t)64)) >= addAmount)
|
||||
{
|
||||
mtx.vout.push_back(Helper::make1of2Vout(amount, myPubkey, heirPubkey));
|
||||
|
||||
// add a marker for finding all plans in HeirList()
|
||||
// TODO: change marker either to cc or normal txidaddr unspendable
|
||||
struct CCcontract_info *cpHeir, heirC;
|
||||
cpHeir = CCinit(&heirC, EVAL_HEIR);
|
||||
CPubKey heirUnspendablePubKey = GetUnspendable(cpHeir, 0);
|
||||
// mtx.vout.push_back(CTxOut(txfee, CScript() << ParseHex(HexStr(heirUnspendablePubKey)) << OP_CHECKSIG)); <-- bad marker cause it was spendable by anyone
|
||||
mtx.vout.push_back(MakeCC1vout(EVAL_HEIR, markerfee, heirUnspendablePubKey)); // this marker spending is disabled in the validation code
|
||||
|
||||
if (!tokenid.IsNull())
|
||||
{
|
||||
int64_t ccChange = 0;
|
||||
// calc and add token change vout:
|
||||
if (inputs > amount)
|
||||
ccChange = (inputs - amount); // -txfee <-- txfee pays user
|
||||
|
||||
//std::cerr << "HeirFund() inputs=" << inputs << " amount=" << amount << " txfee=" << txfee << " change=" << change << '\n';
|
||||
|
||||
if (ccChange != 0)
|
||||
mtx.vout.push_back(Helper::makeUserVout(ccChange, myPubkey));
|
||||
}
|
||||
|
||||
// check owner pubkey in vins
|
||||
bool hasMypubkey = false;
|
||||
bool hasNotMypubkey = false;
|
||||
|
||||
CheckVinPubkey(mtx.vin, myPubkey, hasMypubkey, hasNotMypubkey);
|
||||
|
||||
// for initial funding do not allow to sign by non-owner key:
|
||||
if (hasNotMypubkey) {
|
||||
result.push_back(Pair("result", "error"));
|
||||
result.push_back(Pair("error", "using non-owner inputs not allowed"));
|
||||
return result;
|
||||
}
|
||||
|
||||
// add 1of2 vout token validation pubkeys - used only for tokens
|
||||
std::vector<CPubKey> voutTokenPubkeys;
|
||||
voutTokenPubkeys.push_back(myPubkey);
|
||||
voutTokenPubkeys.push_back(heirPubkey);
|
||||
|
||||
// add change for txfee and opreturn vouts and sign tx:
|
||||
std::string rawhextx = FinalizeCCTx(0, cp, mtx, myPubkey, txfee,
|
||||
Helper::makeCreateOpRet(tokenid, voutTokenPubkeys, myPubkey, heirPubkey, inactivityTimeSec, heirName, memo));
|
||||
if (!rawhextx.empty()) {
|
||||
result.push_back(Pair("result", "success"));
|
||||
result.push_back(Pair("hex", rawhextx));
|
||||
}
|
||||
else {
|
||||
std::cerr << "HeirAdd error in FinalizeCCtx" << std::endl;
|
||||
result.push_back(Pair("result", "error"));
|
||||
result.push_back(Pair("error", "sign error"));
|
||||
}
|
||||
}
|
||||
else { // TODO: need result return unification with heiradd and claim
|
||||
std::cerr << "HeirFund() could not find owner inputs for amount (normal inputs for coins, cc inputs for tokens)" << std::endl;
|
||||
result.push_back(Pair("result", "error"));
|
||||
result.push_back(Pair("error", "could not find normal inputs"));
|
||||
result.push_back(Pair("error", "could not find owner inputs"));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -716,7 +723,6 @@ template <class Helper> UniValue _HeirAdd(uint256 fundingtxid, int64_t txfee, in
|
||||
{
|
||||
UniValue result(UniValue::VOBJ);
|
||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||
int64_t inputs, CCchange = 0;
|
||||
struct CCcontract_info *cp, C;
|
||||
std::string rawhex;
|
||||
|
||||
@@ -736,89 +742,93 @@ template <class Helper> UniValue _HeirAdd(uint256 fundingtxid, int64_t txfee, in
|
||||
return result;
|
||||
}
|
||||
|
||||
if (AddNormalinputs(mtx, myPubkey, markerfee, 3) > 0) { // some for marker
|
||||
|
||||
int64_t inputs, change;
|
||||
|
||||
if ((inputs = Helper::addOwnerInputs(tokenid, mtx, myPubkey, amount, 64)) > 0) { // TODO: why 64 max inputs?
|
||||
|
||||
// we do not use markers anymore - storing data in opreturn is better
|
||||
// add marker vout:
|
||||
/* char markeraddr[64];
|
||||
CPubKey markerpubkey = CCtxidaddr(markeraddr, fundingtxid);
|
||||
mtx.vout.push_back(CTxOut(txfee, CScript() << ParseHex(HexStr(markerpubkey)) << OP_CHECKSIG)); // txfee 1, txfee 2 - for miners
|
||||
std::cerr << "HeirAdd() adding markeraddr=" << markeraddr << '\n'; */
|
||||
|
||||
// add cryptocondition to spend this funded amount for either pk
|
||||
mtx.vout.push_back(Helper::make1of2Vout(amount, ownerPubkey, heirPubkey));
|
||||
if (!tokenid.IsNull()) // add normals only for tokens
|
||||
{
|
||||
if (AddNormalinputs(mtx, myPubkey, txfee + markerfee, 4) < txfee + markerfee)
|
||||
{
|
||||
std::cerr << "HeirFund() could not find normal inputs for txfee" << std::endl;
|
||||
result.push_back(Pair("result", "error"));
|
||||
result.push_back(Pair("error", "could not find normal inputs for txfee"));
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
char markeraddr[64];
|
||||
CPubKey markerPubkey = CCtxidaddr(markeraddr, fundingtxid);
|
||||
mtx.vout.push_back(CTxOut(markerfee, CScript() << ParseHex(HexStr(markerPubkey)) << OP_CHECKSIG)); // marker to prevent archiving of the funds add vouts
|
||||
int64_t inputs;
|
||||
int64_t addAmount = tokenid.IsNull() ? (txfee + markerfee + amount) : amount; // for coins add txfee markerfee amount in one call
|
||||
if ((inputs = Helper::addOwnerInputs(tokenid, mtx, myPubkey, addAmount, 64)) >= addAmount) { // TODO: why 64 max inputs?
|
||||
|
||||
// we do not use markers anymore - storing data in opreturn is better
|
||||
// add marker vout:
|
||||
/* char markeraddr[64];
|
||||
CPubKey markerpubkey = CCtxidaddr(markeraddr, fundingtxid);
|
||||
mtx.vout.push_back(CTxOut(txfee, CScript() << ParseHex(HexStr(markerpubkey)) << OP_CHECKSIG)); // txfee 1, txfee 2 - for miners
|
||||
std::cerr << "HeirAdd() adding markeraddr=" << markeraddr << '\n'; */
|
||||
|
||||
// add cryptocondition to spend this funded amount for either pk
|
||||
mtx.vout.push_back(Helper::make1of2Vout(amount, ownerPubkey, heirPubkey));
|
||||
|
||||
char markeraddr[64];
|
||||
CPubKey markerPubkey = CCtxidaddr(markeraddr, fundingtxid);
|
||||
mtx.vout.push_back(CTxOut(markerfee, CScript() << ParseHex(HexStr(markerPubkey)) << OP_CHECKSIG)); // marker to prevent archiving of the funds add vouts
|
||||
|
||||
if (!tokenid.IsNull())
|
||||
{
|
||||
int64_t ccChange = 0;
|
||||
|
||||
if (inputs > amount)
|
||||
change = (inputs - amount); // -txfee <-- txfee pays user
|
||||
|
||||
ccChange = (inputs - amount); // -txfee <-- txfee pays user
|
||||
//std::cerr << "HeirAdd() inputs=" << inputs << " amount=" << amount << " txfee=" << txfee << " change=" << change << '\n';
|
||||
|
||||
if (change != 0) { // vout[1]
|
||||
mtx.vout.push_back(Helper::makeUserVout(change, myPubkey));
|
||||
}
|
||||
|
||||
// check owner pubkey in vins
|
||||
bool hasMypubkey = false;
|
||||
bool hasNotMypubkey = false;
|
||||
|
||||
CheckVinPubkey(mtx.vin, myPubkey, hasMypubkey, hasNotMypubkey);
|
||||
|
||||
// for additional funding do not allow to sign by both owner and non-owner keys (is this a donation or not?):
|
||||
if (hasMypubkey && hasNotMypubkey) {
|
||||
result.push_back(Pair("result", "error"));
|
||||
result.push_back(Pair("error", "using both owner and non-owner inputs is not allowed"));
|
||||
return result;
|
||||
}
|
||||
|
||||
// warn the user he's making a donation if this is all non-owner keys:
|
||||
if (hasNotMypubkey) {
|
||||
result.push_back(Pair("result", "warning"));
|
||||
result.push_back(Pair("warning", "you are about to make a donation to heir fund"));
|
||||
}
|
||||
else {
|
||||
result.push_back(Pair("result", "success"));
|
||||
}
|
||||
|
||||
// add 1of2 vout validation pubkeys - needed only for tokens:
|
||||
std::vector<CPubKey> voutTokenPubkeys;
|
||||
voutTokenPubkeys.push_back(ownerPubkey);
|
||||
voutTokenPubkeys.push_back(heirPubkey);
|
||||
|
||||
// add opreturn 'A' and sign tx: // this txfee ignored
|
||||
std::string rawhextx = (FinalizeCCTx(0, cp, mtx, myPubkey, txfee,
|
||||
Helper::makeAddOpRet(tokenid, voutTokenPubkeys, fundingtxid, hasHeirSpendingBegun)));
|
||||
|
||||
if (!rawhextx.empty()) {
|
||||
result.push_back(Pair("hex", rawhextx));
|
||||
}
|
||||
else {
|
||||
std::cerr << "HeirAdd error in FinalizeCCtx" << std::endl;
|
||||
result.clear();
|
||||
result.push_back(Pair("result", "error"));
|
||||
result.push_back(Pair("error", "sign error"));
|
||||
}
|
||||
|
||||
if (ccChange != 0)
|
||||
mtx.vout.push_back(Helper::makeUserVout(ccChange, myPubkey));
|
||||
}
|
||||
else {
|
||||
std::cerr << "HeirAdd cannot find owner cc inputs" << std::endl;
|
||||
|
||||
// check owner pubkey in vins
|
||||
bool hasMypubkey = false;
|
||||
bool hasNotMypubkey = false;
|
||||
|
||||
CheckVinPubkey(mtx.vin, myPubkey, hasMypubkey, hasNotMypubkey);
|
||||
|
||||
// for additional funding do not allow to sign by both owner and non-owner keys (is this a donation or not?):
|
||||
if (hasMypubkey && hasNotMypubkey) {
|
||||
result.push_back(Pair("result", "error"));
|
||||
result.push_back(Pair("error", "using both owner and non-owner inputs is not allowed"));
|
||||
return result;
|
||||
}
|
||||
|
||||
// warn the user he's making a donation if this is all non-owner keys:
|
||||
if (hasNotMypubkey) {
|
||||
result.push_back(Pair("result", "warning"));
|
||||
result.push_back(Pair("warning", "you are about to make a donation to heir fund"));
|
||||
}
|
||||
else {
|
||||
result.push_back(Pair("result", "success"));
|
||||
}
|
||||
|
||||
// add 1of2 vout validation pubkeys - needed only for tokens:
|
||||
std::vector<CPubKey> voutTokenPubkeys;
|
||||
voutTokenPubkeys.push_back(ownerPubkey);
|
||||
voutTokenPubkeys.push_back(heirPubkey);
|
||||
|
||||
// add opreturn 'A' and sign tx:
|
||||
std::string rawhextx = (FinalizeCCTx(0, cp, mtx, myPubkey, txfee,
|
||||
Helper::makeAddOpRet(tokenid, voutTokenPubkeys, fundingtxid, hasHeirSpendingBegun)));
|
||||
|
||||
if (!rawhextx.empty()) {
|
||||
result.push_back(Pair("hex", rawhextx));
|
||||
}
|
||||
else {
|
||||
std::cerr << "HeirAdd error in FinalizeCCtx" << std::endl;
|
||||
result.clear();
|
||||
result.push_back(Pair("result", "error"));
|
||||
result.push_back(Pair("error", "can't find owner cc inputs"));
|
||||
result.push_back(Pair("error", "sign error"));
|
||||
}
|
||||
}
|
||||
else {
|
||||
std::cerr << "HeirAdd cannot find normal inputs for tx fee" << std::endl;
|
||||
std::cerr << "HeirAdd cannot find owner inputs for amount (normal inputs for coins, cc inputs for tokens)" << std::endl;
|
||||
result.push_back(Pair("result", "error"));
|
||||
result.push_back(Pair("error", "can't find normal inputs for tx fee"));
|
||||
}
|
||||
|
||||
result.push_back(Pair("error", "can't find owner inputs"));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -833,10 +843,12 @@ UniValue HeirAddCaller(uint256 fundingtxid, int64_t txfee, std::string strAmount
|
||||
std::string heirName, memo;
|
||||
uint8_t hasHeirSpendingBegun = 0;
|
||||
|
||||
if ((latesttxid = FindLatestFundingTx(fundingtxid, funcId, tokenid, ownerPubkey, heirPubkey, inactivityTimeSec, heirName, memo, hasHeirSpendingBegun)) != zeroid) {
|
||||
// get latest tx to see if it is a token or coin
|
||||
if ((latesttxid = FindLatestFundingTx(fundingtxid, funcId, tokenid, ownerPubkey, heirPubkey, inactivityTimeSec, heirName, memo, hasHeirSpendingBegun)) != zeroid)
|
||||
{
|
||||
if (tokenid == zeroid) {
|
||||
int64_t amount = (int64_t)(atof(strAmount.c_str()) * COIN);
|
||||
if (amount <= 0) {
|
||||
int64_t amount = 0;
|
||||
if (!ParseFixedPoint(strAmount, 8, &amount) || amount <= 0 ) {
|
||||
UniValue result(UniValue::VOBJ);
|
||||
result.push_back(Pair("result", "error"));
|
||||
result.push_back(Pair("error", "invalid amount"));
|
||||
@@ -844,7 +856,8 @@ UniValue HeirAddCaller(uint256 fundingtxid, int64_t txfee, std::string strAmount
|
||||
}
|
||||
return _HeirAdd<CoinHelper>(fundingtxid, txfee, amount, latesttxid, funcId, tokenid, ownerPubkey, heirPubkey, inactivityTimeSec, hasHeirSpendingBegun);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
int64_t amount = atoll(strAmount.c_str());
|
||||
if (amount <= 0) {
|
||||
UniValue result(UniValue::VOBJ);
|
||||
@@ -1003,15 +1016,18 @@ UniValue HeirClaimCaller(uint256 fundingtxid, int64_t txfee, std::string strAmou
|
||||
std::string heirName, memo;
|
||||
uint8_t hasHeirSpendingBegun = 0;
|
||||
|
||||
if ((latesttxid = FindLatestFundingTx(fundingtxid, funcId, tokenid, ownerPubkey, heirPubkey, inactivityTimeSec, heirName, memo, hasHeirSpendingBegun)) != zeroid) {
|
||||
if (tokenid == zeroid) {
|
||||
int64_t amount = (int64_t)(atof(strAmount.c_str()) * COIN);
|
||||
if (amount < 0) {
|
||||
UniValue result(UniValue::VOBJ);
|
||||
result.push_back(Pair("result", "error"));
|
||||
result.push_back(Pair("error", "invalid amount"));
|
||||
return result;
|
||||
}
|
||||
// find latest tx to see if it is a token or coin:
|
||||
if ((latesttxid = FindLatestFundingTx(fundingtxid, funcId, tokenid, ownerPubkey, heirPubkey, inactivityTimeSec, heirName, memo, hasHeirSpendingBegun)) != zeroid)
|
||||
{
|
||||
if (tokenid == zeroid)
|
||||
{
|
||||
int64_t amount = 0;
|
||||
if (!ParseFixedPoint(strAmount, 8, &amount) || amount <= 0) { // using ParseFixedPoint instead atof to avoid round errors
|
||||
UniValue result(UniValue::VOBJ);
|
||||
result.push_back(Pair("result", "error"));
|
||||
result.push_back(Pair("error", "invalid amount"));
|
||||
return result;
|
||||
}
|
||||
return _HeirClaim<CoinHelper>(fundingtxid, txfee, amount, latesttxid, funcId, tokenid, ownerPubkey, heirPubkey, inactivityTimeSec, hasHeirSpendingBegun);
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
How this works:
|
||||
- earlytxid must be a transaction included in the chain before block KOMODO_EARLYTXID_HEIGHT. The chain MUST not have any other of these type of tx before block KOMODO_EARLYTXID_HEIGHT, or someone may be able to change it and mess things up.
|
||||
- When it gets to block KOMODO_EARLYTXID_HEIGHT, it takes the txid specified by the -earlytxid param (does not affect magic)
|
||||
- Looks up the transaction searches for the opreturn, then permenantly appends it to the end of ac_script in RAM.
|
||||
- After every daemon restart, the first time the daemon mines a block, or receives a block that pays ac_script it will look up the op_return and save it again.
|
||||
- this enables it to always reach consensus but doesnt need to constantly keep looking up the tx in the chain.
|
||||
- The trick is to use ac_founders=101 or higher so that nothing is ever paid to the unspendable CC address. Although it should still work without this it burns coins.
|
||||
|
||||
-ac_script can be any Global CC address you can spend to with an OP_RETURN. Here we use example of paymentsCC being used to fund a rewards plan, and a set of founders address's.
|
||||
you can get the ac_script from another chain, but the op_return payload must generated on the chain itself. this command gives you the needed info to get the scripPubKey Hex:
|
||||
./komodo-cli -ac_name=TEST paymentsfund '["5d536f54332db09f2be04593c54f764cf569e225f4d8df5155658c679e663682",1000]'
|
||||
append: b8, to the end of ac_script, this changes magic value for -earlytxid chains vs normal ac_script and allows bypass of ac_supply paid to the scritpt as it would be unspendable and you would be unable to create the needed plans with no coins.
|
||||
-ac_script=2ea22c8020987fad30df055db6fd922c3a57e55d76601229ed3da3b31340112e773df3d0d28103120c008203000401ccb8
|
||||
|
||||
-testnode=1 is not affecting magic and allows mining on a single node, we can use this to bootstrap the chain before syncing a second node to save time.
|
||||
|
||||
start chain and make sure to do the following steps before block 100 (set generate false/true is a good idea between steps)
|
||||
./komodod -ac_name=TESTHC -ac_supply=1000000 -ac_reward=100000000000 -ac_cc=2 -ac_script=2ea22c8020987fad30df055db6fd922c3a57e55d76601229ed3da3b31340112e773df3d0d28103120c008203000401ccb8 -ac_founders=150 -ac_blocktime=20 -ac_nk=96,5 -testnode=1
|
||||
|
||||
create rewards plan and fund it with all or a % of the premine. Must be some amount. eg.
|
||||
./komodo-cli -ac_name=TESTHC rewardscreatefunding test 50000 25 0 2 500
|
||||
|
||||
do rewards add funding:
|
||||
./komodo-cli -ac_name=TESTHC rewardsaddfunding test 47a3150150bd196bd2086cae5e0c6b01a23785a04139fa660d169121a534b38e 1000
|
||||
|
||||
and get the script pubkey and op_return from this tx (no need to send it)
|
||||
./komodo-cli -ac_name=TESTHC decoderawtransaction 010000000204ca4c7aaae62bb8fc9412ac010e047fa8d33c3f87d2adeb3e02170642ddfe370000000049483045022100d7b9a
|
||||
4f28ca3a35f34dcdb6075e905cde1eaa962bd0619d0a8ed8e17e952bc99022077308e12325fc2a02c752ec3df9aeee1fc219ea54a4d3884834582b75c89815e01ffffffff08800132da3233d80c65e87b6db6a76dcf
|
||||
188e4fdfa23198d69f647e67754cfb0000000049483045022100d6a8f7a1c4f6013f5897768ae0117fe61dfb72352d3e6652e64a6588db3ffcb102202aa1d041b24f9cbbf7028295b7c5e7f18b4f95ae39c13031dab
|
||||
7f06634438e6801ffffffff0300e8764817000000302ea22c802065686d47a4049c2c845a71895a915eb84c04445896eec5dc0be40df0b31372da8103120c008203000401ccf0c0764817000000232103bbec93af84
|
||||
0933ae2d35fc56eff24f34dbe26871402552f84c44f690945ccd79ac00000000000000002c6a2ae54174657374000000008eb334a52191160d66fa3941a08537a2016b0c5eae6c08d26b19bd500115a34700000000
|
||||
|
||||
From the return of this you need the scriptpubkey hex of vout 0:
|
||||
scriptPubKey: 2ea22c802065686d47a4049c2c845a71895a915eb84c04445896eec5dc0be40df0b31372da8103120c008203000401cc
|
||||
and the scriptpubkey hex of the OP_RETURN in vout 2.
|
||||
OP_RETURN: 6a2ae54174657374000000008eb334a52191160d66fa3941a08537a2016b0c5eae6c08d26b19bd500115a347
|
||||
|
||||
create txidopreturn for this payment:
|
||||
./komodo-cli -ac_name=TESTHC paymentstxidopret '[50,"2ea22c802065686d47a4049c2c845a71895a915eb84c04445896eec5dc0be40df0b31372da8103120c008203000401cc","6a2ae54174657374000000008eb334a52191160d66fa3941a08537a2016b0c5eae6c08d26b19bd500115a347"]'
|
||||
|
||||
create the txidopret for the founders reward(s) pubkeys: should be able to be a few here, not sure of max number yet. These can pay anything that does not need an opreturn. allocation and scriptpubkey hex.
|
||||
./komodo-cli -ac_name=TESTHC paymentstxidopret '[50,"76a9146bf5dd9f679c87a3f83ea176f82148d26653c04388ac"]'
|
||||
|
||||
create payments plan:
|
||||
./komodo-cli -ac_name=TESTHC paymentscreate '[0,0,"61f55f2f87dad3a37d42731a8cb73b3ebea1817abfa176218162c360a8bd7145","0550014823ffa0aa99d7dd7ca5292f4dd0a1b9156eddec03412c953f095181bc"]'
|
||||
gives plan txid: ee7765be874fb084c00538b1b0488e8ecb857de253f09a9ba6ea8d3579b77d33
|
||||
|
||||
paymentsfund:
|
||||
To do this you first need to change the type of tx generated by paymentsfund RPC. in payments.cpp go to line: 639 and comment it out, then uncomment the block of code under this.
|
||||
change the line 646 to line 647 with comments, and line 650/651 aswell. This enables the RPC to generate the ccvout opreturn payload you need without sending the payment on the chain. Just decode the raw hex.
|
||||
./komodo-cli -ac_name=TESTHC paymentsfund '["ee7765be874fb084c00538b1b0488e8ecb857de253f09a9ba6ea8d3579b77d33",1000,1]'
|
||||
|
||||
get the payment fund scriptpubkey hex from vout 0: (the split it at OP_CHECKCRYPTOCONDITION or 'cc' )
|
||||
2ea22c8020987fad30df055db6fd922c3a57e55d76601229ed3da3b31340112e773df3d0d28103120c008203000401cc 2a0401f00101246a22f046337db779358deaa69b9af053e27d85cb8e8e48b0b13805c084b04f87be6577ee75
|
||||
|
||||
put the second half into an OP_RETURN: (the remaining part of the the above scriptpubkey) eg.
|
||||
./komodo-cli -ac_name=TESTHC opreturn_burn 1 2a0401f00101246a22f046337db779358deaa69b9af053e27d85cb8e8e48b0b13805c084b04f87be6577ee75
|
||||
opret_burn takes any burn amount and arbitrary hex string. (RPC works, but may have bugs, likely use this for LABS too with some fixes)
|
||||
this gives a raw hex. Decode it and check the OP_RETURN is right before sending.
|
||||
-earlytxid=810bd62fb8353fad20267ff2050684b8829affa3edf6b366633931530791dfce
|
||||
restart the chain with earlytxid param before height 100 on all nodes (if not using -testnode=1)
|
||||
./komodod -ac_name=TESTHC -ac_supply=1000000 -ac_reward=100000000000 -ac_cc=2 -ac_script=2ea22c8020987fad30df055db6fd922c3a57e55d76601229ed3da3b31340112e773df3d0d28103120c008203000401ccb8 -ac_founders=150 -ac_blocktime=20 -ac_nk=96,5 -earlytxid=810bd62fb8353fad20267ff2050684b8829affa3edf6b366633931530791dfce
|
||||
|
||||
once the payments plan has been funded with the mined coinbase you can issue payments release when conditions of the plan are met to fund founders reward/rewards plan. eg.
|
||||
./komodo-cli -ac_name=TESTHC paymentsrelease '["ee7765be874fb084c00538b1b0488e8ecb857de253f09a9ba6ea8d3579b77d33",500]'
|
||||
@@ -1,4 +1,6 @@
|
||||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
# Copyright (c) 2019 The Hush developers
|
||||
|
||||
rm *.so rogue/rogue games/tetris games/prices
|
||||
|
||||
echo rogue
|
||||
|
||||
1104
src/cc/marmara.cpp
1104
src/cc/marmara.cpp
File diff suppressed because it is too large
Load Diff
@@ -639,15 +639,15 @@ bool OraclesDataValidate(struct CCcontract_info *cp,Eval* eval,const CTransactio
|
||||
else return(true);
|
||||
}
|
||||
|
||||
int32_t GetLatestTimestamp(int32_t height)
|
||||
/*nt32_t GetLatestTimestamp(int32_t height)
|
||||
{
|
||||
if ( KOMODO_NSPV_SUPERLITE ) return (NSPV_blocktime(height));
|
||||
return(komodo_heightstamp(height));
|
||||
}
|
||||
} */
|
||||
|
||||
bool OraclesValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx, uint32_t nIn)
|
||||
{
|
||||
uint256 oracletxid,batontxid; uint64_t txfee=10000; int32_t numvins,numvouts,preventCCvins,preventCCvouts; int64_t amount; uint256 hashblock;
|
||||
uint256 oracletxid,batontxid,txid; uint64_t txfee=10000; int32_t numvins,numvouts,preventCCvins,preventCCvouts; int64_t amount; uint256 hashblock;
|
||||
uint8_t *script; std::vector<uint8_t> vopret,data; CPubKey publisher,tmppk,oraclespk; char tmpaddress[64],vinaddress[64],oraclesaddr[64];
|
||||
CTransaction tmptx; std::string name,desc,format;
|
||||
|
||||
@@ -702,10 +702,16 @@ bool OraclesValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &t
|
||||
return eval->Invalid("invalid marker for oraclescreate!");
|
||||
else if ( IsCCInput(tx.vin[0].scriptSig) != 0 )
|
||||
return eval->Invalid("vin.0 is normal for oraclesregister!");
|
||||
else if ((*cp->ismyvin)(tx.vin[tx.vin.size()-1].scriptSig) == 0 || myGetTransaction(tx.vin[tx.vin.size()-1].prevout.hash,tmptx,hashblock)==0
|
||||
else if ((*cp->ismyvin)(tx.vin[1].scriptSig) == 0 && (*cp->ismyvin)(tx.vin[tx.vin.size()-1].scriptSig) == 0)
|
||||
return eval->Invalid("there is no CC vin from oraclesfund tx");
|
||||
else if ((*cp->ismyvin)(tx.vin[1].scriptSig) == 1 && (myGetTransaction(tx.vin[1].prevout.hash,tmptx,hashblock)==0 || DecodeOraclesOpRet(tmptx.vout[tmptx.vout.size()-1].scriptPubKey,txid,tmppk,amount)!='F'
|
||||
|| tmptx.vout[tx.vin[1].prevout.n].nValue!=CC_MARKER_VALUE || !Getscriptaddress(vinaddress,tmptx.vout[tx.vin[1].prevout.n].scriptPubKey)
|
||||
|| !GetCCaddress(cp,tmpaddress,tmppk) || strcmp(tmpaddress,vinaddress)!=0) || oracletxid!=txid)
|
||||
return eval->Invalid("invalid vin.1 for oraclesregister, it must be CC vin or pubkey not same as vin pubkey, register and fund tx must be done from owner of pubkey that registers to oracle!!");
|
||||
else if ((*cp->ismyvin)(tx.vin[tx.vin.size()-1].scriptSig) == 1 && (myGetTransaction(tx.vin[tx.vin.size()-1].prevout.hash,tmptx,hashblock)==0 || DecodeOraclesOpRet(tmptx.vout[tmptx.vout.size()-1].scriptPubKey,txid,tmppk,amount)!='F'
|
||||
|| tmptx.vout[tx.vin[tx.vin.size()-1].prevout.n].nValue!=CC_MARKER_VALUE || !Getscriptaddress(vinaddress,tmptx.vout[tx.vin[tx.vin.size()-1].prevout.n].scriptPubKey)
|
||||
|| !GetCCaddress(cp,tmpaddress,tmppk) || strcmp(tmpaddress,vinaddress)!=0)
|
||||
return eval->Invalid("vin."+std::to_string(tx.vin.size()-1)+" is CC for oraclesregister or pubkey not same as vin pubkey, register must be done from owner of pubkey that registers to oracle!!");
|
||||
|| !GetCCaddress(cp,tmpaddress,tmppk) || strcmp(tmpaddress,vinaddress)!=0) || oracletxid!=txid)
|
||||
return eval->Invalid("invalid vin."+std::to_string(tx.vin.size()-1)+" for oraclesregister, it must be CC vin or pubkey not same as vin pubkey, register and fund tx must be done from owner of pubkey that registers to oracle!!");
|
||||
else if (CCtxidaddr(tmpaddress,oracletxid).IsValid() && ConstrainVout(tx.vout[0],0,tmpaddress,txfee)==0)
|
||||
return eval->Invalid("invalid marker for oraclesregister!");
|
||||
else if (!Getscriptaddress(tmpaddress,CScript() << ParseHex(HexStr(tmppk)) << OP_CHECKSIG) || ConstrainVout(tx.vout[2],0,tmpaddress,CC_MARKER_VALUE)==0)
|
||||
@@ -851,18 +857,20 @@ int64_t AddMyOraclesFunds(struct CCcontract_info *cp,CMutableTransaction &mtx,CP
|
||||
return (0);
|
||||
}
|
||||
|
||||
std::string OracleCreate(int64_t txfee,std::string name,std::string description,std::string format)
|
||||
UniValue OracleCreate(const CPubKey& pk, int64_t txfee,std::string name,std::string description,std::string format)
|
||||
{
|
||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||
CPubKey mypk,Oraclespk; struct CCcontract_info *cp,C; char fmt;
|
||||
CPubKey mypk,Oraclespk; struct CCcontract_info *cp,C; char fmt;
|
||||
|
||||
cp = CCinit(&C,EVAL_ORACLES);
|
||||
if ( name.size() > 32 || description.size() > 4096 || format.size() > 4096 )
|
||||
{
|
||||
CCerror = strprintf("name.%d or description.%d is too big",(int32_t)name.size(),(int32_t)description.size());
|
||||
fprintf(stderr,"%s\n", CCerror.c_str() );
|
||||
return("");
|
||||
}
|
||||
if ( name.size() > 32)
|
||||
CCERR_RESULT("oraclescc",CCLOG_INFO, stream << "name."<< (int32_t)name.size() << " must be less then 32");
|
||||
if (description.size() > 4096)
|
||||
CCERR_RESULT("oraclescc",CCLOG_INFO, stream << "description."<< (int32_t)description.size() << " must be less then 4096");
|
||||
if (format.size() > 4096 )
|
||||
CCERR_RESULT("oraclescc",CCLOG_INFO, stream << "format."<< (int32_t)format.size() << " must be less then 4096");
|
||||
if ( name.size() == 0 )
|
||||
CCERR_RESULT("oraclescc",CCLOG_INFO, stream << "name must not be empty");
|
||||
for(int i = 0; i < format.size(); i++)
|
||||
{
|
||||
fmt=format[i];
|
||||
@@ -872,154 +880,125 @@ std::string OracleCreate(int64_t txfee,std::string name,std::string description,
|
||||
case 'c': case 'C': case 't': case 'T':
|
||||
case 'i': case 'I': case 'l': case 'L':
|
||||
case 'h': break;
|
||||
default: CCerror = strprintf("invalid format type");
|
||||
fprintf(stderr,"%s\n", CCerror.c_str() );
|
||||
return("");
|
||||
default: CCERR_RESULT("oraclescc",CCLOG_INFO, stream << "invalid format type");
|
||||
}
|
||||
}
|
||||
if ( txfee == 0 )
|
||||
txfee = 10000;
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
Oraclespk = GetUnspendable(cp,0);
|
||||
if ( AddNormalinputs(mtx,mypk,2*txfee,3) > 0 )
|
||||
if ( AddNormalinputs(mtx,mypk,2*txfee,3,pk.IsValid()) > 0 )
|
||||
{
|
||||
mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(Oraclespk)) << OP_CHECKSIG));
|
||||
return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeOraclesCreateOpRet('C',name,description,format)));
|
||||
return(FinalizeCCTxExt(pk.IsValid(),0,cp,mtx,mypk,txfee,EncodeOraclesCreateOpRet('C',name,description,format)));
|
||||
}
|
||||
CCerror = strprintf("error adding normal inputs");
|
||||
fprintf(stderr,"%s\n", CCerror.c_str() );
|
||||
return("");
|
||||
CCERR_RESULT("oraclescc",CCLOG_INFO, stream << "error adding normal inputs");
|
||||
}
|
||||
|
||||
std::string OracleFund(int64_t txfee,uint256 oracletxid)
|
||||
UniValue OracleFund(const CPubKey& pk, int64_t txfee,uint256 oracletxid)
|
||||
{
|
||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||
CPubKey mypk,oraclespk; struct CCcontract_info *cp,C;
|
||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight()); CTransaction tx;
|
||||
CPubKey mypk,oraclespk; struct CCcontract_info *cp,C; std::string name,desc,format; int32_t numvouts; uint256 hashBlock;
|
||||
|
||||
if (GetLatestTimestamp(komodo_get_current_height())<PUBKEY_SPOOFING_FIX_ACTIVATION)
|
||||
{
|
||||
CCerror = strprintf("oraclesfund not active yet, activation scheduled for July 15th");
|
||||
fprintf(stderr,"%s\n", CCerror.c_str() );
|
||||
return("");
|
||||
}
|
||||
if (GetLatestTimestamp(komodo_currentheight())<PUBKEY_SPOOFING_FIX_ACTIVATION)
|
||||
CCERR_RESULT("oraclescc",CCLOG_INFO, stream << "oraclesfund not active yet, activation scheduled for July 15th");
|
||||
if (myGetTransaction(oracletxid,tx,hashBlock)==0 || (numvouts=tx.vout.size())<=0)
|
||||
CCERR_RESULT("oraclecc",CCLOG_INFO, stream << "cant find oracletxid " << oracletxid.GetHex());
|
||||
if (DecodeOraclesCreateOpRet(tx.vout[numvouts-1].scriptPubKey,name,desc,format)!='C')
|
||||
CCERR_RESULT("oraclecc",CCLOG_INFO, stream << "invalid oracletxid " << oracletxid.GetHex());
|
||||
cp = CCinit(&C,EVAL_ORACLES);
|
||||
if ( txfee == 0 )
|
||||
txfee = 10000;
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
if (AddNormalinputs(mtx,mypk,txfee+CC_MARKER_VALUE,2))
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
if (AddNormalinputs(mtx,mypk,txfee+CC_MARKER_VALUE,2,pk.IsValid()))
|
||||
{
|
||||
mtx.vout.push_back(MakeCC1vout(cp->evalcode,CC_MARKER_VALUE,mypk));
|
||||
return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeOraclesOpRet('F',oracletxid,mypk,CC_MARKER_VALUE)));
|
||||
return(FinalizeCCTxExt(pk.IsValid(),0,cp,mtx,mypk,txfee,EncodeOraclesOpRet('F',oracletxid,mypk,CC_MARKER_VALUE)));
|
||||
}
|
||||
CCerror = strprintf("error adding normal inputs");
|
||||
fprintf(stderr,"%s\n", CCerror.c_str() );
|
||||
return("");
|
||||
CCERR_RESULT("oraclescc",CCLOG_INFO, stream << "error adding normal inputs");
|
||||
}
|
||||
|
||||
std::string OracleRegister(int64_t txfee,uint256 oracletxid,int64_t datafee)
|
||||
UniValue OracleRegister(const CPubKey& pk, int64_t txfee,uint256 oracletxid,int64_t datafee)
|
||||
{
|
||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||
CPubKey mypk,markerpubkey,batonpk,oraclespk; struct CCcontract_info *cp,C; char markeraddr[64],batonaddr[64];
|
||||
std::string name,desc,format; int32_t numvouts; uint256 hashBlock; CTransaction tx;
|
||||
|
||||
cp = CCinit(&C,EVAL_ORACLES);
|
||||
if ( txfee == 0 )
|
||||
txfee = 10000;
|
||||
if (myGetTransaction(oracletxid,tx,hashBlock)==0 || (numvouts=tx.vout.size())<=0)
|
||||
CCERR_RESULT("oraclecc",CCLOG_INFO, stream << "cant find oracletxid " << oracletxid.GetHex());
|
||||
if (DecodeOraclesCreateOpRet(tx.vout[numvouts-1].scriptPubKey,name,desc,format)!='C')
|
||||
CCERR_RESULT("oraclecc",CCLOG_INFO, stream << "invalid oracletxid " << oracletxid.GetHex());
|
||||
if ( datafee < txfee )
|
||||
{
|
||||
CCerror = strprintf("datafee must be txfee or more");
|
||||
fprintf(stderr,"%s\n", CCerror.c_str() );
|
||||
return("");
|
||||
}
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
CCERR_RESULT("oraclescc",CCLOG_INFO, stream << "datafee must be txfee or more");
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
oraclespk = GetUnspendable(cp,0);
|
||||
batonpk = OracleBatonPk(batonaddr,cp);
|
||||
markerpubkey = CCtxidaddr(markeraddr,oracletxid);
|
||||
if (AddNormalinputs(mtx,mypk,3*txfee,4))
|
||||
if (AddNormalinputs(mtx,mypk,3*txfee,4,pk.IsValid()))
|
||||
{
|
||||
if (GetLatestTimestamp(komodo_get_current_height())>PUBKEY_SPOOFING_FIX_ACTIVATION && AddMyOraclesFunds(cp,mtx,mypk,oracletxid)!=CC_MARKER_VALUE)
|
||||
{
|
||||
CCerror = strprintf("error adding inputs from your Oracles CC address, please fund it first with oraclesfund rpc!");
|
||||
fprintf(stderr,"%s\n", CCerror.c_str() );
|
||||
return("");
|
||||
}
|
||||
if (GetLatestTimestamp(komodo_currentheight())>PUBKEY_SPOOFING_FIX_ACTIVATION && AddMyOraclesFunds(cp,mtx,mypk,oracletxid)!=CC_MARKER_VALUE)
|
||||
CCERR_RESULT("oraclescc",CCLOG_INFO, stream << "error adding inputs from your Oracles CC address, please fund it first with oraclesfund rpc!");
|
||||
mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(markerpubkey)) << OP_CHECKSIG));
|
||||
mtx.vout.push_back(MakeCC1vout(cp->evalcode,txfee,batonpk));
|
||||
if (GetLatestTimestamp(komodo_get_current_height())>PUBKEY_SPOOFING_FIX_ACTIVATION) mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG));
|
||||
return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeOraclesOpRet('R',oracletxid,mypk,datafee)));
|
||||
return(FinalizeCCTxExt(pk.IsValid(),0,cp,mtx,mypk,txfee,EncodeOraclesOpRet('R',oracletxid,mypk,datafee)));
|
||||
}
|
||||
CCerror = strprintf("error adding normal inputs");
|
||||
fprintf(stderr,"%s\n", CCerror.c_str() );
|
||||
return("");
|
||||
CCERR_RESULT("oraclescc",CCLOG_INFO, stream << "error adding normal inputs");
|
||||
}
|
||||
|
||||
std::string OracleSubscribe(int64_t txfee,uint256 oracletxid,CPubKey publisher,int64_t amount)
|
||||
UniValue OracleSubscribe(const CPubKey& pk, int64_t txfee,uint256 oracletxid,CPubKey publisher,int64_t amount)
|
||||
{
|
||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||
CPubKey mypk,markerpubkey; struct CCcontract_info *cp,C; char markeraddr[64];
|
||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight()); CTransaction tx;
|
||||
CPubKey mypk,markerpubkey; struct CCcontract_info *cp,C; char markeraddr[64]; std::string name,desc,format; int32_t numvouts; uint256 hashBlock;
|
||||
cp = CCinit(&C,EVAL_ORACLES);
|
||||
if ( txfee == 0 )
|
||||
txfee = 10000;
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
if (myGetTransaction(oracletxid,tx,hashBlock)==0 || (numvouts=tx.vout.size())<=0)
|
||||
CCERR_RESULT("oraclecc",CCLOG_INFO, stream << "cant find oracletxid " << oracletxid.GetHex());
|
||||
if (DecodeOraclesCreateOpRet(tx.vout[numvouts-1].scriptPubKey,name,desc,format)!='C')
|
||||
CCERR_RESULT("oraclecc",CCLOG_INFO, stream << "invalid oracletxid " << oracletxid.GetHex());
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
markerpubkey = CCtxidaddr(markeraddr,oracletxid);
|
||||
if ( AddNormalinputs(mtx,mypk,amount + 2*txfee,64) > 0 )
|
||||
if ( AddNormalinputs(mtx,mypk,amount + 2*txfee,64,pk.IsValid()) > 0 )
|
||||
{
|
||||
mtx.vout.push_back(MakeCC1vout(cp->evalcode,amount,publisher));
|
||||
mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(markerpubkey)) << OP_CHECKSIG));
|
||||
return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeOraclesOpRet('S',oracletxid,mypk,amount)));
|
||||
return(FinalizeCCTxExt(pk.IsValid(),0,cp,mtx,mypk,txfee,EncodeOraclesOpRet('S',oracletxid,mypk,amount)));
|
||||
}
|
||||
CCerror = strprintf("error adding normal inputs");
|
||||
fprintf(stderr,"%s\n", CCerror.c_str() );
|
||||
return("");
|
||||
CCERR_RESULT("oraclescc",CCLOG_INFO, stream << "error adding normal inputs");
|
||||
}
|
||||
|
||||
std::string OracleData(int64_t txfee,uint256 oracletxid,std::vector <uint8_t> data)
|
||||
UniValue OracleData(const CPubKey& pk, int64_t txfee,uint256 oracletxid,std::vector <uint8_t> data)
|
||||
{
|
||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||
CScript pubKey; CPubKey mypk,batonpk; int64_t offset,datafee,inputs,CCchange = 0; struct CCcontract_info *cp,C; uint256 batontxid,hashBlock;
|
||||
char coinaddr[64],batonaddr[64]; std::vector <uint8_t> prevdata; CTransaction tx; std::string name,description,format; int32_t len,numvouts;
|
||||
|
||||
cp = CCinit(&C,EVAL_ORACLES);
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
if ( data.size() > 8192 )
|
||||
{
|
||||
CCerror = strprintf("datasize %d is too big",(int32_t)data.size());
|
||||
fprintf(stderr,"%s\n", CCerror.c_str() );
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("oraclescc",CCLOG_INFO, stream << "datasize " << (int32_t)data.size() << " is too big");
|
||||
if ( (datafee= OracleDatafee(pubKey,oracletxid,mypk)) <= 0 )
|
||||
{
|
||||
CCerror = strprintf("datafee %.8f is illegal",(double)datafee/COIN);
|
||||
fprintf(stderr,"%s\n", CCerror.c_str() );
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("oraclescc",CCLOG_INFO, stream << "datafee " << (double)datafee/COIN << "is illegal");
|
||||
if ( myGetTransaction(oracletxid,tx,hashBlock) != 0 && (numvouts=tx.vout.size()) > 0 )
|
||||
{
|
||||
if ( DecodeOraclesCreateOpRet(tx.vout[numvouts-1].scriptPubKey,name,description,format) == 'C' )
|
||||
{
|
||||
if (oracle_parse_data_format(data,format)==0)
|
||||
{
|
||||
CCerror = strprintf("data does not match length or content format specification");
|
||||
fprintf(stderr,"%s\n", CCerror.c_str() );
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("oraclescc",CCLOG_INFO, stream << "data does not match length or content format specification");
|
||||
}
|
||||
else
|
||||
{
|
||||
CCerror = strprintf("invalid oracle txid opret data");
|
||||
fprintf(stderr,"%s\n", CCerror.c_str() );
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("oraclescc",CCLOG_INFO, stream << "invalid oracle txid opret data");
|
||||
}
|
||||
else
|
||||
{
|
||||
CCerror = strprintf("invalid oracle txid");
|
||||
fprintf(stderr,"%s\n", CCerror.c_str() );
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("oraclescc",CCLOG_INFO, stream << "invalid oracle txid");
|
||||
if ( txfee == 0 )
|
||||
txfee = 10000;
|
||||
GetCCaddress(cp,coinaddr,mypk);
|
||||
if ( AddNormalinputs(mtx,mypk,2*txfee,3) > 0 ) // have enough funds even if baton utxo not there
|
||||
if ( AddNormalinputs(mtx,mypk,2*txfee,3,pk.IsValid()) > 0 ) // have enough funds even if baton utxo not there
|
||||
{
|
||||
batonpk = OracleBatonPk(batonaddr,cp);
|
||||
batontxid = OracleBatonUtxo(txfee,cp,oracletxid,batonaddr,mypk,prevdata);
|
||||
@@ -1031,18 +1010,13 @@ std::string OracleData(int64_t txfee,uint256 oracletxid,std::vector <uint8_t> da
|
||||
if ( inputs > datafee )
|
||||
CCchange = (inputs - datafee);
|
||||
mtx.vout.push_back(MakeCC1vout(cp->evalcode,CCchange,mypk));
|
||||
mtx.vout.push_back(MakeCC1vout(cp->evalcode,txfee,batonpk));
|
||||
mtx.vout.push_back(MakeCC1vout(cp->evalcode,CC_MARKER_VALUE,batonpk));
|
||||
mtx.vout.push_back(CTxOut(datafee,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG));
|
||||
return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeOraclesData('D',oracletxid,batontxid,mypk,data)));
|
||||
} else {
|
||||
CCerror = strprintf("couldnt find enough oracle inputs %s, limit 1 per utxo\n",coinaddr);
|
||||
fprintf(stderr,"%s\n", CCerror.c_str() );
|
||||
}
|
||||
} else {
|
||||
CCerror = strprintf("couldnt add normal inputs");
|
||||
fprintf(stderr,"%s\n", CCerror.c_str() );
|
||||
return(FinalizeCCTxExt(pk.IsValid(),0,cp,mtx,mypk,txfee,EncodeOraclesData('D',oracletxid,batontxid,mypk,data)));
|
||||
} else
|
||||
CCERR_RESULT("oraclescc",CCLOG_INFO, stream << "couldnt find enough oracle inputs " << coinaddr << ", limit 1 per utxo");
|
||||
}
|
||||
return("");
|
||||
CCERR_RESULT("oraclescc",CCLOG_INFO, stream << "couldnt add normal inputs");
|
||||
}
|
||||
|
||||
UniValue OracleFormat(uint8_t *data,int32_t datalen,char *format,int32_t formatlen)
|
||||
@@ -1096,7 +1070,7 @@ UniValue OracleDataSample(uint256 reforacletxid,uint256 txid)
|
||||
UniValue OracleDataSamples(uint256 reforacletxid,char* batonaddr,int32_t num)
|
||||
{
|
||||
UniValue result(UniValue::VOBJ),b(UniValue::VARR); CTransaction tx,oracletx; uint256 txid,hashBlock,btxid,oracletxid;
|
||||
CPubKey pk; std::string name,description,format; int32_t numvouts,n=0,vout; std::vector<uint8_t> data; char *formatstr = 0;
|
||||
CPubKey pk; std::string name,description,format; int32_t numvouts,n=0,vout; std::vector<uint8_t> data; char *formatstr = 0, addr[64];
|
||||
std::vector<uint256> txids; int64_t nValue;
|
||||
|
||||
result.push_back(Pair("result","success"));
|
||||
@@ -1110,8 +1084,10 @@ UniValue OracleDataSamples(uint256 reforacletxid,char* batonaddr,int32_t num)
|
||||
{
|
||||
const CTransaction &txmempool = *it;
|
||||
const uint256 &hash = txmempool.GetHash();
|
||||
if ((numvouts=txmempool.vout.size())>0 && DecodeOraclesData(txmempool.vout[numvouts-1].scriptPubKey,oracletxid,btxid,pk,data) == 'D' && reforacletxid == oracletxid )
|
||||
if ((numvouts=txmempool.vout.size())>0 && txmempool.vout[1].nValue==CC_MARKER_VALUE && DecodeOraclesData(txmempool.vout[numvouts-1].scriptPubKey,oracletxid,btxid,pk,data) == 'D' && reforacletxid == oracletxid )
|
||||
{
|
||||
Getscriptaddress(addr,txmempool.vout[1].scriptPubKey);
|
||||
if (strcmp(addr,batonaddr)!=0) continue;
|
||||
if ( (formatstr= (char *)format.c_str()) == 0 )
|
||||
formatstr = (char *)"";
|
||||
UniValue a(UniValue::VOBJ);
|
||||
@@ -1119,7 +1095,10 @@ UniValue OracleDataSamples(uint256 reforacletxid,char* batonaddr,int32_t num)
|
||||
a.push_back(Pair("data",OracleFormat((uint8_t *)data.data(),(int32_t)data.size(),formatstr,(int32_t)format.size())));
|
||||
b.push_back(a);
|
||||
if ( ++n >= num && num != 0)
|
||||
break;
|
||||
{
|
||||
result.push_back(Pair("samples",b));
|
||||
return(result);
|
||||
}
|
||||
}
|
||||
}
|
||||
SetCCtxids(txids,batonaddr,true,EVAL_ORACLES,reforacletxid,'D');
|
||||
@@ -1130,7 +1109,7 @@ UniValue OracleDataSamples(uint256 reforacletxid,char* batonaddr,int32_t num)
|
||||
txid=*it;
|
||||
if (myGetTransaction(txid,tx,hashBlock) != 0 && (numvouts=tx.vout.size()) > 0 )
|
||||
{
|
||||
if ( DecodeOraclesData(tx.vout[numvouts-1].scriptPubKey,oracletxid,btxid,pk,data) == 'D' && reforacletxid == oracletxid )
|
||||
if ( tx.vout[1].nValue==CC_MARKER_VALUE && DecodeOraclesData(tx.vout[numvouts-1].scriptPubKey,oracletxid,btxid,pk,data) == 'D' && reforacletxid == oracletxid )
|
||||
{
|
||||
if ( (formatstr= (char *)format.c_str()) == 0 )
|
||||
formatstr = (char *)"";
|
||||
@@ -1139,13 +1118,20 @@ UniValue OracleDataSamples(uint256 reforacletxid,char* batonaddr,int32_t num)
|
||||
a.push_back(Pair("data",OracleFormat((uint8_t *)data.data(),(int32_t)data.size(),formatstr,(int32_t)format.size())));
|
||||
b.push_back(a);
|
||||
if ( ++n >= num && num != 0)
|
||||
break;
|
||||
{
|
||||
result.push_back(Pair("samples",b));
|
||||
return(result);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "invalid oracletxid " << oracletxid.GetHex());
|
||||
}
|
||||
else
|
||||
CCERR_RESULT("oraclescc",CCLOG_INFO, stream << "cant find oracletxid " << oracletxid.GetHex());
|
||||
result.push_back(Pair("samples",b));
|
||||
return(result);
|
||||
}
|
||||
@@ -1216,7 +1202,11 @@ UniValue OracleInfo(uint256 origtxid)
|
||||
}
|
||||
result.push_back(Pair("registered",a));
|
||||
}
|
||||
else
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "invalid oracletxid " << oracletxid.GetHex());
|
||||
}
|
||||
else
|
||||
CCERR_RESULT("oraclescc",CCLOG_INFO, stream << "cant find oracletxid " << oracletxid.GetHex());
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
@@ -89,6 +89,13 @@ int64_t mpz_get_si2( mpz_t op )
|
||||
return ret;
|
||||
}
|
||||
|
||||
uint64_t mpz_get_ui2( mpz_t op )
|
||||
{
|
||||
uint64_t ret = 0;
|
||||
mpz_export(&ret, NULL, 1, sizeof(ret), 0, 0, op);
|
||||
return ret;
|
||||
}
|
||||
|
||||
CScript EncodePaymentsTxidOpRet(int64_t allocation,std::vector<uint8_t> scriptPubKey,std::vector<uint8_t> destopret)
|
||||
{
|
||||
CScript opret; uint8_t evalcode = EVAL_PAYMENTS;
|
||||
|
||||
500
src/cc/pegs.cpp
500
src/cc/pegs.cpp
@@ -16,6 +16,8 @@
|
||||
#include "CCPegs.h"
|
||||
#include "../importcoin.h"
|
||||
#include "key_io.h"
|
||||
#include <gmp.h>
|
||||
|
||||
|
||||
/*
|
||||
pegs CC is able to create a coin backed (by any supported coin with gateways CC deposits) and pegged to any synthetic price that is able to be calculated based on prices CC
|
||||
@@ -88,9 +90,10 @@ pegs CC is able to create a coin backed (by any supported coin with gateways CC
|
||||
// start of consensus code
|
||||
#ifndef PEGS_THRESHOLDS
|
||||
#define PEGS_THRESHOLDS
|
||||
#define PEGS_ACCOUNT_MAX_DEBT 80
|
||||
#define PEGS_GLOBAL_RED_ZONE 60
|
||||
#define PEGS_ACCOUNT_YELLOW_ZONE 60
|
||||
#define PEGS_ACCOUNT_THRESHOLD 90
|
||||
#define PEGS_GLOBAL_THRESHOLD 60
|
||||
#define PEGS_ACCOUNT_RED_ZONE 90
|
||||
#endif // PEGS_THRESHOLDS
|
||||
#define CC_MARKER_VALUE 10000
|
||||
|
||||
@@ -99,6 +102,8 @@ extern uint64_t ASSETCHAINS_PEGSCCPARAMS[3];
|
||||
extern uint8_t DecodeGatewaysBindOpRet(char *depositaddr,const CScript &scriptPubKey,uint256 &tokenid,std::string &coin,int64_t &totalsupply,uint256 &oracletxid,uint8_t &M,uint8_t &N,std::vector<CPubKey> &gatewaypubkeys,uint8_t &taddr,uint8_t &prefix,uint8_t &prefix2,uint8_t &wiftype);
|
||||
extern int64_t GetTokenBalance(CPubKey pk, uint256 tokenid);
|
||||
extern int32_t komodo_currentheight();
|
||||
extern int32_t prices_syntheticvec(std::vector<uint16_t> &vec, std::vector<std::string> synthetic);
|
||||
extern int64_t prices_syntheticprice(std::vector<uint16_t> vec, int32_t height, int32_t minmax, int16_t leverage);
|
||||
|
||||
CScript EncodePegsCreateOpRet(std::vector<uint256> bindtxids)
|
||||
{
|
||||
@@ -512,21 +517,17 @@ char PegsFindAccount(struct CCcontract_info *cp,CPubKey pk,uint256 pegstxid, uin
|
||||
else return(0);
|
||||
}
|
||||
|
||||
double PegsGetTokenPrice(uint256 tokenid)
|
||||
int64_t PegsGetTokenPrice(uint256 tokenid)
|
||||
{
|
||||
int64_t *tokensyn,*btcusd; double price; CTransaction tokentx; uint256 hashBlock;
|
||||
int64_t price; CTransaction tokentx; uint256 hashBlock; std::vector<uint16_t> exp;
|
||||
std::string name,desc; std::vector<uint8_t> vorigpubkey; int32_t numvouts;
|
||||
|
||||
if (myGetTransaction(tokenid,tokentx,hashBlock)!=0 && (numvouts=tokentx.vout.size())>0 && DecodeTokenCreateOpRet(tokentx.vout[numvouts-1].scriptPubKey,vorigpubkey,name,desc)=='c')
|
||||
{
|
||||
tokensyn = (int64_t *)calloc(sizeof(*tokensyn) * 3, 1 + PRICES_DAYWINDOW * 2 + PRICES_SMOOTHWIDTH);
|
||||
btcusd = (int64_t *)calloc(sizeof(*btcusd) * 3, 1 + PRICES_DAYWINDOW * 2 + PRICES_SMOOTHWIDTH);
|
||||
if (komodo_priceget(tokensyn, komodo_priceind((name+"_BTC").c_str()), komodo_currentheight(), 1) >= 0 && komodo_priceget(btcusd, komodo_priceind("BTC_USD"), komodo_currentheight(), 1) >= 0)
|
||||
{
|
||||
price=tokensyn[2]*btcusd[2];
|
||||
price=price/COIN/COIN;
|
||||
std::vector<std::string> vexpr;
|
||||
SplitStr(desc, vexpr);
|
||||
if (prices_syntheticvec(exp, vexpr)>=0 && (price = prices_syntheticprice(exp, komodo_currentheight(), 0, 1))>=0)
|
||||
return (price);
|
||||
}
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
@@ -544,6 +545,34 @@ std::string PegsGetTokenName(uint256 tokenid)
|
||||
return("");
|
||||
}
|
||||
|
||||
int64_t PegsGetTokensAmountPerPrice(int64_t amount,uint256 tokenid)
|
||||
{
|
||||
mpz_t res,a,b;
|
||||
mpz_init(res);
|
||||
mpz_init(a);
|
||||
mpz_init(b);
|
||||
mpz_set_si(a, amount);
|
||||
mpz_set_si(b, COIN);
|
||||
mpz_mul(res, a, b);
|
||||
mpz_set_si(a, PegsGetTokenPrice(tokenid));
|
||||
mpz_tdiv_q(res, res, a);
|
||||
return (mpz_get_si(res));
|
||||
}
|
||||
|
||||
double PegsGetRatio(uint256 tokenid,std::pair<int64_t,int64_t> account)
|
||||
{
|
||||
mpz_t res,a,b;
|
||||
mpz_init(res);
|
||||
mpz_init(a);
|
||||
mpz_init(b);
|
||||
mpz_set_si(a, account.first);
|
||||
mpz_set_si(b, PegsGetTokenPrice(tokenid));
|
||||
mpz_mul(res, a, b);
|
||||
mpz_set_si(a, COIN);
|
||||
mpz_tdiv_q(res, res, a);
|
||||
return ((double)account.second)*100/mpz_get_si(res);
|
||||
}
|
||||
|
||||
double PegsGetAccountRatio(uint256 pegstxid,uint256 tokenid,uint256 accounttxid)
|
||||
{
|
||||
int64_t amount; uint256 hashBlock,tmptokenid,tmppegstxid;
|
||||
@@ -555,7 +584,7 @@ double PegsGetAccountRatio(uint256 pegstxid,uint256 tokenid,uint256 accounttxid)
|
||||
(funcid=DecodePegsOpRet(tx,tmppegstxid,tmptokenid))!=0 && pegstxid==tmppegstxid && tokenid==tmptokenid)
|
||||
{
|
||||
PegsDecodeAccountTx(tx,pk,amount,account);
|
||||
return ((double)account.second*100/(account.first*PegsGetTokenPrice(tokenid)));
|
||||
return PegsGetRatio(tokenid,account);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
@@ -565,7 +594,7 @@ double PegsGetGlobalRatio(uint256 pegstxid)
|
||||
char coinaddr[64]; int64_t nValue,amount,globaldebt=0; uint256 txid,accounttxid,hashBlock,tmppegstxid,tokenid;
|
||||
CTransaction tx; int32_t numvouts,vout; char funcid; CPubKey mypk,pegspk,pk;
|
||||
std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > unspentOutputs; std::pair<int64_t,int64_t> account;
|
||||
std::map<uint256,std::pair<int64_t,int64_t>> globalaccounts; double globaldeposit=0;
|
||||
std::map<uint256,std::pair<int64_t,int64_t>> globalaccounts;
|
||||
struct CCcontract_info *cp,C;
|
||||
|
||||
cp = CCinit(&C,EVAL_PEGS);
|
||||
@@ -598,12 +627,29 @@ double PegsGetGlobalRatio(uint256 pegstxid)
|
||||
globalaccounts[tokenid].first+=nValue;
|
||||
}
|
||||
}
|
||||
mpz_t res,globaldeposit,a,b;
|
||||
mpz_init(res);
|
||||
mpz_init(globaldeposit);
|
||||
mpz_init(a);
|
||||
mpz_init(b);
|
||||
mpz_set_si(globaldeposit, 0);
|
||||
for (std::map<uint256,std::pair<int64_t,int64_t>>::iterator it = globalaccounts.begin(); it != globalaccounts.end(); ++it)
|
||||
{
|
||||
globaldeposit+=globalaccounts[it->first].first*PegsGetTokenPrice(it->first);
|
||||
mpz_set_si(res, 0);
|
||||
mpz_set_si(a, globalaccounts[it->first].first);
|
||||
mpz_set_si(b, PegsGetTokenPrice(it->first));
|
||||
mpz_mul(res,a,b);
|
||||
mpz_add(globaldeposit,globaldeposit,res);
|
||||
globaldebt+=globalaccounts[it->first].second;
|
||||
}
|
||||
if (globaldebt>0) return ((double)globaldebt*100/globaldeposit);
|
||||
if (globaldebt>0)
|
||||
{
|
||||
mpz_set_si(res, 0);
|
||||
mpz_set_si(a, COIN);
|
||||
mpz_tdiv_q(res, globaldeposit, a);
|
||||
printf("%lu %lu\n",globaldebt,mpz_get_si(res));
|
||||
return ((double)globaldebt)*100/mpz_get_si(res);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
@@ -643,7 +689,7 @@ std::string PegsFindBestAccount(struct CCcontract_info *cp,uint256 pegstxid, uin
|
||||
else return("");
|
||||
}
|
||||
|
||||
std::string PegsCreate(uint64_t txfee,int64_t amount, std::vector<uint256> bindtxids)
|
||||
UniValue PegsCreate(const CPubKey& pk,uint64_t txfee,int64_t amount, std::vector<uint256> bindtxids)
|
||||
{
|
||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||
CPubKey mypk,pegspk; struct CCcontract_info *cp,C; CTransaction tx; int32_t numvouts; int64_t totalsupply; std::string coin;
|
||||
@@ -652,34 +698,24 @@ std::string PegsCreate(uint64_t txfee,int64_t amount, std::vector<uint256> bindt
|
||||
cp = CCinit(&C,EVAL_PEGS);
|
||||
if ( txfee == 0 )
|
||||
txfee = 10000;
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
pegspk = GetUnspendable(cp,0);
|
||||
for(auto txid : bindtxids)
|
||||
{
|
||||
if (myGetTransaction(txid,tx,hashBlock)==0 || (numvouts=tx.vout.size())<=0)
|
||||
{
|
||||
CCerror = strprintf("cant find bindtxid %s",txid.GetHex());
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "cant find bindtxid " << txid.GetHex());
|
||||
if (DecodeGatewaysBindOpRet(depositaddr,tx.vout[numvouts-1].scriptPubKey,tmptokenid,coin,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2,wiftype)!='B')
|
||||
{
|
||||
CCerror = strprintf("invalid bindtxid %s",txid.GetHex());
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "invalid bindtxid " << txid.GetHex());
|
||||
}
|
||||
if ( AddNormalinputs(mtx,mypk,amount,64) >= amount )
|
||||
if ( AddNormalinputs(mtx,mypk,amount,64,pk.IsValid()) >= amount )
|
||||
{
|
||||
for (int i=0; i<100; i++) mtx.vout.push_back(MakeCC1vout(EVAL_PEGS,(amount-txfee)/100,pegspk));
|
||||
return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodePegsCreateOpRet(bindtxids)));
|
||||
return(FinalizeCCTxExt(pk.IsValid(),0,cp,mtx,mypk,txfee,EncodePegsCreateOpRet(bindtxids)));
|
||||
}
|
||||
CCerror = strprintf("error adding normal inputs");
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "error adding normal inputs");
|
||||
}
|
||||
|
||||
std::string PegsFund(uint64_t txfee,uint256 pegstxid, uint256 tokenid,int64_t amount)
|
||||
UniValue PegsFund(const CPubKey& pk,uint64_t txfee,uint256 pegstxid, uint256 tokenid,int64_t amount)
|
||||
{
|
||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight()); std::string coin;
|
||||
CTransaction pegstx,tx; int32_t numvouts; int64_t totalsupply,balance=0,funds=0,tokenfunds=0; uint256 accounttxid=zeroid,hashBlock,txid,tmptokenid,oracletxid;
|
||||
@@ -690,35 +726,18 @@ std::string PegsFund(uint64_t txfee,uint256 pegstxid, uint256 tokenid,int64_t am
|
||||
cpTokens = CCinit(&CTokens,EVAL_TOKENS);
|
||||
if ( txfee == 0 )
|
||||
txfee = 10000;
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
pegspk = GetUnspendable(cp,0);
|
||||
if (myGetTransaction(pegstxid,tx,hashBlock)==0 || (numvouts=tx.vout.size())<=0)
|
||||
{
|
||||
CCerror = strprintf("cant find pegstxid %s",pegstxid.GetHex());
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "cant find pegstxid " << pegstxid.GetHex());
|
||||
if (DecodePegsCreateOpRet(tx.vout[numvouts-1].scriptPubKey,bindtxids)!='C')
|
||||
{
|
||||
CCerror = strprintf("invalid pegstxid ",pegstxid.GetHex());
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "invalid pegstxid " << pegstxid.GetHex());
|
||||
for(auto txid : bindtxids)
|
||||
{
|
||||
if (myGetTransaction(txid,tx,hashBlock)==0 || (numvouts=tx.vout.size())<=0)
|
||||
{
|
||||
CCerror = strprintf("cant find bindtxid %s",txid.GetHex());
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "cant find bindtxid " << txid.GetHex());
|
||||
if (DecodeGatewaysBindOpRet(depositaddr,tx.vout[numvouts-1].scriptPubKey,tmptokenid,coin,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2,wiftype)!='B')
|
||||
{
|
||||
CCerror = strprintf("invalid bindtxid %s",txid.GetHex());
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "invalid bindtxid " << txid.GetHex());
|
||||
if (tmptokenid==tokenid)
|
||||
{
|
||||
found=true;
|
||||
@@ -726,21 +745,13 @@ std::string PegsFund(uint64_t txfee,uint256 pegstxid, uint256 tokenid,int64_t am
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
{
|
||||
CCerror = strprintf("invalid tokenid ",tokenid.GetHex());
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "invalid tokenid " << tokenid.GetHex());
|
||||
if ((balance=GetTokenBalance(mypk,tokenid))>=amount)
|
||||
{
|
||||
PegsFindAccount(cp,mypk,pegstxid,tokenid,accounttxid,account);
|
||||
LOGSTREAM("pegscc",CCLOG_DEBUG2, stream << "current accounttxid=" << accounttxid.GetHex() << " [deposit=" << account.first << ",debt=" << account.second << "]" << std::endl);
|
||||
if (accounttxid!=zeroid && myIsutxo_spentinmempool(ignoretxid,ignorevin,accounttxid,1) != 0)
|
||||
{
|
||||
CCerror = strprintf("previous account tx not yet confirmed");
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "previous account tx not yet confirmed");
|
||||
if (accounttxid!=zeroid && (funds=AddPegsInputs(cp,mtx,pegspk,CPubKey(),txfee,1))>=txfee)
|
||||
{
|
||||
funds+=2*CC_MARKER_VALUE;
|
||||
@@ -763,23 +774,16 @@ std::string PegsFund(uint64_t txfee,uint256 pegstxid, uint256 tokenid,int64_t am
|
||||
if (funds>txfee+2*CC_MARKER_VALUE) mtx.vout.push_back(MakeCC1vout(EVAL_PEGS,funds-(txfee+2*CC_MARKER_VALUE),pegspk));
|
||||
account.first+=amount;
|
||||
LOGSTREAM("pegscc",CCLOG_DEBUG2, stream << "new account [deposit=" << account.first << ",debt=" << account.second << "]" << std::endl);
|
||||
return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodePegsFundOpRet(tokenid,pegstxid,mypk,amount,account)));
|
||||
return(FinalizeCCTxExt(pk.IsValid(),0,cp,mtx,mypk,txfee,EncodePegsFundOpRet(tokenid,pegstxid,mypk,amount,account)));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
CCerror = strprintf("not enough balance in pegs global CC address");
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream <<"not enough balance in pegs global CC address");
|
||||
}
|
||||
CCerror = strprintf("not enough balance (%lld) for this amount of tokens %lld",balance,amount);
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "not enough balance (" << balance << ") for this amount of tokens " << amount);
|
||||
}
|
||||
|
||||
std::string PegsGet(uint64_t txfee,uint256 pegstxid, uint256 tokenid, int64_t amount)
|
||||
UniValue PegsGet(const CPubKey& pk,uint64_t txfee,uint256 pegstxid, uint256 tokenid, int64_t amount)
|
||||
{
|
||||
CMutableTransaction burntx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight()),mtx;
|
||||
CTransaction pegstx,tx; int32_t numvouts; int64_t funds=0; uint256 accounttxid=zeroid,hashBlock,pricestxid; char coinaddr[64];
|
||||
@@ -789,32 +793,16 @@ std::string PegsGet(uint64_t txfee,uint256 pegstxid, uint256 tokenid, int64_t am
|
||||
cp = CCinit(&C,EVAL_PEGS);
|
||||
if ( txfee == 0 )
|
||||
txfee = 10000;
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
pegspk = GetUnspendable(cp,0);
|
||||
if (myGetTransaction(pegstxid,tx,hashBlock)==0 || (numvouts=tx.vout.size())<=0)
|
||||
{
|
||||
CCerror = strprintf("cant find pegstxid %s",pegstxid.GetHex());
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "cant find pegstxid " << pegstxid.GetHex());
|
||||
if (DecodePegsCreateOpRet(tx.vout[numvouts-1].scriptPubKey,bindtxids)!='C')
|
||||
{
|
||||
CCerror = strprintf("invalid pegstxid ",pegstxid.GetHex());
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "invalid pegstxid " << pegstxid.GetHex());
|
||||
if (PegsFindAccount(cp,mypk,pegstxid,tokenid,accounttxid,account)==0)
|
||||
{
|
||||
CCerror = strprintf("cannot find account from which to issue coins, fund account first with pegsfund!");
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "cannot find account from which to issue coins, fund account first with pegsfund!");
|
||||
if (accounttxid!=zeroid && myIsutxo_spentinmempool(ignoretxid,ignorevin,accounttxid,1) != 0)
|
||||
{
|
||||
CCerror = strprintf("previous account tx not yet confirmed");
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "previous account tx not yet confirmed");
|
||||
LOGSTREAM("pegscc",CCLOG_DEBUG2, stream << "current accounttxid=" << accounttxid.GetHex() << " [deposit=" << account.first << ",debt=" << account.second << "]" << std::endl);
|
||||
// spending markers
|
||||
vouts.push_back(MakeCC1of2vout(EVAL_PEGS,CC_MARKER_VALUE,pegspk,pegspk));
|
||||
@@ -822,6 +810,12 @@ std::string PegsGet(uint64_t txfee,uint256 pegstxid, uint256 tokenid, int64_t am
|
||||
// coin issue
|
||||
vouts.push_back(CTxOut(amount,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG));
|
||||
account.second+=amount;
|
||||
if (PegsGetRatio(tokenid,account)>PEGS_ACCOUNT_MAX_DEBT)
|
||||
{
|
||||
CCerror = strprintf("not possible to take more than %d%% of the deposit",PEGS_ACCOUNT_MAX_DEBT);
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
LOGSTREAM("pegscc",CCLOG_DEBUG2, stream << "new account [deposit=" << account.first << ",debt=" << account.second << "]" << std::endl);
|
||||
// burn tx does not exist in pegs method but it must be created in order for import validation to pass
|
||||
// fictive burntx input of previous account state tx
|
||||
@@ -836,12 +830,12 @@ std::string PegsGet(uint64_t txfee,uint256 pegstxid, uint256 tokenid, int64_t am
|
||||
Myprivkey(mypriv);
|
||||
GetCCaddress1of2(cp,coinaddr,mypk,pegspk);
|
||||
CCaddr1of2set(cp,mypk,pegspk,mypriv,coinaddr);
|
||||
std::string retstr = FinalizeCCTx(0,cp,mtx,mypk,txfee,opret);
|
||||
UniValue retstr = FinalizeCCTxExt(pk.IsValid(),0,cp,mtx,mypk,txfee,opret);
|
||||
memset(mypriv,0,sizeof(mypriv));
|
||||
return(retstr);
|
||||
}
|
||||
|
||||
std::string PegsRedeem(uint64_t txfee,uint256 pegstxid, uint256 tokenid)
|
||||
UniValue PegsRedeem(const CPubKey& pk,uint64_t txfee,uint256 pegstxid, uint256 tokenid)
|
||||
{
|
||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight()); std::string coin;
|
||||
CTransaction pegstx,tx; int32_t numvouts; int64_t totalsupply,pegsfunds=0,funds=0,tokenfunds=0,amount; uint256 accounttxid=zeroid,hashBlock,txid,tmptokenid,oracletxid;
|
||||
@@ -852,34 +846,18 @@ std::string PegsRedeem(uint64_t txfee,uint256 pegstxid, uint256 tokenid)
|
||||
cpTokens = CCinit(&CTokens,EVAL_TOKENS);
|
||||
if ( txfee == 0 )
|
||||
txfee = 10000;
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
pegspk = GetUnspendable(cp,0);
|
||||
if (myGetTransaction(pegstxid,tx,hashBlock)==0 || (numvouts=tx.vout.size())<=0)
|
||||
{
|
||||
CCerror = strprintf("cant find pegstxid %s",pegstxid.GetHex());
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "cant find pegstxid " << pegstxid.GetHex());
|
||||
if (DecodePegsCreateOpRet(tx.vout[numvouts-1].scriptPubKey,bindtxids)!='C')
|
||||
{
|
||||
CCerror = strprintf("invalid pegstxid ",pegstxid.GetHex());
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "invalid pegstxid " << pegstxid.GetHex());
|
||||
for(auto txid : bindtxids)
|
||||
{
|
||||
if (myGetTransaction(txid,tx,hashBlock)==0 || (numvouts=tx.vout.size())<=0)
|
||||
{
|
||||
CCerror = strprintf("cant find bindtxid %s",txid.GetHex());
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "cant find bindtxid " << txid.GetHex());
|
||||
if (DecodeGatewaysBindOpRet(depositaddr,tx.vout[numvouts-1].scriptPubKey,tmptokenid,coin,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2,wiftype)!='B')
|
||||
{
|
||||
CCerror = strprintf("invalid bindtxid %s",txid.GetHex());
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "invalid bindtxid " << txid.GetHex());
|
||||
if (tmptokenid==tokenid)
|
||||
{
|
||||
found=true;
|
||||
@@ -887,25 +865,13 @@ std::string PegsRedeem(uint64_t txfee,uint256 pegstxid, uint256 tokenid)
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
{
|
||||
CCerror = strprintf("invalid tokenid ",tokenid.GetHex());
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "invalid tokenid " << tokenid.GetHex());
|
||||
if (PegsFindAccount(cp,mypk,pegstxid,tokenid,accounttxid,account)==0)
|
||||
{
|
||||
CCerror = strprintf("cannot find account from which to redeem tokens!");
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "cannot find account from which to redeem tokens!");
|
||||
if (accounttxid!=zeroid && myIsutxo_spentinmempool(ignoretxid,ignorevin,accounttxid,1) != 0)
|
||||
{
|
||||
CCerror = strprintf("previous account tx not yet confirmed");
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "previous account tx not yet confirmed");
|
||||
LOGSTREAM("pegscc",CCLOG_DEBUG2, stream << "current accounttxid=" << accounttxid.GetHex() << " [deposit=" << account.first << ",debt=" << account.second << "]" << std::endl);
|
||||
if ((funds=AddNormalinputs(mtx,mypk,account.second,64))>=account.second )
|
||||
if ((funds=AddNormalinputs(mtx,mypk,account.second,64,pk.IsValid()))>=account.second )
|
||||
{
|
||||
if (accounttxid!=zeroid && (pegsfunds=AddPegsInputs(cp,mtx,pegspk,CPubKey(),txfee,1))>=txfee)
|
||||
{
|
||||
@@ -928,39 +894,31 @@ std::string PegsRedeem(uint64_t txfee,uint256 pegstxid, uint256 tokenid)
|
||||
account.first=0;
|
||||
account.second=0;
|
||||
LOGSTREAM("pegscc",CCLOG_DEBUG2, stream << "new account [deposit=" << account.first << ",debt=" << account.second << "]" << std::endl);
|
||||
std::string retstr = FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodePegsReedemOpRet(tokenid,pegstxid,mypk,amount,account));
|
||||
UniValue retstr = FinalizeCCTxExt(pk.IsValid(),0,cp,mtx,mypk,txfee,EncodePegsReedemOpRet(tokenid,pegstxid,mypk,amount,account));
|
||||
memset(mypriv,0,32);
|
||||
return(retstr);
|
||||
}
|
||||
else
|
||||
{
|
||||
CCerror = strprintf("not enough balance in pegs global CC address");
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
memset(mypriv,0,32);
|
||||
return("");
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "not enough balance in pegs global CC address");
|
||||
}
|
||||
}
|
||||
CCerror = strprintf("not enough tokens in pegs account (%lld) to redeem this amount of tokens %lld",tokenfunds,account.first);
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
memset(mypriv,0,32);
|
||||
return("");
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "not enough tokens in pegs account (" << tokenfunds << ") to redeem this amount of tokens " << account.first);
|
||||
}
|
||||
else
|
||||
{
|
||||
CCerror = strprintf("not enough balance in pegs global CC address");
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
memset(mypriv,0,32);
|
||||
return("");
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "not enough balance in pegs global CC address");
|
||||
}
|
||||
}
|
||||
CCerror = strprintf("to redeem from account and close it you must redeem full debt ammount %lld instead of %lld",account.second,funds);
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
memset(mypriv,0,32);
|
||||
return("");
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "to redeem from account and close it you must redeem full debt ammount " << account.second << " instead of " << funds);
|
||||
}
|
||||
|
||||
|
||||
std::string PegsExchange(uint64_t txfee,uint256 pegstxid, uint256 tokenid, int64_t amount)
|
||||
UniValue PegsExchange(const CPubKey& pk,uint64_t txfee,uint256 pegstxid, uint256 tokenid, int64_t amount)
|
||||
{
|
||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight()); std::string coin;
|
||||
CTransaction pegstx,tx; int32_t numvouts; int64_t totalsupply,pegsfunds=0,funds=0,tokenfunds=0,tokenamount,tmpamount; uint256 accounttxid=zeroid,hashBlock,txid,tmptokenid,oracletxid;
|
||||
@@ -971,34 +929,18 @@ std::string PegsExchange(uint64_t txfee,uint256 pegstxid, uint256 tokenid, int64
|
||||
cpTokens = CCinit(&CTokens,EVAL_TOKENS);
|
||||
if ( txfee == 0 )
|
||||
txfee = 10000;
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
pegspk = GetUnspendable(cp,0);
|
||||
if (myGetTransaction(pegstxid,tx,hashBlock)==0 || (numvouts=tx.vout.size())<=0)
|
||||
{
|
||||
CCerror = strprintf("cant find pegstxid %s",pegstxid.GetHex());
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "cant find pegstxid " << pegstxid.GetHex());
|
||||
if (DecodePegsCreateOpRet(tx.vout[numvouts-1].scriptPubKey,bindtxids)!='C')
|
||||
{
|
||||
CCerror = strprintf("invalid pegstxid ",pegstxid.GetHex());
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "invalid pegstxid " << pegstxid.GetHex());
|
||||
for(auto txid : bindtxids)
|
||||
{
|
||||
if (myGetTransaction(txid,tx,hashBlock)==0 || (numvouts=tx.vout.size())<=0)
|
||||
{
|
||||
CCerror = strprintf("cant find bindtxid %s",txid.GetHex());
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "cant find bindtxid " << txid.GetHex());
|
||||
if (DecodeGatewaysBindOpRet(depositaddr,tx.vout[numvouts-1].scriptPubKey,tmptokenid,coin,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2,wiftype)!='B')
|
||||
{
|
||||
CCerror = strprintf("invalid bindtxid %s",txid.GetHex());
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "invalid bindtxid " << txid.GetHex());
|
||||
if (tmptokenid==tokenid)
|
||||
{
|
||||
found=true;
|
||||
@@ -1006,43 +948,23 @@ std::string PegsExchange(uint64_t txfee,uint256 pegstxid, uint256 tokenid, int64
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
{
|
||||
CCerror = strprintf("invalid tokenid ",tokenid.GetHex());
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "invalid tokenid " << tokenid.GetHex());
|
||||
if (PegsFindAccount(cp,mypk,pegstxid,tokenid,accounttxid,account)!=0)
|
||||
{
|
||||
CCerror = strprintf("you have active account, please close account first before exchanging other coins!");
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
if ((funds=AddNormalinputs(mtx,mypk,amount,64))>=amount )
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "you have active account, please close account first before exchanging other coins!");
|
||||
if ((funds=AddNormalinputs(mtx,mypk,amount,64,pk.IsValid()))>=amount )
|
||||
{
|
||||
if ((pegsfunds=AddPegsInputs(cp,mtx,pegspk,CPubKey(),txfee,1))>=txfee)
|
||||
{
|
||||
tokenamount=amount/PegsGetTokenPrice(tokenid);
|
||||
tokenamount=PegsGetTokensAmountPerPrice(amount,tokenid);
|
||||
tokenfunds=AddPegsTokenInputs(cp,mtx,pegstxid,tokenid,pegspk,CPubKey(),tokenamount,64);
|
||||
if (tokenfunds<tokenamount)
|
||||
{
|
||||
if (PegsFindBestAccount(cp,pegstxid,tokenid,tokenamount-tokenfunds,accounttxid,account).empty())
|
||||
{
|
||||
CCerror = strprintf("cannot find account from which to get tokens for exchange!");
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "cannot find account from which to get tokens for exchange!");
|
||||
if (accounttxid!=zeroid && myGetTransaction(accounttxid,tx,hashBlock)==0 || (numvouts=tx.vout.size())<=0 || PegsDecodeAccountTx(tx,tmppk,tmpamount,account).empty())
|
||||
{
|
||||
CCerror = strprintf("invalid account tx from which to exchange coins to tokens %s!",accounttxid.GetHex());
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "invalid account tx from which to exchange coins to tokens " << accounttxid.GetHex());
|
||||
if (accounttxid!=zeroid && myIsutxo_spentinmempool(ignoretxid,ignorevin,accounttxid,1) != 0)
|
||||
{
|
||||
CCerror = strprintf("previous account tx not yet confirmed");
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "previous account tx not yet confirmed");
|
||||
tokenfunds+=AddPegsTokenInputs(cp,mtx,pegstxid,tokenid,tmppk,pegspk,tokenamount,64);
|
||||
mtx.vin.push_back(CTxIn(accounttxid,0,CScript()));
|
||||
mtx.vin.push_back(CTxIn(accounttxid,1,CScript()));
|
||||
@@ -1070,35 +992,23 @@ std::string PegsExchange(uint64_t txfee,uint256 pegstxid, uint256 tokenid, int64
|
||||
}
|
||||
else if (pegsfunds>txfee) mtx.vout.push_back(MakeCC1vout(EVAL_PEGS,pegsfunds-txfee,pegspk));
|
||||
LOGSTREAM("pegscc",CCLOG_DEBUG2, stream << "modified account [deposit=" << account.first << ",debt=" << account.second << "]" << std::endl);
|
||||
return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodePegsExchangeOpRet(tokenid,pegstxid,mypk,tmppk,amount,account)));
|
||||
return(FinalizeCCTxExt(pk.IsValid(),0,cp,mtx,mypk,txfee,EncodePegsExchangeOpRet(tokenid,pegstxid,mypk,tmppk,amount,account)));
|
||||
}
|
||||
else
|
||||
{
|
||||
CCerror = strprintf("not enough balance in pegs global CC address");
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "not enough balance in pegs global CC address");
|
||||
}
|
||||
CCerror = strprintf("not enough tokens in pegs account (%lld) to exchange to this amount of tokens %lld",tokenfunds,tokenamount);
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "not enough tokens in pegs account (" << tokenfunds << ") to exchange to this amount of tokens " << tokenamount);
|
||||
}
|
||||
else
|
||||
{
|
||||
CCerror = strprintf("not enough balance in pegs global CC address");
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "not enough balance in pegs global CC address");
|
||||
}
|
||||
CCerror = strprintf("not enough funds to exchange %lld coins to tokens - balance %lld",amount,funds);
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "not enough funds to exchange " << amount << " coins to tokens - balance " << funds);
|
||||
}
|
||||
|
||||
std::string PegsLiquidate(uint64_t txfee,uint256 pegstxid, uint256 tokenid, uint256 liquidatetxid)
|
||||
UniValue PegsLiquidate(const CPubKey& pk,uint64_t txfee,uint256 pegstxid, uint256 tokenid, uint256 liquidatetxid)
|
||||
{
|
||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight()); std::string coin;
|
||||
CTransaction pegstx,tx; int32_t numvouts; int64_t totalsupply,pegsfunds=0,funds=0,tokenfunds=0,amount,burnamount;
|
||||
CTransaction pegstx,tx; int32_t numvouts; int64_t totalsupply,pegsfunds=0,funds=0,tokenfunds=0,amount,tmpamount,tokenamount,burnamount;
|
||||
CPubKey mypk,pegspk,tmppk; struct CCcontract_info *cp,*cpTokens,CTokens,C; char depositaddr[64],coinaddr[64]; std::pair <int64_t,int64_t> account(0,0),myaccount(0,0);
|
||||
uint8_t M,N,taddr,prefix,prefix2,wiftype; std::vector<CPubKey> pubkeys; bool found=false; std::vector<uint256> bindtxids;
|
||||
uint256 hashBlock,txid,tmptokenid,oracletxid,accounttxid;
|
||||
@@ -1107,34 +1017,18 @@ std::string PegsLiquidate(uint64_t txfee,uint256 pegstxid, uint256 tokenid, uint
|
||||
cpTokens = CCinit(&CTokens,EVAL_TOKENS);
|
||||
if ( txfee == 0 )
|
||||
txfee = 10000;
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
pegspk = GetUnspendable(cp,0);
|
||||
if (myGetTransaction(pegstxid,tx,hashBlock)==0 || (numvouts=tx.vout.size())<=0)
|
||||
{
|
||||
CCerror = strprintf("cant find pegstxid %s",pegstxid.GetHex());
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "cant find pegstxid " << pegstxid.GetHex());
|
||||
if (DecodePegsCreateOpRet(tx.vout[numvouts-1].scriptPubKey,bindtxids)!='C')
|
||||
{
|
||||
CCerror = strprintf("invalid pegstxid ",pegstxid.GetHex());
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
for(auto txid : bindtxids)
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "invalid pegstxid " << pegstxid.GetHex());
|
||||
for(auto txid : bindtxids)
|
||||
{
|
||||
if (myGetTransaction(txid,tx,hashBlock)==0 || (numvouts=tx.vout.size())<=0)
|
||||
{
|
||||
CCerror = strprintf("cant find bindtxid %s",txid.GetHex());
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "cant find bindtxid " << txid.GetHex());
|
||||
if (DecodeGatewaysBindOpRet(depositaddr,tx.vout[numvouts-1].scriptPubKey,tmptokenid,coin,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2,wiftype)!='B')
|
||||
{
|
||||
CCerror = strprintf("invalid bindtxid %s",txid.GetHex());
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "invalid bindtxid " << txid.GetHex());
|
||||
if (tmptokenid==tokenid)
|
||||
{
|
||||
found=true;
|
||||
@@ -1142,45 +1036,23 @@ std::string PegsLiquidate(uint64_t txfee,uint256 pegstxid, uint256 tokenid, uint
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
{
|
||||
CCerror = strprintf("invalid tokenid ",tokenid.GetHex());
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "invalid tokenid " << tokenid.GetHex());
|
||||
if (PegsFindAccount(cp,mypk,pegstxid,tokenid,accounttxid,myaccount)==0)
|
||||
{
|
||||
CCerror = strprintf("cannot find account, you must have an account to liquidate another account!");
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "cannot find account, you must have an account to liquidate another account!");
|
||||
if (accounttxid!=zeroid && myIsutxo_spentinmempool(ignoretxid,ignorevin,accounttxid,1) != 0)
|
||||
{
|
||||
CCerror = strprintf("previous account tx not yet confirmed");
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
if (PegsGetAccountRatio(pegstxid,tokenid,liquidatetxid)<(ASSETCHAINS_PEGSCCPARAMS[0]?ASSETCHAINS_PEGSCCPARAMS[0]:PEGS_ACCOUNT_THRESHOLD) || PegsGetGlobalRatio(pegstxid)<(ASSETCHAINS_PEGSCCPARAMS[1]?ASSETCHAINS_PEGSCCPARAMS[1]:PEGS_GLOBAL_THRESHOLD))
|
||||
{
|
||||
CCerror = strprintf("not able to liquidate account until account ratio > %lu%% and global ratio > %lu%%",(ASSETCHAINS_PEGSCCPARAMS[0]?ASSETCHAINS_PEGSCCPARAMS[0]:PEGS_ACCOUNT_THRESHOLD),(ASSETCHAINS_PEGSCCPARAMS[1]?ASSETCHAINS_PEGSCCPARAMS[1]:PEGS_GLOBAL_THRESHOLD));
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "previous account tx not yet confirmed");
|
||||
if (PegsGetAccountRatio(pegstxid,tokenid,liquidatetxid)<(ASSETCHAINS_PEGSCCPARAMS[0]?ASSETCHAINS_PEGSCCPARAMS[0]:PEGS_ACCOUNT_RED_ZONE) || PegsGetGlobalRatio(pegstxid)<(ASSETCHAINS_PEGSCCPARAMS[1]?ASSETCHAINS_PEGSCCPARAMS[1]:PEGS_ACCOUNT_RED_ZONE))
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "not able to liquidate account until account ratio > " << (ASSETCHAINS_PEGSCCPARAMS[0]?ASSETCHAINS_PEGSCCPARAMS[0]:PEGS_ACCOUNT_RED_ZONE) << "% and global ratio > " << (ASSETCHAINS_PEGSCCPARAMS[1]?ASSETCHAINS_PEGSCCPARAMS[1]:PEGS_ACCOUNT_RED_ZONE) << "%");
|
||||
if (liquidatetxid!=zeroid && myGetTransaction(liquidatetxid,tx,hashBlock)==0 || (numvouts=tx.vout.size())<=0 || PegsDecodeAccountTx(tx,tmppk,amount,account).empty())
|
||||
{
|
||||
CCerror = strprintf("cannot find account to liquidate or invalid tx %s!",liquidatetxid.GetHex());
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "cannot find account to liquidate or invalid tx " << liquidatetxid.GetHex());
|
||||
if (liquidatetxid!=zeroid && myIsutxo_spentinmempool(ignoretxid,ignorevin,liquidatetxid,1) != 0)
|
||||
{
|
||||
CCerror = strprintf("previous liquidate account tx not yet confirmed");
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
}
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "previous liquidate account tx not yet confirmed");
|
||||
LOGSTREAM("pegscc",CCLOG_DEBUG2, stream << "current accounttxid=" << accounttxid.GetHex() << " [deposit=" << account.first << ",debt=" << account.second << "]" << std::endl);
|
||||
amount=account.first;
|
||||
burnamount=account.second*0.9;
|
||||
if ((funds=AddNormalinputs(mtx,mypk,txfee+account.second,64))>=txfee+burnamount)
|
||||
tokenamount=account.first;
|
||||
burnamount=account.second;
|
||||
tmpamount=PegsGetTokensAmountPerPrice(burnamount,tokenid)*105/100;
|
||||
amount=tmpamount+((tokenamount-tmpamount)*10/100);
|
||||
if ((funds=AddNormalinputs(mtx,mypk,account.second,64))>=burnamount)
|
||||
{
|
||||
if (liquidatetxid!=zeroid && (pegsfunds=AddPegsInputs(cp,mtx,pegspk,CPubKey(),txfee,1))>=txfee)
|
||||
{
|
||||
@@ -1189,49 +1061,45 @@ std::string PegsLiquidate(uint64_t txfee,uint256 pegstxid, uint256 tokenid, uint
|
||||
mtx.vin.push_back(CTxIn(liquidatetxid,1,CScript()));
|
||||
GetCCaddress1of2(cp,coinaddr,tmppk,pegspk);
|
||||
CCaddr1of2set(cp,tmppk,pegspk,cp->CCpriv,coinaddr);
|
||||
if ((tokenfunds=AddPegsTokenInputs(cp,mtx,pegstxid,tokenid,tmppk,pegspk,amount,64))==amount)
|
||||
if ((tokenfunds=AddPegsTokenInputs(cp,mtx,pegstxid,tokenid,tmppk,pegspk,tokenamount,64))==tokenamount)
|
||||
{
|
||||
if (pegsfunds>=txfee+2*CC_MARKER_VALUE)
|
||||
{
|
||||
mtx.vout.push_back(MakeCC1of2vout(EVAL_PEGS,CC_MARKER_VALUE,pegspk,pegspk));
|
||||
mtx.vout.push_back(MakeCC1of2vout(EVAL_PEGS,CC_MARKER_VALUE,tmppk,pegspk));
|
||||
mtx.vout.push_back(MakeTokensCC1vout(EVAL_TOKENS,(int64_t)(amount*0.95),mypk));
|
||||
mtx.vout.push_back(MakeTokensCC1vout(EVAL_PEGS,amount-(int64_t)(amount*0.95),pegspk));
|
||||
mtx.vout.push_back(MakeTokensCC1vout(EVAL_TOKENS,amount,mypk));
|
||||
mtx.vout.push_back(MakeTokensCC1vout(EVAL_PEGS,tokenamount-amount,pegspk));
|
||||
mtx.vout.push_back(CTxOut(burnamount,CScript() << ParseHex(HexStr(CCtxidaddr(coinaddr,pegstxid))) << OP_CHECKSIG));
|
||||
if (pegsfunds>txfee+2*CC_MARKER_VALUE) mtx.vout.push_back(MakeCC1vout(EVAL_PEGS,pegsfunds-(txfee+2*CC_MARKER_VALUE),pegspk));
|
||||
account.first=0;
|
||||
account.second=0;
|
||||
LOGSTREAM("pegscc",CCLOG_DEBUG2, stream << "new account [deposit=" << account.first << ",debt=" << account.second << "]" << std::endl);
|
||||
return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodePegsLiquidateOpRet(tokenid,pegstxid,mypk,amount,account)));
|
||||
return(FinalizeCCTxExt(pk.IsValid(),0,cp,mtx,mypk,txfee,EncodePegsLiquidateOpRet(tokenid,pegstxid,mypk,amount,account)));
|
||||
}
|
||||
CCerror = strprintf("not enough balance in pegs global CC address");
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "not enough balance in pegs global CC address");
|
||||
}
|
||||
CCerror = strprintf("tokens amount in pegs account (%lld) not matching amount in account %lld",tokenfunds,account.first); // this shouldn't happen
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "tokens amount in pegs account " << tokenfunds << " not matching amount in account " << account.first); // this shouldn't happen
|
||||
}
|
||||
CCerror = strprintf("not enough balance in pegs global CC address");
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "not enough balance in pegs global CC address");
|
||||
}
|
||||
CCerror = strprintf("not enough funds to liquidate account, you must liquidate full debt ammount %lld instead of %lld",txfee+account.second,funds);
|
||||
LOGSTREAM("pegscc",CCLOG_INFO, stream << CCerror << std::endl);
|
||||
return("");
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "not enough funds to liquidate account, you must liquidate full debt ammount " << txfee+account.second << " instead of " << funds);
|
||||
}
|
||||
|
||||
UniValue PegsAccountHistory(uint256 pegstxid)
|
||||
UniValue PegsAccountHistory(const CPubKey& pk,uint256 pegstxid)
|
||||
{
|
||||
char coinaddr[64]; int64_t nValue,amount; uint256 txid,accounttxid,hashBlock,tmptokenid,tmppegstxid;
|
||||
CTransaction tx; int32_t numvouts,vout; char funcid; CPubKey mypk,pegspk,pk; std::map<uint256,std::pair<int64_t,int64_t>> accounts;
|
||||
std::vector<uint256> txids; std::pair<int64_t,int64_t> account;
|
||||
CTransaction tx; int32_t numvouts,vout; char funcid; CPubKey mypk,pegspk,tmppk; std::map<uint256,std::pair<int64_t,int64_t>> accounts;
|
||||
std::vector<uint256> txids; std::pair<int64_t,int64_t> account; std::vector<uint256> bindtxids;
|
||||
UniValue result(UniValue::VOBJ),acc(UniValue::VARR); struct CCcontract_info *cp,C;
|
||||
|
||||
if (myGetTransaction(pegstxid,tx,hashBlock)==0 || (numvouts=tx.vout.size())<=0)
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "cant find pegstxid " << pegstxid.GetHex());
|
||||
if (DecodePegsCreateOpRet(tx.vout[numvouts-1].scriptPubKey,bindtxids)!='C')
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "invalid pegstxid " << pegstxid.GetHex());
|
||||
result.push_back(Pair("result","success"));
|
||||
result.push_back(Pair("name","pegsaccounthistory"));
|
||||
cp = CCinit(&C,EVAL_PEGS);
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
pegspk = GetUnspendable(cp,0);
|
||||
GetCCaddress1of2(cp,coinaddr,mypk,pegspk);
|
||||
SetCCtxids(txids,coinaddr,true,EVAL_PEGS,pegstxid,0);
|
||||
@@ -1242,7 +1110,7 @@ UniValue PegsAccountHistory(uint256 pegstxid)
|
||||
(funcid=DecodePegsOpRet(tx,tmppegstxid,tmptokenid))!=0 && pegstxid==tmppegstxid)
|
||||
{
|
||||
UniValue obj(UniValue::VOBJ);
|
||||
obj.push_back(Pair("action",PegsDecodeAccountTx(tx,pk,amount,account)));
|
||||
obj.push_back(Pair("action",PegsDecodeAccountTx(tx,tmppk,amount,account)));
|
||||
obj.push_back(Pair("amount",amount));
|
||||
obj.push_back(Pair("accounttxid",txid.GetHex()));
|
||||
obj.push_back(Pair("token",PegsGetTokenName(tmptokenid)));
|
||||
@@ -1255,17 +1123,21 @@ UniValue PegsAccountHistory(uint256 pegstxid)
|
||||
return(result);
|
||||
}
|
||||
|
||||
UniValue PegsAccountInfo(uint256 pegstxid)
|
||||
UniValue PegsAccountInfo(const CPubKey& pk,uint256 pegstxid)
|
||||
{
|
||||
char coinaddr[64]; int64_t nValue,amount; uint256 txid,accounttxid,hashBlock,tmptokenid,tmppegstxid; std::map<uint256,std::pair<int64_t,int64_t>> accounts;
|
||||
CTransaction tx; int32_t numvouts,vout; char funcid; CPubKey mypk,pegspk,pk;
|
||||
CTransaction tx; int32_t numvouts,vout; char funcid; CPubKey mypk,pegspk,tmppk; std::vector<uint256> bindtxids;
|
||||
std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > unspentOutputs; std::pair<int64_t,int64_t> account;
|
||||
UniValue result(UniValue::VOBJ),acc(UniValue::VARR); struct CCcontract_info *cp,C;
|
||||
|
||||
if (myGetTransaction(pegstxid,tx,hashBlock)==0 || (numvouts=tx.vout.size())<=0)
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "cant find pegstxid " << pegstxid.GetHex());
|
||||
if (DecodePegsCreateOpRet(tx.vout[numvouts-1].scriptPubKey,bindtxids)!='C')
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "invalid pegstxid " << pegstxid.GetHex());
|
||||
result.push_back(Pair("result","success"));
|
||||
result.push_back(Pair("name","pegsaccountinfo"));
|
||||
cp = CCinit(&C,EVAL_PEGS);
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
mypk = pk.IsValid()?pk:pubkey2pk(Mypubkey());
|
||||
pegspk = GetUnspendable(cp,0);
|
||||
GetCCaddress1of2(cp,coinaddr,mypk,pegspk);
|
||||
SetCCunspents(unspentOutputs,coinaddr,true);
|
||||
@@ -1279,7 +1151,7 @@ UniValue PegsAccountInfo(uint256 pegstxid)
|
||||
(funcid=DecodePegsOpRet(tx,tmppegstxid,tmptokenid))!=0 && pegstxid==tmppegstxid)
|
||||
{
|
||||
//LOGSTREAM("pegscc",CCLOG_DEBUG2, stream << "txid=" << txid.GetHex() << ", vout=" << vout << ", nValue=" << nValue << ", tokenid=" << tmptokenid.GetHex() << std::endl);
|
||||
PegsDecodeAccountTx(tx,pk,amount,account);
|
||||
PegsDecodeAccountTx(tx,tmppk,amount,account);
|
||||
accounts[tmptokenid].first=account.first;
|
||||
accounts[tmptokenid].second=account.second;
|
||||
}
|
||||
@@ -1288,10 +1160,10 @@ UniValue PegsAccountInfo(uint256 pegstxid)
|
||||
{
|
||||
UniValue obj(UniValue::VOBJ);
|
||||
obj.push_back(Pair("token",PegsGetTokenName(it->first)));
|
||||
obj.push_back(Pair("deposit",(double)accounts[it->first].first/COIN));
|
||||
obj.push_back(Pair("debt",(double)accounts[it->first].second/COIN));
|
||||
if (accounts[it->first].first==0 || accounts[it->first].second==0 || PegsGetTokenPrice(it->first)==0) obj.push_back(Pair("ratio",0));
|
||||
else obj.push_back(Pair("ratio",strprintf("%.2f%%",(double)accounts[it->first].second*100/(accounts[it->first].first*PegsGetTokenPrice(it->first)))));
|
||||
obj.push_back(Pair("deposit",accounts[it->first].first));
|
||||
obj.push_back(Pair("debt",accounts[it->first].second));
|
||||
if (accounts[it->first].first==0 || accounts[it->first].second==0 || PegsGetTokenPrice(it->first)<=0) obj.push_back(Pair("ratio",0));
|
||||
else obj.push_back(Pair("ratio",strprintf("%.2f%%",PegsGetRatio(it->first,accounts[it->first]))));
|
||||
acc.push_back(obj);
|
||||
}
|
||||
result.push_back(Pair("account info",acc));
|
||||
@@ -1301,14 +1173,17 @@ UniValue PegsAccountInfo(uint256 pegstxid)
|
||||
UniValue PegsWorstAccounts(uint256 pegstxid)
|
||||
{
|
||||
char coinaddr[64]; int64_t nValue,amount; uint256 txid,accounttxid,hashBlock,tmppegstxid,tokenid,prev;
|
||||
CTransaction tx; int32_t numvouts,vout; char funcid; CPubKey mypk,pegspk,pk; double ratio;
|
||||
CTransaction tx; int32_t numvouts,vout; char funcid; CPubKey pegspk,pk; double ratio; std::vector<uint256> bindtxids;
|
||||
std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > unspentOutputs; std::pair<int64_t,int64_t> account;
|
||||
UniValue result(UniValue::VOBJ),acc(UniValue::VARR); struct CCcontract_info *cp,C; std::multimap<uint256,UniValue> map;
|
||||
|
||||
if (myGetTransaction(pegstxid,tx,hashBlock)==0 || (numvouts=tx.vout.size())<=0)
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "cant find pegstxid " << pegstxid.GetHex());
|
||||
if (DecodePegsCreateOpRet(tx.vout[numvouts-1].scriptPubKey,bindtxids)!='C')
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "invalid pegstxid " << pegstxid.GetHex());
|
||||
result.push_back(Pair("result","success"));
|
||||
result.push_back(Pair("name","pegsworstaccounts"));
|
||||
cp = CCinit(&C,EVAL_PEGS);
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
pegspk = GetUnspendable(cp,0);
|
||||
GetCCaddress1of2(cp,coinaddr,pegspk,pegspk);
|
||||
SetCCunspents(unspentOutputs,coinaddr,true);
|
||||
@@ -1321,9 +1196,9 @@ UniValue PegsWorstAccounts(uint256 pegstxid)
|
||||
(funcid=DecodePegsOpRet(tx,tmppegstxid,tokenid))!=0 && pegstxid==tmppegstxid)
|
||||
{
|
||||
PegsDecodeAccountTx(tx,pk,amount,account);
|
||||
if (account.first==0 || account.second==0 || PegsGetTokenPrice(tokenid)==0) ratio=0;
|
||||
else ratio=(double)account.second*100/(account.first*PegsGetTokenPrice(tokenid));
|
||||
if (ratio>80)
|
||||
if (account.first==0 || account.second==0 || PegsGetTokenPrice(tokenid)<=0) ratio=0;
|
||||
else ratio=PegsGetRatio(tokenid,account);
|
||||
if (ratio>PEGS_ACCOUNT_RED_ZONE)
|
||||
{
|
||||
UniValue obj(UniValue::VOBJ);
|
||||
obj.push_back(Pair("accounttxid",txid.GetHex()));
|
||||
@@ -1352,15 +1227,18 @@ UniValue PegsWorstAccounts(uint256 pegstxid)
|
||||
UniValue PegsInfo(uint256 pegstxid)
|
||||
{
|
||||
char coinaddr[64]; int64_t nValue,amount; uint256 txid,accounttxid,hashBlock,tmppegstxid,tokenid;
|
||||
CTransaction tx; int32_t numvouts,vout; char funcid; CPubKey mypk,pegspk,pk;
|
||||
CTransaction tx; int32_t numvouts,vout; char funcid; CPubKey pegspk,pk; std::vector<uint256> bindtxids;
|
||||
std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > unspentOutputs; std::pair<int64_t,int64_t> account;
|
||||
std::map<uint256,std::pair<int64_t,int64_t>> globalaccounts; double globaldeposit=0;
|
||||
UniValue result(UniValue::VOBJ),acc(UniValue::VARR); struct CCcontract_info *cp,C;
|
||||
|
||||
if (myGetTransaction(pegstxid,tx,hashBlock)==0 || (numvouts=tx.vout.size())<=0)
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "cant find pegstxid " << pegstxid.GetHex());
|
||||
if (DecodePegsCreateOpRet(tx.vout[numvouts-1].scriptPubKey,bindtxids)!='C')
|
||||
CCERR_RESULT("pegscc",CCLOG_INFO, stream << "invalid pegstxid " << pegstxid.GetHex());
|
||||
result.push_back(Pair("result","success"));
|
||||
result.push_back(Pair("name","pegsinfo"));
|
||||
cp = CCinit(&C,EVAL_PEGS);
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
pegspk = GetUnspendable(cp,0);
|
||||
GetCCaddress1of2(cp,coinaddr,pegspk,pegspk);
|
||||
SetCCunspents(unspentOutputs,coinaddr,true);
|
||||
@@ -1396,8 +1274,8 @@ UniValue PegsInfo(uint256 pegstxid)
|
||||
obj.push_back(Pair("token",PegsGetTokenName(it->first)));
|
||||
obj.push_back(Pair("total deposit",globalaccounts[it->first].first));
|
||||
obj.push_back(Pair("total debt",globalaccounts[it->first].second));
|
||||
if (globalaccounts[it->first].first==0 || globalaccounts[it->first].second==0 || PegsGetTokenPrice(it->first)==0) obj.push_back(Pair("total ratio",0));
|
||||
else obj.push_back(Pair("total ratio",strprintf("%.2f%%",(double)globalaccounts[it->first].second*100/(globalaccounts[it->first].first*PegsGetTokenPrice(it->first)))));
|
||||
if (globalaccounts[it->first].first==0 || globalaccounts[it->first].second==0 || PegsGetTokenPrice(it->first)<=0) obj.push_back(Pair("total ratio",0));
|
||||
else obj.push_back(Pair("total ratio",strprintf("%.2f%%",PegsGetRatio(it->first,globalaccounts[it->first]))));
|
||||
acc.push_back(obj);
|
||||
}
|
||||
result.push_back(Pair("info",acc));
|
||||
|
||||
@@ -65,24 +65,62 @@
|
||||
vout.n-1: opreturn 'U' sbits fundingtxid
|
||||
|
||||
*/
|
||||
|
||||
int64_t RewardsCalc(int64_t amount,uint256 txid,uint64_t APR,uint64_t minseconds,uint64_t maxseconds,uint64_t mindeposit)
|
||||
|
||||
/// the following are compatible with windows
|
||||
/// mpz_set_lli sets a long long singed int to a big num mpz_t for very large integer math
|
||||
extern void mpz_set_lli( mpz_t rop, long long op );
|
||||
// mpz_get_si2 gets a mpz_t and returns a signed long long int
|
||||
extern int64_t mpz_get_si2( mpz_t op );
|
||||
// mpz_get_ui2 gets a mpz_t and returns a unsigned long long int
|
||||
extern uint64_t mpz_get_ui2( mpz_t op );
|
||||
|
||||
uint64_t RewardsCalc(int64_t amount, uint256 txid, int64_t APR, int64_t minseconds, int64_t maxseconds, uint32_t timestamp)
|
||||
{
|
||||
int32_t numblocks; uint64_t duration,reward = 0;
|
||||
int32_t numblocks; int64_t duration; uint64_t reward = 0;
|
||||
//fprintf(stderr,"minseconds %llu maxseconds %llu\n",(long long)minseconds,(long long)maxseconds);
|
||||
if ( (duration= CCduration(numblocks,txid)) < minseconds )
|
||||
{
|
||||
fprintf(stderr,"duration %llu < minseconds %llu\n",(long long)duration,(long long)minseconds);
|
||||
fprintf(stderr,"duration %lli < minseconds %lli\n",(long long)duration,(long long)minseconds);
|
||||
return(0);
|
||||
//duration = (uint32_t)time(NULL) - (1532713903 - 3600 * 24);
|
||||
} else if ( duration > maxseconds )
|
||||
duration = maxseconds;
|
||||
if ( 0 ) // amount * APR * duration / COIN * 100 * 365*24*3600
|
||||
/* if ( 0 ) // amount * APR * duration / COIN * 100 * 365*24*3600
|
||||
reward = (((amount * APR) / COIN) * duration) / (365*24*3600LL * 100);
|
||||
else reward = (((amount * duration) / (365 * 24 * 3600LL)) * (APR / 1000000)) / 10000;
|
||||
*/
|
||||
if ( !hush_hardfork_active(timestamp) )
|
||||
reward = (((amount * duration) / (365 * 24 * 3600LL)) * (APR / 1000000)) / 10000;
|
||||
else
|
||||
{
|
||||
// declare and init the mpz_t big num variables
|
||||
mpz_t mpzAmount, mpzDuration, mpzReward, mpzAPR, mpzModifier;
|
||||
mpz_init(mpzAmount);
|
||||
mpz_init(mpzDuration);
|
||||
mpz_init(mpzAPR);
|
||||
mpz_init(mpzReward);
|
||||
mpz_init(mpzModifier);
|
||||
|
||||
// set the inputs to big num variables
|
||||
mpz_set_lli(mpzAmount, amount);
|
||||
mpz_set_lli(mpzDuration, duration);
|
||||
mpz_set_lli(mpzAPR, APR);
|
||||
mpz_set_lli(mpzModifier, COIN*100*365*24*3600LL);
|
||||
|
||||
// (amount * APR * duration)
|
||||
mpz_mul(mpzReward, mpzAmount, mpzDuration);
|
||||
mpz_mul(mpzReward, mpzReward, mpzAPR);
|
||||
|
||||
// total_of_above / (COIN * 100 * 365*24*3600LL)
|
||||
mpz_tdiv_q(mpzReward, mpzReward, mpzModifier);
|
||||
|
||||
// set result to variable we can use and return it.
|
||||
reward = mpz_get_ui2(mpzReward);
|
||||
}
|
||||
if ( reward > amount )
|
||||
reward = amount;
|
||||
fprintf(stderr,"amount %.8f %.8f %llu -> duration.%llu reward %.8f vals %.8f %.8f\n",(double)amount/COIN,((double)amount * APR)/COIN,(long long)((amount * APR) / (COIN * 365*24*3600)),(long long)duration,(double)reward/COIN,(double)((amount * duration) / (365 * 24 * 3600LL))/COIN,(double)(((amount * duration) / (365 * 24 * 3600LL)) * (APR / 1000000))/COIN);
|
||||
fprintf(stderr, "amount.%lli duration.%lli APR.%lli reward.%llu\n", (long long)amount, (long long)duration, (long long)APR, (long long)reward);
|
||||
//fprintf(stderr,"amount %.8f %.8f %llu -> duration.%llu reward %.8f vals %.8f %.8f\n",(double)amount/COIN,((double)amount * APR)/COIN,(long long)((amount * APR) / (COIN * 365*24*3600)),(long long)duration,(double)reward/COIN,(double)((amount * duration) / (365 * 24 * 3600LL))/COIN,(double)(((amount * duration) / (365 * 24 * 3600LL)) * (APR / 1000000))/COIN);
|
||||
return(reward);
|
||||
}
|
||||
|
||||
@@ -259,7 +297,7 @@ bool RewardsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &t
|
||||
if ( !CheckTxFee(tx, txfee, chainActive.LastTip()->GetHeight(), chainActive.LastTip()->nTime, dummy) )
|
||||
return eval->Invalid("txfee is too high");
|
||||
amount = vinTx.vout[0].nValue;
|
||||
reward = RewardsCalc(amount,tx.vin[0].prevout.hash,APR,minseconds,maxseconds,mindeposit);
|
||||
reward = RewardsCalc((int64_t)amount,tx.vin[0].prevout.hash,(int64_t)APR,(int64_t)minseconds,(int64_t)maxseconds,GetLatestTimestamp(eval->GetCurrentHeight()));
|
||||
if ( reward == 0 )
|
||||
return eval->Invalid("no eligible rewards");
|
||||
if ( numvins == 1 && tx.vout[0].scriptPubKey.IsPayToCryptoCondition() == 0 )
|
||||
@@ -671,7 +709,7 @@ std::string RewardsUnlock(uint64_t txfee,char *planstr,uint256 fundingtxid,uint2
|
||||
}
|
||||
if ( amount > txfee )
|
||||
{
|
||||
reward = RewardsCalc(amount,mtx.vin[0].prevout.hash,APR,minseconds,maxseconds,mindeposit);
|
||||
reward = RewardsCalc((int64_t)amount,mtx.vin[0].prevout.hash,(int64_t)APR,(int64_t)minseconds,(int64_t)maxseconds,komodo_chainactive_timestamp());
|
||||
if ( scriptPubKey.size() > 0 )
|
||||
{
|
||||
if ( reward > txfee )
|
||||
|
||||
146
src/chain.h
146
src/chain.h
@@ -1,5 +1,6 @@
|
||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
// Copyright (c) 2009-2014 The Bitcoin Core developers
|
||||
// Copyright (c) 2019 The Hush developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
@@ -29,6 +30,7 @@ class CChainPower;
|
||||
#include "tinyformat.h"
|
||||
#include "uint256.h"
|
||||
extern int8_t is_STAKED(const char *chain_name);
|
||||
extern bool fZindex;
|
||||
|
||||
#include <vector>
|
||||
|
||||
@@ -136,6 +138,7 @@ class CBlockIndex;
|
||||
// that involves mining in secret completely ineffective, even before dPOW, unless a large part
|
||||
// of the staking supply is also controlled. It also enables a faster deterministic convergence,
|
||||
// aided by both POS and POW.
|
||||
// TODO: delete this junk
|
||||
class CChainPower
|
||||
{
|
||||
public:
|
||||
@@ -258,11 +261,101 @@ public:
|
||||
//! Note: in a potential headers-first mode, this number cannot be relied upon
|
||||
unsigned int nTx;
|
||||
|
||||
//! Number of notarization transactions in this block.
|
||||
int64_t nNotarizations;
|
||||
|
||||
//! (memory only) Number of payments (shielded or transparent) in the block
|
||||
//! up to and including this block. One transaction can contain one or more
|
||||
//! payments. This stat allows us to calculate ratios of shielded/transparent
|
||||
//! when combined with shielded payment stats
|
||||
int64_t nPayments;
|
||||
|
||||
//! (memory only) Number of shielded transactions (of any kind) in the block up to and including this block.
|
||||
//! A shielded transaction is defined as a transaction that contains at least 1 JoinSplit, which includes
|
||||
//! shielding/de-shielding and other complex transaction possibilties including multiple taddrs/zaddrs as
|
||||
//! inputs and outputs.
|
||||
int64_t nShieldedTx;
|
||||
|
||||
//! (memory only) Number of fully shielded transactions. A fully shielded transaction is defined
|
||||
//! as a transaction containing JoinSplits and only shielded inputs and outputs, i.e. no transparent
|
||||
// inputs or outputs: z->z or z->(z,z) or z->(z,z,z,) etc...
|
||||
int64_t nFullyShieldedTx;
|
||||
|
||||
//! (memory only) Number of shielding payments. A shielding payment is defined
|
||||
//! as having a shielded output but transparent input: t->z
|
||||
int64_t nShieldingPayments;
|
||||
|
||||
//! (memory only) Number of shielded payments. A shielded payment is defined
|
||||
//! as having a shielded input or output: t->z or z->t
|
||||
int64_t nShieldedPayments;
|
||||
|
||||
//! (memory only) Number of fully shielded payments. A fully shielded payment is defined
|
||||
//! as having a shielded input and shielded output: z->z
|
||||
int64_t nFullyShieldedPayments;
|
||||
|
||||
//! (memory only) Number of deshielding transactions. A deshielding transaction is defined
|
||||
//! as a transaction containing JoinSplits and at least one transparent output.
|
||||
int64_t nDeshieldingTx;
|
||||
|
||||
//! (memory only) Number of deshielding payments. A deshielding payment is defined
|
||||
//! as one transparent input and one shielded output: z->t
|
||||
int64_t nDeshieldingPayments;
|
||||
|
||||
//! (memory only) Number of shielding transactions. A shielding transaction is defined
|
||||
//! as a transaction containing JoinSplits and at least one transparent input
|
||||
// i.e. t->z or t->(z,t) or z->(z,z,t)
|
||||
int64_t nShieldingTx;
|
||||
|
||||
//! (memory only) Number of transactions in the chain up to and including this block.
|
||||
//! This value will be non-zero only if and only if transactions for this block and all its parents are available.
|
||||
//! Change to 64-bit type when necessary; won't happen before 2030
|
||||
unsigned int nChainTx;
|
||||
|
||||
//! Number of notarization transactions in this chain
|
||||
int64_t nChainNotarizations;
|
||||
|
||||
//! (memory only) Number of payments (shielded or transparent) in the chain
|
||||
//! up to and including this block. One transaction can contain one or more
|
||||
//! payments. This stat allows us to calculate ratios of shielded/transparent
|
||||
//! when combined with shielded payment stats
|
||||
int64_t nChainPayments;
|
||||
|
||||
//! (memory only) Number of shielded transactions (of any kind) in the chain up to and including this block.
|
||||
//! A shielded transaction is defined as a transaction that contains at least 1 JoinSplit, which includes
|
||||
//! shielding/de-shielding and other complex transaction possibilties including multiple taddrs/zaddrs as
|
||||
//! inputs and outputs.
|
||||
int64_t nChainShieldedTx;
|
||||
|
||||
//! (memory only) Number of fully shielded transactions. A fully shielded transaction is defined
|
||||
//! as a transaction containing JoinSplits and only shielded inputs and outputs, i.e. no transparent
|
||||
// inputs or outputs: z->z or z->(z,z) or z->(z,z,z,) etc...
|
||||
int64_t nChainFullyShieldedTx;
|
||||
|
||||
//! (memory only) Number of shielding payments. A shielding payment is defined
|
||||
//! as having a shielded output but transparent input: t->z
|
||||
int64_t nChainShieldingPayments;
|
||||
|
||||
//! (memory only) Number of shielded payments. A shielded payment is defined
|
||||
//! as having a shielded input or output: t->z or z->t
|
||||
int64_t nChainShieldedPayments;
|
||||
|
||||
//! (memory only) Number of fully shielded payments. A fully shielded payment is defined
|
||||
//! as having a shielded input and shielded output: z->z
|
||||
int64_t nChainFullyShieldedPayments;
|
||||
|
||||
//! (memory only) Number of deshielding transactions. A deshielding transaction is defined
|
||||
//! as a transaction containing JoinSplits and at least one transparent output.
|
||||
int64_t nChainDeshieldingTx;
|
||||
|
||||
//! (memory only) Number of deshielding payments. A deshielding payment is defined
|
||||
//! as one transparent input and one shielded output: z->t
|
||||
int64_t nChainDeshieldingPayments;
|
||||
|
||||
//! (memory only) Number of shielding transactions. A shielding transaction is defined
|
||||
//! as a transaction containing JoinSplits and at least one transparent input
|
||||
// i.e. t->z or t->(z,t) or z->(z,z,t)
|
||||
int64_t nChainShieldingTx;
|
||||
|
||||
//! Verification status of this block. See enum BlockStatus
|
||||
unsigned int nStatus;
|
||||
|
||||
@@ -321,6 +414,29 @@ public:
|
||||
chainPower = CChainPower();
|
||||
nTx = 0;
|
||||
nChainTx = 0;
|
||||
|
||||
nChainPayments = 0;
|
||||
nChainShieldedTx = 0;
|
||||
nChainShieldingTx = 0;
|
||||
nChainDeshieldingTx = 0;
|
||||
nChainNotarizations = 0;
|
||||
nChainFullyShieldedTx = 0;
|
||||
nChainShieldedPayments = 0;
|
||||
nChainShieldingPayments = 0;
|
||||
nChainDeshieldingPayments = 0;
|
||||
nChainFullyShieldedPayments = 0;
|
||||
|
||||
nPayments = 0;
|
||||
nShieldedTx = 0;
|
||||
nShieldingTx = 0;
|
||||
nNotarizations = 0;
|
||||
nDeshieldingTx = 0;
|
||||
nFullyShieldedTx = 0;
|
||||
nShieldedPayments = 0;
|
||||
nShieldingPayments = 0;
|
||||
nDeshieldingPayments = 0;
|
||||
nFullyShieldedPayments = 0;
|
||||
|
||||
nStatus = 0;
|
||||
nCachedBranchId = boost::none;
|
||||
hashSproutAnchor = uint256();
|
||||
@@ -465,17 +581,6 @@ public:
|
||||
CBlockIndex* GetAncestor(int height);
|
||||
const CBlockIndex* GetAncestor(int height) const;
|
||||
|
||||
int32_t GetVerusPOSTarget() const
|
||||
{
|
||||
return GetBlockHeader().GetVerusPOSTarget();
|
||||
}
|
||||
|
||||
bool IsVerusPOSBlock() const
|
||||
{
|
||||
if ( ASSETCHAINS_LWMAPOS != 0 )
|
||||
return GetBlockHeader().IsVerusPOSBlock();
|
||||
else return(0);
|
||||
}
|
||||
};
|
||||
|
||||
/** Used to marshal pointers into hashes for db storage. */
|
||||
@@ -506,6 +611,8 @@ public:
|
||||
READWRITE(VARINT(chainPower.nHeight));
|
||||
READWRITE(VARINT(nStatus));
|
||||
READWRITE(VARINT(nTx));
|
||||
|
||||
|
||||
if (nStatus & (BLOCK_HAVE_DATA | BLOCK_HAVE_UNDO))
|
||||
READWRITE(VARINT(nFile));
|
||||
if (nStatus & BLOCK_HAVE_DATA)
|
||||
@@ -547,10 +654,27 @@ public:
|
||||
if ((s.GetType() & SER_DISK) && (nVersion >= SAPLING_VALUE_VERSION)) {
|
||||
READWRITE(nSaplingValue);
|
||||
}
|
||||
/*
|
||||
if ( (s.GetType() & SER_DISK) && (is_STAKED(ASSETCHAINS_SYMBOL) != 0) && ASSETCHAINS_NOTARY_PAY[0] != 0 )
|
||||
{
|
||||
READWRITE(nNotaryPay);
|
||||
READWRITE(segid);
|
||||
}
|
||||
*/
|
||||
|
||||
// These values only serialized when -zindex enabled
|
||||
if((s.GetType() & SER_DISK) && fZindex) {
|
||||
READWRITE(nShieldedTx);
|
||||
READWRITE(nShieldingTx);
|
||||
READWRITE(nDeshieldingTx);
|
||||
READWRITE(nFullyShieldedTx);
|
||||
|
||||
READWRITE(nPayments);
|
||||
READWRITE(nNotarizations);
|
||||
READWRITE(nShieldedPayments);
|
||||
READWRITE(nShieldingPayments);
|
||||
READWRITE(nDeshieldingPayments);
|
||||
READWRITE(nFullyShieldedPayments);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// Copyright (c) 2010 Satoshi Nakamoto
|
||||
// Copyright (c) 2009-2014 The Bitcoin Core developers
|
||||
// Copyright (c) 2019-2020 The Hush developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
@@ -104,7 +105,7 @@ public:
|
||||
strNetworkID = "main";
|
||||
strCurrencyUnits = "KMD";
|
||||
bip44CoinType = 141; // As registered in https://github.com/satoshilabs/slips/blob/master/slip-0044.md
|
||||
consensus.fCoinbaseMustBeProtected = false; // true this is only true wuth Verus and enforced after block 12800
|
||||
consensus.fCoinbaseMustBeProtected = false;
|
||||
consensus.nSubsidySlowStartInterval = 20000;
|
||||
consensus.nSubsidyHalvingInterval = 840000;
|
||||
consensus.nMajorityEnforceBlockUpgrade = 750;
|
||||
@@ -182,10 +183,6 @@ public:
|
||||
assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"));
|
||||
vFixedSeeds.clear();
|
||||
vSeeds.clear();
|
||||
vSeeds.push_back(CDNSSeedData("komodoplatform.com", "seeds.komodoplatform.com")); // @kolo - old static dns seeds
|
||||
vSeeds.push_back(CDNSSeedData("kolo.supernet.org", "static.kolo.supernet.org")); // @kolo - new static dns seeds ToDo
|
||||
vSeeds.push_back(CDNSSeedData("kolo.supernet.org", "dynamic.kolo.supernet.org")); // @kolo - crawler seeds ToDo
|
||||
vSeeds.push_back(CDNSSeedData("kolo.supernet.org", "dynamic.kolo.supernet.org")); // @kolo - crawler seeds ToDo
|
||||
vSeeds.push_back(CDNSSeedData("node1", "dnsseed.myhush.org"));
|
||||
vSeeds.push_back(CDNSSeedData("node2", "dnsseed2.myhush.org"));
|
||||
vSeeds.push_back(CDNSSeedData("node3", "dnsseed.bleuzero.com"));
|
||||
@@ -249,7 +246,7 @@ class CTestNetParams : public CChainParams {
|
||||
public:
|
||||
CTestNetParams() {
|
||||
strNetworkID = "test";
|
||||
strCurrencyUnits = "TAZ";
|
||||
strCurrencyUnits = "TUSH";
|
||||
bip44CoinType = 1;
|
||||
consensus.fCoinbaseMustBeProtected = true;
|
||||
consensus.nSubsidySlowStartInterval = 20000;
|
||||
@@ -307,7 +304,6 @@ public:
|
||||
|
||||
vFixedSeeds.clear();
|
||||
vSeeds.clear();
|
||||
//vSeeds.push_back(CDNSSeedData("z.cash", "dns.testnet.z.cash")); // Komodo
|
||||
|
||||
base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,0);
|
||||
base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1,5);
|
||||
@@ -585,228 +581,165 @@ void *chainparams_commandline()
|
||||
pCurrentParams->pchMessageStart[2] = (ASSETCHAINS_MAGIC >> 16) & 0xff;
|
||||
pCurrentParams->pchMessageStart[3] = (ASSETCHAINS_MAGIC >> 24) & 0xff;
|
||||
fprintf(stderr,">>>>>>>>>> %s: p2p.%u rpc.%u magic.%08x %u %u coins\n",ASSETCHAINS_SYMBOL,ASSETCHAINS_P2PPORT,ASSETCHAINS_RPCPORT,ASSETCHAINS_MAGIC,ASSETCHAINS_MAGIC,(uint32_t)ASSETCHAINS_SUPPLY);
|
||||
if (ASSETCHAINS_ALGO == ASSETCHAINS_VERUSHASH)
|
||||
{
|
||||
// this is only good for 60 second blocks with an averaging window of 45. for other parameters, use:
|
||||
// nLwmaAjustedWeight = (N+1)/2 * (0.9989^(500/nPowAveragingWindow)) * nPowTargetSpacing
|
||||
pCurrentParams->consensus.nLwmaAjustedWeight = 1350;
|
||||
pCurrentParams->consensus.nPowAveragingWindow = 45;
|
||||
pCurrentParams->consensus.powAlternate = uint256S("00000f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f");
|
||||
}
|
||||
else if (ASSETCHAINS_ALGO == ASSETCHAINS_VERUSHASHV1_1)
|
||||
{
|
||||
// this is only good for 60 second blocks with an averaging window of 45. for other parameters, use:
|
||||
// nLwmaAjustedWeight = (N+1)/2 * (0.9989^(500/nPowAveragingWindow)) * nPowTargetSpacing
|
||||
pCurrentParams->consensus.nLwmaAjustedWeight = 1350;
|
||||
pCurrentParams->consensus.nPowAveragingWindow = 45;
|
||||
pCurrentParams->consensus.powAlternate = uint256S("0000000f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f");
|
||||
}
|
||||
|
||||
if (ASSETCHAINS_LWMAPOS != 0)
|
||||
{
|
||||
pCurrentParams->consensus.posLimit = uint256S("000000000f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f");
|
||||
pCurrentParams->consensus.nPOSAveragingWindow = 45;
|
||||
// spacing is 1000 units per block to get better resolution, POS is 50% hard coded for now, we can vary it later
|
||||
// when we get reliable integer math on nLwmaPOSAjustedWeight
|
||||
pCurrentParams->consensus.nPOSTargetSpacing = VERUS_BLOCK_POSUNITS * 2;
|
||||
// nLwmaPOSAjustedWeight = (N+1)/2 * (0.9989^(500/nPOSAveragingWindow)) * nPOSTargetSpacing
|
||||
// this needs to be recalculated if VERUS_BLOCK_POSUNITS is changed
|
||||
pCurrentParams->consensus.nLwmaPOSAjustedWeight = 46531;
|
||||
}
|
||||
|
||||
// only require coinbase protection on Verus from the Komodo family of coins
|
||||
if (strcmp(ASSETCHAINS_SYMBOL,"VRSC") == 0)
|
||||
{
|
||||
pCurrentParams->consensus.vUpgrades[Consensus::UPGRADE_SAPLING].nActivationHeight = 227520;
|
||||
pCurrentParams->consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nActivationHeight = 227520;
|
||||
pCurrentParams->consensus.fCoinbaseMustBeProtected = true;
|
||||
checkpointData = //(Checkpoints::CCheckpointData)
|
||||
{
|
||||
boost::assign::map_list_of
|
||||
(0, pCurrentParams->consensus.hashGenesisBlock)
|
||||
(10000, uint256S("0xac2cd7d37177140ea4991cf630c0b9c7f94d707b84fb0351bf3a44856d2ae5dc"))
|
||||
(20000, uint256S("0xb0e8cb9f77aaa7ff5bd90d6c08d06f4c4bf03e00c2b8a35a042e760845590c8a"))
|
||||
(30000, uint256S("0xf2112ca577338ad7104bf905fa6a63d36b17a86f914c97b73cd31d43fcd7557c"))
|
||||
(40000, uint256S("0x00000000008f83378dab727864b763ce91a4ea5f75d55939c0c1390cfb8c38f1"))
|
||||
(49170, uint256S("0x2add646c0089871ec2379f02f7cd60b3af6efd9c152a6f16fc10925458c270cc")),
|
||||
(int64_t)1529910234, // * UNIX timestamp of last checkpoint block
|
||||
(int64_t)63661, // * total number of transactions between genesis and last checkpoint
|
||||
// (the tx=... number in the SetBestChain debug.log lines)
|
||||
(double)2777 // * estimated number of transactions per day after checkpoint
|
||||
// total number of tx / (checkpoint block height / (24 * 24))
|
||||
};
|
||||
|
||||
pCurrentParams->consensus.nMinimumChainWork = uint256S("0x000000000000000000000000000000000000000000000001a8f4f23f8b2d1f7e");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (strcmp(ASSETCHAINS_SYMBOL,"VRSCTEST") == 0 || strcmp(ASSETCHAINS_SYMBOL,"VERUSTEST") == 0)
|
||||
{
|
||||
pCurrentParams->consensus.nMinimumChainWork = uint256S("0x0000000000000000000000000000000000000000000000000000000000001f7e");
|
||||
}
|
||||
pCurrentParams->consensus.vUpgrades[Consensus::UPGRADE_SAPLING].nActivationHeight = ASSETCHAINS_SAPLING;
|
||||
pCurrentParams->consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nActivationHeight = ASSETCHAINS_OVERWINTER;
|
||||
checkpointData = //(Checkpoints::CCheckpointData)
|
||||
{
|
||||
boost::assign::map_list_of
|
||||
(0, pCurrentParams->consensus.hashGenesisBlock),
|
||||
(int64_t)1231006505,
|
||||
(int64_t)1,
|
||||
(double)2777 // * estimated number of transactions per day after checkpoint
|
||||
// total number of tx / (checkpoint block height / (24 * 24))
|
||||
};
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
checkpointData = //(Checkpoints::CCheckpointData)
|
||||
pCurrentParams->consensus.vUpgrades[Consensus::UPGRADE_SAPLING].nActivationHeight = ASSETCHAINS_SAPLING;
|
||||
pCurrentParams->consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nActivationHeight = ASSETCHAINS_OVERWINTER;
|
||||
// Generated at 1575831755 via hush3 contrib/checkpoints.pl by Duke Leto
|
||||
if (strcmp(ASSETCHAINS_SYMBOL,"HUSH3") == 0) {
|
||||
checkpointData = //(Checkpoints::CCheckpointData)
|
||||
{
|
||||
boost::assign::map_list_of
|
||||
|
||||
(0, pCurrentParams->consensus.hashGenesisBlock)
|
||||
( 5000, uint256S("0x049cfc91eef411e96603a42c9a77c5e30e9fe96f783ab818f4c00fb56fb29b6c"))
|
||||
( 10000, uint256S("0x0a0169db3614311cd4181deb73cfcf7f640e7dc956cda34e0121a0351925e9ae"))
|
||||
( 15000, uint256S("0x00f0bd236790e903321a2d22f85bd6bf8a505f6ef4eddb20458a65d37e14d142"))
|
||||
( 20000, uint256S("0x01bbf0c38892bdcced62b538329cf63bc7badca3e7e1bff8eb10345436871c6e"))
|
||||
( 25000, uint256S("0x04ca27808268dda8f942b647a6df844be1b263a661a13740293db962022d1f9e"))
|
||||
( 30000, uint256S("0x04c9e8cfbcd37399085e529b50147de8afb80c76c48752c122d56f23316a7acb"))
|
||||
( 35000, uint256S("0x00815f1240354cff7487c67f7dff78e248cb9053ed2c92751d1a9ad42d3eaedf"))
|
||||
( 40000, uint256S("0x00eafd9dfb1e5f1bf1cca0c49be628538900daf69b665464443d29c2c3b6a2fe"))
|
||||
( 45000, uint256S("0x0377730632caf694b92f40d03ae0fbe5bd86a1205014b71d975453ac793b0af9"))
|
||||
( 50000, uint256S("0x00076e16d3fa5194da559c17cf9cf285e21d1f13154ae4f7c7b87919549345aa"))
|
||||
( 55000, uint256S("0x0005a0701a83e05b639418ea4c87018544a4d22b2b49e5f111161e8ffc455108"))
|
||||
( 60000, uint256S("0x0000296fc15f8599b7c6561d0e0a96f24766135ed79107b603d6dd6e55142c0d"))
|
||||
( 65000, uint256S("0x000861f5d7970d5399733b4605074d47f877d6536f74ffae6f08e871ee29e6f2"))
|
||||
( 70000, uint256S("0x0002af1d487c567526c517b52996944dca344e139cddca77c2e72f746e73b263"))
|
||||
( 75000, uint256S("0x0d08129659be5f105e70c047769359eaf3475d61a726750859fdca3e1a2bf5cc"))
|
||||
( 80000, uint256S("0x0af5f3f1caae4f08c74a82689731d1ef8e55107c06f9a996e251b8ecb96989ad"))
|
||||
( 85000, uint256S("0x00000c8ee29086c5fb39eddad0619773b9ce936c77c13e5e5118a4998e939544"))
|
||||
( 90000, uint256S("0x06d3bb7f9ee5b55f67b2dc13c680699a2f736f43a44b4e4cfd41a58aa00f063f"))
|
||||
( 95000, uint256S("0x0670981b269879aae83a88f6f0c4db34763c93fd410d96435f2acb4e6580b976"))
|
||||
( 100000, uint256S("0x0f02eb1f3a4b89df9909fec81a4bd7d023e32e24e1f5262d9fc2cc36a715be6f"))
|
||||
( 105000, uint256S("0x018b97d7e6d259add24afe0e08fc125dc21d734e8831b68b430f5c3896deb4af"))
|
||||
( 110000, uint256S("0x09644ff52734e0e911a9ba7ecd03cf7995b25301840a9637891ef9af69f59c32"))
|
||||
( 115000, uint256S("0x0ee382b4729b8ceb918a92913f9c144a6a4f8a50bfc0f8b4aac5b12592caed7f"))
|
||||
( 120000, uint256S("0x082a7918a0dd9cb2df65f55acb8d0a4a535b3fa684d92c3ebcb24ed7019d975b"))
|
||||
( 125000, uint256S("0x00008f76c4484fd539c9d02fc69c40a50b6f9e00984d33890b85cc0324159e9e"))
|
||||
( 130000, uint256S("0x011b09e53acfe46f310e8c960a9c4f4f490cc7b2cd3791d7a6a80d6e8ac96b36"))
|
||||
( 135000, uint256S("0x01e0cd48358fa05646baa6f00e26717474d6049a537c8861b324d1f497dc3d4a"))
|
||||
( 140000, uint256S("0x0e6db36fd8a9d1b7baf359c8bd5c76635d0bcada973a75b5d2028ca3baea4961"))
|
||||
( 145000, uint256S("0x00010c40b57316ce6cde076807c9db956452a3c82cb09fe7d56c6bb1a7e24726"))
|
||||
( 150000, uint256S("0x0a817f15b9da636f453a7a01835cfc534ed1a55ce7f08c566471d167678bedce"))
|
||||
( 155000, uint256S("0x0528084fd00223bd9747635d7a4d8cc79f158795cad654efb78e4e4cc5f23d6a"))
|
||||
( 160000, uint256S("0x00003a09f26ae9fb7ebbfa3ef589b81ccd8909a82430f7414bc68d5a5a3316ab"))
|
||||
( 165000, uint256S("0x00004a0c6a29e7d1f22ea4e44d05e861fec5fcd8eebc5a61574c4ecf29dbb9be"))
|
||||
( 170000, uint256S("0x0cf9eac27badc0ae9a2b370dd7cc3fcb550f139349551e60978f394a2e1b262b"))
|
||||
( 175000, uint256S("0x0000137856b825d431da27ff4c3cf22f5482fa21952d45b0db0ec6774fb9b510"))
|
||||
( 180000, uint256S("0x000000b0afcccf98aa0afb6ac61050892bd9415857d66313d1f67fd1bbac312f"))
|
||||
( 185000, uint256S("0x00c2af8f88d84de080067f8ae1c25754e32e5516d20c11f85b9adae2d683687b"))
|
||||
( 190000, uint256S("0x00000033d85b3e7d19e02278ef300b8ab957d3dd3e58b4c81166ba0a58af5c3f"))
|
||||
( 195000, uint256S("0x000000964b6068be1dd4ee6893d183e86cba82a2744fb5439c463d0ba7e053b6"))
|
||||
( 200000, uint256S("0x000001763a9337328651ca57ac487cc0507087be5838fb74ca4165ff19f0e84f"))
|
||||
( 205000, uint256S("0x049fc6832e64a75ae898b32804e151e7561ea49082858c3d4af89a7de4b82f06"))
|
||||
( 210000, uint256S("0x0000000d9078b9c9604cc663eafafba8f3643bb3f3ddbb78fed4993236e1edb5"))
|
||||
( 215000, uint256S("0x00060089ecc21bcc62094e2f7f0448fe163415f6ef2f2aafe047757889ca82fe"))
|
||||
( 220000, uint256S("0x000082c78e6c2a13a9c23dd7a6faaf962fc133142b4a2d07725561f59c03bfa2"))
|
||||
( 225000, uint256S("0x00030026483167fe13505cf27049307ce42e0d9c5aa093aed10baa4f49edf4ca"))
|
||||
( 230000, uint256S("0x000183a3e17988060a35776b99c1f0b43393bbe7153b2718dfc57f428191de4e"))
|
||||
( 235000, uint256S("0x000184995f0ec024ed3783e322c8cfa5e68d9f0c77c3aaea301b22d311619156"))
|
||||
( 240000, uint256S("0x0000002cc7cf6d0a44ab57f9bd3bfa11a865bbf1cd87a2081095bc90981633a3"))
|
||||
( 245000, uint256S("0x004c5f19a88c8fe8a604006dbd2d44c94baef2a00876a17d8e2be2124003f979"))
|
||||
( 250000, uint256S("0x0dd54ef5f816c7fde9d2b1c8c1a26412b3c761cc5dd3901fa5c4cd1900892fba"))
|
||||
( 255000, uint256S("0x0b6da9e4f50c8bc7a92c539bc7474ffd6c29e0a8531f0dbbbc261fff1f990827"))
|
||||
( 260000, uint256S("0x0cac8b12bf7233ee5a68fcde9e251852b177833fefa2a9f39ec28474b0851cb9"))
|
||||
( 265000, uint256S("0x04feb5b4029f3b8b8eb3e6661a78eadd1a26b4af00ac59b5f05b261afcfd2818"))
|
||||
( 270000, uint256S("0x01bc5897bd20b8b61acf4989987ba85fbc37d9ebe848924aa8effcb08bf48fe0"))
|
||||
( 275000, uint256S("0x0416bc29eb5a12231826e546ba90fcd38aeef387ff77b45849cd418a9c1a6f12"))
|
||||
( 280000, uint256S("0x000007593e9880b171d46bce59aa0cec2a1b1f53d1fd7e8f71ccb2b9182374a4"))
|
||||
( 285000, uint256S("0x05a338b2d90cd79740221fe8635b7a834f2e486fcbb2464a4294f5a21231a5f5"))
|
||||
( 290000, uint256S("0x064ca3912cdcd833702d07a530e98bc5c6c1cd738a8825c7240b17cd68ca0cc4"))
|
||||
( 295000, uint256S("0x036b3bb318d743fd78db983a9aadd52869991d48913c4eebe2a074387d67cc5a"))
|
||||
( 300000, uint256S("0x000000fa5efd1998959926047727519ed7de06dcf9f2cd92a4f71e907e1312dc"))
|
||||
( 305000, uint256S("0x00003656231e83de2348755153ed175794696a113d7e8a15c01f90fdb7c2f287"))
|
||||
( 310000, uint256S("0x0cf6baf727eb931da0813ed8b032648c4766be79e146b0d40c643f9d8edf40f7"))
|
||||
( 315000, uint256S("0x082469974c152ebe69f1787f0d06aa5d9dd1dc69c880febde7eac2bc800146dd"))
|
||||
( 320000, uint256S("0x0000063df36b99bfb2516f55cb548a5baed1f2d8ae69c3559dc478c5c2eb32df"))
|
||||
( 325000, uint256S("0x0cb926b303a1514ba0a2f729af88ccb143517f396e9e0bde09b0736900698e0f"))
|
||||
( 330000, uint256S("0x000000be3d8bb6e31c3b534819aae7014cbbe9a44ab3e799dc1bfc724c6ab184"))
|
||||
( 335000, uint256S("0x0d0756608189fd5bbd8ec50e76180074e69e973439cc09df49134e4cb970ed4d"))
|
||||
( 340000, uint256S("0x0d814eacdb9c97003d703c0ff79b1b97b9ed8615fe12b1afaede946e5fdfe0a7"))
|
||||
( 345000, uint256S("0x000000c2910f510f1de325d300202da1a391f2719dd378173299151c3da94e85"))
|
||||
( 350000, uint256S("0x0000000228ef321323f81dae00c98d7960fc7486fb2d881007fee60d1e34653f"))
|
||||
( 355000, uint256S("0x03e6a55e382b478e0fab9c3584da3629fd9b977986a333a406b24b0d3559bf44"))
|
||||
( 360000, uint256S("0x0859c86dd718bcb5b58af06389197794e2beea6239653f2e6fa7b8a7433d29ea"))
|
||||
( 365000, uint256S("0x07896332665c707a8f55398a998e7878e8d2681ba79dd95c2859b1dafc9343d0"))
|
||||
( 370000, uint256S("0x040efd8c64cf5cf96ecf75468741a8880d1386eb5e349bef0a55116d4023944c"))
|
||||
( 375000, uint256S("0x053029e7599a09fe6c01203997d7ca738dd4c6d216a433695a0d514def1eccc0"))
|
||||
( 380000, uint256S("0x0cae44e7a421c389b88a5a204d3e39779e93aeacaab1b693741bf279fd0c8acd"))
|
||||
( 385000, uint256S("0x0b4032d2c799ba93644231ce57134dd24e13ec0dc267c1ed5912389691d2bd72"))
|
||||
( 390000, uint256S("0x0afd0f166f33a881ef289af7ea7010d58c4bbd560dee10b561c79e1b8dfd0593"))
|
||||
( 395000, uint256S("0x083774b88cf1b138d67c242d9b33c54f69d7e901b5e8144dc4a2303ab9927102"))
|
||||
( 400000, uint256S("0x036d294c5be96f4c0efb28e652eb3968231e87204a823991a85c5fdab3c43ae6"))
|
||||
( 405000, uint256S("0x0522e33bb2161fb1b33acef9a4a438fcf420dcae8a0b472e234d223d731c42b2"))
|
||||
( 410000, uint256S("0x0361d06aa807c66b87befea8119a485341d1118b694c3dbb4c3cf0b85ac69e9b"))
|
||||
( 415000, uint256S("0x072d5653d8673f64ef8b9c655f7b8021072070a072b799013ff6e96de99a59e6"))
|
||||
( 420000, uint256S("0x013b693d66955be69d4501cb1d307ca323a5c8473e25866ae7e700cdce0c654f"))
|
||||
( 425000, uint256S("0x0ef0c55af27c6971289a790dee2b2ec728fb9c6555ff9306c07f1083cf0fb4b5"))
|
||||
( 430000, uint256S("0x0ccbeeaba28291e0316a9cf54c005097c61dc67ba6f32283406d6c83b828da00"))
|
||||
( 435000, uint256S("0x020ed6b7fe1124400baba7feed463ba0c90e7e6903493fdc1a1a18c4a506055a"))
|
||||
( 440000, uint256S("0x055aaadca1908abeedc831a3f9115aa31284fc223d010590caf7b612960b61a4"))
|
||||
( 445000, uint256S("0x06d2327fa25ea7e2be742fc0e45fc4f9adb41811f21be0357f8543c5434df715"))
|
||||
( 450000, uint256S("0x0906ef1e8dc194f1f03bd4ce1ac8c6992fd721ef2c5ccbf4871ec8cdbb456c18"))
|
||||
( 455000, uint256S("0x0b8b92eec29eb20262dcf9916f0ca36d6abf0c39d321d3f480a5535cb978db71"))
|
||||
( 460000, uint256S("0x0cb04591f69a255b1127aaff3bbd59eaa21a5d9cca999de197516c251895c536"))
|
||||
( 465000, uint256S("0x029985ae78d8bb8fd170aeb3ab02ea76134ed0c19ae00211cc28a61fe5755b88"))
|
||||
( 470000, uint256S("0x01a2f4b56f37b223e75572862ad1ba956ec179332f8cd40590d7253563c86ba8"))
|
||||
( 475000, uint256S("0x0a34c6f9d4d9cb8c78c14b8041a7cc1874cfcbb22a34a5c068d1d6ff3ed9fdf0"))
|
||||
( 480000, uint256S("0x0ebab25030179996ae25969f34f6a297c7ffce1994f9b4186082a47032a9a7dc"))
|
||||
( 485000, uint256S("0x06a096e6bccf3b85537a30f95db6a414deacc0509bc84da264c2830df1a1d9b0"))
|
||||
( 490000, uint256S("0x0af828930ef13405cb536b88a3d1d4e0d84dc79ee260402c56bfa86e261c74ff"))
|
||||
( 495000, uint256S("0x09d44905bfd12849d3c2178b2ba882f8e9d6565b6e4d7a97c70a92bd6de7c5e6"))
|
||||
( 500000, uint256S("0x0bebdb417f7a51fe0c36fcf94e2ed29895a9a862eaa61601272866a7ecd6391b"))
|
||||
( 505000, uint256S("0x0c1609f4f3561baa1fc975877948af94d2107c88686a9821bc240016cc87d953"))
|
||||
( 510000, uint256S("0x0cf9a5a4997b871e615e5e398627e45fa15b3e6970ae22b47bdd11b0f5fa0fa7"))
|
||||
( 515000, uint256S("0x034171d4819e9961de13309743a32a179abede97d60ea64101dc04c97a1a0807"))
|
||||
( 520000, uint256S("0x0648fa44d5bbc2cc04a782e083c11df64ac06185f0f8e11a7416625ebb6409a6"))
|
||||
( 525000, uint256S("0x0000000ef17d63af3159e52cd351b6f000536ad88adc3a937bb747955fed58a2"))
|
||||
( 530000, uint256S("0x08e3af153995ba09e50086b64145cf4cd57db6b29f16f06f28d80d7f6121cfad"))
|
||||
( 535000, uint256S("0x02a0ffd00b51e2061b85de50a9223d9c84f4e357dc1046397bb9d7d4a827a3fb"))
|
||||
( 540000, uint256S("0x04bf07d026af29025c1ac2815e067f4a41d2872701ac9780eb3015d51cdcd854"))
|
||||
( 545000, uint256S("0x0a0d6d86635946792ad0dca57ed227a5360fc8b6d79e47132aac11e90a4963ce"))
|
||||
( 550000, uint256S("0x06df52fc5f9ba03ccc3a7673b01ab47990bd5c4947f6e1bc0ba14d21cd5bcccd"))
|
||||
( 555000, uint256S("0x0baf38eea8e08fcad3a9d760f27377e79c291b08e7fb4920cadd5cb7bab547f3"))
|
||||
( 560000, uint256S("0x00000004c34abbf1366adbae965b644c01debf15409acc715ff51cb221d92dd7"))
|
||||
( 565000, uint256S("0x067bae7119f083e0fa1820bc8e25dcfa7717e42aabaef18beefd87d974953dfb"))
|
||||
( 570000, uint256S("0x00000011a7ce7b628b7be17777d8dea2574d83f165e23c9e44aa705975820fd3"))
|
||||
( 575000, uint256S("0x0e1110a193a30d3f8d369017233a2486b11c748b3d033859a2eb7b37062d303e"))
|
||||
( 580000, uint256S("0x083cb58484aff80f48e3537e0451d49e544b3efa3da97274800c91e567d33a92"))
|
||||
( 585000, uint256S("0x0224cf835428d03472edf4f7b6fcc63b9d8d6f1d5a90ad8186bf123d541b4ea8"))
|
||||
( 590000, uint256S("0x0cfcf3b9517894e4df49db5faf8b74f3a9e01eb83c0cc5051c115d4424615dae"))
|
||||
( 595000, uint256S("0x0000000a45266983dd81e0df381a3b0455699b2f76d5b4d3f17b87d657a1b56d"))
|
||||
( 600000, uint256S("0x00000005080d5689c3b4466e551cd1986e5d2024a62a79b1335afe12c42779e4"))
|
||||
( 605000, uint256S("0x0000001c691da36848542299af859d4eb3fa408a0f425b1fbe6d622d2100623a"))
|
||||
( 610000, uint256S("0x040d8c7a0ac89e3ed8605a198583a795986aacbf18722a9897d7b925bcf757f6"))
|
||||
( 615000, uint256S("0x0449cf00fc36206389c14cbf1d762f8b96bb0440ccea5b46703e7c69b0e2bc42"))
|
||||
( 620000, uint256S("0x07227a41340c25ee1a7e9b60414259780202ffa990079fc91d8faeac9af03e60"))
|
||||
( 625000, uint256S("0x047c2472fe2afabb3d38decf24bba4ba712b60e7a1782f4afae3ede3f912f493"))
|
||||
( 630000, uint256S("0x0a7f1f04e66260cf972ab1374a9126b8abc1adaa3ab4669db5d4d4ddb9ad493d"))
|
||||
( 635000, uint256S("0x048df95165eb821dabf37ef28cf7f3be72e216e95377684253dab806985b50a4"))
|
||||
( 640000, uint256S("0x066b3c6a6a3c8dc58bef509a972c3e3ade14493b40e1b361ecbc928134e302be"))
|
||||
( 645000, uint256S("0x07d059888c9ade3bbe16d6b4d70ee9b8302d104b37a3c6cd61f81012aabd0e1e"))
|
||||
( 650000, uint256S("0x039a3cb760cc6e564974caf69e8ae621c14567f3a36e4991f77fd869294b1d52"))
|
||||
( 655000, uint256S("0x089350ee8d28b44837eb4b1fe77704953d5de2077f10c74a888d9d3ea1e13c2a"))
|
||||
( 660000, uint256S("0x000000023f8a582a61ae2f6fab6fe8197e79b7a68aaac67432421b09f1bdd4ba"))
|
||||
( 665000, uint256S("0x0b16edce865e7a0d662115774e0c0d3abbf9c69004155b693ddc933f051bfb26"))
|
||||
( 670000, uint256S("0x09070b109b089490bc372fd8358abae352d6db0e46ade6ed2200e4d4ff7aa6af"))
|
||||
( 675000, uint256S("0x08d9edeed3b6ac55991e9f32af0218ff8fa9dc808078623f4c831eb09d4f186b"))
|
||||
( 680000, uint256S("0x00000003eb2b30bfac929d3496acecab19625ac9f854a86aaf9678bea99e1cc1"))
|
||||
( 681777, uint256S("0x0000243296b9b26c040f471fdd9398ef72e57062cf05c19b9ba2fefac8165306")),
|
||||
(int64_t)1516924927, // * UNIX timestamp of last checkpoint block
|
||||
(int64_t)1253783, // * total number of transactions between genesis and last checkpoint
|
||||
// (the tx=... number in the SetBestChain debug.log lines)
|
||||
(double)2777 // * estimated number of transactions per day after checkpoint
|
||||
// total number of tx / (checkpoint block height / (24 * 24))
|
||||
(1000, uint256S("0x0000001893130f005d2e90fcdf40057ae06390bd0490740aae2843e62aeb7bc2"))
|
||||
(2000, uint256S("0x00000003003e6c8fa176ef293d1322514778343601fa21dfdb0c9aacef189576"))
|
||||
(3000, uint256S("0x00000005c1419d252bc59d77c06e07aad61702c8b3e76d2070577a18159ab59d"))
|
||||
(4000, uint256S("0x00000008bc4094ea475a871302361ffdc6bfd63ded049d172c8dad01ed67fd3c"))
|
||||
(5000, uint256S("0x000000018f8543066baa9c5f83e981749da4cb625fad02c187b4a9c4693ebd60"))
|
||||
(6000, uint256S("0x0000000567191591911b33b852e4b87de119df2c773bc800b5a3655be18eb98e"))
|
||||
(7000, uint256S("0x000000082e7b000480d0317d9115f0d0737e78fa2381a2d6456f598bf83fe2f0"))
|
||||
(8000, uint256S("0x0000000415226fff123cd868e255a23d72e204d61bb405fb9dde0810e7721ebf"))
|
||||
(9000, uint256S("0x00000000bd26f7b8d6d80230aad06c0cd590758176b8558da7dfc14161a23ab7"))
|
||||
(10000, uint256S("0x00000002d177d1cbfeaf7c27a2a32766ea9063d222cbcc7623dc08355b07a3ad"))
|
||||
(11000, uint256S("0x0000000284bcffa3bef4097178a94b6b9a788261981253cb8cd6db6b47634732"))
|
||||
(12000, uint256S("0x000000006cf15fdb94253a9389d95ef607c3484c635fe0c8a1f1ec1e5a1c6865"))
|
||||
(13000, uint256S("0x00000001cdc66e08f7f13c775aa1220a801a33df90edba7bbcffac8d06181207"))
|
||||
(14000, uint256S("0x0000000443e432c7dbf0707a12c5671dd1ca606f962368a847bbcff2f5fc2135"))
|
||||
(15000, uint256S("0x000000008dbfbd5d5e27d819bf2989c5658c3494608bfa1320ad0b090660cd44"))
|
||||
(16000, uint256S("0x00000003c6a59e5b10e1a1c6bef08dee4d33d1841156bf97e26c3e4df789b128"))
|
||||
(17000, uint256S("0x00000001debe3734ef4b6aacedde4a6b04cd1c60d4cf37b9f4689f2225ff7c24"))
|
||||
(18000, uint256S("0x00000002e37eccfa7bacd9c201468c754cbef50be9411e3f907891755eef4c6d"))
|
||||
(19000, uint256S("0x000000044636331c0277abb5592529cae1303d2bd43981a8382b4cc152a8d024"))
|
||||
(20000, uint256S("0x00000000a7840e1fccedb13672804e94fcaa87c0360ee4f7353a6b93e5a59da8"))
|
||||
(21000, uint256S("0x00000003a89b17d0cd489045ad62531c4211ee17c3609ed3e4291a067636d526"))
|
||||
(22000, uint256S("0x0000000352a7a25b3fe5f1a32a2c42260d32345487b92b6e520eecec0ee6aca4"))
|
||||
(23000, uint256S("0x00000002c1fdc5cc1211b7adff3b7e755059638fd98bd9da1cdd86bd9a0af1fd"))
|
||||
(24000, uint256S("0x0000000603a6190bbfdcdc5da9645d069aebd7a0b29607077470089c7b4a1188"))
|
||||
(25000, uint256S("0x0000000519d6ab6ca9c705ebafa9946bce34934709621bc22227567e90608667"))
|
||||
(26000, uint256S("0x0000000146e7314e2ebb2bfc10b9fe0fdd744734910a3971bbc4e970fe2c4cb9"))
|
||||
(27000, uint256S("0x000000047060e4173b4edd6374c3580580981dea20d0b49ea15c9fdfa97ba104"))
|
||||
(28000, uint256S("0x000000065eea521cccf6b1f99e1a77683717d02ddaed654a4c85d717e1e8c957"))
|
||||
(29000, uint256S("0x00000001ecdbcd195e04f792721262dc79bb070e73b6606b389825b5ae8e4791"))
|
||||
(30000, uint256S("0x0000000240de901e9e70d2db5badf62886ab0e8c442107d571bc04b3bdd43052"))
|
||||
(31000, uint256S("0x00000002d39f4f3504660e13e956c12aa3411a0ba392b3797d95f15e8fbd1958"))
|
||||
(32000, uint256S("0x0000000130cd781ed559d553f35a6bc99ed252aadd92b2a461bd332ca2d69a96"))
|
||||
(33000, uint256S("0x000000035ad950b0e78bbaf19f7a97865f29edd600e7aee4a3fce2e42db29d38"))
|
||||
(34000, uint256S("0x00000004f33b5ff97c128bfbef656aa10341e2606f54e198d5280016d2578eca"))
|
||||
(35000, uint256S("0x00000000ad1ef91eb70011a94646c148f1b8949b464a0de82adf1ba1ce6175a5"))
|
||||
(36000, uint256S("0x00000003b1450e1cf9f4e5f53534777b24039fcde81ec7ac1c2ea754a26fcd78"))
|
||||
(37000, uint256S("0x0000000337c4407954be01dcaf75a660e4b5b69e9e923bd62e74b0e44f01d9df"))
|
||||
(38000, uint256S("0x00000002b5d6f83f8d2ef7d88c3cdff1e444882819a70a7c7281d1d92f81bc9a"))
|
||||
(39000, uint256S("0x00000001a1eb6a530b065c873f65219de3282c4f386ba68bc2a0b88dc2b4c5cd"))
|
||||
(40000, uint256S("0x000000013b65e22d0bb6a9103dc71da5a1b7fa2acbc1c7d7a4d8f7730c37d4ab"))
|
||||
(41000, uint256S("0x000000027dbc2315769690cf93c79c54e0591c808d83decb66302492f0f79f1c"))
|
||||
(42000, uint256S("0x00000000ca09a12162a92b9ecbf6bf00a2bb822a77dd142df26d81db95c21bed"))
|
||||
(43000, uint256S("0x000000050c4c80b9e53b960a638bd231c193a383f0df162c720e4594ba427a4b"))
|
||||
(44000, uint256S("0x00000000f42d6c43703dbb47847298cedcbef8a27018baed8f4a217e7d5d823c"))
|
||||
(45000, uint256S("0x00000004da449923c218bd3e69745ebafca41c32e0c81ab6b485ae6c4c80df18"))
|
||||
(46000, uint256S("0x00000006e4bdf2707158e266d2d54294b20063c0f1723abed97fafe7ecf4b2de"))
|
||||
(47000, uint256S("0x0000000015d099357b0c8cbc24d8e2bd18e5e47eabe6ff89c09c9837bb071cd8"))
|
||||
(48000, uint256S("0x00000009c9ddaffefc5d5c78a6f89b872fdd732c16a5311debed6b92255f340b"))
|
||||
(49000, uint256S("0x00000008447d907ddc1d87df0ea235636baaaf34bc1000620e8173f1d8f7758c"))
|
||||
(50000, uint256S("0x000000027470e84cd195242f199b90fde40b70f80fac7a7080b1517c95cf56c6"))
|
||||
(51000, uint256S("0x000000015190913dec8a508bc219b0a0a1587b50acb23b48343010015cb5ec69"))
|
||||
(52000, uint256S("0x000000071608ad395dc31dc3011d5cad7f7a7296e34490a1e9e2dcf060bcc649"))
|
||||
(53000, uint256S("0x0000000608fa8a454c3c0e5e06bf091c4cfa131e7b91eb6622087cfc3fa4c149"))
|
||||
(54000, uint256S("0x0000000455eac130c205512cc0bffaa3ecb2d393cbf0d9e943c3d5911ea06a4b"))
|
||||
(55000, uint256S("0x00000000a20b276ed95b261a51681fb2d0d58e528cc8cd2e5fb7fdeb732b1861"))
|
||||
(56000, uint256S("0x000000016057dfbf2fc59650b63b7c2dc2379af75cf00c0ee3f3835e992ec11e"))
|
||||
(57000, uint256S("0x00000003a1eff8b5160655111ff1c0f1426b2b879c1f6fd761332b82c8640c67"))
|
||||
(58000, uint256S("0x00000001b0ac789061a277b553de1aae373533f5b6b1330326744ac7087c87c9"))
|
||||
(59000, uint256S("0x0000000a0dee07bdf593a68e5463cb5553f9bce3367a39d88f07ea43709eba87"))
|
||||
(60000, uint256S("0x000000060382850eadef184b67f38c0b2de27157296f3d9d8e2b7b70b1f76127"))
|
||||
(61000, uint256S("0x0000000492a93fd6c9eb080f3398517b39c8eaf835440d2571e515f76a931bf2"))
|
||||
(62000, uint256S("0x00000005ee0b8f7fcae8e6b17b12ab66f17cf34697182afc29d863d9844a84a9"))
|
||||
(63000, uint256S("0x000000045842b1c05c7e9a1a887e9a6ecdcaea2f4e03b9476031ed609ace91d2"))
|
||||
(64000, uint256S("0x00000004259921159c0714b90b1950fbae7eee2a14687dcfc57ab22b39c8123c"))
|
||||
(65000, uint256S("0x0000000618eb1c909301585f6b8f17ee6d09da97c580fe70d59babcd7864b556"))
|
||||
(66000, uint256S("0x000000049c85139efb1694525b5cf864a6021e49a412aaea9ff2b2b6ee04e1ca"))
|
||||
(67000, uint256S("0x0000000141358b3ae2c4ab2a384f963f4fdc925060c42de5578aec82c1de3189"))
|
||||
(68000, uint256S("0x0000000405b0273ba96d1e83e27e50ecf5f123c2e3e05b56524cc2cd79ea18e7"))
|
||||
(69000, uint256S("0x0000000764c8a434a1583b2578155a18720bbad67cc2c06e2fb013e872b1b10e"))
|
||||
(70000, uint256S("0x00000006d11cf168399c719b2bb036eadd09e740c98764d82adf75f5a800e90d"))
|
||||
(71000, uint256S("0x00000002339c3cf62fc4716899a0e341969d85146dcb98854607332f81e5f258"))
|
||||
(72000, uint256S("0x000000055e39f9cd963bac08c9c10ab982491d50b66486099675b015016dad7a"))
|
||||
(73000, uint256S("0x0000000766261dbd9e48a0d544d012f57ab7890a761d893851b63e0e5b5e47dc"))
|
||||
(74000, uint256S("0x000000058bd8080674ffb086704fbfde45e91172d0784416ed5356d20bd60fd7"))
|
||||
(75000, uint256S("0x00000007abb9cb521244c988f0ace53bf230bdf9c9db75d0102472a721c6b038"))
|
||||
(76000, uint256S("0x000000071789d7ecf5e8c7e1a982e119d0b9d6748cb01426a5b8fff77a54f76b"))
|
||||
(77000, uint256S("0x00000007364be847b08481f87bbe4db69a79f5c4388e3c898ea140011a121ca7"))
|
||||
(78000, uint256S("0x000000031b7afd1aa244d78056606bf718cb96cb1fe1656070d37ed9d4031ebf"))
|
||||
(79000, uint256S("0x00000003125d8e62fa215c1797229d271db705299f43e1db85edb7ac68349127"))
|
||||
(80000, uint256S("0x000000031c23c3a1828b3a432ab27c6b34a93741f5711507abeb34a822ba5311"))
|
||||
(81000, uint256S("0x0000000212aab2361322e29a1037b82624fc2acdb61dd457ae25e4dffca14b42"))
|
||||
(82000, uint256S("0x00000003140442a0d3b5ba57d2e51ed4a2ec39fb6ee8c9e2d70d530f46843f57"))
|
||||
(83000, uint256S("0x0000000404e963d87db2ccd709377d5fd8b28c67c51ffcace62290844b895ba0"))
|
||||
(84000, uint256S("0x00000003076c29391d9a5910e287d5319f4bf29f92eb309a8dd72cbf98847102"))
|
||||
(85000, uint256S("0x00000006fc5823857bdd44f89f4a97838a9f735c7bdf81bd89f50110dc16fbab"))
|
||||
(86000, uint256S("0x00000002247705c4f02ab4a672686dadba9de55fcf71433388a4250af6d1154d"))
|
||||
(87000, uint256S("0x00000000302718129c873c0ba6e571512ab5c4216e0d978ed3ef1d4dccddbb26"))
|
||||
(88000, uint256S("0x00000002129732e7d8d99d78eef4ed3318cdbd73883d88e7c2b9534d11284486"))
|
||||
(89000, uint256S("0x00000001513759a2e2b6e6c30ee8db631957511adcefa518ad31e0b1ec4e789d"))
|
||||
(90000, uint256S("0x00000003e62dcb81fe33178e2dc45c70ca04733542179ac5d93bceb7c456f365"))
|
||||
(91000, uint256S("0x00000000674963dd8d6d7dab67d1df8c6e9455cef55014aa15082722f9d7f115"))
|
||||
(92000, uint256S("0x00000004f4e1151df0905baf82bd29ece0fc7db8d96a2ae6c0efad0e0e68e55e"))
|
||||
(93000, uint256S("0x00000002876b9eb7b41e025d55d7dd740b5dc811eae0909169081e705c61b6b5"))
|
||||
(94000, uint256S("0x00000001efdcd19bf060a424cd0cef2d04f0d206fae21a72a57b4cc8d1019421"))
|
||||
(95000, uint256S("0x00000002a22cae35b32e31ffbe55d2d56ef04f010aebd19f1536b7582c1ea4d9"))
|
||||
(96000, uint256S("0x0000000433d2385e8260c26dabec1c5f7376ed63b478c5d94bc15ee521a86ee3"))
|
||||
(97000, uint256S("0x00000003112c73fd4cf10604e1a44b7acd698e196cbe16e63abdcd34008f4b36"))
|
||||
(98000, uint256S("0x0000000179fb7ea8e68c54de5d09e531b5cbbfe7f5d128f3f93f55576673ddc7"))
|
||||
(99000, uint256S("0x00000002e8e3a9f26154b941837d42ad62ea153d75be61a13c04e2249a781243"))
|
||||
(100000, uint256S("0x00000001bc1c40d120bf2df1654f3fb5e4d28d4ff292d05667cf5610042c794a"))
|
||||
(101000, uint256S("0x00000003a52ec72d58bdb88096334a29eddb17fd454a7c15aba815358f3b4285"))
|
||||
(102000, uint256S("0x00000002a602644eb8765aab158112307f25bc6e8f82c1220be08642be6d12ca"))
|
||||
(103000, uint256S("0x000000044a6a0aca758af879fee5bbbfc4ac75287f63cc91ad26bc921d3c44ac"))
|
||||
(104000, uint256S("0x000000013fe4abb66862573821938d8e203da577e8c15055249a5fc4d6ca28f6"))
|
||||
(105000, uint256S("0x0000000175182a7f9c46aaae8723a664168af4be37c5d73e8f773df6b67a458b"))
|
||||
(106000, uint256S("0x000000005426bdc52efa996e5bd44f0d5f075fdd865063a1c5c341f4b37aa8d7"))
|
||||
(107000, uint256S("0x000000026ce5ee0c6f81786838f502ab3ac4b52371716b3956bb58f91fe2a79e"))
|
||||
(108000, uint256S("0x000000042a0f660df6ef24e237b4010749b7cc7ba402fe7f6af98643df62cb0b"))
|
||||
(109000, uint256S("0x000000020debe96d90bc1d317036404c4518309e93c45303f86bdef7fac213df"))
|
||||
(110000, uint256S("0x000000030ba3cdbb85d5028379dfe50fbf28c04f8add3300814c2f649ec53594"))
|
||||
(111000, uint256S("0x000000030d9aa7e30990157616d54e5c32a26a0fbb5db1a7fde7e192bb2bd992"))
|
||||
(112000, uint256S("0x00000003885472c246e7f5cc5c9982ce0d1ed292ff0b09451c272f201ff1bd3a"))
|
||||
(113000, uint256S("0x000000027d6d7f782a510fa9b2a41f8f1a713fa4ff12906e453ba59af911cbfc"))
|
||||
(114000, uint256S("0x000000046020cd15a3803db747ec6811bee5703c9b67b54185d8fae23f7617cf"))
|
||||
(115000, uint256S("0x000000019fd1a317c649c83c6b2a3f6bca7e82fac2fc89ce69de4b6d5715050b"))
|
||||
(116000, uint256S("0x00000002cad5e312f8553c3ca053f3588d53561722ce3bf20d55eb4654707668"))
|
||||
(117000, uint256S("0x0000000339f55a289fabf4881ab5d89739779bc0e1ab5650830b4fec8870d183"))
|
||||
(118000, uint256S("0x000000027bc70600ad7355ee66e6ca0b9d2fd24b7778014bb464a7bbc37627de"))
|
||||
(119000, uint256S("0x00000001ddca829e3480f45ec3f7291fe9d611dd4600c047516729052a881058"))
|
||||
(120000, uint256S("0x0000000217decb42c4ea26cbee700e728a558ae648393b8014f035566ef2a456"))
|
||||
(121000, uint256S("0x00000000f2798338531f5a39201960a80ec28203cdd5dcd27718f6a7fd6723bf"))
|
||||
(122000, uint256S("0x00000001204dfcde9f95ef04a25f54553329a48fe34078e213d93199dfe0c26b"))
|
||||
(123000, uint256S("0x0000000220091729c30ec5a296a5218e0500bff2dfe10a5d9e5ceca2ea39482b"))
|
||||
(124000, uint256S("0x00000002415360bf949d8e96362ce7b0aada6adbcfb73aba536fa7a329fec49f"))
|
||||
(125000, uint256S("0x000000002aeab45f5e399d027976c49f4c7732ddbb78d7dc729fb226346ea3f1"))
|
||||
(126000, uint256S("0x0000000067f239b6b78180145dc4ccbda1c71d506201f807912ddc170683808d"))
|
||||
(127000, uint256S("0x00000001962a64e4e5a9e9c6cc286e2bcf155734c24f2c9481128e37ac6d9712"))
|
||||
(128000, uint256S("0x000000011dfac6f7447ae6de5002dd3bf5ddc94faadb706f45e0b4724257dfe5"))
|
||||
(129000, uint256S("0x0000000014f4aa454784a182645fa425834f8f9464abea319ea0afe5d3ccd91a"))
|
||||
(130000, uint256S("0x000000001c4a5aa11e6c142931463fcf7a9f5b9fb41061d26c18ff1860431881"))
|
||||
(131000, uint256S("0x000000003c44e490a60f7aa1941835277230706cfbf58dc8113610cc9c3582eb"))
|
||||
(132000, uint256S("0x0000000041bef6adaff29263986224bd5a2999e2aec38aa07b52fa67eed1402f"))
|
||||
(133000, uint256S("0x0000000162eb0ea1633481197a8ddc3743ff32ce2e8ecc249f9a8e9912459e05"))
|
||||
(134000, uint256S("0x00000002a34611317b4b1d8bc8640282ffb7d7c86fc858af7e0abb0bca6b720d"))
|
||||
(135000, uint256S("0x000000025f9502fc7474d62a0a23417cc5b77f3a049260e65b5b810d71074743"))
|
||||
(136000, uint256S("0x00000000af2a19997fde28b70235070f627f3b5900a9ee13c927529a11110bc6")),
|
||||
(int64_t) 1575741799, // time of last checkpointed block
|
||||
(int64_t) 274689, // total txs
|
||||
(double) 1065 // txs in the last day before block 136590
|
||||
};
|
||||
} else {
|
||||
checkpointData = //(Checkpoints::CCheckpointData)
|
||||
{
|
||||
boost::assign::map_list_of
|
||||
(0, pCurrentParams->consensus.hashGenesisBlock),
|
||||
(int64_t)1231006505,
|
||||
(int64_t)1,
|
||||
(double)2555
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
pCurrentParams->SetCheckpointData(checkpointData);
|
||||
|
||||
@@ -33,9 +33,9 @@
|
||||
//! These need to be macros, as clientversion.cpp's and bitcoin*-res.rc's voodoo requires it
|
||||
// Must be kept in sync with configure.ac !
|
||||
#define CLIENT_VERSION_MAJOR 3
|
||||
#define CLIENT_VERSION_MINOR 1
|
||||
#define CLIENT_VERSION_MINOR 3
|
||||
#define CLIENT_VERSION_REVISION 0
|
||||
#define CLIENT_VERSION_BUILD 0
|
||||
#define CLIENT_VERSION_BUILD 50
|
||||
|
||||
//! Set to true for release, false for prerelease or test build
|
||||
#define CLIENT_VERSION_IS_RELEASE true
|
||||
@@ -56,7 +56,7 @@
|
||||
#define DO_STRINGIZE(X) #X
|
||||
|
||||
//! Copyright string used in Windows .rc files
|
||||
#define COPYRIGHT_STR "2009-" STRINGIZE(COPYRIGHT_YEAR) " The Bitcoin Core Developers, The Zcash developers, Komodo developers, and Verus developers"
|
||||
#define COPYRIGHT_STR "2009-" STRINGIZE(COPYRIGHT_YEAR) " The Bitcoin Core Developers, The Zcash developers, Komodo developers, Hush developers"
|
||||
|
||||
/**
|
||||
* bitcoind-res.rc includes this file, but it cannot cope with real c++ code.
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
// Copyright (c) 2012-2014 The Bitcoin Core developers
|
||||
// Copyright (c) 2019 The Hush developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
@@ -333,13 +334,6 @@ void CCoinsViewCache::PopAnchor(const uint256 &newrt, ShieldedType type) {
|
||||
}
|
||||
|
||||
void CCoinsViewCache::SetNullifiers(const CTransaction& tx, bool spent) {
|
||||
for (const JSDescription &joinsplit : tx.vjoinsplit) {
|
||||
for (const uint256 &nullifier : joinsplit.nullifiers) {
|
||||
std::pair<CNullifiersMap::iterator, bool> ret = cacheSproutNullifiers.insert(std::make_pair(nullifier, CNullifiersCacheEntry()));
|
||||
ret.first->second.entered = spent;
|
||||
ret.first->second.flags |= CNullifiersCacheEntry::DIRTY;
|
||||
}
|
||||
}
|
||||
for (const SpendDescription &spendDescription : tx.vShieldedSpend) {
|
||||
std::pair<CNullifiersMap::iterator, bool> ret = cacheSaplingNullifiers.insert(std::make_pair(spendDescription.nullifier, CNullifiersCacheEntry()));
|
||||
ret.first->second.entered = spent;
|
||||
@@ -622,6 +616,7 @@ CAmount CCoinsViewCache::GetValueIn(int32_t nHeight,int64_t *interestp,const CTr
|
||||
|
||||
bool CCoinsViewCache::HaveJoinSplitRequirements(const CTransaction& tx) const
|
||||
{
|
||||
<<<<<<< HEAD
|
||||
/*
|
||||
boost::unordered_map<uint256, SproutMerkleTree, CCoinsKeyHasher> intermediates;
|
||||
|
||||
@@ -653,15 +648,45 @@ bool CCoinsViewCache::HaveJoinSplitRequirements(const CTransaction& tx) const
|
||||
}
|
||||
*/
|
||||
|
||||
||||||| merged common ancestors
|
||||
boost::unordered_map<uint256, SproutMerkleTree, CCoinsKeyHasher> intermediates;
|
||||
|
||||
BOOST_FOREACH(const JSDescription &joinsplit, tx.vjoinsplit)
|
||||
{
|
||||
BOOST_FOREACH(const uint256& nullifier, joinsplit.nullifiers)
|
||||
{
|
||||
if (GetNullifier(nullifier, SPROUT)) {
|
||||
// If the nullifier is set, this transaction
|
||||
// double-spends!
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
SproutMerkleTree tree;
|
||||
auto it = intermediates.find(joinsplit.anchor);
|
||||
if (it != intermediates.end()) {
|
||||
tree = it->second;
|
||||
} else if (!GetSproutAnchorAt(joinsplit.anchor, tree)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
BOOST_FOREACH(const uint256& commitment, joinsplit.commitments)
|
||||
{
|
||||
tree.append(commitment);
|
||||
}
|
||||
|
||||
intermediates.insert(std::make_pair(tree.root(), tree));
|
||||
}
|
||||
|
||||
for (const SpendDescription &spendDescription : tx.vShieldedSpend) {
|
||||
if (GetNullifier(spendDescription.nullifier, SAPLING)) { // Prevent double spends
|
||||
fprintf(stderr,"%s: existing nullifier!",__FUNCTION__);
|
||||
LogPrintf("%s: sapling nullifier %s exists, preventing double spend\n", __FUNCTION__, spendDescription.nullifier.GetHex().c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
SaplingMerkleTree tree;
|
||||
if (!GetSaplingAnchorAt(spendDescription.anchor, tree)) {
|
||||
fprintf(stderr,"%s: missing Sapling anchor!",__FUNCTION__);
|
||||
LogPrintf("%s: missing sapling anchor: %s \n", __FUNCTION__, spendDescription.anchor.GetHex().c_str());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
// Copyright (c) 2009-2014 The Bitcoin Core developers
|
||||
// Copyright (c) 2019 The Hush developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
@@ -39,7 +40,6 @@
|
||||
#include <boost/foreach.hpp>
|
||||
#include <boost/unordered_map.hpp>
|
||||
#include "zcash/IncrementalMerkleTree.hpp"
|
||||
//#include "veruslaunch.h"
|
||||
|
||||
/**
|
||||
* Pruned version of CTransaction: only retains metadata and unspent transaction outputs
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include "cc/eval.h"
|
||||
#include "crosschain.h"
|
||||
#include "notarisationdb.h"
|
||||
#include "notaries_staked.h"
|
||||
|
||||
|
||||
int GetSymbolAuthority(const char* symbol)
|
||||
{
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
// Copyright (c) 2014 The Bitcoin Core developers
|
||||
// Copyright (c) 2019-2020 The Hush developers
|
||||
// Released under the GPLv3
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
@@ -17,7 +19,7 @@
|
||||
#include "compat/endian.h"
|
||||
|
||||
#if defined(NDEBUG)
|
||||
# error "Zcash cannot be compiled without assertions."
|
||||
# error "Hush cannot be compiled without assertions."
|
||||
#endif
|
||||
|
||||
uint16_t static inline ReadLE16(const unsigned char* ptr)
|
||||
|
||||
@@ -1,606 +0,0 @@
|
||||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2016 kste
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
Optimized Implementations for Haraka256 and Haraka512
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "crypto/haraka.h"
|
||||
|
||||
u128 rc[40];
|
||||
u128 rc0[40] = {0};
|
||||
|
||||
void load_constants() {
|
||||
rc[0] = _mm_set_epi32(0x0684704c,0xe620c00a,0xb2c5fef0,0x75817b9d);
|
||||
rc[1] = _mm_set_epi32(0x8b66b4e1,0x88f3a06b,0x640f6ba4,0x2f08f717);
|
||||
rc[2] = _mm_set_epi32(0x3402de2d,0x53f28498,0xcf029d60,0x9f029114);
|
||||
rc[3] = _mm_set_epi32(0x0ed6eae6,0x2e7b4f08,0xbbf3bcaf,0xfd5b4f79);
|
||||
rc[4] = _mm_set_epi32(0xcbcfb0cb,0x4872448b,0x79eecd1c,0xbe397044);
|
||||
rc[5] = _mm_set_epi32(0x7eeacdee,0x6e9032b7,0x8d5335ed,0x2b8a057b);
|
||||
rc[6] = _mm_set_epi32(0x67c28f43,0x5e2e7cd0,0xe2412761,0xda4fef1b);
|
||||
rc[7] = _mm_set_epi32(0x2924d9b0,0xafcacc07,0x675ffde2,0x1fc70b3b);
|
||||
rc[8] = _mm_set_epi32(0xab4d63f1,0xe6867fe9,0xecdb8fca,0xb9d465ee);
|
||||
rc[9] = _mm_set_epi32(0x1c30bf84,0xd4b7cd64,0x5b2a404f,0xad037e33);
|
||||
rc[10] = _mm_set_epi32(0xb2cc0bb9,0x941723bf,0x69028b2e,0x8df69800);
|
||||
rc[11] = _mm_set_epi32(0xfa0478a6,0xde6f5572,0x4aaa9ec8,0x5c9d2d8a);
|
||||
rc[12] = _mm_set_epi32(0xdfb49f2b,0x6b772a12,0x0efa4f2e,0x29129fd4);
|
||||
rc[13] = _mm_set_epi32(0x1ea10344,0xf449a236,0x32d611ae,0xbb6a12ee);
|
||||
rc[14] = _mm_set_epi32(0xaf044988,0x4b050084,0x5f9600c9,0x9ca8eca6);
|
||||
rc[15] = _mm_set_epi32(0x21025ed8,0x9d199c4f,0x78a2c7e3,0x27e593ec);
|
||||
rc[16] = _mm_set_epi32(0xbf3aaaf8,0xa759c9b7,0xb9282ecd,0x82d40173);
|
||||
rc[17] = _mm_set_epi32(0x6260700d,0x6186b017,0x37f2efd9,0x10307d6b);
|
||||
rc[18] = _mm_set_epi32(0x5aca45c2,0x21300443,0x81c29153,0xf6fc9ac6);
|
||||
rc[19] = _mm_set_epi32(0x9223973c,0x226b68bb,0x2caf92e8,0x36d1943a);
|
||||
rc[20] = _mm_set_epi32(0xd3bf9238,0x225886eb,0x6cbab958,0xe51071b4);
|
||||
rc[21] = _mm_set_epi32(0xdb863ce5,0xaef0c677,0x933dfddd,0x24e1128d);
|
||||
rc[22] = _mm_set_epi32(0xbb606268,0xffeba09c,0x83e48de3,0xcb2212b1);
|
||||
rc[23] = _mm_set_epi32(0x734bd3dc,0xe2e4d19c,0x2db91a4e,0xc72bf77d);
|
||||
rc[24] = _mm_set_epi32(0x43bb47c3,0x61301b43,0x4b1415c4,0x2cb3924e);
|
||||
rc[25] = _mm_set_epi32(0xdba775a8,0xe707eff6,0x03b231dd,0x16eb6899);
|
||||
rc[26] = _mm_set_epi32(0x6df3614b,0x3c755977,0x8e5e2302,0x7eca472c);
|
||||
rc[27] = _mm_set_epi32(0xcda75a17,0xd6de7d77,0x6d1be5b9,0xb88617f9);
|
||||
rc[28] = _mm_set_epi32(0xec6b43f0,0x6ba8e9aa,0x9d6c069d,0xa946ee5d);
|
||||
rc[29] = _mm_set_epi32(0xcb1e6950,0xf957332b,0xa2531159,0x3bf327c1);
|
||||
rc[30] = _mm_set_epi32(0x2cee0c75,0x00da619c,0xe4ed0353,0x600ed0d9);
|
||||
rc[31] = _mm_set_epi32(0xf0b1a5a1,0x96e90cab,0x80bbbabc,0x63a4a350);
|
||||
rc[32] = _mm_set_epi32(0xae3db102,0x5e962988,0xab0dde30,0x938dca39);
|
||||
rc[33] = _mm_set_epi32(0x17bb8f38,0xd554a40b,0x8814f3a8,0x2e75b442);
|
||||
rc[34] = _mm_set_epi32(0x34bb8a5b,0x5f427fd7,0xaeb6b779,0x360a16f6);
|
||||
rc[35] = _mm_set_epi32(0x26f65241,0xcbe55438,0x43ce5918,0xffbaafde);
|
||||
rc[36] = _mm_set_epi32(0x4ce99a54,0xb9f3026a,0xa2ca9cf7,0x839ec978);
|
||||
rc[37] = _mm_set_epi32(0xae51a51a,0x1bdff7be,0x40c06e28,0x22901235);
|
||||
rc[38] = _mm_set_epi32(0xa0c1613c,0xba7ed22b,0xc173bc0f,0x48a659cf);
|
||||
rc[39] = _mm_set_epi32(0x756acc03,0x02288288,0x4ad6bdfd,0xe9c59da1);
|
||||
}
|
||||
|
||||
void test_implementations() {
|
||||
unsigned char *in = (unsigned char *)calloc(64*8, sizeof(unsigned char));
|
||||
unsigned char *out256 = (unsigned char *)calloc(32*8, sizeof(unsigned char));
|
||||
unsigned char *out512 = (unsigned char *)calloc(32*8, sizeof(unsigned char));
|
||||
unsigned char testvector256[32] = {0x80, 0x27, 0xcc, 0xb8, 0x79, 0x49, 0x77, 0x4b,
|
||||
0x78, 0xd0, 0x54, 0x5f, 0xb7, 0x2b, 0xf7, 0x0c,
|
||||
0x69, 0x5c, 0x2a, 0x09, 0x23, 0xcb, 0xd4, 0x7b,
|
||||
0xba, 0x11, 0x59, 0xef, 0xbf, 0x2b, 0x2c, 0x1c};
|
||||
|
||||
unsigned char testvector512[32] = {0xbe, 0x7f, 0x72, 0x3b, 0x4e, 0x80, 0xa9, 0x98,
|
||||
0x13, 0xb2, 0x92, 0x28, 0x7f, 0x30, 0x6f, 0x62,
|
||||
0x5a, 0x6d, 0x57, 0x33, 0x1c, 0xae, 0x5f, 0x34,
|
||||
0xdd, 0x92, 0x77, 0xb0, 0x94, 0x5b, 0xe2, 0xaa};
|
||||
|
||||
|
||||
|
||||
int i;
|
||||
|
||||
// Input for testvector
|
||||
for(i = 0; i < 512; i++) {
|
||||
in[i] = i % 64;
|
||||
}
|
||||
|
||||
load_constants();
|
||||
haraka512_8x(out512, in);
|
||||
|
||||
// Verify output
|
||||
for(i = 0; i < 32; i++) {
|
||||
if (out512[i % 32] != testvector512[i]) {
|
||||
printf("Error: testvector incorrect.\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
free(in);
|
||||
free(out256);
|
||||
free(out512);
|
||||
}
|
||||
|
||||
void haraka256(unsigned char *out, const unsigned char *in) {
|
||||
__m128i s[2], tmp;
|
||||
|
||||
s[0] = LOAD(in);
|
||||
s[1] = LOAD(in + 16);
|
||||
|
||||
AES2(s[0], s[1], 0);
|
||||
MIX2(s[0], s[1]);
|
||||
|
||||
AES2(s[0], s[1], 4);
|
||||
MIX2(s[0], s[1]);
|
||||
|
||||
AES2(s[0], s[1], 8);
|
||||
MIX2(s[0], s[1]);
|
||||
|
||||
AES2(s[0], s[1], 12);
|
||||
MIX2(s[0], s[1]);
|
||||
|
||||
AES2(s[0], s[1], 16);
|
||||
MIX2(s[0], s[1]);
|
||||
|
||||
s[0] = _mm_xor_si128(s[0], LOAD(in));
|
||||
s[1] = _mm_xor_si128(s[1], LOAD(in + 16));
|
||||
|
||||
STORE(out, s[0]);
|
||||
STORE(out + 16, s[1]);
|
||||
}
|
||||
|
||||
void haraka256_4x(unsigned char *out, const unsigned char *in) {
|
||||
__m128i s[4][2], tmp;
|
||||
|
||||
s[0][0] = LOAD(in);
|
||||
s[0][1] = LOAD(in + 16);
|
||||
s[1][0] = LOAD(in + 32);
|
||||
s[1][1] = LOAD(in + 48);
|
||||
s[2][0] = LOAD(in + 64);
|
||||
s[2][1] = LOAD(in + 80);
|
||||
s[3][0] = LOAD(in + 96);
|
||||
s[3][1] = LOAD(in + 112);
|
||||
|
||||
// Round 1
|
||||
AES2_4x(s[0], s[1], s[2], s[3], 0);
|
||||
|
||||
MIX2(s[0][0], s[0][1]);
|
||||
MIX2(s[1][0], s[1][1]);
|
||||
MIX2(s[2][0], s[2][1]);
|
||||
MIX2(s[3][0], s[3][1]);
|
||||
|
||||
// Round 2
|
||||
AES2_4x(s[0], s[1], s[2], s[3], 4);
|
||||
|
||||
MIX2(s[0][0], s[0][1]);
|
||||
MIX2(s[1][0], s[1][1]);
|
||||
MIX2(s[2][0], s[2][1]);
|
||||
MIX2(s[3][0], s[3][1]);
|
||||
|
||||
// Round 3
|
||||
AES2_4x(s[0], s[1], s[2], s[3], 8);
|
||||
|
||||
MIX2(s[0][0], s[0][1]);
|
||||
MIX2(s[1][0], s[1][1]);
|
||||
MIX2(s[2][0], s[2][1]);
|
||||
MIX2(s[3][0], s[3][1]);
|
||||
|
||||
// Round 4
|
||||
AES2_4x(s[0], s[1], s[2], s[3], 12);
|
||||
|
||||
MIX2(s[0][0], s[0][1]);
|
||||
MIX2(s[1][0], s[1][1]);
|
||||
MIX2(s[2][0], s[2][1]);
|
||||
MIX2(s[3][0], s[3][1]);
|
||||
|
||||
// Round 5
|
||||
AES2_4x(s[0], s[1], s[2], s[3], 16);
|
||||
|
||||
MIX2(s[0][0], s[0][1]);
|
||||
MIX2(s[1][0], s[1][1]);
|
||||
MIX2(s[2][0], s[2][1]);
|
||||
MIX2(s[3][0], s[3][1]);
|
||||
|
||||
// Feed Forward
|
||||
s[0][0] = _mm_xor_si128(s[0][0], LOAD(in));
|
||||
s[0][1] = _mm_xor_si128(s[0][1], LOAD(in + 16));
|
||||
s[1][0] = _mm_xor_si128(s[1][0], LOAD(in + 32));
|
||||
s[1][1] = _mm_xor_si128(s[1][1], LOAD(in + 48));
|
||||
s[2][0] = _mm_xor_si128(s[2][0], LOAD(in + 64));
|
||||
s[2][1] = _mm_xor_si128(s[2][1], LOAD(in + 80));
|
||||
s[3][0] = _mm_xor_si128(s[3][0], LOAD(in + 96));
|
||||
s[3][1] = _mm_xor_si128(s[3][1], LOAD(in + 112));
|
||||
|
||||
STORE(out, s[0][0]);
|
||||
STORE(out + 16, s[0][1]);
|
||||
STORE(out + 32, s[1][0]);
|
||||
STORE(out + 48, s[1][1]);
|
||||
STORE(out + 64, s[2][0]);
|
||||
STORE(out + 80, s[2][1]);
|
||||
STORE(out + 96, s[3][0]);
|
||||
STORE(out + 112, s[3][1]);
|
||||
}
|
||||
|
||||
void haraka256_8x(unsigned char *out, const unsigned char *in) {
|
||||
// This is faster on Skylake, the code below is faster on Haswell.
|
||||
haraka256_4x(out, in);
|
||||
haraka256_4x(out + 128, in + 128);
|
||||
return;
|
||||
// __m128i s[8][2], tmp;
|
||||
//
|
||||
// int i;
|
||||
//
|
||||
// s[0][0] = LOAD(in);
|
||||
// s[0][1] = LOAD(in + 16);
|
||||
// s[1][0] = LOAD(in + 32);
|
||||
// s[1][1] = LOAD(in + 48);
|
||||
// s[2][0] = LOAD(in + 64);
|
||||
// s[2][1] = LOAD(in + 80);
|
||||
// s[3][0] = LOAD(in + 96);
|
||||
// s[3][1] = LOAD(in + 112);
|
||||
// s[4][0] = LOAD(in + 128);
|
||||
// s[4][1] = LOAD(in + 144);
|
||||
// s[5][0] = LOAD(in + 160);
|
||||
// s[5][1] = LOAD(in + 176);
|
||||
// s[6][0] = LOAD(in + 192);
|
||||
// s[6][1] = LOAD(in + 208);
|
||||
// s[7][0] = LOAD(in + 224);
|
||||
// s[7][1] = LOAD(in + 240);
|
||||
//
|
||||
// // Round 1
|
||||
// AES2_8x(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], 0);
|
||||
//
|
||||
// MIX2(s[0][0], s[0][1]);
|
||||
// MIX2(s[1][0], s[1][1]);
|
||||
// MIX2(s[2][0], s[2][1]);
|
||||
// MIX2(s[3][0], s[3][1]);
|
||||
// MIX2(s[4][0], s[4][1]);
|
||||
// MIX2(s[5][0], s[5][1]);
|
||||
// MIX2(s[6][0], s[6][1]);
|
||||
// MIX2(s[7][0], s[7][1]);
|
||||
//
|
||||
//
|
||||
// // Round 2
|
||||
// AES2_8x(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], 4);
|
||||
//
|
||||
// MIX2(s[0][0], s[0][1]);
|
||||
// MIX2(s[1][0], s[1][1]);
|
||||
// MIX2(s[2][0], s[2][1]);
|
||||
// MIX2(s[3][0], s[3][1]);
|
||||
// MIX2(s[4][0], s[4][1]);
|
||||
// MIX2(s[5][0], s[5][1]);
|
||||
// MIX2(s[6][0], s[6][1]);
|
||||
// MIX2(s[7][0], s[7][1]);
|
||||
//
|
||||
// // Round 3
|
||||
// AES2_8x(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], 8);
|
||||
//
|
||||
// MIX2(s[0][0], s[0][1]);
|
||||
// MIX2(s[1][0], s[1][1]);
|
||||
// MIX2(s[2][0], s[2][1]);
|
||||
// MIX2(s[3][0], s[3][1]);
|
||||
// MIX2(s[4][0], s[4][1]);
|
||||
// MIX2(s[5][0], s[5][1]);
|
||||
// MIX2(s[6][0], s[6][1]);
|
||||
// MIX2(s[7][0], s[7][1]);
|
||||
//
|
||||
// // Round 4
|
||||
// AES2_8x(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], 12);
|
||||
//
|
||||
// MIX2(s[0][0], s[0][1]);
|
||||
// MIX2(s[1][0], s[1][1]);
|
||||
// MIX2(s[2][0], s[2][1]);
|
||||
// MIX2(s[3][0], s[3][1]);
|
||||
// MIX2(s[4][0], s[4][1]);
|
||||
// MIX2(s[5][0], s[5][1]);
|
||||
// MIX2(s[6][0], s[6][1]);
|
||||
// MIX2(s[7][0], s[7][1]);
|
||||
//
|
||||
// // Round 5
|
||||
// AES2_8x(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], 16);
|
||||
//
|
||||
// MIX2(s[0][0], s[0][1]);
|
||||
// MIX2(s[1][0], s[1][1]);
|
||||
// MIX2(s[2][0], s[2][1]);
|
||||
// MIX2(s[3][0], s[3][1]);
|
||||
// MIX2(s[4][0], s[4][1]);
|
||||
// MIX2(s[5][0], s[5][1]);
|
||||
// MIX2(s[6][0], s[6][1]);
|
||||
// MIX2(s[7][0], s[7][1]);
|
||||
//
|
||||
// // Feed Forward
|
||||
// s[0][0] = _mm_xor_si128(s[0][0], LOAD(in));
|
||||
// s[0][1] = _mm_xor_si128(s[0][1], LOAD(in + 16));
|
||||
// s[1][0] = _mm_xor_si128(s[1][0], LOAD(in + 32));
|
||||
// s[1][1] = _mm_xor_si128(s[1][1], LOAD(in + 48));
|
||||
// s[2][0] = _mm_xor_si128(s[2][0], LOAD(in + 64));
|
||||
// s[2][1] = _mm_xor_si128(s[2][1], LOAD(in + 80));
|
||||
// s[3][0] = _mm_xor_si128(s[3][0], LOAD(in + 96));
|
||||
// s[3][1] = _mm_xor_si128(s[3][1], LOAD(in + 112));
|
||||
// s[4][0] = _mm_xor_si128(s[4][0], LOAD(in + 128));
|
||||
// s[4][1] = _mm_xor_si128(s[4][1], LOAD(in + 144));
|
||||
// s[5][0] = _mm_xor_si128(s[5][0], LOAD(in + 160));
|
||||
// s[5][1] = _mm_xor_si128(s[5][1], LOAD(in + 176));
|
||||
// s[6][0] = _mm_xor_si128(s[6][0], LOAD(in + 192));
|
||||
// s[6][1] = _mm_xor_si128(s[6][1], LOAD(in + 208));
|
||||
// s[7][0] = _mm_xor_si128(s[7][0], LOAD(in + 224));
|
||||
// s[7][1] = _mm_xor_si128(s[7][1], LOAD(in + 240));
|
||||
//
|
||||
// STORE(out, s[0][0]);
|
||||
// STORE(out + 16, s[0][1]);
|
||||
// STORE(out + 32, s[1][0]);
|
||||
// STORE(out + 48, s[1][1]);
|
||||
// STORE(out + 64, s[2][0]);
|
||||
// STORE(out + 80, s[2][1]);
|
||||
// STORE(out + 96, s[3][0]);
|
||||
// STORE(out + 112, s[3][1]);
|
||||
// STORE(out + 128, s[4][0]);
|
||||
// STORE(out + 144, s[4][1]);
|
||||
// STORE(out + 160, s[5][0]);
|
||||
// STORE(out + 176, s[5][1]);
|
||||
// STORE(out + 192, s[6][0]);
|
||||
// STORE(out + 208, s[6][1]);
|
||||
// STORE(out + 224, s[7][0]);
|
||||
// STORE(out + 240, s[7][1]);
|
||||
}
|
||||
|
||||
void haraka512(unsigned char *out, const unsigned char *in) {
|
||||
u128 s[4], tmp;
|
||||
|
||||
s[0] = LOAD(in);
|
||||
s[1] = LOAD(in + 16);
|
||||
s[2] = LOAD(in + 32);
|
||||
s[3] = LOAD(in + 48);
|
||||
|
||||
AES4(s[0], s[1], s[2], s[3], 0);
|
||||
MIX4(s[0], s[1], s[2], s[3]);
|
||||
|
||||
AES4(s[0], s[1], s[2], s[3], 8);
|
||||
MIX4(s[0], s[1], s[2], s[3]);
|
||||
|
||||
AES4(s[0], s[1], s[2], s[3], 16);
|
||||
MIX4(s[0], s[1], s[2], s[3]);
|
||||
|
||||
AES4(s[0], s[1], s[2], s[3], 24);
|
||||
MIX4(s[0], s[1], s[2], s[3]);
|
||||
|
||||
AES4(s[0], s[1], s[2], s[3], 32);
|
||||
MIX4(s[0], s[1], s[2], s[3]);
|
||||
|
||||
s[0] = _mm_xor_si128(s[0], LOAD(in));
|
||||
s[1] = _mm_xor_si128(s[1], LOAD(in + 16));
|
||||
s[2] = _mm_xor_si128(s[2], LOAD(in + 32));
|
||||
s[3] = _mm_xor_si128(s[3], LOAD(in + 48));
|
||||
|
||||
TRUNCSTORE(out, s[0], s[1], s[2], s[3]);
|
||||
}
|
||||
|
||||
void haraka512_zero(unsigned char *out, const unsigned char *in) {
|
||||
u128 s[4], tmp;
|
||||
|
||||
s[0] = LOAD(in);
|
||||
s[1] = LOAD(in + 16);
|
||||
s[2] = LOAD(in + 32);
|
||||
s[3] = LOAD(in + 48);
|
||||
|
||||
AES4_zero(s[0], s[1], s[2], s[3], 0);
|
||||
MIX4(s[0], s[1], s[2], s[3]);
|
||||
|
||||
AES4_zero(s[0], s[1], s[2], s[3], 8);
|
||||
MIX4(s[0], s[1], s[2], s[3]);
|
||||
|
||||
AES4_zero(s[0], s[1], s[2], s[3], 16);
|
||||
MIX4(s[0], s[1], s[2], s[3]);
|
||||
|
||||
AES4_zero(s[0], s[1], s[2], s[3], 24);
|
||||
MIX4(s[0], s[1], s[2], s[3]);
|
||||
|
||||
AES4_zero(s[0], s[1], s[2], s[3], 32);
|
||||
MIX4(s[0], s[1], s[2], s[3]);
|
||||
|
||||
s[0] = _mm_xor_si128(s[0], LOAD(in));
|
||||
s[1] = _mm_xor_si128(s[1], LOAD(in + 16));
|
||||
s[2] = _mm_xor_si128(s[2], LOAD(in + 32));
|
||||
s[3] = _mm_xor_si128(s[3], LOAD(in + 48));
|
||||
|
||||
TRUNCSTORE(out, s[0], s[1], s[2], s[3]);
|
||||
}
|
||||
|
||||
void haraka512_4x(unsigned char *out, const unsigned char *in) {
|
||||
u128 s[4][4], tmp;
|
||||
|
||||
s[0][0] = LOAD(in);
|
||||
s[0][1] = LOAD(in + 16);
|
||||
s[0][2] = LOAD(in + 32);
|
||||
s[0][3] = LOAD(in + 48);
|
||||
s[1][0] = LOAD(in + 64);
|
||||
s[1][1] = LOAD(in + 80);
|
||||
s[1][2] = LOAD(in + 96);
|
||||
s[1][3] = LOAD(in + 112);
|
||||
s[2][0] = LOAD(in + 128);
|
||||
s[2][1] = LOAD(in + 144);
|
||||
s[2][2] = LOAD(in + 160);
|
||||
s[2][3] = LOAD(in + 176);
|
||||
s[3][0] = LOAD(in + 192);
|
||||
s[3][1] = LOAD(in + 208);
|
||||
s[3][2] = LOAD(in + 224);
|
||||
s[3][3] = LOAD(in + 240);
|
||||
|
||||
AES4_4x(s[0], s[1], s[2], s[3], 0);
|
||||
MIX4(s[0][0], s[0][1], s[0][2], s[0][3]);
|
||||
MIX4(s[1][0], s[1][1], s[1][2], s[1][3]);
|
||||
MIX4(s[2][0], s[2][1], s[2][2], s[2][3]);
|
||||
MIX4(s[3][0], s[3][1], s[3][2], s[3][3]);
|
||||
|
||||
AES4_4x(s[0], s[1], s[2], s[3], 8);
|
||||
MIX4(s[0][0], s[0][1], s[0][2], s[0][3]);
|
||||
MIX4(s[1][0], s[1][1], s[1][2], s[1][3]);
|
||||
MIX4(s[2][0], s[2][1], s[2][2], s[2][3]);
|
||||
MIX4(s[3][0], s[3][1], s[3][2], s[3][3]);
|
||||
|
||||
AES4_4x(s[0], s[1], s[2], s[3], 16);
|
||||
MIX4(s[0][0], s[0][1], s[0][2], s[0][3]);
|
||||
MIX4(s[1][0], s[1][1], s[1][2], s[1][3]);
|
||||
MIX4(s[2][0], s[2][1], s[2][2], s[2][3]);
|
||||
MIX4(s[3][0], s[3][1], s[3][2], s[3][3]);
|
||||
|
||||
AES4_4x(s[0], s[1], s[2], s[3], 24);
|
||||
MIX4(s[0][0], s[0][1], s[0][2], s[0][3]);
|
||||
MIX4(s[1][0], s[1][1], s[1][2], s[1][3]);
|
||||
MIX4(s[2][0], s[2][1], s[2][2], s[2][3]);
|
||||
MIX4(s[3][0], s[3][1], s[3][2], s[3][3]);
|
||||
|
||||
AES4_4x(s[0], s[1], s[2], s[3], 32);
|
||||
MIX4(s[0][0], s[0][1], s[0][2], s[0][3]);
|
||||
MIX4(s[1][0], s[1][1], s[1][2], s[1][3]);
|
||||
MIX4(s[2][0], s[2][1], s[2][2], s[2][3]);
|
||||
MIX4(s[3][0], s[3][1], s[3][2], s[3][3]);
|
||||
|
||||
|
||||
s[0][0] = _mm_xor_si128(s[0][0], LOAD(in));
|
||||
s[0][1] = _mm_xor_si128(s[0][1], LOAD(in + 16));
|
||||
s[0][2] = _mm_xor_si128(s[0][2], LOAD(in + 32));
|
||||
s[0][3] = _mm_xor_si128(s[0][3], LOAD(in + 48));
|
||||
s[1][0] = _mm_xor_si128(s[1][0], LOAD(in + 64));
|
||||
s[1][1] = _mm_xor_si128(s[1][1], LOAD(in + 80));
|
||||
s[1][2] = _mm_xor_si128(s[1][2], LOAD(in + 96));
|
||||
s[1][3] = _mm_xor_si128(s[1][3], LOAD(in + 112));
|
||||
s[2][0] = _mm_xor_si128(s[2][0], LOAD(in + 128));
|
||||
s[2][1] = _mm_xor_si128(s[2][1], LOAD(in + 144));
|
||||
s[2][2] = _mm_xor_si128(s[2][2], LOAD(in + 160));
|
||||
s[2][3] = _mm_xor_si128(s[2][3], LOAD(in + 176));
|
||||
s[3][0] = _mm_xor_si128(s[3][0], LOAD(in + 192));
|
||||
s[3][1] = _mm_xor_si128(s[3][1], LOAD(in + 208));
|
||||
s[3][2] = _mm_xor_si128(s[3][2], LOAD(in + 224));
|
||||
s[3][3] = _mm_xor_si128(s[3][3], LOAD(in + 240));
|
||||
|
||||
TRUNCSTORE(out, s[0][0], s[0][1], s[0][2], s[0][3]);
|
||||
TRUNCSTORE(out + 32, s[1][0], s[1][1], s[1][2], s[1][3]);
|
||||
TRUNCSTORE(out + 64, s[2][0], s[2][1], s[2][2], s[2][3]);
|
||||
TRUNCSTORE(out + 96, s[3][0], s[3][1], s[3][2], s[3][3]);
|
||||
}
|
||||
|
||||
void haraka512_8x(unsigned char *out, const unsigned char *in) {
|
||||
// This is faster on Skylake, the code below is faster on Haswell.
|
||||
haraka512_4x(out, in);
|
||||
haraka512_4x(out + 128, in + 256);
|
||||
|
||||
// u128 s[8][4], tmp;
|
||||
//
|
||||
// s[0][0] = LOAD(in);
|
||||
// s[0][1] = LOAD(in + 16);
|
||||
// s[0][2] = LOAD(in + 32);
|
||||
// s[0][3] = LOAD(in + 48);
|
||||
// s[1][0] = LOAD(in + 64);
|
||||
// s[1][1] = LOAD(in + 80);
|
||||
// s[1][2] = LOAD(in + 96);
|
||||
// s[1][3] = LOAD(in + 112);
|
||||
// s[2][0] = LOAD(in + 128);
|
||||
// s[2][1] = LOAD(in + 144);
|
||||
// s[2][2] = LOAD(in + 160);
|
||||
// s[2][3] = LOAD(in + 176);
|
||||
// s[3][0] = LOAD(in + 192);
|
||||
// s[3][1] = LOAD(in + 208);
|
||||
// s[3][2] = LOAD(in + 224);
|
||||
// s[3][3] = LOAD(in + 240);
|
||||
// s[4][0] = LOAD(in + 256);
|
||||
// s[4][1] = LOAD(in + 272);
|
||||
// s[4][2] = LOAD(in + 288);
|
||||
// s[4][3] = LOAD(in + 304);
|
||||
// s[5][0] = LOAD(in + 320);
|
||||
// s[5][1] = LOAD(in + 336);
|
||||
// s[5][2] = LOAD(in + 352);
|
||||
// s[5][3] = LOAD(in + 368);
|
||||
// s[6][0] = LOAD(in + 384);
|
||||
// s[6][1] = LOAD(in + 400);
|
||||
// s[6][2] = LOAD(in + 416);
|
||||
// s[6][3] = LOAD(in + 432);
|
||||
// s[7][0] = LOAD(in + 448);
|
||||
// s[7][1] = LOAD(in + 464);
|
||||
// s[7][2] = LOAD(in + 480);
|
||||
// s[7][3] = LOAD(in + 496);
|
||||
//
|
||||
// AES4_8x(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], 0);
|
||||
// MIX4(s[0][0], s[0][1], s[0][2], s[0][3]);
|
||||
// MIX4(s[1][0], s[1][1], s[1][2], s[1][3]);
|
||||
// MIX4(s[2][0], s[2][1], s[2][2], s[2][3]);
|
||||
// MIX4(s[3][0], s[3][1], s[3][2], s[3][3]);
|
||||
// MIX4(s[4][0], s[4][1], s[4][2], s[4][3]);
|
||||
// MIX4(s[5][0], s[5][1], s[5][2], s[5][3]);
|
||||
// MIX4(s[6][0], s[6][1], s[6][2], s[6][3]);
|
||||
// MIX4(s[7][0], s[7][1], s[7][2], s[7][3]);
|
||||
//
|
||||
// AES4_8x(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], 8);
|
||||
// MIX4(s[0][0], s[0][1], s[0][2], s[0][3]);
|
||||
// MIX4(s[1][0], s[1][1], s[1][2], s[1][3]);
|
||||
// MIX4(s[2][0], s[2][1], s[2][2], s[2][3]);
|
||||
// MIX4(s[3][0], s[3][1], s[3][2], s[3][3]);
|
||||
// MIX4(s[4][0], s[4][1], s[4][2], s[4][3]);
|
||||
// MIX4(s[5][0], s[5][1], s[5][2], s[5][3]);
|
||||
// MIX4(s[6][0], s[6][1], s[6][2], s[6][3]);
|
||||
// MIX4(s[7][0], s[7][1], s[7][2], s[7][3]);
|
||||
//
|
||||
// AES4_8x(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], 16);
|
||||
// MIX4(s[0][0], s[0][1], s[0][2], s[0][3]);
|
||||
// MIX4(s[1][0], s[1][1], s[1][2], s[1][3]);
|
||||
// MIX4(s[2][0], s[2][1], s[2][2], s[2][3]);
|
||||
// MIX4(s[3][0], s[3][1], s[3][2], s[3][3]);
|
||||
// MIX4(s[4][0], s[4][1], s[4][2], s[4][3]);
|
||||
// MIX4(s[5][0], s[5][1], s[5][2], s[5][3]);
|
||||
// MIX4(s[6][0], s[6][1], s[6][2], s[6][3]);
|
||||
// MIX4(s[7][0], s[7][1], s[7][2], s[7][3]);
|
||||
//
|
||||
// AES4_8x(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], 24);
|
||||
// MIX4(s[0][0], s[0][1], s[0][2], s[0][3]);
|
||||
// MIX4(s[1][0], s[1][1], s[1][2], s[1][3]);
|
||||
// MIX4(s[2][0], s[2][1], s[2][2], s[2][3]);
|
||||
// MIX4(s[3][0], s[3][1], s[3][2], s[3][3]);
|
||||
// MIX4(s[4][0], s[4][1], s[4][2], s[4][3]);
|
||||
// MIX4(s[5][0], s[5][1], s[5][2], s[5][3]);
|
||||
// MIX4(s[6][0], s[6][1], s[6][2], s[6][3]);
|
||||
// MIX4(s[7][0], s[7][1], s[7][2], s[7][3]);
|
||||
//
|
||||
// AES4_8x(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], 32);
|
||||
// MIX4(s[0][0], s[0][1], s[0][2], s[0][3]);
|
||||
// MIX4(s[1][0], s[1][1], s[1][2], s[1][3]);
|
||||
// MIX4(s[2][0], s[2][1], s[2][2], s[2][3]);
|
||||
// MIX4(s[3][0], s[3][1], s[3][2], s[3][3]);
|
||||
// MIX4(s[4][0], s[4][1], s[4][2], s[4][3]);
|
||||
// MIX4(s[5][0], s[5][1], s[5][2], s[5][3]);
|
||||
// MIX4(s[6][0], s[6][1], s[6][2], s[6][3]);
|
||||
// MIX4(s[7][0], s[7][1], s[7][2], s[7][3]);
|
||||
//
|
||||
//
|
||||
// s[0][0] = _mm_xor_si128(s[0][0], LOAD(in));
|
||||
// s[0][1] = _mm_xor_si128(s[0][1], LOAD(in + 16));
|
||||
// s[0][2] = _mm_xor_si128(s[0][2], LOAD(in + 32));
|
||||
// s[0][3] = _mm_xor_si128(s[0][3], LOAD(in + 48));
|
||||
// s[1][0] = _mm_xor_si128(s[1][0], LOAD(in + 64));
|
||||
// s[1][1] = _mm_xor_si128(s[1][1], LOAD(in + 80));
|
||||
// s[1][2] = _mm_xor_si128(s[1][2], LOAD(in + 96));
|
||||
// s[1][3] = _mm_xor_si128(s[1][3], LOAD(in + 112));
|
||||
// s[2][0] = _mm_xor_si128(s[2][0], LOAD(in + 128));
|
||||
// s[2][1] = _mm_xor_si128(s[2][1], LOAD(in + 144));
|
||||
// s[2][2] = _mm_xor_si128(s[2][2], LOAD(in + 160));
|
||||
// s[2][3] = _mm_xor_si128(s[2][3], LOAD(in + 176));
|
||||
// s[3][0] = _mm_xor_si128(s[3][0], LOAD(in + 192));
|
||||
// s[3][1] = _mm_xor_si128(s[3][1], LOAD(in + 208));
|
||||
// s[3][2] = _mm_xor_si128(s[3][2], LOAD(in + 224));
|
||||
// s[3][3] = _mm_xor_si128(s[3][3], LOAD(in + 240));
|
||||
// s[4][0] = _mm_xor_si128(s[4][0], LOAD(in + 256));
|
||||
// s[4][1] = _mm_xor_si128(s[4][1], LOAD(in + 272));
|
||||
// s[4][2] = _mm_xor_si128(s[4][2], LOAD(in + 288));
|
||||
// s[4][3] = _mm_xor_si128(s[4][3], LOAD(in + 304));
|
||||
// s[5][0] = _mm_xor_si128(s[5][0], LOAD(in + 320));
|
||||
// s[5][1] = _mm_xor_si128(s[5][1], LOAD(in + 336));
|
||||
// s[5][2] = _mm_xor_si128(s[5][2], LOAD(in + 352));
|
||||
// s[5][3] = _mm_xor_si128(s[5][3], LOAD(in + 368));
|
||||
// s[6][0] = _mm_xor_si128(s[6][0], LOAD(in + 384));
|
||||
// s[6][1] = _mm_xor_si128(s[6][1], LOAD(in + 400));
|
||||
// s[6][2] = _mm_xor_si128(s[6][2], LOAD(in + 416));
|
||||
// s[6][3] = _mm_xor_si128(s[6][3], LOAD(in + 432));
|
||||
// s[7][0] = _mm_xor_si128(s[7][0], LOAD(in + 448));
|
||||
// s[7][1] = _mm_xor_si128(s[7][1], LOAD(in + 464));
|
||||
// s[7][2] = _mm_xor_si128(s[7][2], LOAD(in + 480));
|
||||
// s[7][3] = _mm_xor_si128(s[7][3], LOAD(in + 496));
|
||||
//
|
||||
// TRUNCSTORE(out, s[0][0], s[0][1], s[0][2], s[0][3]);
|
||||
// TRUNCSTORE(out + 32, s[1][0], s[1][1], s[1][2], s[1][3]);
|
||||
// TRUNCSTORE(out + 64, s[2][0], s[2][1], s[2][2], s[2][3]);
|
||||
// TRUNCSTORE(out + 96, s[3][0], s[3][1], s[3][2], s[3][3]);
|
||||
// TRUNCSTORE(out + 128, s[4][0], s[4][1], s[4][2], s[4][3]);
|
||||
// TRUNCSTORE(out + 160, s[5][0], s[5][1], s[5][2], s[5][3]);
|
||||
// TRUNCSTORE(out + 192, s[6][0], s[6][1], s[6][2], s[6][3]);
|
||||
// TRUNCSTORE(out + 224, s[7][0], s[7][1], s[7][2], s[7][3]);
|
||||
}
|
||||
@@ -1,126 +0,0 @@
|
||||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2016 kste
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
Optimized Implementations for Haraka256 and Haraka512
|
||||
*/
|
||||
#ifndef HARAKA_H_
|
||||
#define HARAKA_H_
|
||||
|
||||
#include "immintrin.h"
|
||||
|
||||
#define NUMROUNDS 5
|
||||
|
||||
#ifdef _WIN32
|
||||
typedef unsigned long long u64;
|
||||
#else
|
||||
typedef unsigned long u64;
|
||||
#endif
|
||||
typedef __m128i u128;
|
||||
|
||||
extern u128 rc[40];
|
||||
|
||||
#define LOAD(src) _mm_load_si128((u128 *)(src))
|
||||
#define STORE(dest,src) _mm_storeu_si128((u128 *)(dest),src)
|
||||
|
||||
#define AES2(s0, s1, rci) \
|
||||
s0 = _mm_aesenc_si128(s0, rc[rci]); \
|
||||
s1 = _mm_aesenc_si128(s1, rc[rci + 1]); \
|
||||
s0 = _mm_aesenc_si128(s0, rc[rci + 2]); \
|
||||
s1 = _mm_aesenc_si128(s1, rc[rci + 3]);
|
||||
|
||||
#define AES2_4x(s0, s1, s2, s3, rci) \
|
||||
AES2(s0[0], s0[1], rci); \
|
||||
AES2(s1[0], s1[1], rci); \
|
||||
AES2(s2[0], s2[1], rci); \
|
||||
AES2(s3[0], s3[1], rci);
|
||||
|
||||
#define AES2_8x(s0, s1, s2, s3, s4, s5, s6, s7, rci) \
|
||||
AES2_4x(s0, s1, s2, s3, rci); \
|
||||
AES2_4x(s4, s5, s6, s7, rci);
|
||||
|
||||
#define AES4(s0, s1, s2, s3, rci) \
|
||||
s0 = _mm_aesenc_si128(s0, rc[rci]); \
|
||||
s1 = _mm_aesenc_si128(s1, rc[rci + 1]); \
|
||||
s2 = _mm_aesenc_si128(s2, rc[rci + 2]); \
|
||||
s3 = _mm_aesenc_si128(s3, rc[rci + 3]); \
|
||||
s0 = _mm_aesenc_si128(s0, rc[rci + 4]); \
|
||||
s1 = _mm_aesenc_si128(s1, rc[rci + 5]); \
|
||||
s2 = _mm_aesenc_si128(s2, rc[rci + 6]); \
|
||||
s3 = _mm_aesenc_si128(s3, rc[rci + 7]); \
|
||||
|
||||
#define AES4_zero(s0, s1, s2, s3, rci) \
|
||||
s0 = _mm_aesenc_si128(s0, rc0[rci]); \
|
||||
s1 = _mm_aesenc_si128(s1, rc0[rci + 1]); \
|
||||
s2 = _mm_aesenc_si128(s2, rc0[rci + 2]); \
|
||||
s3 = _mm_aesenc_si128(s3, rc0[rci + 3]); \
|
||||
s0 = _mm_aesenc_si128(s0, rc0[rci + 4]); \
|
||||
s1 = _mm_aesenc_si128(s1, rc0[rci + 5]); \
|
||||
s2 = _mm_aesenc_si128(s2, rc0[rci + 6]); \
|
||||
s3 = _mm_aesenc_si128(s3, rc0[rci + 7]); \
|
||||
|
||||
#define AES4_4x(s0, s1, s2, s3, rci) \
|
||||
AES4(s0[0], s0[1], s0[2], s0[3], rci); \
|
||||
AES4(s1[0], s1[1], s1[2], s1[3], rci); \
|
||||
AES4(s2[0], s2[1], s2[2], s2[3], rci); \
|
||||
AES4(s3[0], s3[1], s3[2], s3[3], rci);
|
||||
|
||||
#define AES4_8x(s0, s1, s2, s3, s4, s5, s6, s7, rci) \
|
||||
AES4_4x(s0, s1, s2, s3, rci); \
|
||||
AES4_4x(s4, s5, s6, s7, rci);
|
||||
|
||||
#define MIX2(s0, s1) \
|
||||
tmp = _mm_unpacklo_epi32(s0, s1); \
|
||||
s1 = _mm_unpackhi_epi32(s0, s1); \
|
||||
s0 = tmp;
|
||||
|
||||
#define MIX4(s0, s1, s2, s3) \
|
||||
tmp = _mm_unpacklo_epi32(s0, s1); \
|
||||
s0 = _mm_unpackhi_epi32(s0, s1); \
|
||||
s1 = _mm_unpacklo_epi32(s2, s3); \
|
||||
s2 = _mm_unpackhi_epi32(s2, s3); \
|
||||
s3 = _mm_unpacklo_epi32(s0, s2); \
|
||||
s0 = _mm_unpackhi_epi32(s0, s2); \
|
||||
s2 = _mm_unpackhi_epi32(s1, tmp); \
|
||||
s1 = _mm_unpacklo_epi32(s1, tmp);
|
||||
|
||||
#define TRUNCSTORE(out, s0, s1, s2, s3) \
|
||||
*(u64*)(out) = (u64*)(s0)[1]; \
|
||||
*(u64*)(out + 8) = (u64*)(s1)[1]; \
|
||||
*(u64*)(out + 16) = (u64*)(s2)[0]; \
|
||||
*(u64*)(out + 24) = (u64*)(s3)[0];
|
||||
|
||||
void load_constants();
|
||||
void test_implementations();
|
||||
|
||||
void load_constants();
|
||||
|
||||
void haraka256(unsigned char *out, const unsigned char *in);
|
||||
void haraka256_4x(unsigned char *out, const unsigned char *in);
|
||||
void haraka256_8x(unsigned char *out, const unsigned char *in);
|
||||
|
||||
void haraka512(unsigned char *out, const unsigned char *in);
|
||||
void haraka512_zero(unsigned char *out, const unsigned char *in);
|
||||
void haraka512_4x(unsigned char *out, const unsigned char *in);
|
||||
void haraka512_8x(unsigned char *out, const unsigned char *in);
|
||||
|
||||
#endif
|
||||
@@ -1,375 +0,0 @@
|
||||
/*
|
||||
Plain C implementation of the Haraka256 and Haraka512 permutations.
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "haraka_portable.h"
|
||||
|
||||
#define HARAKAS_RATE 32
|
||||
|
||||
static const unsigned char haraka_rc[40][16] = {
|
||||
{0x9d, 0x7b, 0x81, 0x75, 0xf0, 0xfe, 0xc5, 0xb2, 0x0a, 0xc0, 0x20, 0xe6, 0x4c, 0x70, 0x84, 0x06},
|
||||
{0x17, 0xf7, 0x08, 0x2f, 0xa4, 0x6b, 0x0f, 0x64, 0x6b, 0xa0, 0xf3, 0x88, 0xe1, 0xb4, 0x66, 0x8b},
|
||||
{0x14, 0x91, 0x02, 0x9f, 0x60, 0x9d, 0x02, 0xcf, 0x98, 0x84, 0xf2, 0x53, 0x2d, 0xde, 0x02, 0x34},
|
||||
{0x79, 0x4f, 0x5b, 0xfd, 0xaf, 0xbc, 0xf3, 0xbb, 0x08, 0x4f, 0x7b, 0x2e, 0xe6, 0xea, 0xd6, 0x0e},
|
||||
{0x44, 0x70, 0x39, 0xbe, 0x1c, 0xcd, 0xee, 0x79, 0x8b, 0x44, 0x72, 0x48, 0xcb, 0xb0, 0xcf, 0xcb},
|
||||
{0x7b, 0x05, 0x8a, 0x2b, 0xed, 0x35, 0x53, 0x8d, 0xb7, 0x32, 0x90, 0x6e, 0xee, 0xcd, 0xea, 0x7e},
|
||||
{0x1b, 0xef, 0x4f, 0xda, 0x61, 0x27, 0x41, 0xe2, 0xd0, 0x7c, 0x2e, 0x5e, 0x43, 0x8f, 0xc2, 0x67},
|
||||
{0x3b, 0x0b, 0xc7, 0x1f, 0xe2, 0xfd, 0x5f, 0x67, 0x07, 0xcc, 0xca, 0xaf, 0xb0, 0xd9, 0x24, 0x29},
|
||||
{0xee, 0x65, 0xd4, 0xb9, 0xca, 0x8f, 0xdb, 0xec, 0xe9, 0x7f, 0x86, 0xe6, 0xf1, 0x63, 0x4d, 0xab},
|
||||
{0x33, 0x7e, 0x03, 0xad, 0x4f, 0x40, 0x2a, 0x5b, 0x64, 0xcd, 0xb7, 0xd4, 0x84, 0xbf, 0x30, 0x1c},
|
||||
{0x00, 0x98, 0xf6, 0x8d, 0x2e, 0x8b, 0x02, 0x69, 0xbf, 0x23, 0x17, 0x94, 0xb9, 0x0b, 0xcc, 0xb2},
|
||||
{0x8a, 0x2d, 0x9d, 0x5c, 0xc8, 0x9e, 0xaa, 0x4a, 0x72, 0x55, 0x6f, 0xde, 0xa6, 0x78, 0x04, 0xfa},
|
||||
{0xd4, 0x9f, 0x12, 0x29, 0x2e, 0x4f, 0xfa, 0x0e, 0x12, 0x2a, 0x77, 0x6b, 0x2b, 0x9f, 0xb4, 0xdf},
|
||||
{0xee, 0x12, 0x6a, 0xbb, 0xae, 0x11, 0xd6, 0x32, 0x36, 0xa2, 0x49, 0xf4, 0x44, 0x03, 0xa1, 0x1e},
|
||||
{0xa6, 0xec, 0xa8, 0x9c, 0xc9, 0x00, 0x96, 0x5f, 0x84, 0x00, 0x05, 0x4b, 0x88, 0x49, 0x04, 0xaf},
|
||||
{0xec, 0x93, 0xe5, 0x27, 0xe3, 0xc7, 0xa2, 0x78, 0x4f, 0x9c, 0x19, 0x9d, 0xd8, 0x5e, 0x02, 0x21},
|
||||
{0x73, 0x01, 0xd4, 0x82, 0xcd, 0x2e, 0x28, 0xb9, 0xb7, 0xc9, 0x59, 0xa7, 0xf8, 0xaa, 0x3a, 0xbf},
|
||||
{0x6b, 0x7d, 0x30, 0x10, 0xd9, 0xef, 0xf2, 0x37, 0x17, 0xb0, 0x86, 0x61, 0x0d, 0x70, 0x60, 0x62},
|
||||
{0xc6, 0x9a, 0xfc, 0xf6, 0x53, 0x91, 0xc2, 0x81, 0x43, 0x04, 0x30, 0x21, 0xc2, 0x45, 0xca, 0x5a},
|
||||
{0x3a, 0x94, 0xd1, 0x36, 0xe8, 0x92, 0xaf, 0x2c, 0xbb, 0x68, 0x6b, 0x22, 0x3c, 0x97, 0x23, 0x92},
|
||||
{0xb4, 0x71, 0x10, 0xe5, 0x58, 0xb9, 0xba, 0x6c, 0xeb, 0x86, 0x58, 0x22, 0x38, 0x92, 0xbf, 0xd3},
|
||||
{0x8d, 0x12, 0xe1, 0x24, 0xdd, 0xfd, 0x3d, 0x93, 0x77, 0xc6, 0xf0, 0xae, 0xe5, 0x3c, 0x86, 0xdb},
|
||||
{0xb1, 0x12, 0x22, 0xcb, 0xe3, 0x8d, 0xe4, 0x83, 0x9c, 0xa0, 0xeb, 0xff, 0x68, 0x62, 0x60, 0xbb},
|
||||
{0x7d, 0xf7, 0x2b, 0xc7, 0x4e, 0x1a, 0xb9, 0x2d, 0x9c, 0xd1, 0xe4, 0xe2, 0xdc, 0xd3, 0x4b, 0x73},
|
||||
{0x4e, 0x92, 0xb3, 0x2c, 0xc4, 0x15, 0x14, 0x4b, 0x43, 0x1b, 0x30, 0x61, 0xc3, 0x47, 0xbb, 0x43},
|
||||
{0x99, 0x68, 0xeb, 0x16, 0xdd, 0x31, 0xb2, 0x03, 0xf6, 0xef, 0x07, 0xe7, 0xa8, 0x75, 0xa7, 0xdb},
|
||||
{0x2c, 0x47, 0xca, 0x7e, 0x02, 0x23, 0x5e, 0x8e, 0x77, 0x59, 0x75, 0x3c, 0x4b, 0x61, 0xf3, 0x6d},
|
||||
{0xf9, 0x17, 0x86, 0xb8, 0xb9, 0xe5, 0x1b, 0x6d, 0x77, 0x7d, 0xde, 0xd6, 0x17, 0x5a, 0xa7, 0xcd},
|
||||
{0x5d, 0xee, 0x46, 0xa9, 0x9d, 0x06, 0x6c, 0x9d, 0xaa, 0xe9, 0xa8, 0x6b, 0xf0, 0x43, 0x6b, 0xec},
|
||||
{0xc1, 0x27, 0xf3, 0x3b, 0x59, 0x11, 0x53, 0xa2, 0x2b, 0x33, 0x57, 0xf9, 0x50, 0x69, 0x1e, 0xcb},
|
||||
{0xd9, 0xd0, 0x0e, 0x60, 0x53, 0x03, 0xed, 0xe4, 0x9c, 0x61, 0xda, 0x00, 0x75, 0x0c, 0xee, 0x2c},
|
||||
{0x50, 0xa3, 0xa4, 0x63, 0xbc, 0xba, 0xbb, 0x80, 0xab, 0x0c, 0xe9, 0x96, 0xa1, 0xa5, 0xb1, 0xf0},
|
||||
{0x39, 0xca, 0x8d, 0x93, 0x30, 0xde, 0x0d, 0xab, 0x88, 0x29, 0x96, 0x5e, 0x02, 0xb1, 0x3d, 0xae},
|
||||
{0x42, 0xb4, 0x75, 0x2e, 0xa8, 0xf3, 0x14, 0x88, 0x0b, 0xa4, 0x54, 0xd5, 0x38, 0x8f, 0xbb, 0x17},
|
||||
{0xf6, 0x16, 0x0a, 0x36, 0x79, 0xb7, 0xb6, 0xae, 0xd7, 0x7f, 0x42, 0x5f, 0x5b, 0x8a, 0xbb, 0x34},
|
||||
{0xde, 0xaf, 0xba, 0xff, 0x18, 0x59, 0xce, 0x43, 0x38, 0x54, 0xe5, 0xcb, 0x41, 0x52, 0xf6, 0x26},
|
||||
{0x78, 0xc9, 0x9e, 0x83, 0xf7, 0x9c, 0xca, 0xa2, 0x6a, 0x02, 0xf3, 0xb9, 0x54, 0x9a, 0xe9, 0x4c},
|
||||
{0x35, 0x12, 0x90, 0x22, 0x28, 0x6e, 0xc0, 0x40, 0xbe, 0xf7, 0xdf, 0x1b, 0x1a, 0xa5, 0x51, 0xae},
|
||||
{0xcf, 0x59, 0xa6, 0x48, 0x0f, 0xbc, 0x73, 0xc1, 0x2b, 0xd2, 0x7e, 0xba, 0x3c, 0x61, 0xc1, 0xa0},
|
||||
{0xa1, 0x9d, 0xc5, 0xe9, 0xfd, 0xbd, 0xd6, 0x4a, 0x88, 0x82, 0x28, 0x02, 0x03, 0xcc, 0x6a, 0x75}
|
||||
};
|
||||
|
||||
static unsigned char rc[40][16];
|
||||
static unsigned char rc0[40][16];
|
||||
static unsigned char rc_sseed[40][16];
|
||||
|
||||
static const unsigned char sbox[256] =
|
||||
{ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe,
|
||||
0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4,
|
||||
0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7,
|
||||
0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3,
|
||||
0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09,
|
||||
0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3,
|
||||
0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe,
|
||||
0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
|
||||
0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92,
|
||||
0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c,
|
||||
0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19,
|
||||
0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14,
|
||||
0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2,
|
||||
0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5,
|
||||
0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25,
|
||||
0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
|
||||
0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86,
|
||||
0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e,
|
||||
0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42,
|
||||
0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 };
|
||||
|
||||
#define XT(x) (((x) << 1) ^ ((((x) >> 7) & 1) * 0x1b))
|
||||
|
||||
// Simulate _mm_aesenc_si128 instructions from AESNI
|
||||
void aesenc(unsigned char *s, const unsigned char *rk)
|
||||
{
|
||||
unsigned char i, t, u, v[4][4];
|
||||
for (i = 0; i < 16; ++i) {
|
||||
v[((i / 4) + 4 - (i%4) ) % 4][i % 4] = sbox[s[i]];
|
||||
}
|
||||
for (i = 0; i < 4; ++i) {
|
||||
t = v[i][0];
|
||||
u = v[i][0] ^ v[i][1] ^ v[i][2] ^ v[i][3];
|
||||
v[i][0] ^= u ^ XT(v[i][0] ^ v[i][1]);
|
||||
v[i][1] ^= u ^ XT(v[i][1] ^ v[i][2]);
|
||||
v[i][2] ^= u ^ XT(v[i][2] ^ v[i][3]);
|
||||
v[i][3] ^= u ^ XT(v[i][3] ^ t);
|
||||
}
|
||||
for (i = 0; i < 16; ++i) {
|
||||
s[i] = v[i / 4][i % 4] ^ rk[i];
|
||||
}
|
||||
}
|
||||
|
||||
// Simulate _mm_unpacklo_epi32
|
||||
void unpacklo32(unsigned char *t, unsigned char *a, unsigned char *b)
|
||||
{
|
||||
unsigned char tmp[16];
|
||||
memcpy(tmp, a, 4);
|
||||
memcpy(tmp + 4, b, 4);
|
||||
memcpy(tmp + 8, a + 4, 4);
|
||||
memcpy(tmp + 12, b + 4, 4);
|
||||
memcpy(t, tmp, 16);
|
||||
}
|
||||
|
||||
// Simulate _mm_unpackhi_epi32
|
||||
void unpackhi32(unsigned char *t, unsigned char *a, unsigned char *b)
|
||||
{
|
||||
unsigned char tmp[16];
|
||||
memcpy(tmp, a + 8, 4);
|
||||
memcpy(tmp + 4, b + 8, 4);
|
||||
memcpy(tmp + 8, a + 12, 4);
|
||||
memcpy(tmp + 12, b + 12, 4);
|
||||
memcpy(t, tmp, 16);
|
||||
}
|
||||
|
||||
void load_constants_port()
|
||||
{
|
||||
/* Use the standard constants to generate tweaked ones. */
|
||||
memcpy(rc, haraka_rc, 40*16);
|
||||
}
|
||||
|
||||
void tweak_constants(const unsigned char *pk_seed, const unsigned char *sk_seed,
|
||||
unsigned long long seed_length)
|
||||
{
|
||||
unsigned char buf[40*16];
|
||||
|
||||
/* Use the standard constants to generate tweaked ones. */
|
||||
memcpy(rc, haraka_rc, 40*16);
|
||||
|
||||
/* Constants for sk.seed */
|
||||
if (sk_seed != NULL) {
|
||||
haraka_S(buf, 40*16, sk_seed, seed_length);
|
||||
memcpy(rc_sseed, buf, 40*16);
|
||||
}
|
||||
|
||||
/* Constants for pk.seed */
|
||||
haraka_S(buf, 40*16, pk_seed, seed_length);
|
||||
memcpy(rc, buf, 40*16);
|
||||
}
|
||||
|
||||
static void haraka_S_absorb(unsigned char *s, unsigned int r,
|
||||
const unsigned char *m, unsigned long long mlen,
|
||||
unsigned char p)
|
||||
{
|
||||
unsigned long long i;
|
||||
unsigned char t[r];
|
||||
|
||||
while (mlen >= r) {
|
||||
// XOR block to state
|
||||
for (i = 0; i < r; ++i) {
|
||||
s[i] ^= m[i];
|
||||
}
|
||||
haraka512_perm(s, s);
|
||||
mlen -= r;
|
||||
m += r;
|
||||
}
|
||||
|
||||
for (i = 0; i < r; ++i) {
|
||||
t[i] = 0;
|
||||
}
|
||||
for (i = 0; i < mlen; ++i) {
|
||||
t[i] = m[i];
|
||||
}
|
||||
t[i] = p;
|
||||
t[r - 1] |= 128;
|
||||
for (i = 0; i < r; ++i) {
|
||||
s[i] ^= t[i];
|
||||
}
|
||||
}
|
||||
|
||||
static void haraka_S_squeezeblocks(unsigned char *h, unsigned long long nblocks,
|
||||
unsigned char *s, unsigned int r)
|
||||
{
|
||||
while (nblocks > 0) {
|
||||
haraka512_perm(s, s);
|
||||
memcpy(h, s, HARAKAS_RATE);
|
||||
h += r;
|
||||
nblocks--;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void haraka_S(unsigned char *out, unsigned long long outlen,
|
||||
const unsigned char *in, unsigned long long inlen)
|
||||
{
|
||||
unsigned long long i;
|
||||
unsigned char s[64];
|
||||
unsigned char d[32];
|
||||
|
||||
for (i = 0; i < 64; i++) {
|
||||
s[i] = 0;
|
||||
}
|
||||
haraka_S_absorb(s, 32, in, inlen, 0x1F);
|
||||
|
||||
haraka_S_squeezeblocks(out, outlen / 32, s, 32);
|
||||
out += (outlen / 32) * 32;
|
||||
|
||||
if (outlen % 32) {
|
||||
haraka_S_squeezeblocks(d, 1, s, 32);
|
||||
for (i = 0; i < outlen % 32; i++) {
|
||||
out[i] = d[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void haraka512_perm(unsigned char *out, const unsigned char *in)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
unsigned char s[64], tmp[16];
|
||||
|
||||
memcpy(s, in, 16);
|
||||
memcpy(s + 16, in + 16, 16);
|
||||
memcpy(s + 32, in + 32, 16);
|
||||
memcpy(s + 48, in + 48, 16);
|
||||
|
||||
for (i = 0; i < 5; ++i) {
|
||||
// aes round(s)
|
||||
for (j = 0; j < 2; ++j) {
|
||||
aesenc(s, rc[4*2*i + 4*j]);
|
||||
aesenc(s + 16, rc[4*2*i + 4*j + 1]);
|
||||
aesenc(s + 32, rc[4*2*i + 4*j + 2]);
|
||||
aesenc(s + 48, rc[4*2*i + 4*j + 3]);
|
||||
}
|
||||
|
||||
// mixing
|
||||
unpacklo32(tmp, s, s + 16);
|
||||
unpackhi32(s, s, s + 16);
|
||||
unpacklo32(s + 16, s + 32, s + 48);
|
||||
unpackhi32(s + 32, s + 32, s + 48);
|
||||
unpacklo32(s + 48, s, s + 32);
|
||||
unpackhi32(s, s, s + 32);
|
||||
unpackhi32(s + 32, s + 16, tmp);
|
||||
unpacklo32(s + 16, s + 16, tmp);
|
||||
}
|
||||
|
||||
memcpy(out, s, 64);
|
||||
}
|
||||
|
||||
void haraka512_port(unsigned char *out, const unsigned char *in)
|
||||
{
|
||||
int i;
|
||||
|
||||
unsigned char buf[64];
|
||||
|
||||
haraka512_perm(buf, in);
|
||||
/* Feed-forward */
|
||||
for (i = 0; i < 64; i++) {
|
||||
buf[i] = buf[i] ^ in[i];
|
||||
}
|
||||
|
||||
/* Truncated */
|
||||
memcpy(out, buf + 8, 8);
|
||||
memcpy(out + 8, buf + 24, 8);
|
||||
memcpy(out + 16, buf + 32, 8);
|
||||
memcpy(out + 24, buf + 48, 8);
|
||||
}
|
||||
|
||||
void haraka512_perm_zero(unsigned char *out, const unsigned char *in)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
unsigned char s[64], tmp[16];
|
||||
|
||||
memcpy(s, in, 16);
|
||||
memcpy(s + 16, in + 16, 16);
|
||||
memcpy(s + 32, in + 32, 16);
|
||||
memcpy(s + 48, in + 48, 16);
|
||||
|
||||
for (i = 0; i < 5; ++i) {
|
||||
// aes round(s)
|
||||
for (j = 0; j < 2; ++j) {
|
||||
aesenc(s, rc0[4*2*i + 4*j]);
|
||||
aesenc(s + 16, rc0[4*2*i + 4*j + 1]);
|
||||
aesenc(s + 32, rc0[4*2*i + 4*j + 2]);
|
||||
aesenc(s + 48, rc0[4*2*i + 4*j + 3]);
|
||||
}
|
||||
|
||||
// mixing
|
||||
unpacklo32(tmp, s, s + 16);
|
||||
unpackhi32(s, s, s + 16);
|
||||
unpacklo32(s + 16, s + 32, s + 48);
|
||||
unpackhi32(s + 32, s + 32, s + 48);
|
||||
unpacklo32(s + 48, s, s + 32);
|
||||
unpackhi32(s, s, s + 32);
|
||||
unpackhi32(s + 32, s + 16, tmp);
|
||||
unpacklo32(s + 16, s + 16, tmp);
|
||||
}
|
||||
|
||||
memcpy(out, s, 64);
|
||||
}
|
||||
|
||||
void haraka512_port_zero(unsigned char *out, const unsigned char *in)
|
||||
{
|
||||
int i;
|
||||
|
||||
unsigned char buf[64];
|
||||
|
||||
haraka512_perm_zero(buf, in);
|
||||
/* Feed-forward */
|
||||
for (i = 0; i < 64; i++) {
|
||||
buf[i] = buf[i] ^ in[i];
|
||||
}
|
||||
|
||||
/* Truncated */
|
||||
memcpy(out, buf + 8, 8);
|
||||
memcpy(out + 8, buf + 24, 8);
|
||||
memcpy(out + 16, buf + 32, 8);
|
||||
memcpy(out + 24, buf + 48, 8);
|
||||
}
|
||||
|
||||
void haraka256_port(unsigned char *out, const unsigned char *in)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
unsigned char s[32], tmp[16];
|
||||
|
||||
memcpy(s, in, 16);
|
||||
memcpy(s + 16, in + 16, 16);
|
||||
|
||||
for (i = 0; i < 5; ++i) {
|
||||
// aes round(s)
|
||||
for (j = 0; j < 2; ++j) {
|
||||
aesenc(s, rc[2*2*i + 2*j]);
|
||||
aesenc(s + 16, rc[2*2*i + 2*j + 1]);
|
||||
}
|
||||
|
||||
// mixing
|
||||
unpacklo32(tmp, s, s + 16);
|
||||
unpackhi32(s + 16, s, s + 16);
|
||||
memcpy(s, tmp, 16);
|
||||
}
|
||||
|
||||
/* Feed-forward */
|
||||
for (i = 0; i < 32; i++) {
|
||||
out[i] = in[i] ^ s[i];
|
||||
}
|
||||
}
|
||||
|
||||
void haraka256_sk(unsigned char *out, const unsigned char *in)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
unsigned char s[32], tmp[16];
|
||||
|
||||
memcpy(s, in, 16);
|
||||
memcpy(s + 16, in + 16, 16);
|
||||
|
||||
for (i = 0; i < 5; ++i) {
|
||||
// aes round(s)
|
||||
for (j = 0; j < 2; ++j) {
|
||||
aesenc(s, rc_sseed[2*2*i + 2*j]);
|
||||
aesenc(s + 16, rc_sseed[2*2*i + 2*j + 1]);
|
||||
}
|
||||
|
||||
// mixing
|
||||
unpacklo32(tmp, s, s + 16);
|
||||
unpackhi32(s + 16, s, s + 16);
|
||||
memcpy(s, tmp, 16);
|
||||
}
|
||||
|
||||
/* Feed-forward */
|
||||
for (i = 0; i < 32; i++) {
|
||||
out[i] = in[i] ^ s[i];
|
||||
}
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
#ifndef SPX_HARAKA_H
|
||||
#define SPX_HARAKA_H
|
||||
|
||||
/* load constants */
|
||||
void load_constants_port();
|
||||
|
||||
/* Tweak constants with seed */
|
||||
void tweak_constants(const unsigned char *pk_seed, const unsigned char *sk_seed,
|
||||
unsigned long long seed_length);
|
||||
|
||||
/* Haraka Sponge */
|
||||
void haraka_S(unsigned char *out, unsigned long long outlen,
|
||||
const unsigned char *in, unsigned long long inlen);
|
||||
|
||||
/* Applies the 512-bit Haraka permutation to in. */
|
||||
void haraka512_perm(unsigned char *out, const unsigned char *in);
|
||||
|
||||
/* Implementation of Haraka-512 */
|
||||
void haraka512_port(unsigned char *out, const unsigned char *in);
|
||||
|
||||
/* Applies the 512-bit Haraka permutation to in, using zero key. */
|
||||
void haraka512_perm_zero(unsigned char *out, const unsigned char *in);
|
||||
|
||||
/* Implementation of Haraka-512, using zero key */
|
||||
void haraka512_port_zero(unsigned char *out, const unsigned char *in);
|
||||
|
||||
/* Implementation of Haraka-256 */
|
||||
void haraka256_port(unsigned char *out, const unsigned char *in);
|
||||
|
||||
/* Implementation of Haraka-256 using sk.seed constants */
|
||||
void haraka256_sk(unsigned char *out, const unsigned char *in);
|
||||
|
||||
#endif
|
||||
@@ -3,12 +3,22 @@
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#include "crypto/sha256.h"
|
||||
|
||||
#include "crypto/common.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <stdexcept>
|
||||
|
||||
#if defined(__x86_64__) || defined(__amd64__)
|
||||
#if defined(EXPERIMENTAL_ASM)
|
||||
#include <cpuid.h>
|
||||
namespace sha256_sse4
|
||||
{
|
||||
void Transform(uint32_t* s, const unsigned char* chunk, size_t blocks);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// Internal implementation code.
|
||||
namespace
|
||||
{
|
||||
@@ -44,9 +54,10 @@ void inline Initialize(uint32_t* s)
|
||||
s[7] = 0x5be0cd19ul;
|
||||
}
|
||||
|
||||
/** Perform one SHA-256 transformation, processing a 64-byte chunk. */
|
||||
void Transform(uint32_t* s, const unsigned char* chunk)
|
||||
/** Perform a number of SHA-256 transformations, processing 64-byte chunks. */
|
||||
void Transform(uint32_t* s, const unsigned char* chunk, size_t blocks)
|
||||
{
|
||||
while (blocks--) {
|
||||
uint32_t a = s[0], b = s[1], c = s[2], d = s[3], e = s[4], f = s[5], g = s[6], h = s[7];
|
||||
uint32_t w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15;
|
||||
|
||||
@@ -126,11 +137,59 @@ void Transform(uint32_t* s, const unsigned char* chunk)
|
||||
s[5] += f;
|
||||
s[6] += g;
|
||||
s[7] += h;
|
||||
chunk += 64;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace sha256
|
||||
|
||||
typedef void (*TransformType)(uint32_t*, const unsigned char*, size_t);
|
||||
|
||||
bool SelfTest(TransformType tr) {
|
||||
static const unsigned char in1[65] = {0, 0x80};
|
||||
static const unsigned char in2[129] = {
|
||||
0,
|
||||
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
|
||||
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
|
||||
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0
|
||||
};
|
||||
static const uint32_t init[8] = {0x6a09e667ul, 0xbb67ae85ul, 0x3c6ef372ul, 0xa54ff53aul, 0x510e527ful, 0x9b05688cul, 0x1f83d9abul, 0x5be0cd19ul};
|
||||
static const uint32_t out1[8] = {0xe3b0c442ul, 0x98fc1c14ul, 0x9afbf4c8ul, 0x996fb924ul, 0x27ae41e4ul, 0x649b934cul, 0xa495991bul, 0x7852b855ul};
|
||||
static const uint32_t out2[8] = {0xce4153b0ul, 0x147c2a86ul, 0x3ed4298eul, 0xe0676bc8ul, 0x79fc77a1ul, 0x2abe1f49ul, 0xb2b055dful, 0x1069523eul};
|
||||
uint32_t buf[8];
|
||||
memcpy(buf, init, sizeof(buf));
|
||||
// Process nothing, and check we remain in the initial state.
|
||||
tr(buf, nullptr, 0);
|
||||
if (memcmp(buf, init, sizeof(buf))) return false;
|
||||
// Process the padded empty string (unaligned)
|
||||
tr(buf, in1 + 1, 1);
|
||||
if (memcmp(buf, out1, sizeof(buf))) return false;
|
||||
// Process 64 spaces (unaligned)
|
||||
memcpy(buf, init, sizeof(buf));
|
||||
tr(buf, in2 + 1, 2);
|
||||
if (memcmp(buf, out2, sizeof(buf))) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
TransformType Transform = sha256::Transform;
|
||||
|
||||
} // namespace
|
||||
|
||||
std::string SHA256AutoDetect()
|
||||
{
|
||||
#if defined(EXPERIMENTAL_ASM) && (defined(__x86_64__) || defined(__amd64__))
|
||||
uint32_t eax, ebx, ecx, edx;
|
||||
if (__get_cpuid(1, &eax, &ebx, &ecx, &edx) && (ecx >> 19) & 1) {
|
||||
Transform = sha256_sse4::Transform;
|
||||
assert(SelfTest(Transform));
|
||||
return "sse4";
|
||||
}
|
||||
#endif
|
||||
|
||||
assert(SelfTest(Transform));
|
||||
return "standard";
|
||||
}
|
||||
|
||||
////// SHA-256
|
||||
|
||||
@@ -148,14 +207,14 @@ CSHA256& CSHA256::Write(const unsigned char* data, size_t len)
|
||||
memcpy(buf + bufsize, data, 64 - bufsize);
|
||||
bytes += 64 - bufsize;
|
||||
data += 64 - bufsize;
|
||||
sha256::Transform(s, buf);
|
||||
Transform(s, buf, 1);
|
||||
bufsize = 0;
|
||||
}
|
||||
while (end >= data + 64) {
|
||||
// Process full chunks directly from the source.
|
||||
sha256::Transform(s, data);
|
||||
bytes += 64;
|
||||
data += 64;
|
||||
if (end - data >= 64) {
|
||||
size_t blocks = (end - data) / 64;
|
||||
Transform(s, data, blocks);
|
||||
data += 64 * blocks;
|
||||
bytes += 64 * blocks;
|
||||
}
|
||||
if (end > data) {
|
||||
// Fill the buffer with what remains.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014 The Bitcoin Core developers
|
||||
// Copyright (c) 2014-2016 The Bitcoin Core developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
@@ -7,13 +7,19 @@
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string>
|
||||
|
||||
/** A hasher class for SHA-256. */
|
||||
class CSHA256
|
||||
{
|
||||
public:
|
||||
static const size_t OUTPUT_SIZE = 32;
|
||||
|
||||
private:
|
||||
uint32_t s[8];
|
||||
unsigned char buf[64];
|
||||
size_t bytes;
|
||||
void FinalizeNoPadding(unsigned char hash[OUTPUT_SIZE], bool enforce_compression);
|
||||
public:
|
||||
CSHA256();
|
||||
CSHA256& Write(const unsigned char* data, size_t len);
|
||||
void Finalize(unsigned char hash[OUTPUT_SIZE]);
|
||||
@@ -21,12 +27,11 @@ public:
|
||||
FinalizeNoPadding(hash, true);
|
||||
};
|
||||
CSHA256& Reset();
|
||||
|
||||
private:
|
||||
uint32_t s[8];
|
||||
unsigned char buf[64];
|
||||
size_t bytes;
|
||||
void FinalizeNoPadding(unsigned char hash[OUTPUT_SIZE], bool enforce_compression);
|
||||
};
|
||||
|
||||
/** Autodetect the best available SHA256 implementation.
|
||||
* Returns the name of the implementation.
|
||||
*/
|
||||
std::string SHA256AutoDetect();
|
||||
|
||||
#endif // BITCOIN_CRYPTO_SHA256_H
|
||||
|
||||
1506
src/crypto/sha256_sse4.cpp
Normal file
1506
src/crypto/sha256_sse4.cpp
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,180 +0,0 @@
|
||||
// (C) 2018 The Verus Developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
/*
|
||||
This provides the PoW hash function for Verus, a CPU-optimized hash
|
||||
function with a Haraka V2 core. Unlike Haraka, which is made for short
|
||||
inputs only, Verus Hash takes any length of input and produces a 256
|
||||
bit output.
|
||||
*/
|
||||
#include <string.h>
|
||||
#include "crypto/common.h"
|
||||
#include "crypto/verus_hash.h"
|
||||
|
||||
void (*CVerusHash::haraka512Function)(unsigned char *out, const unsigned char *in);
|
||||
|
||||
void CVerusHash::Hash(void *result, const void *data, size_t _len)
|
||||
{
|
||||
unsigned char buf[128];
|
||||
unsigned char *bufPtr = buf;
|
||||
int nextOffset = 64;
|
||||
uint32_t pos = 0, len = _len;
|
||||
unsigned char *bufPtr2 = bufPtr + nextOffset;
|
||||
unsigned char *ptr = (unsigned char *)data;
|
||||
|
||||
// put our last result or zero at beginning of buffer each time
|
||||
memset(bufPtr, 0, 32);
|
||||
|
||||
// digest up to 32 bytes at a time
|
||||
for ( ; pos < len; pos += 32)
|
||||
{
|
||||
if (len - pos >= 32)
|
||||
{
|
||||
memcpy(bufPtr + 32, ptr + pos, 32);
|
||||
}
|
||||
else
|
||||
{
|
||||
int i = (int)(len - pos);
|
||||
memcpy(bufPtr + 32, ptr + pos, i);
|
||||
memset(bufPtr + 32 + i, 0, 32 - i);
|
||||
}
|
||||
(*haraka512Function)(bufPtr2, bufPtr);
|
||||
bufPtr2 = bufPtr;
|
||||
bufPtr += nextOffset;
|
||||
nextOffset *= -1;
|
||||
}
|
||||
memcpy(result, bufPtr, 32);
|
||||
};
|
||||
|
||||
void CVerusHash::init()
|
||||
{
|
||||
if (IsCPUVerusOptimized())
|
||||
{
|
||||
haraka512Function = &haraka512_zero;
|
||||
}
|
||||
else
|
||||
{
|
||||
haraka512Function = &haraka512_port_zero;
|
||||
}
|
||||
}
|
||||
|
||||
CVerusHash &CVerusHash::Write(const unsigned char *data, size_t _len)
|
||||
{
|
||||
unsigned char *tmp;
|
||||
uint32_t pos, len = _len;
|
||||
|
||||
// digest up to 32 bytes at a time
|
||||
for ( pos = 0; pos < len; )
|
||||
{
|
||||
uint32_t room = 32 - curPos;
|
||||
|
||||
if (len - pos >= room)
|
||||
{
|
||||
memcpy(curBuf + 32 + curPos, data + pos, room);
|
||||
(*haraka512Function)(result, curBuf);
|
||||
tmp = curBuf;
|
||||
curBuf = result;
|
||||
result = tmp;
|
||||
pos += room;
|
||||
curPos = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
memcpy(curBuf + 32 + curPos, data + pos, len - pos);
|
||||
curPos += len - pos;
|
||||
pos = len;
|
||||
}
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
// to be declared and accessed from C
|
||||
void verus_hash(void *result, const void *data, size_t len)
|
||||
{
|
||||
return CVerusHash::Hash(result, data, len);
|
||||
}
|
||||
|
||||
void (*CVerusHashV2::haraka512Function)(unsigned char *out, const unsigned char *in);
|
||||
|
||||
void CVerusHashV2::init()
|
||||
{
|
||||
if (IsCPUVerusOptimized())
|
||||
{
|
||||
load_constants();
|
||||
haraka512Function = &haraka512;
|
||||
}
|
||||
else
|
||||
{
|
||||
// load and tweak the haraka constants
|
||||
load_constants_port();
|
||||
haraka512Function = &haraka512_port;
|
||||
}
|
||||
}
|
||||
|
||||
void CVerusHashV2::Hash(void *result, const void *data, size_t len)
|
||||
{
|
||||
unsigned char buf[128];
|
||||
unsigned char *bufPtr = buf;
|
||||
int pos = 0, nextOffset = 64;
|
||||
unsigned char *bufPtr2 = bufPtr + nextOffset;
|
||||
unsigned char *ptr = (unsigned char *)data;
|
||||
|
||||
// put our last result or zero at beginning of buffer each time
|
||||
memset(bufPtr, 0, 32);
|
||||
|
||||
// digest up to 32 bytes at a time
|
||||
for ( ; pos < len; pos += 32)
|
||||
{
|
||||
if (len - pos >= 32)
|
||||
{
|
||||
memcpy(bufPtr + 32, ptr + pos, 32);
|
||||
}
|
||||
else
|
||||
{
|
||||
int i = (int)(len - pos);
|
||||
memcpy(bufPtr + 32, ptr + pos, i);
|
||||
memset(bufPtr + 32 + i, 0, 32 - i);
|
||||
}
|
||||
(*haraka512Function)(bufPtr2, bufPtr);
|
||||
bufPtr2 = bufPtr;
|
||||
bufPtr += nextOffset;
|
||||
nextOffset *= -1;
|
||||
}
|
||||
memcpy(result, bufPtr, 32);
|
||||
};
|
||||
|
||||
CVerusHashV2 &CVerusHashV2::Write(const unsigned char *data, size_t len)
|
||||
{
|
||||
unsigned char *tmp;
|
||||
|
||||
// digest up to 32 bytes at a time
|
||||
for ( int pos = 0; pos < len; )
|
||||
{
|
||||
int room = 32 - curPos;
|
||||
|
||||
if (len - pos >= room)
|
||||
{
|
||||
memcpy(curBuf + 32 + curPos, data + pos, room);
|
||||
(*haraka512Function)(result, curBuf);
|
||||
tmp = curBuf;
|
||||
curBuf = result;
|
||||
result = tmp;
|
||||
pos += room;
|
||||
curPos = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
memcpy(curBuf + 32 + curPos, data + pos, len - pos);
|
||||
curPos += len - pos;
|
||||
pos = len;
|
||||
}
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
// to be declared and accessed from C
|
||||
void verus_hash_v2(void *result, const void *data, size_t len)
|
||||
{
|
||||
return CVerusHashV2::Hash(result, data, len);
|
||||
}
|
||||
@@ -1,134 +0,0 @@
|
||||
// (C) 2018 Michael Toutonghi
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
/*
|
||||
This provides the PoW hash function for Verus, enabling CPU mining.
|
||||
*/
|
||||
#ifndef VERUS_HASH_H_
|
||||
#define VERUS_HASH_H_
|
||||
|
||||
#include <cstring>
|
||||
#include <vector>
|
||||
|
||||
#include <cpuid.h>
|
||||
|
||||
extern "C"
|
||||
{
|
||||
#include "crypto/haraka.h"
|
||||
#include "crypto/haraka_portable.h"
|
||||
}
|
||||
|
||||
class CVerusHash
|
||||
{
|
||||
public:
|
||||
static void Hash(void *result, const void *data, size_t len);
|
||||
static void (*haraka512Function)(unsigned char *out, const unsigned char *in);
|
||||
|
||||
static void init();
|
||||
|
||||
CVerusHash() { }
|
||||
|
||||
CVerusHash &Write(const unsigned char *data, size_t len);
|
||||
|
||||
CVerusHash &Reset()
|
||||
{
|
||||
curBuf = buf1;
|
||||
result = buf2;
|
||||
curPos = 0;
|
||||
std::fill(buf1, buf1 + sizeof(buf1), 0);
|
||||
return *this;
|
||||
}
|
||||
|
||||
int64_t *ExtraI64Ptr() { return (int64_t *)(curBuf + 32); }
|
||||
void ClearExtra()
|
||||
{
|
||||
if (curPos)
|
||||
{
|
||||
std::fill(curBuf + 32 + curPos, curBuf + 64, 0);
|
||||
}
|
||||
}
|
||||
void ExtraHash(unsigned char hash[32]) { (*haraka512Function)(hash, curBuf); }
|
||||
|
||||
void Finalize(unsigned char hash[32])
|
||||
{
|
||||
if (curPos)
|
||||
{
|
||||
std::fill(curBuf + 32 + curPos, curBuf + 64, 0);
|
||||
(*haraka512Function)(hash, curBuf);
|
||||
}
|
||||
else
|
||||
std::memcpy(hash, curBuf, 32);
|
||||
}
|
||||
|
||||
private:
|
||||
// only buf1, the first source, needs to be zero initialized
|
||||
unsigned char buf1[64] = {0}, buf2[64];
|
||||
unsigned char *curBuf = buf1, *result = buf2;
|
||||
size_t curPos = 0;
|
||||
};
|
||||
|
||||
class CVerusHashV2
|
||||
{
|
||||
public:
|
||||
static void Hash(void *result, const void *data, size_t len);
|
||||
static void (*haraka512Function)(unsigned char *out, const unsigned char *in);
|
||||
|
||||
static void init();
|
||||
|
||||
CVerusHashV2() {}
|
||||
|
||||
CVerusHashV2 &Write(const unsigned char *data, size_t len);
|
||||
|
||||
CVerusHashV2 &Reset()
|
||||
{
|
||||
curBuf = buf1;
|
||||
result = buf2;
|
||||
curPos = 0;
|
||||
std::fill(buf1, buf1 + sizeof(buf1), 0);
|
||||
return *this;
|
||||
}
|
||||
|
||||
int64_t *ExtraI64Ptr() { return (int64_t *)(curBuf + 32); }
|
||||
void ClearExtra()
|
||||
{
|
||||
if (curPos)
|
||||
{
|
||||
std::fill(curBuf + 32 + curPos, curBuf + 64, 0);
|
||||
}
|
||||
}
|
||||
void ExtraHash(unsigned char hash[32]) { (*haraka512Function)(hash, curBuf); }
|
||||
|
||||
void Finalize(unsigned char hash[32])
|
||||
{
|
||||
if (curPos)
|
||||
{
|
||||
std::fill(curBuf + 32 + curPos, curBuf + 64, 0);
|
||||
(*haraka512Function)(hash, curBuf);
|
||||
}
|
||||
else
|
||||
std::memcpy(hash, curBuf, 32);
|
||||
}
|
||||
|
||||
private:
|
||||
// only buf1, the first source, needs to be zero initialized
|
||||
unsigned char buf1[64] = {0}, buf2[64];
|
||||
unsigned char *curBuf = buf1, *result = buf2;
|
||||
size_t curPos = 0;
|
||||
};
|
||||
|
||||
extern void verus_hash(void *result, const void *data, size_t len);
|
||||
extern void verus_hash_v2(void *result, const void *data, size_t len);
|
||||
|
||||
inline bool IsCPUVerusOptimized()
|
||||
{
|
||||
unsigned int eax,ebx,ecx,edx;
|
||||
|
||||
if (!__get_cpuid(1,&eax,&ebx,&ecx,&edx))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return ((ecx & (bit_AVX | bit_AES)) == (bit_AVX | bit_AES));
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,4 +1,5 @@
|
||||
// Copyright (c) 2012-2014 The Bitcoin Core developers
|
||||
// Copyright (c) 2019 The Hush developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
@@ -143,6 +144,7 @@ public:
|
||||
CDataStream ssValue(slValue.data(), slValue.data() + slValue.size(), SER_DISK, CLIENT_VERSION);
|
||||
ssValue >> value;
|
||||
} catch(std::exception &e) {
|
||||
LogPrintf("%s: CDataStream error - %s\n", __FUNCTION__, e.what());
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@@ -207,7 +209,8 @@ public:
|
||||
try {
|
||||
CDataStream ssValue(strValue.data(), strValue.data() + strValue.size(), SER_DISK, CLIENT_VERSION);
|
||||
ssValue >> value;
|
||||
} catch (const std::exception&) {
|
||||
} catch (const std::exception &e) {
|
||||
LogPrintf("%s: CDataStream error - %s\n", __FUNCTION__, e.what());
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
// Copyright (c) 2017 The Zcash developers
|
||||
// Copyright (c) 2019 The Hush developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
@@ -48,7 +49,7 @@ void EnforceNodeDeprecation(int nHeight, bool forceLogging, bool fThread) {
|
||||
if (blocksToDeprecation == 0 || forceLogging) {
|
||||
msg = strprintf(_("This version has been deprecated as of block height %d."),
|
||||
DEPRECATION_HEIGHT) + " " +
|
||||
_("You should upgrade to the latest version of Komodo.");
|
||||
_("You should upgrade to the latest version of Hush.");
|
||||
LogPrintf("*** %s\n", msg);
|
||||
CAlert::Notify(msg, fThread);
|
||||
uiInterface.ThreadSafeMessageBox(msg, "", CClientUIInterface::MSG_ERROR);
|
||||
@@ -57,7 +58,7 @@ void EnforceNodeDeprecation(int nHeight, bool forceLogging, bool fThread) {
|
||||
} else if (blocksToDeprecation == DEPRECATION_WARN_LIMIT || (blocksToDeprecation < DEPRECATION_WARN_LIMIT && forceLogging)) {
|
||||
msg = strprintf(_("This version will be deprecated at block height %d, and will automatically shut down."),
|
||||
DEPRECATION_HEIGHT) + " " +
|
||||
_("You should upgrade to the latest version of Komodo.");
|
||||
_("You should upgrade to the latest version of Hush.");
|
||||
LogPrintf("*** %s\n", msg);
|
||||
CAlert::Notify(msg, fThread);
|
||||
uiInterface.ThreadSafeMessageBox(msg, "", CClientUIInterface::MSG_WARNING);
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
// Copyright (c) 2017 The Zcash developers
|
||||
// Copyright (c) 2019 The Hush developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
@@ -24,8 +25,8 @@
|
||||
// * Shut down WEEKS_UNTIL_DEPRECATION weeks' worth of blocks after the estimated release block height.
|
||||
// * A warning is shown during the DEPRECATION_WARN_LIMIT worth of blocks prior to shut down.
|
||||
static const int WEEKS_UNTIL_DEPRECATION = 52;
|
||||
static const int DEPRECATION_HEIGHT = 2200000;
|
||||
static const int APPROX_RELEASE_HEIGHT = DEPRECATION_HEIGHT - (WEEKS_UNTIL_DEPRECATION * 7 * 24 * 60);
|
||||
static const int DEPRECATION_HEIGHT = 5555555;
|
||||
static const int APPROX_RELEASE_HEIGHT = DEPRECATION_HEIGHT - (WEEKS_UNTIL_DEPRECATION * 7 * 24 * 60);
|
||||
|
||||
// Number of blocks before deprecation to warn users
|
||||
static const int DEPRECATION_WARN_LIMIT = 60 * 24 * 60; // 2 months
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
#set working directory to the location of this script
|
||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
cd $DIR
|
||||
|
||||
../komodo-cli -ac_name=VRSC "$@"
|
||||
@@ -1,2 +0,0 @@
|
||||
#!/bin/bash
|
||||
./komodo-cli -ac_name=VRSC $1 $2 $3 $4 $5 $6
|
||||
@@ -1,3 +1,6 @@
|
||||
// Copyright (c) 2019-2020 The Hush developers
|
||||
// Released under the GPLv3
|
||||
|
||||
#include <gmock/gmock.h>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
@@ -135,7 +138,7 @@ TEST_F(DeprecationTest, AlertNotify) {
|
||||
|
||||
// -alertnotify restricts the message to safe characters.
|
||||
auto expectedMsg = strprintf(
|
||||
"This version will be deprecated at block height %d, and will automatically shut down. You should upgrade to the latest version of Zcash.",
|
||||
"This version will be deprecated at block height %d, and will automatically shut down. You should upgrade to the latest version of Hush.",
|
||||
DEPRECATION_HEIGHT);
|
||||
|
||||
// Windows built-in echo semantics are different than posixy shells. Quotes and
|
||||
|
||||
92
src/hash.h
92
src/hash.h
@@ -1,5 +1,6 @@
|
||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
// Copyright (c) 2009-2013 The Bitcoin Core developers
|
||||
// Copyright (c) 2019 The Hush developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
@@ -23,7 +24,6 @@
|
||||
|
||||
#include "crypto/ripemd160.h"
|
||||
#include "crypto/sha256.h"
|
||||
#include "crypto/verus_hash.h"
|
||||
#include "prevector.h"
|
||||
#include "serialize.h"
|
||||
#include "uint256.h"
|
||||
@@ -221,78 +221,6 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
/** A writer stream (for serialization) that computes a 256-bit Verus hash. */
|
||||
class CVerusHashWriter
|
||||
{
|
||||
private:
|
||||
CVerusHash state;
|
||||
|
||||
public:
|
||||
int nType;
|
||||
int nVersion;
|
||||
|
||||
CVerusHashWriter(int nTypeIn, int nVersionIn) : nType(nTypeIn), nVersion(nVersionIn), state() { }
|
||||
void Reset() { state.Reset(); }
|
||||
|
||||
CVerusHashWriter& write(const char *pch, size_t size) {
|
||||
state.Write((const unsigned char*)pch, size);
|
||||
return (*this);
|
||||
}
|
||||
|
||||
// invalidates the object for further writing
|
||||
uint256 GetHash() {
|
||||
uint256 result;
|
||||
state.Finalize((unsigned char*)&result);
|
||||
return result;
|
||||
}
|
||||
|
||||
int64_t *xI64p() { return state.ExtraI64Ptr(); }
|
||||
CVerusHash &GetState() { return state; }
|
||||
|
||||
template<typename T>
|
||||
CVerusHashWriter& operator<<(const T& obj) {
|
||||
// Serialize to this stream
|
||||
::Serialize(*this, obj);
|
||||
return (*this);
|
||||
}
|
||||
};
|
||||
|
||||
/** A writer stream (for serialization) that computes a 256-bit Verus hash with key initialized to Haraka standard. */
|
||||
class CVerusHashV2Writer
|
||||
{
|
||||
private:
|
||||
CVerusHashV2 state;
|
||||
|
||||
public:
|
||||
int nType;
|
||||
int nVersion;
|
||||
|
||||
CVerusHashV2Writer(int nTypeIn, int nVersionIn) : nType(nTypeIn), nVersion(nVersionIn), state() {}
|
||||
void Reset() { state.Reset(); }
|
||||
|
||||
CVerusHashV2Writer& write(const char *pch, size_t size) {
|
||||
state.Write((const unsigned char*)pch, size);
|
||||
return (*this);
|
||||
}
|
||||
|
||||
// invalidates the object for further writing
|
||||
uint256 GetHash() {
|
||||
uint256 result;
|
||||
state.Finalize((unsigned char*)&result);
|
||||
return result;
|
||||
}
|
||||
|
||||
int64_t *xI64p() { return state.ExtraI64Ptr(); }
|
||||
CVerusHashV2 &GetState() { return state; }
|
||||
|
||||
template<typename T>
|
||||
CVerusHashV2Writer& operator<<(const T& obj) {
|
||||
// Serialize to this stream
|
||||
::Serialize(*this, obj);
|
||||
return (*this);
|
||||
}
|
||||
};
|
||||
|
||||
/** Compute the 256-bit hash of an object's serialization. */
|
||||
template<typename T>
|
||||
uint256 SerializeHash(const T& obj, int nType=SER_GETHASH, int nVersion=PROTOCOL_VERSION)
|
||||
@@ -302,24 +230,6 @@ uint256 SerializeHash(const T& obj, int nType=SER_GETHASH, int nVersion=PROTOCOL
|
||||
return ss.GetHash();
|
||||
}
|
||||
|
||||
/** Compute the 256-bit Verus hash of an object's serialization. */
|
||||
template<typename T>
|
||||
uint256 SerializeVerusHash(const T& obj, int nType=SER_GETHASH, int nVersion=PROTOCOL_VERSION)
|
||||
{
|
||||
CVerusHashWriter ss(nType, nVersion);
|
||||
ss << obj;
|
||||
return ss.GetHash();
|
||||
}
|
||||
|
||||
/** Compute the 256-bit Verus hash of an object's serialization. */
|
||||
template<typename T>
|
||||
uint256 SerializeVerusHashV2(const T& obj, int nType=SER_GETHASH, int nVersion=PROTOCOL_VERSION)
|
||||
{
|
||||
CVerusHashV2Writer ss(nType, nVersion);
|
||||
ss << obj;
|
||||
return ss.GetHash();
|
||||
}
|
||||
|
||||
unsigned int MurmurHash3(unsigned int nHashSeed, const std::vector<unsigned char>& vDataToHash);
|
||||
|
||||
void BIP32Hash(const ChainCode &chainCode, unsigned int nChild, unsigned char header, const unsigned char data[32], unsigned char output[64]);
|
||||
|
||||
@@ -306,7 +306,7 @@ static void http_reject_request_cb(struct evhttp_request* req, void*)
|
||||
/** Event dispatcher thread */
|
||||
static void ThreadHTTP(struct event_base* base, struct evhttp* http)
|
||||
{
|
||||
RenameThread("zcash-http");
|
||||
RenameThread("hush-http");
|
||||
LogPrint("http", "Entering http event loop\n");
|
||||
event_base_dispatch(base);
|
||||
// Event loop will be interrupted by InterruptHTTPServer()
|
||||
@@ -355,7 +355,7 @@ static bool HTTPBindAddresses(struct evhttp* http)
|
||||
/** Simple wrapper to set thread name and run work queue */
|
||||
static void HTTPWorkQueueRun(WorkQueue<HTTPClosure>* queue)
|
||||
{
|
||||
RenameThread("zcash-httpworker");
|
||||
RenameThread("hush-httpworker");
|
||||
queue->Run();
|
||||
}
|
||||
|
||||
|
||||
12
src/hush-cli
12
src/hush-cli
@@ -2,10 +2,20 @@
|
||||
# Copyright (c) 2019 Hush developers
|
||||
|
||||
# set working directory to the location of this script
|
||||
# readlink -f does not always exist
|
||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
cd $DIR
|
||||
DIR="$( cd "$( dirname "$( readlink "${BASH_SOURCE[0]}" )" )" && pwd )"
|
||||
cd $DIR
|
||||
|
||||
NAME=HUSH3
|
||||
|
||||
CLI=${KOMODOCLI:-./komodo-cli}
|
||||
$CLI -ac_name=$NAME "$@"
|
||||
if [ -f $CLI ]; then
|
||||
$CLI -ac_name=$NAME "$@"
|
||||
else
|
||||
# We prefix our binary when installed
|
||||
# system wide on Debain system, to prevent clashes
|
||||
CLI=hush-komodo-cli
|
||||
$CLI -ac_name=$NAME "$@"
|
||||
fi
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
@call :GET_CURRENT_DIR
|
||||
@cd %THIS_DIR%
|
||||
komodo-cli.exe -ac_name=VRSC %1 %2 %3 %4 %5 %6 %7 %8 %9
|
||||
komodo-cli.exe -ac_name=HUSH3 %1 %2 %3 %4 %5 %6 %7 %8 %9
|
||||
@goto :EOF
|
||||
|
||||
:GET_CURRENT_DIR
|
||||
24
src/hush-smart-chain
Executable file
24
src/hush-smart-chain
Executable file
@@ -0,0 +1,24 @@
|
||||
#!/bin/bash
|
||||
# Copyright (c) 2019-2020 Hush developers
|
||||
# set working directory to the location of this script
|
||||
# readlink -f does not always exist
|
||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
cd $DIR
|
||||
DIR="$( cd "$( dirname "$( readlink "${BASH_SOURCE[0]}" )" )" && pwd )"
|
||||
cd $DIR
|
||||
|
||||
NAME=HUSH3
|
||||
CLIENTNAME="GoldenSandtrout"
|
||||
DEFAULTS="-ac_sapling=1 -clientname=$CLIENTNAME"
|
||||
|
||||
# This is a Hush-flavored KMD that allows us to pass in arbitary CLI
|
||||
# flags, since hushd is specific to Hush mainnet
|
||||
KMD=${KOMODOD:-./komodod}
|
||||
if [ -f $KMD ]; then
|
||||
$KMD $DEFAULTS "$@"
|
||||
else
|
||||
# We prefix our binary when installed
|
||||
# system wide on Debain system, to prevent clashes
|
||||
KMD=hush-komodod
|
||||
$KMD $DEFAULTS "$@"
|
||||
fi
|
||||
57
src/hushd
57
src/hushd
@@ -24,10 +24,13 @@ HALVING=129,340000,840000
|
||||
# NOTE: keep in sync with komodo_bitcoind.h
|
||||
END=128,340000,5422111
|
||||
CLIENTNAME=GoldenSandtrout
|
||||
SEEDNODE1=188.165.212.101
|
||||
SEEDNODE2=136.243.227.142
|
||||
SEEDNODE3=5.9.224.250
|
||||
NODE1=188.165.212.101 # EU
|
||||
NODE2=64.120.113.130 # AR
|
||||
NODE3=209.58.144.205 # NA
|
||||
NODE4=94.130.35.94 # EU
|
||||
CCLIB=hush3
|
||||
# First Pure Sapling Zcash Protocol chain!
|
||||
SAPLING=1
|
||||
|
||||
# CryptoConditions/Custom Consensus params
|
||||
FAUCET=228
|
||||
@@ -37,22 +40,36 @@ ORACLE=236
|
||||
GATEWAY=241
|
||||
CCENABLE=$FAUCET,$HEIR,$CHANNEL,$ORACLE,$GATEWAY
|
||||
|
||||
#NOTE: This is not compatible with upstream KMD komodod,
|
||||
# but you can reuse one hush3 komodod binary in various
|
||||
# directories/repos on one server, to save disk space
|
||||
KMD=${KOMODOD:-./komodod}
|
||||
$KMD -ac_name=$NAME -ac_sapling=1 \
|
||||
-ac_reward=$REWARD \
|
||||
-ac_halving=$HALVING \
|
||||
-ac_end=$END \
|
||||
-ac_eras=$ERAS \
|
||||
-ac_blocktime=$BLOCKTIME \
|
||||
-ac_cc=2 -ac_ccenable=$CCENABLE \
|
||||
-ac_founders=$FOUNDERS -ac_supply=$SUPPLY \
|
||||
-ac_perc=$PERC \
|
||||
-clientname=$CLIENTNAME \
|
||||
-addnode=$SEEDNODE1 \
|
||||
-addnode=$SEEDNODE2 \
|
||||
-addnode=$SEEDNODE3 \
|
||||
-ac_cclib=$CCLIB \
|
||||
if [ -f $KMD ]; then
|
||||
echo "Found binary: $KMD"
|
||||
else
|
||||
KMD=hush-komodod
|
||||
if [ -f $KMD ]; then
|
||||
echo "Found binary: $KMD"
|
||||
else
|
||||
echo "ERROR: Could not find Komodo binary!!!"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
$KMD -ac_name=$NAME \
|
||||
-ac_sapling=$SAPLING \
|
||||
-ac_reward=$REWARD \
|
||||
-ac_halving=$HALVING \
|
||||
-ac_end=$END \
|
||||
-ac_eras=$ERAS \
|
||||
-ac_blocktime=$BLOCKTIME \
|
||||
-ac_cc=2 \
|
||||
-ac_ccenable=$CCENABLE \
|
||||
-ac_founders=$FOUNDERS \
|
||||
-ac_supply=$SUPPLY \
|
||||
-ac_perc=$PERC \
|
||||
-clientname=$CLIENTNAME \
|
||||
-addnode=$NODE1 \
|
||||
-addnode=$NODE2 \
|
||||
-addnode=$NODE3 \
|
||||
-addnode=$NODE4 \
|
||||
-ac_cclib=$CCLIB \
|
||||
-ac_script=$SCRIPT "$@"
|
||||
|
||||
10
src/hushd.bat
Normal file
10
src/hushd.bat
Normal file
@@ -0,0 +1,10 @@
|
||||
@call :GET_CURRENT_DIR
|
||||
@cd %THIS_DIR%
|
||||
komodod.exe -ac_name=HUSH3 -ac_sapling=1 -ac_reward=0,1125000000,562500000 -ac_halving=129,340000,840000 -ac_end=128,340000,5422111 -ac_eras=3 -ac_blocktime=150 -ac_cc=2 -ac_ccenable=228,234,235,236,241 -ac_founders=1 -ac_supply=6178674 -ac_perc=11111111 -clientname=GoldenSandtrout -addnode=64.120.113.130 -addnode=209.58.144.205 -addnode=94.130.35.94 -addnode=188.165.212.101 -ac_cclib=hush3 -ac_script=76a9145eb10cf64f2bab1b457f1f25e658526155928fac88ac -daemon %1 %2 %3 %4 %5 %6 %7 %8 %9
|
||||
@goto :EOF
|
||||
|
||||
:GET_CURRENT_DIR
|
||||
@pushd %~dp0
|
||||
@set THIS_DIR=%CD%
|
||||
@popd
|
||||
@goto :EOF
|
||||
335
src/init.cpp
335
src/init.cpp
@@ -97,6 +97,9 @@ using namespace std;
|
||||
extern void ThreadSendAlert();
|
||||
extern bool komodo_dailysnapshot(int32_t height);
|
||||
extern int32_t KOMODO_LOADINGBLOCKS;
|
||||
extern char ASSETCHAINS_SYMBOL[];
|
||||
extern int32_t KOMODO_SNAPSHOT_INTERVAL;
|
||||
|
||||
extern void komodo_init(int32_t height);
|
||||
|
||||
ZCJoinSplit* pzcashParams = NULL;
|
||||
@@ -164,6 +167,7 @@ std::atomic<bool> fRequestShutdown(false);
|
||||
|
||||
void StartShutdown()
|
||||
{
|
||||
fprintf(stderr,"%s: fRequestShudown=true\n", __FUNCTION__);
|
||||
fRequestShutdown = true;
|
||||
}
|
||||
bool ShutdownRequested()
|
||||
@@ -207,6 +211,7 @@ void Interrupt(boost::thread_group& threadGroup)
|
||||
|
||||
void Shutdown()
|
||||
{
|
||||
fprintf(stderr,"%s: start\n", __FUNCTION__);
|
||||
LogPrintf("%s: In progress...\n", __func__);
|
||||
static CCriticalSection cs_Shutdown;
|
||||
TRY_LOCK(cs_Shutdown, lockShutdown);
|
||||
@@ -218,11 +223,11 @@ void Shutdown()
|
||||
/// Be sure that anything that writes files or flushes caches only does this if the respective
|
||||
/// module was initialized.
|
||||
static char shutoffstr[128];
|
||||
sprintf(shutoffstr,"%s-shutoff",ASSETCHAINS_SYMBOL);
|
||||
//RenameThread("verus-shutoff");
|
||||
sprintf(shutoffstr,"%s-shutoff","hush");
|
||||
RenameThread(shutoffstr);
|
||||
mempool.AddTransactionsUpdated(1);
|
||||
|
||||
fprintf(stderr,"%s: stopping HTTP/REST/RPC\n", __FUNCTION__);
|
||||
StopHTTPRPC();
|
||||
StopREST();
|
||||
StopRPC();
|
||||
@@ -238,6 +243,7 @@ void Shutdown()
|
||||
GenerateBitcoins(false, 0);
|
||||
#endif
|
||||
#endif
|
||||
fprintf(stderr,"%s: stopping node\n", __FUNCTION__);
|
||||
StopNode();
|
||||
StopTorControl();
|
||||
UnregisterNodeSignals(GetNodeSignals());
|
||||
@@ -312,11 +318,13 @@ void Shutdown()
|
||||
*/
|
||||
void HandleSIGTERM(int)
|
||||
{
|
||||
fprintf(stderr,"%s\n",__FUNCTION__);
|
||||
fRequestShutdown = true;
|
||||
}
|
||||
|
||||
void HandleSIGHUP(int)
|
||||
{
|
||||
fprintf(stderr,"%s\n",__FUNCTION__);
|
||||
fReopenDebugLog = true;
|
||||
}
|
||||
|
||||
@@ -403,6 +411,7 @@ std::string HelpMessage(HelpMessageMode mode)
|
||||
strUsage += HelpMessageOpt("-addressindex", strprintf(_("Maintain a full address index, used to query for the balance, txids and unspent outputs for addresses (default: %u)"), DEFAULT_ADDRESSINDEX));
|
||||
strUsage += HelpMessageOpt("-timestampindex", strprintf(_("Maintain a timestamp index for block hashes, used to query blocks hashes by a range of timestamps (default: %u)"), DEFAULT_TIMESTAMPINDEX));
|
||||
strUsage += HelpMessageOpt("-spentindex", strprintf(_("Maintain a full spent index, used to query the spending txid and input index for an outpoint (default: %u)"), DEFAULT_SPENTINDEX));
|
||||
strUsage += HelpMessageOpt("-zindex", strprintf(_("Maintain extra statistics about shielded transactions and payments (default: %u)"), 0));
|
||||
strUsage += HelpMessageGroup(_("Connection options:"));
|
||||
strUsage += HelpMessageOpt("-addnode=<ip>", _("Add a node to connect to and attempt to keep the connection open"));
|
||||
strUsage += HelpMessageOpt("-banscore=<n>", strprintf(_("Threshold for disconnecting misbehaving peers (default: %u)"), 100));
|
||||
@@ -532,7 +541,6 @@ std::string HelpMessage(HelpMessageMode mode)
|
||||
|
||||
#ifdef ENABLE_MINING
|
||||
strUsage += HelpMessageGroup(_("Mining options:"));
|
||||
strUsage += HelpMessageOpt("-mint", strprintf(_("Mint/stake coins automatically (default: %u)"), 0));
|
||||
strUsage += HelpMessageOpt("-gen", strprintf(_("Mine/generate coins (default: %u)"), 0));
|
||||
strUsage += HelpMessageOpt("-genproclimit=<n>", strprintf(_("Set the number of threads for coin mining if enabled (-1 = all cores, default: %d)"), 0));
|
||||
strUsage += HelpMessageOpt("-equihashsolver=<name>", _("Specify the Equihash solver to be used if enabled (default: \"default\")"));
|
||||
@@ -593,13 +601,8 @@ std::string HelpMessage(HelpMessageMode mode)
|
||||
strUsage += HelpMessageOpt("-ac_reward", _("Block reward in satoshis, default is 0"));
|
||||
strUsage += HelpMessageOpt("-ac_sapling", _("Sapling activation block height"));
|
||||
strUsage += HelpMessageOpt("-ac_script", _("P2SH/multisig address to receive founders rewards"));
|
||||
strUsage += HelpMessageOpt("-ac_staked", _("Percentage of blocks that are Proof-Of-Stake, default 0"));
|
||||
strUsage += HelpMessageOpt("-ac_supply", _("Starting supply, default is 0"));
|
||||
strUsage += HelpMessageOpt("-ac_timelockfrom", _("Timelocked coinbase start height"));
|
||||
strUsage += HelpMessageOpt("-ac_timelockgte", _("Timelocked coinbase minimum amount to be locked"));
|
||||
strUsage += HelpMessageOpt("-ac_timelockto", _("Timelocked coinbase stop height"));
|
||||
strUsage += HelpMessageOpt("-ac_txpow", _("Enforce transaction-rate limit, default 0"));
|
||||
strUsage += HelpMessageOpt("-ac_veruspos", _("Use Verus Proof-Of-Stake (-ac_veruspos=50) default 0"));
|
||||
|
||||
return strUsage;
|
||||
}
|
||||
@@ -673,7 +676,7 @@ void CleanupBlockRevFiles()
|
||||
|
||||
void ThreadImport(std::vector<boost::filesystem::path> vImportFiles)
|
||||
{
|
||||
RenameThread("zcash-loadblk");
|
||||
RenameThread("hush-loadblk");
|
||||
// -reindex
|
||||
if (fReindex) {
|
||||
CImportingNow imp;
|
||||
@@ -747,87 +750,175 @@ void ThreadNotifyRecentlyAdded()
|
||||
}
|
||||
|
||||
/** Sanity checks
|
||||
* Ensure that Bitcoin is running in a usable environment with all
|
||||
* Ensure that Hush is running in a usable environment with all
|
||||
* necessary library support.
|
||||
*/
|
||||
bool InitSanityCheck(void)
|
||||
{
|
||||
if(!ECC_InitSanityCheck()) {
|
||||
InitError("Elliptic curve cryptography sanity check failure. Aborting.");
|
||||
fprintf(stderr,"%s: ECC insanity!\n", __FUNCTION__);
|
||||
return false;
|
||||
}
|
||||
if (!glibc_sanity_test() || !glibcxx_sanity_test())
|
||||
if (!glibc_sanity_test() || !glibcxx_sanity_test()) {
|
||||
fprintf(stderr,"%s: glibc insanity!\n", __FUNCTION__);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void NoParamsShutdown(void)
|
||||
{
|
||||
//TODO: error message incorrect about location
|
||||
LogPrintf("Could not find Sapling params anywhere! Exiting...");
|
||||
fprintf(stderr,"%s: no params!\n", __FUNCTION__);
|
||||
LogPrintf("Could not find valid Sapling params anywhere! Exiting...");
|
||||
uiInterface.ThreadSafeMessageBox(strprintf(
|
||||
_("Cannot find the Sapling network parameters in the following directory:\n"
|
||||
"%s\n"
|
||||
"Please run 'zcash-fetch-params' or './zcutil/fetch-params.sh' and then restart."),
|
||||
ZC_GetParamsDir()),
|
||||
_("Cannot find the Sapling network parameters! Something is very wrong.\n"
|
||||
"Please join our Discord for help: https://myhush.org/discord/")),
|
||||
"", CClientUIInterface::MSG_ERROR);
|
||||
StartShutdown();
|
||||
return;
|
||||
}
|
||||
|
||||
void CorruptParamsShutdown(void)
|
||||
{
|
||||
fprintf(stderr,"%s: corrupt params!\n", __FUNCTION__);
|
||||
LogPrintf("We detected corrupt Sapling params! Exiting...");
|
||||
uiInterface.ThreadSafeMessageBox(strprintf(
|
||||
_("Corrupt Sapling network parameters were detected! Something is very wrong.\n"
|
||||
"Please join our Discord for help: https://myhush.org/discord/")),
|
||||
"", CClientUIInterface::MSG_ERROR);
|
||||
StartShutdown();
|
||||
return;
|
||||
}
|
||||
|
||||
bool files_exist(boost::filesystem::path file1, boost::filesystem::path file2) {
|
||||
return boost::filesystem::exists(file1) && boost::filesystem::exists(file2);
|
||||
}
|
||||
|
||||
static void ZC_LoadParams(
|
||||
const CChainParams& chainparams
|
||||
)
|
||||
{
|
||||
namespace fs = boost::filesystem;
|
||||
struct timeval tv_start, tv_end;
|
||||
float elapsed;
|
||||
bool found = false;
|
||||
char cwd[1024];
|
||||
bool ret = getcwd(cwd, sizeof(cwd));
|
||||
|
||||
// First check the global installation location
|
||||
boost::filesystem::path sapling_spend = ZC_GetParamsDir() / "sapling-spend.params";
|
||||
boost::filesystem::path sapling_output = ZC_GetParamsDir() / "sapling-output.params";
|
||||
LogPrintf("Looking for sapling params, PWD=%s\n", cwd);
|
||||
|
||||
// NOTE: This means that sapling params do not need to be installed, just findable
|
||||
if (!( boost::filesystem::exists(sapling_spend) && boost::filesystem::exists(sapling_output))) {
|
||||
// Not globally installed, use local copies if they exist
|
||||
// First check ., then .., then ../hush3
|
||||
sapling_spend = "sapling-spend.params";
|
||||
sapling_output = "sapling-output.params";
|
||||
// Some people have previous partial downloads of zcash params, so check that last
|
||||
// Sapling Param Search path: . /usr/share/hush .. ../hush3 ./Contents/MacOS/ ~/.zcash-params
|
||||
gettimeofday(&tv_start, 0);
|
||||
|
||||
// This is the most common case, for binaries distributed with params
|
||||
if (!( boost::filesystem::exists(sapling_spend) && boost::filesystem::exists(sapling_output))) {
|
||||
// Not in PWD, try ..
|
||||
sapling_spend = boost::filesystem::path("..") / "sapling-spend.params";
|
||||
sapling_output = boost::filesystem::path("..") / "sapling-output.params";
|
||||
// PWD
|
||||
boost::filesystem::path sapling_spend = "sapling-spend.params";
|
||||
boost::filesystem::path sapling_output = "sapling-output.params";
|
||||
if (files_exist(sapling_spend, sapling_output)) {
|
||||
LogPrintf("Found sapling params in .\n");
|
||||
found = true;
|
||||
}
|
||||
|
||||
// Try .. in case this binary has no params
|
||||
if (!( boost::filesystem::exists(sapling_spend) && boost::filesystem::exists(sapling_output))) {
|
||||
// Not in .., try ../hush3 (the case of SilentDragon installed in same directory as hush3)
|
||||
sapling_spend = boost::filesystem::path("..") / "hush3" / "sapling-spend.params";
|
||||
sapling_output = boost::filesystem::path("..") / "hush3" / "sapling-output.params";
|
||||
if (!found) {
|
||||
// Debian global install dir: /usr/share/hush
|
||||
sapling_spend = fs::path("/usr/share/hush") / "sapling-spend.params";
|
||||
sapling_output = fs::path("/usr/share/hush") / "sapling-output.params";
|
||||
if (files_exist(sapling_spend, sapling_output)) {
|
||||
LogPrintf("Found sapling params in /usr/share/hush\n");
|
||||
found=true;
|
||||
}
|
||||
}
|
||||
|
||||
// This will catch the case of any external software (i.e. GUI wallets) needing params and installed in same dir as hush3.git
|
||||
if (!( boost::filesystem::exists(sapling_spend) && boost::filesystem::exists(sapling_output))) {
|
||||
// No Sapling params, at least we tried
|
||||
NoParamsShutdown();
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
// Try ..
|
||||
sapling_spend = boost::filesystem::path("..") / "sapling-spend.params";
|
||||
sapling_output = boost::filesystem::path("..") / "sapling-output.params";
|
||||
if (files_exist(sapling_spend, sapling_output)) {
|
||||
LogPrintf("Found sapling params in ..\n");
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
|
||||
//LogPrintf("Loading verifying key from %s\n", vk_path.string().c_str());
|
||||
gettimeofday(&tv_start, 0);
|
||||
if (!found) {
|
||||
// This will catch the case of any external software (i.e. GUI wallets) needing params and installed in same dir as hush3.git
|
||||
sapling_spend = boost::filesystem::path("..") / "hush3" / "sapling-spend.params";
|
||||
sapling_output = boost::filesystem::path("..") / "hush3" / "sapling-output.params";
|
||||
if (files_exist(sapling_spend, sapling_output)) {
|
||||
LogPrintf("Found sapling params in ../hush3\n");
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
|
||||
//pzcashParams = ZCJoinSplit::Prepared(vk_path.string(), pk_path.string());
|
||||
if (!found) {
|
||||
// This will only work when SD is installed into /Applications, which is the only supported method
|
||||
sapling_spend = boost::filesystem::path("/Applications/silentdragon.app/Contents/MacOS") / "sapling-spend.params";
|
||||
sapling_output = boost::filesystem::path("/Applications/silentdragon.app/Contents/MacOS") / "sapling-output.params";
|
||||
if (files_exist(sapling_spend, sapling_output)) {
|
||||
LogPrintf("Found sapling params in /Applications/Contents/MacOS\n");
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
// DMG Support: Apple just has to do things differently...
|
||||
sapling_spend = boost::filesystem::path("./silentdragon.app/Contents/MacOS") / "sapling-spend.params";
|
||||
sapling_output = boost::filesystem::path("./silentdragon.app/Contents/MacOS") / "sapling-output.params";
|
||||
if (files_exist(sapling_spend, sapling_output)) {
|
||||
LogPrintf("Found sapling params in /Applications/Contents/MacOS\n");
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
// The traditional place Zcash params are stored, should not hit this case in normal circumstances,
|
||||
// as Hush packages sapling params now
|
||||
sapling_spend = ZC_GetParamsDir() / "sapling-spend.params";
|
||||
sapling_output = ZC_GetParamsDir() / "sapling-output.params";
|
||||
if (files_exist(sapling_spend, sapling_output)) {
|
||||
LogPrintf("Found sapling params in ~/.zcash\n");
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
// No Sapling params, at least we tried
|
||||
LogPrintf("No Sapling params found! :(\n");
|
||||
NoParamsShutdown();
|
||||
return;
|
||||
}
|
||||
|
||||
boost::system::error_code ec1, ec2;
|
||||
boost::uintmax_t spend_size = file_size(sapling_spend, ec1);
|
||||
boost::uintmax_t output_size = file_size(sapling_output, ec2);
|
||||
fprintf(stderr,"Sapling spend: %d bytes, output: %d bytes\n", (int)spend_size, (int)output_size);
|
||||
|
||||
// We could check sha hashes, but we mostly want to detect on-disk file corruption
|
||||
// or people having a full harddrive. Full validation happens in librustzcash_init_zksnark_params
|
||||
// This prevents users seeing very low-level errors from that routine
|
||||
boost::uintmax_t spend_valid = 47958396;
|
||||
boost::uintmax_t output_valid = 3592860;
|
||||
//TODO: passing the exact reason for corruption to GUI
|
||||
if (spend_size != spend_valid) {
|
||||
LogPrintf("Sapling spend %d bytes != %d is invalid!\n", (int)spend_size, (int)spend_valid);
|
||||
CorruptParamsShutdown();
|
||||
return;
|
||||
}
|
||||
|
||||
if (output_size != output_valid) {
|
||||
LogPrintf("Sapling ouput %d bytes != %d is invalid!\n", (int)output_size, (int)output_valid);
|
||||
CorruptParamsShutdown();
|
||||
return;
|
||||
}
|
||||
|
||||
gettimeofday(&tv_end, 0);
|
||||
elapsed = float(tv_end.tv_sec-tv_start.tv_sec) + (tv_end.tv_usec-tv_start.tv_usec)/float(1000000);
|
||||
LogPrintf("Loaded verifying key in %fs seconds.\n", elapsed);
|
||||
LogPrintf("Found sapling param in %fs seconds.\n", elapsed);
|
||||
|
||||
static_assert( sizeof(boost::filesystem::path::value_type) == sizeof(codeunit), "librustzcash not configured correctly");
|
||||
|
||||
auto sapling_spend_str = sapling_spend.native();
|
||||
auto sapling_spend_str = sapling_spend.native();
|
||||
auto sapling_output_str = sapling_output.native();
|
||||
|
||||
LogPrintf("Loading Sapling (Spend) parameters from %s\n", sapling_spend.string().c_str());
|
||||
@@ -841,7 +932,7 @@ static void ZC_LoadParams(
|
||||
reinterpret_cast<const codeunit*>(sapling_output_str.c_str()),
|
||||
sapling_output_str.length(),
|
||||
"657e3d38dbb5cb5e7dd2970e8b03d69b4787dd907285b5a7f0790dcc8072f60bf593b32cc2d1c030e00ff5ae64bf84c5c3beb84ddc841d48264b4a171744d028",
|
||||
// These are dummy arguments, ignored by Hush-flavored librustzcash
|
||||
// These are dummy arguments, ignored by Hush-flavored librustzcash
|
||||
reinterpret_cast<const codeunit*>(sapling_output_str.c_str()),
|
||||
sapling_output_str.length(),
|
||||
"657e3d38dbb5cb5e7dd2970e8b03d69b4787dd907285b5a7f0790dcc8072f60bf593b32cc2d1c030e00ff5ae64bf84c5c3beb84ddc841d48264b4a171744d028"
|
||||
@@ -869,13 +960,14 @@ bool AppInitServers(boost::thread_group& threadGroup)
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Initialize bitcoin.
|
||||
/** Initialize Hush.
|
||||
* @pre Parameters should be parsed and config file should be read.
|
||||
*/
|
||||
extern int32_t KOMODO_REWIND;
|
||||
|
||||
bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
{
|
||||
fprintf(stderr,"%s start\n", __FUNCTION__);
|
||||
// ********************************************************* Step 1: setup
|
||||
#ifdef _MSC_VER
|
||||
// Turn off Microsoft heap dump noise
|
||||
@@ -902,6 +994,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
|
||||
if (!SetupNetworking())
|
||||
return InitError("Error: Initializing networking failed");
|
||||
fprintf(stderr,"%s networking setup\n", __FUNCTION__);
|
||||
|
||||
#ifndef _WIN32
|
||||
if (GetBoolArg("-sysperms", false)) {
|
||||
@@ -910,9 +1003,11 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
return InitError("Error: -sysperms is not allowed in combination with enabled wallet functionality");
|
||||
#endif
|
||||
} else {
|
||||
//fprintf(stderr,"%s setting umask\n", __FUNCTION__);
|
||||
umask(077);
|
||||
}
|
||||
|
||||
//fprintf(stderr,"%s tik1\n", __FUNCTION__);
|
||||
// Clean shutdown on SIGTERM
|
||||
struct sigaction sa;
|
||||
sa.sa_handler = HandleSIGTERM;
|
||||
@@ -934,31 +1029,42 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
|
||||
std::set_new_handler(new_handler_terminate);
|
||||
|
||||
//fprintf(stderr,"%s: set signal handlers\n", __FUNCTION__);
|
||||
|
||||
// ********************************************************* Step 2: parameter interactions
|
||||
const CChainParams& chainparams = Params();
|
||||
|
||||
//fprintf(stderr,"%s: got chain params\n", __FUNCTION__);
|
||||
|
||||
// Set this early so that experimental features are correctly enabled/disabled
|
||||
fExperimentalMode = GetBoolArg("-experimentalfeatures", true);
|
||||
|
||||
fprintf(stderr,"%s: fExperimentalMode=%d\n", __FUNCTION__, fExperimentalMode);
|
||||
|
||||
// Fail early if user has set experimental options without the global flag
|
||||
if (!fExperimentalMode) {
|
||||
if (mapArgs.count("-developerencryptwallet")) {
|
||||
fprintf(stderr,"%s wallet encryption error\n", __FUNCTION__);
|
||||
return InitError(_("Wallet encryption requires -experimentalfeatures."));
|
||||
}
|
||||
else if (mapArgs.count("-paymentdisclosure")) {
|
||||
fprintf(stderr,"%s payment disclosure error\n", __FUNCTION__);
|
||||
return InitError(_("Payment disclosure requires -experimentalfeatures."));
|
||||
} else if (mapArgs.count("-zmergetoaddress")) {
|
||||
fprintf(stderr,"%s zmerge error\n", __FUNCTION__);
|
||||
return InitError(_("RPC method z_mergetoaddress requires -experimentalfeatures."));
|
||||
}
|
||||
}
|
||||
}
|
||||
//fprintf(stderr,"%s tik2\n", __FUNCTION__);
|
||||
|
||||
// Set this early so that parameter interactions go to console
|
||||
fPrintToConsole = GetBoolArg("-printtoconsole", false);
|
||||
fLogTimestamps = GetBoolArg("-logtimestamps", true);
|
||||
fLogIPs = GetBoolArg("-logips", false);
|
||||
fLogTimestamps = GetBoolArg("-logtimestamps", true);
|
||||
fLogIPs = GetBoolArg("-logips", false);
|
||||
|
||||
|
||||
LogPrintf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
|
||||
LogPrintf("Zcash version %s (%s)\n", FormatFullVersion(), CLIENT_DATE);
|
||||
LogPrintf("Hush version %s (%s)\n", FormatFullVersion(), CLIENT_DATE);
|
||||
|
||||
// when specifying an explicit binding address, you want to listen on it
|
||||
// even when -connect or -proxy is specified
|
||||
@@ -971,6 +1077,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
LogPrintf("%s: parameter interaction: -whitebind set -> setting -listen=1\n", __func__);
|
||||
}
|
||||
|
||||
//fprintf(stderr,"%s tik3\n", __FUNCTION__);
|
||||
if (mapArgs.count("-connect") && mapMultiArgs["-connect"].size() > 0) {
|
||||
// when only connecting to trusted nodes, do not seed via DNS, or listen by default
|
||||
if (SoftSetBoolArg("-dnsseed", false))
|
||||
@@ -1013,6 +1120,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
if (SoftSetBoolArg("-rescan", true))
|
||||
LogPrintf("%s: parameter interaction: -zapwallettxes=<mode> -> setting -rescan=1\n", __func__);
|
||||
}
|
||||
//fprintf(stderr,"%s tik4\n", __FUNCTION__);
|
||||
|
||||
// Make sure enough file descriptors are available
|
||||
int nBind = std::max((int)mapArgs.count("-bind") + (int)mapArgs.count("-whitebind"), 1);
|
||||
@@ -1020,12 +1128,12 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
//fprintf(stderr,"nMaxConnections %d\n",nMaxConnections);
|
||||
nMaxConnections = std::max(std::min(nMaxConnections, (int)(FD_SETSIZE - nBind - MIN_CORE_FILEDESCRIPTORS)), 0);
|
||||
int nFD = RaiseFileDescriptorLimit(nMaxConnections + MIN_CORE_FILEDESCRIPTORS);
|
||||
//fprintf(stderr,"nMaxConnections %d FD_SETSIZE.%d nBind.%d expr.%d \n",nMaxConnections,FD_SETSIZE,nBind,(int)(FD_SETSIZE - nBind - MIN_CORE_FILEDESCRIPTORS));
|
||||
fprintf(stderr,"nMaxConnections %d FD_SETSIZE.%d nBind.%d expr.%d \n",nMaxConnections,FD_SETSIZE,nBind,(int)(FD_SETSIZE - nBind - MIN_CORE_FILEDESCRIPTORS));
|
||||
if (nFD < MIN_CORE_FILEDESCRIPTORS)
|
||||
return InitError(_("Not enough file descriptors available."));
|
||||
if (nFD - MIN_CORE_FILEDESCRIPTORS < nMaxConnections)
|
||||
nMaxConnections = nFD - MIN_CORE_FILEDESCRIPTORS;
|
||||
fprintf(stderr,"nMaxConnections %d\n",nMaxConnections);
|
||||
//fprintf(stderr,"nMaxConnections %d\n",nMaxConnections);
|
||||
// if using block pruning, then disable txindex
|
||||
// also disable the wallet (for now, until SPV support is implemented in wallet)
|
||||
if (GetArg("-prune", 0)) {
|
||||
@@ -1058,6 +1166,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
}
|
||||
}
|
||||
|
||||
//fprintf(stderr,"%s tik5\n", __FUNCTION__);
|
||||
// Check for -debugnet
|
||||
if (GetBoolArg("-debugnet", false))
|
||||
InitWarning(_("Warning: Unsupported argument -debugnet ignored, use -debug=net."));
|
||||
@@ -1089,6 +1198,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
nScriptCheckThreads = MAX_SCRIPTCHECK_THREADS;
|
||||
|
||||
fServer = GetBoolArg("-server", false);
|
||||
//fprintf(stderr,"%s tik6\n", __FUNCTION__);
|
||||
|
||||
// block pruning; get the amount of disk space (in MB) to allot for block & undo files
|
||||
int64_t nSignedPruneTarget = GetArg("-prune", 0) * 1024 * 1024;
|
||||
@@ -1176,6 +1286,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
expiryDelta = GetArg("-txexpirydelta", DEFAULT_TX_EXPIRY_DELTA);
|
||||
bSpendZeroConfChange = GetBoolArg("-spendzeroconfchange", true);
|
||||
fSendFreeTransactions = GetBoolArg("-sendfreetransactions", false);
|
||||
//fprintf(stderr,"%s tik7\n", __FUNCTION__);
|
||||
|
||||
std::string strWalletFile = GetArg("-wallet", "wallet.dat");
|
||||
#endif // ENABLE_WALLET
|
||||
@@ -1194,6 +1305,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
nLocalServices |= NODE_BLOOM;
|
||||
}
|
||||
nMaxTipAge = GetArg("-maxtipage", DEFAULT_MAX_TIP_AGE);
|
||||
//fprintf(stderr,"%s tik8\n", __FUNCTION__);
|
||||
|
||||
#ifdef ENABLE_MINING
|
||||
if (mapArgs.count("-mineraddress")) {
|
||||
@@ -1216,6 +1328,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
}
|
||||
}
|
||||
|
||||
//fprintf(stderr,"%s tik9\n", __FUNCTION__);
|
||||
if (!mapMultiArgs["-nuparams"].empty()) {
|
||||
// Allow overriding network upgrade parameters for testing
|
||||
if (Params().NetworkIDString() != "regtest") {
|
||||
@@ -1253,6 +1366,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
|
||||
// Initialize libsodium
|
||||
if (init_and_check_sodium() == -1) {
|
||||
fprintf(stderr,"%s: libsodium init failed!\n", __FUNCTION__);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1260,25 +1374,13 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
ECC_Start();
|
||||
globalVerifyHandle.reset(new ECCVerifyHandle());
|
||||
|
||||
// set the hash algorithm to use for this chain
|
||||
// Again likely better solution here, than using long IF ELSE.
|
||||
extern uint32_t ASSETCHAINS_ALGO, ASSETCHAINS_VERUSHASH, ASSETCHAINS_VERUSHASHV1_1;
|
||||
CVerusHash::init();
|
||||
CVerusHashV2::init();
|
||||
if (ASSETCHAINS_ALGO == ASSETCHAINS_VERUSHASH)
|
||||
{
|
||||
// initialize VerusHash
|
||||
CBlockHeader::SetVerusHash();
|
||||
}
|
||||
else if (ASSETCHAINS_ALGO == ASSETCHAINS_VERUSHASHV1_1)
|
||||
{
|
||||
// initialize VerusHashV2
|
||||
CBlockHeader::SetVerusHashV2();
|
||||
}
|
||||
std::string sha256_algo = SHA256AutoDetect();
|
||||
LogPrintf("Using the '%s' SHA256 implementation\n", sha256_algo);
|
||||
|
||||
//fprintf(stderr,"%s tik10\n", __FUNCTION__);
|
||||
// Sanity check
|
||||
if (!InitSanityCheck())
|
||||
return InitError(_("Initialization sanity check failed. Komodo is shutting down."));
|
||||
return InitError(_("Initialization sanity check failed. Please check for insanity. Hush is shutting down!"));
|
||||
|
||||
std::string strDataDir = GetDataDir().string();
|
||||
#ifdef ENABLE_WALLET
|
||||
@@ -1286,31 +1388,32 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
if (strWalletFile != boost::filesystem::basename(strWalletFile) + boost::filesystem::extension(strWalletFile))
|
||||
return InitError(strprintf(_("Wallet %s resides outside data directory %s"), strWalletFile, strDataDir));
|
||||
#endif
|
||||
// Make sure only a single Bitcoin process is using the data directory.
|
||||
// Make sure only a single Hush process is using the data directory.
|
||||
boost::filesystem::path pathLockFile = GetDataDir() / ".lock";
|
||||
FILE* file = fopen(pathLockFile.string().c_str(), "a"); // empty lock file; created if it doesn't exist.
|
||||
if (file) fclose(file);
|
||||
|
||||
|
||||
//fprintf(stderr,"%s tik11\n", __FUNCTION__);
|
||||
fprintf(stderr,"Attempting to obtain lock %s\n", pathLockFile.string().c_str());
|
||||
try {
|
||||
static boost::interprocess::file_lock lock(pathLockFile.string().c_str());
|
||||
if (!lock.try_lock())
|
||||
return InitError(strprintf(_("Cannot obtain a lock on data directory %s. Komodo is probably already running."), strDataDir));
|
||||
return InitError(strprintf(_("Cannot obtain a lock on data directory %s. Hush is probably already running."), strDataDir));
|
||||
} catch(const boost::interprocess::interprocess_exception& e) {
|
||||
return InitError(strprintf(_("Cannot obtain a lock on data directory %s. Komodo is probably already running.") + " %s.", strDataDir, e.what()));
|
||||
return InitError(strprintf(_("Cannot obtain a lock on data directory %s. Hush is probably already running.") + " %s.", strDataDir, e.what()));
|
||||
}
|
||||
|
||||
fprintf(stderr,"About to create pidfile\n");
|
||||
#ifndef _WIN32
|
||||
CreatePidFile(GetPidFile(), getpid());
|
||||
#endif
|
||||
fprintf(stderr,"created pidfile\n");
|
||||
if (GetBoolArg("-shrinkdebugfile", !fDebug))
|
||||
ShrinkDebugFile();
|
||||
fprintf(stderr,"past shrinkdebugfile\n");
|
||||
|
||||
//fprintf(stderr,"%s tik12\n", __FUNCTION__);
|
||||
|
||||
LogPrintf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
|
||||
LogPrintf("Komodo version %s (%s)\n", FormatFullVersion(), CLIENT_DATE);
|
||||
LogPrintf("Hush version %s (%s)\n", FormatFullVersion(), CLIENT_DATE);
|
||||
|
||||
if (fPrintToDebugLog)
|
||||
OpenDebugLog();
|
||||
@@ -1332,12 +1435,15 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
threadGroup.create_thread(&ThreadScriptCheck);
|
||||
}
|
||||
|
||||
//fprintf(stderr,"%s tik13\n", __FUNCTION__);
|
||||
|
||||
// Start the lightweight task scheduler thread
|
||||
CScheduler::Function serviceLoop = boost::bind(&CScheduler::serviceQueue, &scheduler);
|
||||
threadGroup.create_thread(boost::bind(&TraceThread<CScheduler::Function>, "scheduler", serviceLoop));
|
||||
|
||||
// Count uptime
|
||||
MarkStartTime();
|
||||
//fprintf(stderr,"%s tik14\n", __FUNCTION__);
|
||||
|
||||
if ((chainparams.NetworkIDString() != "regtest") &&
|
||||
GetBoolArg("-showmetrics", 0) &&
|
||||
@@ -1347,6 +1453,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
threadGroup.create_thread(&ThreadShowMetricsScreen);
|
||||
}
|
||||
|
||||
//fprintf(stderr,"%s tik15\n", __FUNCTION__);
|
||||
// These must be disabled for now, they are buggy and we probably don't
|
||||
// want any of libsnark's profiling in production anyway.
|
||||
libsnark::inhibit_profiling_info = true;
|
||||
@@ -1368,6 +1475,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
if (!AppInitServers(threadGroup))
|
||||
return InitError(_("Unable to start HTTP server. See debug log for details."));
|
||||
}
|
||||
//fprintf(stderr,"%s tik16\n", __FUNCTION__);
|
||||
|
||||
int64_t nStart;
|
||||
|
||||
@@ -1392,6 +1500,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
#endif // ENABLE_WALLET
|
||||
// ********************************************************* Step 6: network initialization
|
||||
|
||||
//fprintf(stderr,"%s tik17\n", __FUNCTION__);
|
||||
RegisterNodeSignals(GetNodeSignals());
|
||||
|
||||
// sanitize comments per BIP-0014, format user agent and check total size
|
||||
@@ -1407,6 +1516,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
return InitError(strprintf("Total length of network version string %i exceeds maximum of %i characters. Reduce the number and/or size of uacomments.",
|
||||
strSubVersion.size(), MAX_SUBVERSION_LENGTH));
|
||||
}
|
||||
//fprintf(stderr,"%s tik18\n", __FUNCTION__);
|
||||
|
||||
if (mapArgs.count("-onlynet")) {
|
||||
std::set<enum Network> nets;
|
||||
@@ -1423,6 +1533,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
}
|
||||
}
|
||||
|
||||
//fprintf(stderr,"%s tik19\n", __FUNCTION__);
|
||||
if (mapArgs.count("-whitelist")) {
|
||||
BOOST_FOREACH(const std::string& net, mapMultiArgs["-whitelist"]) {
|
||||
CSubNet subnet(net);
|
||||
@@ -1448,6 +1559,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
SetNameProxy(addrProxy);
|
||||
SetLimited(NET_TOR, false); // by default, -proxy sets onion as reachable, unless -noonion later
|
||||
}
|
||||
//fprintf(stderr,"%s tik20\n", __FUNCTION__);
|
||||
|
||||
// -onion can be used to set only a proxy for .onion, or override normal proxy for .onion addresses
|
||||
// -noonion (or -onion=0) disables connecting to .onion entirely
|
||||
@@ -1466,10 +1578,11 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
}
|
||||
|
||||
// see Step 2: parameter interactions for more information about these
|
||||
fListen = GetBoolArg("-listen", DEFAULT_LISTEN);
|
||||
fDiscover = GetBoolArg("-discover", true);
|
||||
fListen = GetBoolArg("-listen", DEFAULT_LISTEN);
|
||||
fDiscover = GetBoolArg("-discover", true);
|
||||
fNameLookup = GetBoolArg("-dns", true);
|
||||
|
||||
//fprintf(stderr,"%s tik22\n", __FUNCTION__);
|
||||
bool fBound = false;
|
||||
if (fListen) {
|
||||
if (mapArgs.count("-bind") || mapArgs.count("-whitebind")) {
|
||||
@@ -1507,6 +1620,8 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
}
|
||||
}
|
||||
|
||||
//fprintf(stderr,"%s tik23\n", __FUNCTION__);
|
||||
|
||||
BOOST_FOREACH(const std::string& strDest, mapMultiArgs["-seednode"])
|
||||
AddOneShot(strDest);
|
||||
|
||||
@@ -1546,34 +1661,14 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
return !fRequestShutdown;
|
||||
}
|
||||
// ********************************************************* Step 7: load block chain
|
||||
//fprintf(stderr,"%s tik24\n", __FUNCTION__);
|
||||
|
||||
fReindex = GetBoolArg("-reindex", false);
|
||||
|
||||
// Upgrading to 0.8; hard-link the old blknnnn.dat files into /blocks/
|
||||
boost::filesystem::path blocksDir = GetDataDir() / "blocks";
|
||||
if (!boost::filesystem::exists(blocksDir))
|
||||
{
|
||||
boost::filesystem::create_directories(blocksDir);
|
||||
bool linked = false;
|
||||
for (unsigned int i = 1; i < 10000; i++) {
|
||||
boost::filesystem::path source = GetDataDir() / strprintf("blk%04u.dat", i);
|
||||
if (!boost::filesystem::exists(source)) break;
|
||||
boost::filesystem::path dest = blocksDir / strprintf("blk%05u.dat", i-1);
|
||||
try {
|
||||
boost::filesystem::create_hard_link(source, dest);
|
||||
LogPrintf("Hardlinked %s -> %s\n", source.string(), dest.string());
|
||||
linked = true;
|
||||
} catch (const boost::filesystem::filesystem_error& e) {
|
||||
// Note: hardlink creation failing is not a disaster, it just means
|
||||
// blocks will get re-downloaded from peers.
|
||||
LogPrintf("Error hardlinking blk%04u.dat: %s\n", i, e.what());
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (linked)
|
||||
{
|
||||
fReindex = true;
|
||||
}
|
||||
}
|
||||
|
||||
// block tree db settings
|
||||
@@ -1660,11 +1755,14 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
boost::filesystem::remove(GetDataDir() / "komodostate");
|
||||
boost::filesystem::remove(GetDataDir() / "signedmasks");
|
||||
pblocktree->WriteReindexing(true);
|
||||
fprintf(stderr, "%s: Deleted komodostate and signedmasks...\n", __FUNCTION__);
|
||||
|
||||
//If we're reindexing in prune mode, wipe away unusable block files and all undo data files
|
||||
if (fPruneMode)
|
||||
CleanupBlockRevFiles();
|
||||
}
|
||||
|
||||
fprintf(stderr, "%s: Loading block index...\n", __FUNCTION__);
|
||||
if (!LoadBlockIndex()) {
|
||||
strLoadError = _("Error loading block database");
|
||||
break;
|
||||
@@ -1687,6 +1785,12 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
break;
|
||||
}
|
||||
|
||||
fprintf(stderr, "zindex=%s in block index\n", fZindex ? "enabled" : "disabled");
|
||||
if (fZindex != GetBoolArg("-zindex", false)) {
|
||||
strLoadError = _("You need to rebuild the database using -reindex to change -zindex");
|
||||
break;
|
||||
}
|
||||
|
||||
// Check for changed -prune state. What we are concerned about is a user who has pruned blocks
|
||||
// in the past, but is now trying to run unpruned.
|
||||
if (fHavePruned && !fPruneMode) {
|
||||
@@ -1718,14 +1822,14 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
}
|
||||
if ( KOMODO_REWIND == 0 )
|
||||
{
|
||||
if (!CVerifyDB().VerifyDB(pcoinsdbview, GetArg("-checklevel", 3),
|
||||
GetArg("-checkblocks", 288))) {
|
||||
LogPrintf("Verifying block DB...");
|
||||
if (!CVerifyDB().VerifyDB(pcoinsdbview, GetArg("-checklevel", 3), GetArg("-checkblocks", 288))) {
|
||||
strLoadError = _("Corrupted block database detected");
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch (const std::exception& e) {
|
||||
if (fDebug) LogPrintf("%s\n", e.what());
|
||||
LogPrintf("%s: Error opening block database: %s\n", __FUNCTION__, e.what());
|
||||
strLoadError = _("Error opening block database");
|
||||
break;
|
||||
}
|
||||
@@ -1736,6 +1840,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
if (!fLoaded) {
|
||||
// first suggest a reindex
|
||||
if (!fReset) {
|
||||
fprintf(stderr,"%s: error in hd data\n", __FUNCTION__);
|
||||
bool fRet = uiInterface.ThreadSafeMessageBox(
|
||||
strLoadError + ".\n\n" + _("error in HDD data, might just need to update to latest, if that doesnt work, then you need to resync"),
|
||||
"", CClientUIInterface::MSG_ERROR | CClientUIInterface::BTN_ABORT);
|
||||
@@ -1770,6 +1875,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
mempool.ReadFeeEstimates(est_filein);
|
||||
fFeeEstimatesInitialized = true;
|
||||
|
||||
//fprintf(stderr,"%s tik25\n", __FUNCTION__);
|
||||
|
||||
// ********************************************************* Step 8: load wallet
|
||||
#ifdef ENABLE_WALLET
|
||||
@@ -1812,10 +1918,10 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
InitWarning(msg);
|
||||
}
|
||||
else if (nLoadWalletRet == DB_TOO_NEW)
|
||||
strErrors << _("Error loading wallet.dat: Wallet requires newer version of Komodo") << "\n";
|
||||
strErrors << _("Error loading wallet.dat: Wallet requires newer version of Hush") << "\n";
|
||||
else if (nLoadWalletRet == DB_NEED_REWRITE)
|
||||
{
|
||||
strErrors << _("Wallet needed to be rewritten: restart Zcash to complete") << "\n";
|
||||
strErrors << _("Wallet needed to be rewritten: restart Hush to complete") << "\n";
|
||||
LogPrintf("%s", strErrors.str());
|
||||
return InitError(strErrors.str());
|
||||
}
|
||||
@@ -1922,10 +2028,10 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
#ifdef ENABLE_MINING
|
||||
#ifndef ENABLE_WALLET
|
||||
if (GetBoolArg("-minetolocalwallet", false)) {
|
||||
return InitError(_("Zcash was not built with wallet support. Set -minetolocalwallet=0 to use -mineraddress, or rebuild Zcash with wallet support."));
|
||||
return InitError(_("Hush was not built with wallet support. Set -minetolocalwallet=0 to use -mineraddress, or rebuild Hush with wallet support."));
|
||||
}
|
||||
if (GetArg("-mineraddress", "").empty() && GetBoolArg("-gen", false)) {
|
||||
return InitError(_("Zcash was not built with wallet support. Set -mineraddress, or rebuild Zcash with wallet support."));
|
||||
return InitError(_("Hush was not built with wallet support. Set -mineraddress, or rebuild Hush with wallet support."));
|
||||
}
|
||||
#endif // !ENABLE_WALLET
|
||||
|
||||
@@ -1976,6 +2082,8 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
CValidationState state;
|
||||
if ( !ActivateBestChain(true,state))
|
||||
strErrors << "Failed to connect best block";
|
||||
} else {
|
||||
fprintf(stderr,"KOMODO_REWIND < 0\n");
|
||||
}
|
||||
std::vector<boost::filesystem::path> vImportFiles;
|
||||
if (mapArgs.count("-loadblock"))
|
||||
@@ -1992,6 +2100,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
|
||||
// ********************************************************* Step 11: start node
|
||||
|
||||
fprintf(stderr,"Checking disk space...\n");
|
||||
if (!CheckDiskSpace())
|
||||
return false;
|
||||
|
||||
@@ -2016,12 +2125,12 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
if (GetBoolArg("-listenonion", DEFAULT_LISTEN_ONION))
|
||||
StartTorControl(threadGroup, scheduler);
|
||||
|
||||
fprintf(stderr,"Starting txnotify thread\n");
|
||||
StartNode(threadGroup, scheduler);
|
||||
|
||||
#ifdef ENABLE_MINING
|
||||
// Generate coins in the background
|
||||
#ifdef ENABLE_WALLET
|
||||
VERUS_MINTBLOCKS = GetBoolArg("-mint", false);
|
||||
|
||||
if (pwalletMain || !GetArg("-mineraddress", "").empty())
|
||||
GenerateBitcoins(GetBoolArg("-gen", false), pwalletMain, GetArg("-genproclimit", -1));
|
||||
@@ -2033,13 +2142,16 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
// ********************************************************* Step 11: finished
|
||||
|
||||
SetRPCWarmupFinished();
|
||||
uiInterface.InitMessage(_("Done loading"));
|
||||
fprintf(stderr,"RPC warmump finished\n");
|
||||
uiInterface.InitMessage(_("Done loading!"));
|
||||
|
||||
#ifdef ENABLE_WALLET
|
||||
if (pwalletMain) {
|
||||
fprintf(stderr,"%s Reaccepting wallet xtns\n", __FUNCTION__);
|
||||
// Add wallet transactions that aren't already in a block to mapTransactions
|
||||
pwalletMain->ReacceptWalletTransactions();
|
||||
|
||||
fprintf(stderr,"%s Starting wallet flusher thread\n", __FUNCTION__);
|
||||
// Run a thread to flush wallet periodically
|
||||
threadGroup.create_thread(boost::bind(&ThreadFlushWalletDB, boost::ref(pwalletMain->strWalletFile)));
|
||||
}
|
||||
@@ -2048,5 +2160,6 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||
// SENDALERT
|
||||
threadGroup.create_thread(boost::bind(ThreadSendAlert));
|
||||
|
||||
fprintf(stderr,"%s end fRequestShutdown=%d\n", __FUNCTION__, !!fRequestShutdown);
|
||||
return !fRequestShutdown;
|
||||
}
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
#include "pubkey.h"
|
||||
#include "script/script.h"
|
||||
#include "script/standard.h"
|
||||
#include "script/script_ext.h"
|
||||
#include "sync.h"
|
||||
#include "zcash/Address.hpp"
|
||||
#include "zcash/NoteEncryption.hpp"
|
||||
|
||||
14
src/komodo.h
14
src/komodo.h
@@ -16,7 +16,7 @@
|
||||
#ifndef H_KOMODO_H
|
||||
#define H_KOMODO_H
|
||||
#include "komodo_defs.h"
|
||||
#include "notaries_staked.h"
|
||||
|
||||
|
||||
#ifdef _WIN32
|
||||
#define printf(...)
|
||||
@@ -835,18 +835,6 @@ int32_t komodo_connectblock(bool fJustCheck, CBlockIndex *pindex,CBlock& block)
|
||||
}
|
||||
//fprintf(stderr,"%s connect.%d\n",ASSETCHAINS_SYMBOL,pindex->nHeight);
|
||||
// Wallet Filter. Disabled here. Cant be activated by notaries or pools with some changes.
|
||||
if ( is_STAKED(ASSETCHAINS_SYMBOL) != 0 || IS_STAKED_NOTARY > -1 )
|
||||
{
|
||||
staked_era = STAKED_era(pindex->GetBlockTime());
|
||||
if ( !fJustCheck && staked_era != lastStakedEra )
|
||||
{
|
||||
uint8_t tmp_pubkeys[64][33];
|
||||
int8_t numSN = numStakedNotaries(tmp_pubkeys,staked_era);
|
||||
UpdateNotaryAddrs(tmp_pubkeys,numSN);
|
||||
STAKED_ERA = staked_era;
|
||||
lastStakedEra = staked_era;
|
||||
}
|
||||
}
|
||||
numnotaries = komodo_notaries(pubkeys,pindex->GetHeight(),pindex->GetBlockTime());
|
||||
calc_rmd160_sha256(rmd160,pubkeys[0],33);
|
||||
if ( pindex->GetHeight() > hwmheight )
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
// Copyright 2019 The Hush Developers
|
||||
|
||||
/******************************************************************************
|
||||
* Copyright © 2014-2019 The SuperNET Developers. *
|
||||
* *
|
||||
@@ -17,8 +19,8 @@
|
||||
|
||||
#include <curl/curl.h>
|
||||
#include <curl/easy.h>
|
||||
#include "primitives/nonce.h"
|
||||
#include "consensus/params.h"
|
||||
#include "primitives/nonce.h"
|
||||
#include "komodo_defs.h"
|
||||
#include "script/standard.h"
|
||||
#include "cc/CCinclude.h"
|
||||
@@ -26,13 +28,12 @@
|
||||
int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp);
|
||||
int32_t komodo_electednotary(int32_t *numnotariesp,uint8_t *pubkey33,int32_t height,uint32_t timestamp);
|
||||
int32_t komodo_voutupdate(bool fJustCheck,int32_t *isratificationp,int32_t notaryid,uint8_t *scriptbuf,int32_t scriptlen,int32_t height,uint256 txhash,int32_t i,int32_t j,uint64_t *voutmaskp,int32_t *specialtxp,int32_t *notarizedheightp,uint64_t value,int32_t notarized,uint64_t signedmask,uint32_t timestamp);
|
||||
unsigned int lwmaGetNextPOSRequired(const CBlockIndex* pindexLast, const Consensus::Params& params);
|
||||
bool EnsureWalletIsAvailable(bool avoidException);
|
||||
extern bool fRequestShutdown;
|
||||
extern CScript KOMODO_EARLYTXID_SCRIPTPUB;
|
||||
|
||||
int32_t MarmaraSignature(uint8_t *utxosig,CMutableTransaction &txNew);
|
||||
uint8_t DecodeMaramaraCoinbaseOpRet(const CScript scriptPubKey,CPubKey &pk,int32_t &height,int32_t &unlockht);
|
||||
uint32_t komodo_heightstamp(int32_t height);
|
||||
|
||||
//#define issue_curl(cmdstr) bitcoind_RPC(0,(char *)"curl",(char *)"http://127.0.0.1:7776",0,0,(char *)(cmdstr))
|
||||
|
||||
@@ -261,7 +262,7 @@ try_again:
|
||||
}
|
||||
else if ( numretries >= 1 )
|
||||
{
|
||||
fprintf(stderr,"Maximum number of retries exceeded!\n");
|
||||
fprintf(stderr,"%s: Maximum number of retries exceeded!\n", __FUNCTION__);
|
||||
free(s.ptr);
|
||||
return(0);
|
||||
}
|
||||
@@ -543,6 +544,18 @@ int32_t komodo_verifynotarization(char *symbol,char *dest,int32_t height,int32_t
|
||||
return(retval);
|
||||
}
|
||||
|
||||
CScript komodo_makeopret(CBlock *pblock, bool fNew)
|
||||
{
|
||||
std::vector<uint256> vLeaves;
|
||||
vLeaves.push_back(pblock->hashPrevBlock);
|
||||
for (int32_t i = 0; i < pblock->vtx.size()-(fNew ? 0 : 1); i++)
|
||||
vLeaves.push_back(pblock->vtx[i].GetHash());
|
||||
uint256 merkleroot = GetMerkleRoot(vLeaves);
|
||||
CScript opret;
|
||||
opret << OP_RETURN << E_MARSHAL(ss << merkleroot);
|
||||
return(opret);
|
||||
}
|
||||
|
||||
/*uint256 komodo_getblockhash(int32_t height)
|
||||
{
|
||||
uint256 hash; char params[128],*hexstr,*jsonstr; cJSON *result; int32_t i; uint8_t revbuf[32];
|
||||
@@ -680,66 +693,28 @@ int32_t komodo_WhoStaked(CBlock *pblock, CTxDestination &addressout)
|
||||
return(0);
|
||||
}
|
||||
|
||||
bool MarmaraPoScheck(char *destaddr,CScript opret,CTransaction staketx);
|
||||
|
||||
int32_t komodo_isPoS2(CBlock *pblock)
|
||||
bool komodo_checkopret(CBlock *pblock, CScript &merkleroot)
|
||||
{
|
||||
CBlockIndex *pindex = komodo_blockindex(pblock->GetHash());
|
||||
if ( pindex != 0 && pindex->segid >= -1 )
|
||||
{
|
||||
//fprintf(stderr,"isPoSblock segid.%d\n",pindex->segid);
|
||||
if ( pindex->segid == -1 )
|
||||
return(0);
|
||||
else return(1);
|
||||
merkleroot = pblock->vtx.back().vout.back().scriptPubKey;
|
||||
return(merkleroot.IsOpReturn() && merkleroot == komodo_makeopret(pblock, false));
|
||||
}
|
||||
|
||||
|
||||
extern const uint32_t nHushHardforkHeight;
|
||||
|
||||
bool hush_hardfork_active(uint32_t time)
|
||||
{
|
||||
//This allows simulating a different height via CLI option, with hardcoded height as default
|
||||
uint32_t nHardForkHeight = GetArg("-hardfork-height", nHushHardforkHeight);
|
||||
bool isactive = chainActive.Height() > nHardForkHeight;
|
||||
if(fDebug) {
|
||||
fprintf(stderr, "%s: active=%d at height=%d and forkheight=%d\n", __FUNCTION__, (int)isactive, chainActive.Height(), nHardForkHeight);
|
||||
}
|
||||
return (-1);
|
||||
return isactive;
|
||||
}
|
||||
|
||||
int32_t komodo_isPoS(CBlock *pblock,int32_t height,bool fJustCheck)
|
||||
{
|
||||
int32_t n,vout,numvouts,ret; uint32_t txtime; uint64_t value; char voutaddr[64],destaddr[64]; CTxDestination voutaddress; uint256 txid; CScript opret;
|
||||
if ( ASSETCHAINS_STAKED != 0 )
|
||||
{
|
||||
if ( fJustCheck )
|
||||
{
|
||||
// check pindex first, if that does not work, continue with slow check.
|
||||
if ( (ret= komodo_isPoS2(pblock)) == 1 )
|
||||
return (1);
|
||||
else if ( ret == 0 )
|
||||
return (0);
|
||||
}
|
||||
n = pblock->vtx.size();
|
||||
//fprintf(stderr,"ht.%d check for PoS numtx.%d numvins.%d numvouts.%d\n",height,n,(int32_t)pblock->vtx[n-1].vin.size(),(int32_t)pblock->vtx[n-1].vout.size());
|
||||
if ( n > 1 && pblock->vtx[n-1].vin.size() == 1 && pblock->vtx[n-1].vout.size() == 1+(ASSETCHAINS_MARMARA!=0) )
|
||||
{
|
||||
txid = pblock->vtx[n-1].vin[0].prevout.hash;
|
||||
vout = pblock->vtx[n-1].vin[0].prevout.n;
|
||||
txtime = komodo_txtime(opret,&value,txid,vout,destaddr);
|
||||
if ( ExtractDestination(pblock->vtx[n-1].vout[0].scriptPubKey,voutaddress) )
|
||||
{
|
||||
strcpy(voutaddr,CBitcoinAddress(voutaddress).ToString().c_str());
|
||||
//fprintf(stderr,"voutaddr.%s vs destaddr.%s\n",voutaddr,destaddr);
|
||||
if ( pblock->vtx[n-1].vout[0].nValue == value && strcmp(destaddr,voutaddr) == 0 )
|
||||
{
|
||||
if ( ASSETCHAINS_MARMARA == 0 )
|
||||
return(1);
|
||||
else
|
||||
{
|
||||
if ( pblock->vtx[n-1].vout[0].scriptPubKey.IsPayToCryptoCondition() != 0 && (numvouts= pblock->vtx[n-1].vout.size()) == 2 )
|
||||
{
|
||||
//fprintf(stderr,"validate proper %s %s signature and unlockht preservation\n",voutaddr,destaddr);
|
||||
return(MarmaraPoScheck(destaddr,opret,pblock->vtx[n-1]));
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr,"reject ht.%d PoS block\n",height);
|
||||
return(strcmp(ASSETCHAINS_SYMBOL,"MTST2") == 0); // allow until MTST3
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
@@ -966,6 +941,7 @@ void komodo_index2pubkey33(uint8_t *pubkey33,CBlockIndex *pindex,int32_t height)
|
||||
|
||||
int32_t komodo_eligiblenotary(uint8_t pubkeys[66][33],int32_t *mids,uint32_t blocktimes[66],int32_t *nonzpkeysp,int32_t height)
|
||||
{
|
||||
// after the season HF block ALL new notaries instantly become elegible.
|
||||
int32_t i,j,n,duplicate; CBlock block; CBlockIndex *pindex; uint8_t notarypubs33[64][33];
|
||||
memset(mids,-1,sizeof(*mids)*66);
|
||||
n = komodo_notaries(notarypubs33,height,0);
|
||||
@@ -1222,6 +1198,7 @@ int32_t komodo_isrealtime(int32_t *kmdheightp)
|
||||
|
||||
int32_t komodo_validate_interest(const CTransaction &tx,int32_t txheight,uint32_t cmptime,int32_t dispflag)
|
||||
{
|
||||
dispflag = 1;
|
||||
if ( KOMODO_REWIND == 0 && ASSETCHAINS_SYMBOL[0] == 0 && (int64_t)tx.nLockTime >= LOCKTIME_THRESHOLD ) //1473793441 )
|
||||
{
|
||||
if ( txheight > 246748 )
|
||||
@@ -1481,11 +1458,7 @@ arith_uint256 komodo_PoWtarget(int32_t *percPoSp,arith_uint256 target,int32_t he
|
||||
}
|
||||
if ( m+n < 100 )
|
||||
{
|
||||
// We do actual PoS % at the start. Requires coin distribution in first 10 blocks!
|
||||
if ( ASSETCHAINS_ALGO == ASSETCHAINS_VERUSHASH || ASSETCHAINS_ALGO == ASSETCHAINS_VERUSHASHV1_1 )
|
||||
percPoS = (percPoS*100) / (m+n);
|
||||
else
|
||||
percPoS = ((percPoS * n) + (goalperc * (100-n))) / 100;
|
||||
percPoS = ((percPoS * n) + (goalperc * (100-n))) / 100;
|
||||
}
|
||||
if ( dispflag != 0 && ASSETCHAINS_STAKED < 100 )
|
||||
fprintf(stderr," -> %d%% percPoS vs goalperc.%d ht.%d\n",percPoS,goalperc,height);
|
||||
@@ -1583,24 +1556,6 @@ uint32_t komodo_stake(int32_t validateflag,arith_uint256 bnTarget,int32_t nHeigh
|
||||
if ( blocktime+iter+segid*2 < txtime+minage )
|
||||
continue;
|
||||
diff = (iter + blocktime - txtime - minage);
|
||||
if ( ASSETCHAINS_ALGO == ASSETCHAINS_VERUSHASH || ASSETCHAINS_ALGO == ASSETCHAINS_VERUSHASHV1_1 )
|
||||
{
|
||||
/*if ( PoSperc < ASSETCHAINS_STAKED )
|
||||
{
|
||||
// Under PoS % target and we need to increase diff.
|
||||
//fprintf(stderr, "PoS too low diff.%i changed to.",diff);
|
||||
diff = diff * ( (ASSETCHAINS_STAKED - PoSperc + 1) * (ASSETCHAINS_STAKED - PoSperc + 1) * ( nHeight < 50 ? 1000 : 1));
|
||||
//fprintf(stderr, "%i \n",diff);
|
||||
}
|
||||
else */
|
||||
if ( PoSperc > ASSETCHAINS_STAKED )
|
||||
{
|
||||
// Over PoS target need to lower diff.
|
||||
//fprintf(stderr, "PoS too high diff.%i changed to.",diff);
|
||||
diff = diff / ( (PoSperc - ASSETCHAINS_STAKED + 1) * (PoSperc - ASSETCHAINS_STAKED + 1) );
|
||||
//fprintf(stderr, "%i \n",diff);
|
||||
}
|
||||
}
|
||||
if ( diff < 0 )
|
||||
diff = 60;
|
||||
else if ( diff > 3600*24*30 )
|
||||
@@ -1611,17 +1566,6 @@ uint32_t komodo_stake(int32_t validateflag,arith_uint256 bnTarget,int32_t nHeigh
|
||||
if ( iter > 0 )
|
||||
diff += segid*2;
|
||||
coinage = (value * diff);
|
||||
if ( ASSETCHAINS_ALGO == ASSETCHAINS_VERUSHASH || ASSETCHAINS_ALGO == ASSETCHAINS_VERUSHASHV1_1 )
|
||||
{
|
||||
if ( PoSperc < ASSETCHAINS_STAKED )
|
||||
{
|
||||
// Under PoS % target and we need to increase diff.
|
||||
//fprintf(stderr, "PoS too low diff.%i changed to.",diff);
|
||||
if ( blocktime+iter+segid*2 > prevtime+128 )
|
||||
coinage *= ((blocktime+iter+segid*2) - (prevtime+102));
|
||||
//fprintf(stderr, "%i \n",diff);
|
||||
}
|
||||
}
|
||||
if ( blocktime+iter+segid*2 > prevtime+480 )
|
||||
coinage *= ((blocktime+iter+segid*2) - (prevtime+400));
|
||||
coinage256 = arith_uint256(coinage+1);
|
||||
@@ -1752,181 +1696,6 @@ int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_
|
||||
bool GetStakeParams(const CTransaction &stakeTx, CStakeParams &stakeParams);
|
||||
bool ValidateMatchingStake(const CTransaction &ccTx, uint32_t voutNum, const CTransaction &stakeTx, bool &cheating);
|
||||
|
||||
// for now, we will ignore slowFlag in the interest of keeping success/fail simpler for security purposes
|
||||
bool verusCheckPOSBlock(int32_t slowflag, CBlock *pblock, int32_t height)
|
||||
{
|
||||
CBlockIndex *pastBlockIndex;
|
||||
uint256 txid, blkHash;
|
||||
int32_t txn_count;
|
||||
uint32_t voutNum;
|
||||
CAmount value;
|
||||
bool isPOS = false;
|
||||
CTxDestination voutaddress, destaddress, cbaddress;
|
||||
arith_uint256 target, hash;
|
||||
CTransaction tx;
|
||||
|
||||
if (!pblock->IsVerusPOSBlock())
|
||||
{
|
||||
printf("%s, height %d not POS block\n", pblock->nNonce.GetHex().c_str(), height);
|
||||
//pblock->nNonce.SetPOSTarget(pblock->nNonce.GetPOSTarget());
|
||||
//printf("%s after setting POS target\n", pblock->nNonce.GetHex().c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
char voutaddr[64], destaddr[64], cbaddr[64];
|
||||
|
||||
txn_count = pblock->vtx.size();
|
||||
|
||||
if ( txn_count > 1 )
|
||||
{
|
||||
target.SetCompact(pblock->GetVerusPOSTarget());
|
||||
txid = pblock->vtx[txn_count-1].vin[0].prevout.hash;
|
||||
voutNum = pblock->vtx[txn_count-1].vin[0].prevout.n;
|
||||
value = pblock->vtx[txn_count-1].vout[0].nValue;
|
||||
|
||||
{
|
||||
bool validHash = (value != 0);
|
||||
bool enablePOSNonce = CPOSNonce::NewPOSActive(height);
|
||||
uint256 rawHash;
|
||||
arith_uint256 posHash;
|
||||
|
||||
if (validHash && enablePOSNonce)
|
||||
{
|
||||
validHash = pblock->GetRawVerusPOSHash(rawHash, height);
|
||||
posHash = UintToArith256(rawHash) / value;
|
||||
if (!validHash || posHash > target)
|
||||
{
|
||||
validHash = false;
|
||||
printf("ERROR: invalid nonce value for PoS block\nnNonce: %s\nrawHash: %s\nposHash: %s\nvalue: %lu\n",
|
||||
pblock->nNonce.GetHex().c_str(), rawHash.GetHex().c_str(), posHash.GetHex().c_str(), value);
|
||||
}
|
||||
}
|
||||
if (validHash)
|
||||
{
|
||||
if (slowflag == 0)
|
||||
{
|
||||
isPOS = true;
|
||||
}
|
||||
else if (!(pastBlockIndex = komodo_chainactive(height - 100)))
|
||||
{
|
||||
fprintf(stderr,"ERROR: chain not fully loaded or invalid PoS block %s - no past block found\n",blkHash.ToString().c_str());
|
||||
}
|
||||
else
|
||||
#ifndef KOMODO_ZCASH
|
||||
if (!GetTransaction(txid, tx, Params().GetConsensus(), blkHash, true))
|
||||
#else
|
||||
if (!GetTransaction(txid, tx, blkHash, true))
|
||||
#endif
|
||||
{
|
||||
fprintf(stderr,"ERROR: invalid PoS block %s - no source transaction\n",blkHash.ToString().c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
CBlockHeader bh = pastBlockIndex->GetBlockHeader();
|
||||
uint256 pastHash = bh.GetVerusEntropyHash(height - 100);
|
||||
|
||||
// if height is over when Nonce is required to be the new format, we check that the new format is correct
|
||||
// if over when we have the new POS hash function, we validate that as well
|
||||
// they are 100 blocks apart
|
||||
CPOSNonce nonce = pblock->nNonce;
|
||||
|
||||
//printf("before nNonce: %s, height: %d\n", pblock->nNonce.GetHex().c_str(), height);
|
||||
//validHash = pblock->GetRawVerusPOSHash(rawHash, height);
|
||||
//hash = UintToArith256(rawHash) / tx.vout[voutNum].nValue;
|
||||
//printf("Raw POShash: %s\n", hash.GetHex().c_str());
|
||||
|
||||
hash = UintToArith256(tx.GetVerusPOSHash(&nonce, voutNum, height, pastHash));
|
||||
|
||||
//printf("after nNonce: %s, height: %d\n", nonce.GetHex().c_str(), height);
|
||||
//printf("POShash: %s\n\n", hash.GetHex().c_str());
|
||||
|
||||
if (posHash == hash && hash <= target)
|
||||
{
|
||||
BlockMap::const_iterator it = mapBlockIndex.find(blkHash);
|
||||
if ((it == mapBlockIndex.end()) ||
|
||||
!(pastBlockIndex = it->second) ||
|
||||
(height - pastBlockIndex->GetHeight()) < VERUS_MIN_STAKEAGE)
|
||||
{
|
||||
fprintf(stderr,"ERROR: invalid PoS block %s - stake source too new or not found\n",blkHash.ToString().c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
// make sure we have the right target
|
||||
CBlockIndex *previndex;
|
||||
it = mapBlockIndex.find(pblock->hashPrevBlock);
|
||||
if (it == mapBlockIndex.end() || !(previndex = it->second))
|
||||
{
|
||||
fprintf(stderr,"ERROR: invalid PoS block %s - no prev block found\n",blkHash.ToString().c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
arith_uint256 cTarget;
|
||||
uint32_t nBits = lwmaGetNextPOSRequired(previndex, Params().GetConsensus());
|
||||
cTarget.SetCompact(nBits);
|
||||
bool nonceOK = true;
|
||||
|
||||
// check to see how many fail
|
||||
//if (nonce != pblock->nNonce)
|
||||
// printf("Mismatched nNonce: %s\nblkHash: %s, height: %d\n", nonce.GetHex().c_str(), pblock->GetHash().GetHex().c_str(), height);
|
||||
|
||||
if (CPOSNonce::NewNonceActive(height) && !nonce.CheckPOSEntropy(pastHash, txid, voutNum))
|
||||
{
|
||||
fprintf(stderr,"ERROR: invalid PoS block %s - nonce entropy corrupted or forged\n",blkHash.ToString().c_str());
|
||||
nonceOK = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (cTarget != target)
|
||||
{
|
||||
fprintf(stderr,"ERROR: invalid PoS block %s - invalid diff target\n",blkHash.ToString().c_str());
|
||||
nonceOK = false;
|
||||
}
|
||||
}
|
||||
if ( nonceOK && ExtractDestination(pblock->vtx[txn_count-1].vout[0].scriptPubKey, voutaddress) &&
|
||||
ExtractDestination(tx.vout[voutNum].scriptPubKey, destaddress) )
|
||||
{
|
||||
strcpy(voutaddr, CBitcoinAddress(voutaddress).ToString().c_str());
|
||||
strcpy(destaddr, CBitcoinAddress(destaddress).ToString().c_str());
|
||||
if ( !strcmp(destaddr,voutaddr) )
|
||||
{
|
||||
isPOS = true;
|
||||
CTransaction &cbtx = pblock->vtx[0];
|
||||
for (int i = 0; i < cbtx.vout.size(); i++)
|
||||
{
|
||||
if (CScriptExt::ExtractVoutDestination(cbtx, i, cbaddress))
|
||||
{
|
||||
strcpy(cbaddr, CBitcoinAddress(cbaddress).ToString().c_str());
|
||||
if (!strcmp(destaddr,cbaddr))
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (cbtx.vout[i].scriptPubKey.IsOpReturn())
|
||||
continue;
|
||||
isPOS = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr,"ERROR: invalid PoS block %s - invalid stake or coinbase destination\n",blkHash.ToString().c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("ERROR: malformed nonce value for PoS block\nnNonce: %s\nrawHash: %s\nposHash: %s\nvalue: %lu\n",
|
||||
pblock->nNonce.GetHex().c_str(), rawHash.GetHex().c_str(), posHash.GetHex().c_str(), value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return(isPOS);
|
||||
}
|
||||
|
||||
uint64_t komodo_notarypayamount(int32_t nHeight, int64_t notarycount)
|
||||
{
|
||||
@@ -2261,7 +2030,7 @@ bool KOMODO_TEST_ASSETCHAIN_SKIP_POW = 0;
|
||||
|
||||
int32_t komodo_checkPOW(int32_t slowflag,CBlock *pblock,int32_t height)
|
||||
{
|
||||
uint256 hash; arith_uint256 bnTarget,bhash; bool fNegative,fOverflow; uint8_t *script,pubkey33[33],pubkeys[64][33]; int32_t i,scriptlen,possible,PoSperc,is_PoSblock=0,n,failed = 0,notaryid = -1; int64_t checktoshis,value; CBlockIndex *pprev;
|
||||
uint256 hash,merkleroot; arith_uint256 bnTarget,bhash; bool fNegative,fOverflow; uint8_t *script,pubkey33[33],pubkeys[64][33]; int32_t i,scriptlen,possible,PoSperc,is_PoSblock=0,n,failed = 0,notaryid = -1; int64_t checktoshis,value; CBlockIndex *pprev;
|
||||
if ( KOMODO_TEST_ASSETCHAIN_SKIP_POW == 0 && Params().NetworkIDString() == "regtest" )
|
||||
KOMODO_TEST_ASSETCHAIN_SKIP_POW = 1;
|
||||
if ( !CheckEquihashSolution(pblock, Params()) )
|
||||
@@ -2290,11 +2059,6 @@ int32_t komodo_checkPOW(int32_t slowflag,CBlock *pblock,int32_t height)
|
||||
// bnTarget = komodo_adaptivepow_target(height,bnTarget,pblock->nTime);
|
||||
if ( ASSETCHAINS_LWMAPOS != 0 && bhash > bnTarget )
|
||||
{
|
||||
// if proof of stake is active, check if this is a valid PoS block before we fail
|
||||
if (verusCheckPOSBlock(slowflag, pblock, height))
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
if ( (ASSETCHAINS_SYMBOL[0] != 0 || height > 792000) && bhash > bnTarget )
|
||||
{
|
||||
@@ -2396,10 +2160,10 @@ int32_t komodo_checkPOW(int32_t slowflag,CBlock *pblock,int32_t height)
|
||||
// the default daemon miner, checks the actual vins so the only way this will fail, is if someone changes the miner,
|
||||
// and then creates txs to the crypto address meeting min sigs and puts it in tx position 1.
|
||||
// If they go through this effort, the block will still fail at connect block, and will be auto purged by the temp file fix.
|
||||
if ( failed == 0 && ASSETCHAINS_NOTARY_PAY[0] != 0 && pblock->vtx[0].vout.size() > 1 )
|
||||
if ( failed == 0 && ASSETCHAINS_NOTARY_PAY[0] != 0 && pblock->vtx.size() > 1 )
|
||||
{
|
||||
// We check the full validation in ConnectBlock directly to get the amount for coinbase. So just approx here.
|
||||
if ( slowflag == 0 )
|
||||
if ( slowflag == 0 && pblock->vtx[0].vout.size() > 1 )
|
||||
{
|
||||
// Check the notarisation tx is to the crypto address.
|
||||
if ( !komodo_is_notarytx(pblock->vtx[1]) == 1 )
|
||||
@@ -2560,193 +2324,3 @@ struct komodo_staking *komodo_addutxo(struct komodo_staking *array,int32_t *numk
|
||||
kp->scriptPubKey = pk;
|
||||
return(array);
|
||||
}
|
||||
|
||||
int32_t komodo_staked(CMutableTransaction &txNew,uint32_t nBits,uint32_t *blocktimep,uint32_t *txtimep,uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig)
|
||||
{
|
||||
static struct komodo_staking *array; static int32_t numkp,maxkp; static uint32_t lasttime;
|
||||
int32_t PoSperc;
|
||||
set<CBitcoinAddress> setAddress; struct komodo_staking *kp; int32_t winners,segid,minage,nHeight,counter=0,i,m,siglen=0,nMinDepth = 1,nMaxDepth = 99999999; vector<COutput> vecOutputs; uint32_t block_from_future_rejecttime,besttime,eligible,earliest = 0; CScript best_scriptPubKey; arith_uint256 mindiff,ratio,bnTarget,tmpTarget; CBlockIndex *tipindex,*pindex; CTxDestination address; bool fNegative,fOverflow; uint8_t hashbuf[256]; CTransaction tx; uint256 hashBlock;
|
||||
if (!EnsureWalletIsAvailable(0))
|
||||
return 0;
|
||||
|
||||
bnTarget.SetCompact(nBits, &fNegative, &fOverflow);
|
||||
assert(pwalletMain != NULL);
|
||||
*utxovaluep = 0;
|
||||
memset(utxotxidp,0,sizeof(*utxotxidp));
|
||||
memset(utxovoutp,0,sizeof(*utxovoutp));
|
||||
memset(utxosig,0,72);
|
||||
if ( (tipindex= chainActive.Tip()) == 0 )
|
||||
return(0);
|
||||
nHeight = tipindex->GetHeight() + 1;
|
||||
// Get the PoS% so we can pass it to komodo_stake, this is to adjust PoS dofficulty when it is under the target %!
|
||||
tmpTarget = komodo_PoWtarget(&PoSperc,bnTarget,nHeight,ASSETCHAINS_STAKED);
|
||||
if ( (minage= nHeight*3) > 6000 ) // about 100 blocks
|
||||
minage = 6000;
|
||||
komodo_segids(hashbuf,nHeight-101,100);
|
||||
if ( *blocktimep < tipindex->nTime+60)
|
||||
*blocktimep = tipindex->nTime+60;
|
||||
|
||||
bool resetstaker = false;
|
||||
if ( array != 0 )
|
||||
{
|
||||
CBlockIndex* pblockindex = chainActive[tipindex->GetHeight()];
|
||||
CBlock block; CTxDestination addressout;
|
||||
if ( ASSETCHAINS_MARMARA != 0 )
|
||||
resetstaker = true;
|
||||
else if( ReadBlockFromDisk(block, pblockindex, 1) && komodo_WhoStaked(&block, addressout) != 0 && IsMine(*pwalletMain,addressout) != 0 )
|
||||
{
|
||||
resetstaker = true;
|
||||
fprintf(stderr, "Reset ram staker after mining a block!\n");
|
||||
}
|
||||
}
|
||||
|
||||
if ( resetstaker || array == 0 || time(NULL) > lasttime+600 )
|
||||
{
|
||||
LOCK2(cs_main, pwalletMain->cs_wallet);
|
||||
pwalletMain->AvailableCoins(vecOutputs, false, NULL, true);
|
||||
if ( array != 0 )
|
||||
{
|
||||
free(array);
|
||||
array = 0;
|
||||
maxkp = numkp = 0;
|
||||
lasttime = 0;
|
||||
}
|
||||
if ( ASSETCHAINS_MARMARA == 0 )
|
||||
{
|
||||
BOOST_FOREACH(const COutput& out, vecOutputs)
|
||||
{
|
||||
if ( (tipindex= chainActive.Tip()) == 0 || tipindex->GetHeight()+1 > nHeight )
|
||||
{
|
||||
fprintf(stderr,"chain tip changed during staking loop t.%u counter.%d\n",(uint32_t)time(NULL),counter);
|
||||
return(0);
|
||||
}
|
||||
counter++;
|
||||
if ( out.nDepth < nMinDepth || out.nDepth > nMaxDepth )
|
||||
{
|
||||
//fprintf(stderr,"komodo_staked invalid depth %d\n",(int32_t)out.nDepth);
|
||||
continue;
|
||||
}
|
||||
CAmount nValue = out.tx->vout[out.i].nValue;
|
||||
if ( nValue < COIN || !out.fSpendable )
|
||||
continue;
|
||||
const CScript& pk = out.tx->vout[out.i].scriptPubKey;
|
||||
if ( ExtractDestination(pk,address) != 0 )
|
||||
{
|
||||
if ( IsMine(*pwalletMain,address) == 0 )
|
||||
continue;
|
||||
if ( GetTransaction(out.tx->GetHash(),tx,hashBlock,true) != 0 && (pindex= komodo_getblockindex(hashBlock)) != 0 )
|
||||
{
|
||||
array = komodo_addutxo(array,&numkp,&maxkp,(uint32_t)pindex->nTime,(uint64_t)nValue,out.tx->GetHash(),out.i,(char *)CBitcoinAddress(address).ToString().c_str(),hashbuf,(CScript)pk);
|
||||
//fprintf(stderr,"addutxo numkp.%d vs max.%d\n",numkp,maxkp);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
struct CCcontract_info *cp,C; uint256 txid; int32_t vout,ht,unlockht; CAmount nValue; char coinaddr[64]; CPubKey mypk,Marmarapk,pk;
|
||||
std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > unspentOutputs;
|
||||
cp = CCinit(&C,EVAL_MARMARA);
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
Marmarapk = GetUnspendable(cp,0);
|
||||
GetCCaddress1of2(cp,coinaddr,Marmarapk,mypk);
|
||||
SetCCunspents(unspentOutputs,coinaddr,true);
|
||||
for (std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++)
|
||||
{
|
||||
txid = it->first.txhash;
|
||||
vout = (int32_t)it->first.index;
|
||||
if ( (nValue= it->second.satoshis) < COIN )
|
||||
continue;
|
||||
if ( GetTransaction(txid,tx,hashBlock,true) != 0 && (pindex= komodo_getblockindex(hashBlock)) != 0 && myIsutxo_spentinmempool(ignoretxid,ignorevin,txid,vout) == 0 )
|
||||
{
|
||||
const CScript &scriptPubKey = tx.vout[vout].scriptPubKey;
|
||||
if ( DecodeMaramaraCoinbaseOpRet(tx.vout[tx.vout.size()-1].scriptPubKey,pk,ht,unlockht) != 0 && pk == mypk )
|
||||
{
|
||||
array = komodo_addutxo(array,&numkp,&maxkp,(uint32_t)pindex->nTime,(uint64_t)nValue,txid,vout,coinaddr,hashbuf,(CScript)scriptPubKey);
|
||||
}
|
||||
// else fprintf(stderr,"SKIP addutxo %.8f numkp.%d vs max.%d\n",(double)nValue/COIN,numkp,maxkp);
|
||||
}
|
||||
}
|
||||
}
|
||||
lasttime = (uint32_t)time(NULL);
|
||||
//fprintf(stderr,"finished kp data of utxo for staking %u ht.%d numkp.%d maxkp.%d\n",(uint32_t)time(NULL),nHeight,numkp,maxkp);
|
||||
}
|
||||
block_from_future_rejecttime = (uint32_t)GetAdjustedTime() + 57;
|
||||
for (i=winners=0; i<numkp; i++)
|
||||
{
|
||||
if ( fRequestShutdown || !GetBoolArg("-gen",false) )
|
||||
return(0);
|
||||
if ( (tipindex= chainActive.Tip()) == 0 || tipindex->GetHeight()+1 > nHeight )
|
||||
{
|
||||
fprintf(stderr,"chain tip changed during staking loop t.%u counter.%d\n",(uint32_t)time(NULL),counter);
|
||||
return(0);
|
||||
}
|
||||
kp = &array[i];
|
||||
eligible = komodo_stake(0,bnTarget,nHeight,kp->txid,kp->vout,0,(uint32_t)tipindex->nTime+27,kp->address,PoSperc);
|
||||
if ( eligible > 0 )
|
||||
{
|
||||
besttime = 0;
|
||||
if ( eligible == komodo_stake(1,bnTarget,nHeight,kp->txid,kp->vout,eligible,(uint32_t)tipindex->nTime+27,kp->address,PoSperc) )
|
||||
{
|
||||
// have elegible utxo to stake with.
|
||||
if ( earliest == 0 || eligible < earliest || (eligible == earliest && (*utxovaluep == 0 || kp->nValue < *utxovaluep)) )
|
||||
{
|
||||
// is better than the previous best, so use it instead.
|
||||
earliest = eligible;
|
||||
best_scriptPubKey = kp->scriptPubKey;
|
||||
*utxovaluep = (uint64_t)kp->nValue;
|
||||
decode_hex((uint8_t *)utxotxidp,32,(char *)kp->txid.GetHex().c_str());
|
||||
*utxovoutp = kp->vout;
|
||||
*txtimep = kp->txtime;
|
||||
}
|
||||
if ( eligible < block_from_future_rejecttime ) // nothing gained by going earlier
|
||||
break;
|
||||
} else continue;
|
||||
}
|
||||
}
|
||||
if ( numkp < 500 && array != 0 )
|
||||
{
|
||||
free(array);
|
||||
array = 0;
|
||||
maxkp = numkp = 0;
|
||||
lasttime = 0;
|
||||
}
|
||||
if ( earliest != 0 )
|
||||
{
|
||||
bool signSuccess; SignatureData sigdata; uint64_t txfee; uint8_t *ptr; uint256 revtxid,utxotxid;
|
||||
auto consensusBranchId = CurrentEpochBranchId(chainActive.Height() + 1, Params().GetConsensus());
|
||||
const CKeyStore& keystore = *pwalletMain;
|
||||
txNew.vin.resize(1);
|
||||
txNew.vout.resize(1);
|
||||
txfee = 0;
|
||||
for (i=0; i<32; i++)
|
||||
((uint8_t *)&revtxid)[i] = ((uint8_t *)utxotxidp)[31 - i];
|
||||
txNew.vin[0].prevout.hash = revtxid;
|
||||
txNew.vin[0].prevout.n = *utxovoutp;
|
||||
txNew.vout[0].scriptPubKey = best_scriptPubKey;
|
||||
txNew.vout[0].nValue = *utxovaluep - txfee;
|
||||
txNew.nLockTime = earliest;
|
||||
CTransaction txNewConst(txNew);
|
||||
if ( ASSETCHAINS_MARMARA == 0 )
|
||||
{
|
||||
signSuccess = ProduceSignature(TransactionSignatureCreator(&keystore, &txNewConst, 0, *utxovaluep, SIGHASH_ALL), best_scriptPubKey, sigdata, consensusBranchId);
|
||||
UpdateTransaction(txNew,0,sigdata);
|
||||
ptr = (uint8_t *)&sigdata.scriptSig[0];
|
||||
siglen = sigdata.scriptSig.size();
|
||||
for (i=0; i<siglen; i++)
|
||||
utxosig[i] = ptr[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
siglen = MarmaraSignature(utxosig,txNew);
|
||||
if ( siglen > 0 )
|
||||
signSuccess = true;
|
||||
else signSuccess = false;
|
||||
}
|
||||
if (!signSuccess)
|
||||
fprintf(stderr,"failed to create signature\n");
|
||||
else
|
||||
*blocktimep = earliest;
|
||||
}
|
||||
return(siglen);
|
||||
}
|
||||
|
||||
@@ -57,6 +57,12 @@ extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#ifndef _BITS256
|
||||
#define _BITS256
|
||||
union _bits256 { uint8_t bytes[32]; uint16_t ushorts[16]; uint32_t uints[8]; uint64_t ulongs[4]; uint64_t txid; };
|
||||
typedef union _bits256 bits256;
|
||||
#endif
|
||||
|
||||
/* Macros for creating things quickly. */
|
||||
#define cJSON_AddNullToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateNull())
|
||||
#define cJSON_AddTrueToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateTrue())
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// Copyright (c) 2019 The Hush developers
|
||||
/******************************************************************************
|
||||
* Copyright © 2014-2019 The SuperNET Developers. *
|
||||
* *
|
||||
@@ -16,7 +17,7 @@
|
||||
#ifndef KOMODO_DEFS_H
|
||||
#define KOMODO_DEFS_H
|
||||
#include "arith_uint256.h"
|
||||
|
||||
#include "chain.h"
|
||||
#include "komodo_nk.h"
|
||||
|
||||
#define KOMODO_EARLYTXID_HEIGHT 100
|
||||
@@ -33,6 +34,9 @@
|
||||
#define KOMODO_FIRSTFUNGIBLEID 100
|
||||
#define KOMODO_SAPLING_ACTIVATION 1544832000 // Dec 15th, 2018
|
||||
#define KOMODO_SAPLING_DEADLINE 1550188800 // Feb 15th, 2019
|
||||
#define ASSETCHAINS_STAKED_BLOCK_FUTURE_MAX 57
|
||||
#define ASSETCHAINS_STAKED_BLOCK_FUTURE_HALF 27
|
||||
#define ASSETCHAINS_STAKED_MIN_POW_DIFF 536900000 // 537000000 537300000
|
||||
#define _COINBASE_MATURITY 100
|
||||
|
||||
// KMD Notary Seasons
|
||||
@@ -42,10 +46,21 @@
|
||||
// 1751328000 = dummy timestamp, 1 July 2025!
|
||||
// 7113400 = 5x current KMD blockheight.
|
||||
// to add 4th season, change NUM_KMD_SEASONS to 4, and add timestamp and height of activation to these arrays.
|
||||
#define NUM_KMD_SEASONS 3
|
||||
|
||||
#define NUM_KMD_SEASONS 4
|
||||
#define NUM_KMD_NOTARIES 64
|
||||
static const uint32_t KMD_SEASON_TIMESTAMPS[NUM_KMD_SEASONS] = {1525132800, 1563148800, 1751328000};
|
||||
static const int32_t KMD_SEASON_HEIGHTS[NUM_KMD_SEASONS] = {814000, 1444000, 7113400};
|
||||
|
||||
// $ ./contrib/block_time.pl 166250
|
||||
// Hush Block 166250 will happen at roughly:
|
||||
// Wed Jan 29 08:14:12 2020 Eastern # 1580303652
|
||||
// Wed Jan 29 13:14:12 2020 GMT # 1580303652
|
||||
const uint32_t nHushHardforkHeight = 166250;
|
||||
|
||||
// No coins/code are currently using timestamp activated fork
|
||||
const uint32_t nHushHardforkTimestamp = 1580303652; // Jan 29nd 1pm GMT
|
||||
|
||||
static const uint32_t KMD_SEASON_TIMESTAMPS[NUM_KMD_SEASONS] = {1525132800, 1563148800, nHushHardforkTimestamp, 1751328000};
|
||||
static const int32_t KMD_SEASON_HEIGHTS[NUM_KMD_SEASONS] = {1,2,nHushHardforkHeight, 5*nHushHardforkHeight};
|
||||
|
||||
// Era array of pubkeys. Add extra seasons to bottom as requried, after adding appropriate info above.
|
||||
static const char *notaries_elected[NUM_KMD_SEASONS][NUM_KMD_NOTARIES][2] =
|
||||
@@ -247,6 +262,73 @@ static const char *notaries_elected[NUM_KMD_SEASONS][NUM_KMD_NOTARIES][2] =
|
||||
{"gt_AR", "0348430538a4944d3162bb4749d8c5ed51299c2434f3ee69c11a1f7815b3f46135" },
|
||||
{"patchkez_SH", "03f45e9beb5c4cd46525db8195eb05c1db84ae7ef3603566b3d775770eba3b96ee" },
|
||||
{"decker_AR", "03ffdf1a116300a78729608d9930742cd349f11a9d64fcc336b8f18592dd9c91bc" }, // 63
|
||||
},
|
||||
{
|
||||
// Season 3.5 third party NN pubkeys from https://github.com/KomodoPlatform/dPoW/blob/master/iguana/3rd_party
|
||||
{"madmax_NA", "02ef81a360411adf71184ff04d0c5793fc41fd1d7155a28dd909f21f35f4883ac1" },
|
||||
{"alright_AR", "036a6bca1c2a8166f79fa8a979662892742346cc972b432f8e61950a358d705517" },
|
||||
{"strob_NA", "02049202f3872877e81035549f6f3a0f868d0ad1c9b0e0d2b48b1f30324255d26d" },
|
||||
{"hunter_EU", "0378224b4e9d8a0083ce36f2963ec0a4e231ec06b0c780de108e37f41181a89f6a" },
|
||||
{"phm87_SH", "03889a10f9df2caef57220628515693cf25316fe1b0693b0241419e75d0d0e66ed" },
|
||||
{"chainmakers_NA", "030e4822bddba10eb50d52d7da13106486651e4436962078ee8d681bc13f4993e9" },
|
||||
{"indenodes_EU", "03a416533cace0814455a1bb1cd7861ce825a543c6f6284a432c4c8d8875b7ace9" },
|
||||
{"blackjok3r_SH", "03d23bb5aad3c20414078472220cc5c26bc5aeb41e43d72c99158d450f714d743a" },
|
||||
{"chainmakers_EU", "034f8c0a504856fb3d80a94c3aa78828c1152daf8ccc45a17c450f32a1e242bb0c" },
|
||||
{"titomane_AR", "0358cd6d7460654a0ddd5125dd6fa0402d0719999444c6cc3888689a0b4446136a" },
|
||||
{"fullmoon_SH", "0275031fa79846c5d667b1f7c4219c487d439cd367dd294f73b5ecd55b4e673254" },
|
||||
{"indenodes_NA", "02b3908eda4078f0e9b6704451cdc24d418e899c0f515fab338d7494da6f0a647b" },
|
||||
{"chmex_EU", "03e5b7ab96b7271ecd585d6f22807fa87da374210a843ec3a90134cbf4a62c3db1" },
|
||||
{"metaphilibert_SH", "03b21ff042bf1730b28bde43f44c064578b41996117ac7634b567c3773089e3be3" },
|
||||
{"ca333_DEV", "029c0342ce2a4f9146c7d1ee012b26f5c2df78b507fb4461bf48df71b4e3031b56" },
|
||||
{"cipi_NA", "034406ac4cf94e84561c5d3f25384dd59145e92fefc5972a037dc6a44bfa286688" },
|
||||
{"pungocloud_SH", "0203064e291045187927cc35ed350e046bba604e324bb0e3b214ea83c74c4713b1" },
|
||||
{"voskcoin_EU", "037bfd946f1dd3736ddd2cb1a0731f8b83de51be5d1be417496fbc419e203bc1fe" },
|
||||
{"decker_DEV", "02fca8ee50e49f480de275745618db7b0b3680b0bdcce7dcae7d2e0fd5c3345744" },
|
||||
{"cryptoeconomy_EU", "037d04b7d16de61a44a3fc766bea4b7791023a36675d6cee862fe53defd04dd8f2" },
|
||||
{"etszombi_EU", "02f65da26061d1b9f1756a274918a37e83086dbfe9a43d2f0b35b9d2f593b31907" },
|
||||
{"karasugoi_NA", "024ba10f7f5325fd6ec6cab50c5242d142d00fab3537c0002097c0e98f72014177" },
|
||||
{"pirate_AR", "0353e2747f89968741c24f254caec24f9f49a894a0039ee9ba09234fcbad75c77d" },
|
||||
{"metaphilibert_AR", "0239e34ad22957bbf4c8df824401f237b2afe8d40f7a645ecd43e8f27dde1ab0da" },
|
||||
{"zatjum_SH", "03643c3b0a07a34f6ae7b048832e0216b935408dfc48b0c7d3d4faceb38841f3f3" },
|
||||
{"madmax_AR", "038735b4f6881925e5a9b14275af80fa2b712c8bd57eef26b97e5b153218890e38" },
|
||||
{"lukechilds_NA", "024607d85ea648511fa50b13f29d16beb2c3a248c586b449707d7be50a6060cf50" },
|
||||
{"cipi_AR", "025b7655826f5fd3a807cbb4918ef9f02fe64661153ca170db981e9b0861f8c5ad" },
|
||||
{"tonyl_AR", "03a8db38075c80348889871b4318b0a79a1fd7e9e21daefb4ca6e4f05e5963569c" },
|
||||
{"infotech_DEV", "0399ff59b0244103486a94acf1e4a928235cb002b20e26a6f3163b4a0d5e62db91" },
|
||||
{"fullmoon_NA", "02adf6e3cb8a3c94d769102aec9faf2cb073b7f2979ce64efb1161a596a8d16312" },
|
||||
{"etszombi_AR", "03c786702b81e0122157739c8e2377cf945998d36c0d187ec5c5ff95855848dfdd" },
|
||||
{"node-9_EU", "024f2402daddee0c8169ccd643e5536c2cf95b9690391c370a65c9dd0169fc3dc6" },
|
||||
{"phba2061_EU", "02dc98f064e3bf26a251a269893b280323c83f1a4d4e6ccd5e84986cc3244cb7c9" },
|
||||
{"indenodes_AR", "0242778789986d614f75bcf629081651b851a12ab1cc10c73995b27b90febb75a2" },
|
||||
{"and1-89_EU", "029f5a4c6046de880cc95eb448d20c80918339daff7d71b73dd3921895559d7ca3" },
|
||||
{"komodopioneers_SH", "02ae196a1e93444b9fcac2b0ccee428a4d9232a00b3a508484b5bccaedc9bac55e" },
|
||||
{"komodopioneers_EU", "03c7fef345ca6b5326de9d5a38498638801eee81bfea4ca8ffc3dacac43c27b14d" },
|
||||
{"d0ct0r_NA", "0235b211469d7c1881d30ab647e0d6ddb4daf9466f60e85e6a33a92e39dedde3a7" },
|
||||
{"kolo_DEV", "03dc7c71a5ef7104f81e62928446c4216d6e9f68d944c893a21d7a0eba74b1cb7c" },
|
||||
{"peer2cloud_AR", "0351c784d966dbb79e1bab4fad7c096c1637c98304854dcdb7d5b5aeceb94919b4" },
|
||||
{"webworker01_SH", "0221365d89a6f6373b15daa4a50d56d34ad1b4b8a48a7fd090163b6b5a5ecd7a0a" },
|
||||
{"webworker01_NA", "03bfc36a60194b495c075b89995f307bec68c1bcbe381b6b29db47af23494430f9" },
|
||||
{"pbca26_NA", "038319dcf74916486dbd506ac866d184c17c3202105df68c8335a1a1079ef0dfcc" },
|
||||
{"indenodes_SH", "031d1584cf0eb4a2d314465e49e2677226b1615c3718013b8d6b4854c15676a58c" },
|
||||
{"pirate_NA", "034899e6e884b3cb1f491d296673ab22a6590d9f62020bea83d721f5c68b9d7aa7" },
|
||||
{"lukechilds_AR", "031ee242e67a8166e489c0c4ed1e5f7fa32dff19b4c1749de35f8da18befa20811" },
|
||||
{"dragonhound_NA", "022405dbc2ea320131e9f0c4115442c797bf0f2677860d46679ac4522300ce8c0a" },
|
||||
{"fullmoon_AR", "03cd152ae20adcc389e77acad25953fc2371961631b35dc92cf5c96c7729c2e8d9" },
|
||||
{"chainzilla_SH", "03fe36ff13cb224217898682ce8b87ba6e3cdd4a98941bb7060c04508b57a6b014" },
|
||||
{"titomane_EU", "03d691cd0914a711f651082e2b7b27bee778c1309a38840e40a6cf650682d17bb5" },
|
||||
{"jeezy_EU", "022bca828b572cb2b3daff713ed2eb0bbc7378df20f799191eebecf3ef319509cd" },
|
||||
{"titomane_SH", "038c2a64f7647633c0e74eec93f9a668d4bf80214a43ed7cd08e4e30d3f2f7acfb" },
|
||||
{"alien_AR", "024f20c096b085308e21893383f44b4faf1cdedea9ad53cc7d7e7fbfa0c30c1e71" },
|
||||
{"pirate_EU", "0371f348b4ac848cdfb732758f59b9fdd64285e7adf769198771e8e203638db7e6" },
|
||||
{"thegaltmines_NA", "03e1d4cec2be4c11e368ff0c11e80cd1b09da8026db971b643daee100056b110fa" },
|
||||
{"computergenie_NA", "02f945d87b7cd6e9f2173a110399d36b369edb1f10bdf5a4ba6fd4923e2986e137" },
|
||||
{"nutellalicka_SH", "035ec5b9e88734e5bd0f3bd6533e52f917d51a0e31f83b2297aabb75f9798d01ef" },
|
||||
{"chainstrike_SH", "0221f9dee04b7da1f3833c6ea7f7325652c951b1c239052b0dadb57209084ca6a8" },
|
||||
{"hunter_SH", "02407db70ad30ce4dfaee8b4ae35fae88390cad2b0ba0373fdd6231967537ccfdf" },
|
||||
{"alien_EU", "022b85908191788f409506ebcf96a892f3274f352864c3ed566c5a16de63953236" },
|
||||
{"gt_AR", "0307c1cf89bd8ed4db1b09a0a98cf5f746fc77df3803ecc8611cf9455ec0ce6960" },
|
||||
{"patchkez_SH", "03d7c187689bf829ca076a30bbf36d2e67bb74e16a3290d8a55df21d6cb15c80c1" },
|
||||
{"decker_AR", "02a85540db8d41c7e60bf0d33d1364b4151cad883dd032878ea4c037f67b769635" }
|
||||
}
|
||||
};
|
||||
|
||||
@@ -270,24 +352,24 @@ int32_t MAX_BLOCK_SIZE(int32_t height);
|
||||
extern char ASSETCHAINS_SYMBOL[KOMODO_ASSETCHAIN_MAXLEN];
|
||||
extern uint16_t ASSETCHAINS_P2PPORT,ASSETCHAINS_RPCPORT;
|
||||
extern uint32_t ASSETCHAIN_INIT, ASSETCHAINS_MAGIC;
|
||||
extern int32_t VERUS_BLOCK_POSUNITS, ASSETCHAINS_LWMAPOS, ASSETCHAINS_SAPLING, ASSETCHAINS_OVERWINTER,ASSETCHAINS_BLOCKTIME;
|
||||
extern int32_t ASSETCHAINS_LWMAPOS, ASSETCHAINS_SAPLING, ASSETCHAINS_OVERWINTER,ASSETCHAINS_BLOCKTIME;
|
||||
extern uint64_t ASSETCHAINS_SUPPLY, ASSETCHAINS_FOUNDERS_REWARD;
|
||||
|
||||
extern int32_t ASSETCHAINS_LWMAPOS, ASSETCHAINS_SAPLING, ASSETCHAINS_OVERWINTER,ASSETCHAINS_BLOCKTIME;
|
||||
extern int32_t KOMODO_BLOCK_POSUNITS, KOMODO_CONSECUTIVE_POS_THRESHOLD, KOMODO_NOPOS_THRESHHOLD;
|
||||
|
||||
extern uint64_t ASSETCHAINS_TIMELOCKGTE;
|
||||
extern uint32_t ASSETCHAINS_ALGO, ASSETCHAINS_VERUSHASH,ASSETCHAINS_EQUIHASH,KOMODO_INITDONE;
|
||||
extern uint32_t ASSETCHAINS_ALGO,ASSETCHAINS_EQUIHASH,KOMODO_INITDONE;
|
||||
|
||||
extern int32_t KOMODO_MININGTHREADS,KOMODO_LONGESTCHAIN,ASSETCHAINS_SEED,IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,KOMODO_ON_DEMAND,KOMODO_PASSPORT_INITDONE,ASSETCHAINS_STAKED,KOMODO_NSPV;
|
||||
extern uint64_t ASSETCHAINS_COMMISSION, ASSETCHAINS_LASTERA,ASSETCHAINS_CBOPRET;
|
||||
extern bool VERUS_MINTBLOCKS;
|
||||
extern uint64_t ASSETCHAINS_REWARD[ASSETCHAINS_MAX_ERAS+1], ASSETCHAINS_NOTARY_PAY[ASSETCHAINS_MAX_ERAS+1], ASSETCHAINS_TIMELOCKGTE, ASSETCHAINS_NONCEMASK[],ASSETCHAINS_NK[2];
|
||||
extern const char *ASSETCHAINS_ALGORITHMS[];
|
||||
extern int32_t VERUS_MIN_STAKEAGE;
|
||||
extern uint32_t ASSETCHAINS_VERUSHASH, ASSETCHAINS_VERUSHASHV1_1, ASSETCHAINS_NONCESHIFT[], ASSETCHAINS_HASHESPERROUND[];
|
||||
extern uint32_t ASSETCHAINS_NONCESHIFT[], ASSETCHAINS_HASHESPERROUND[];
|
||||
extern std::string NOTARY_PUBKEY,ASSETCHAINS_OVERRIDE_PUBKEY,ASSETCHAINS_SCRIPTPUB;
|
||||
extern uint8_t NOTARY_PUBKEY33[33],ASSETCHAINS_OVERRIDE_PUBKEY33[33],ASSETCHAINS_MARMARA;
|
||||
extern std::vector<std::string> ASSETCHAINS_PRICES,ASSETCHAINS_STOCKS;
|
||||
|
||||
extern int32_t VERUS_BLOCK_POSUNITS, VERUS_CONSECUTIVE_POS_THRESHOLD, VERUS_NOPOS_THRESHHOLD;
|
||||
extern uint256 KOMODO_EARLYTXID;
|
||||
|
||||
extern int32_t KOMODO_CONNECTING,KOMODO_CCACTIVATE,KOMODO_DEALERNODE;
|
||||
@@ -296,21 +378,22 @@ extern std::string CCerror,ASSETCHAINS_CCLIB;
|
||||
extern uint8_t ASSETCHAINS_CCDISABLES[256];
|
||||
|
||||
extern int32_t USE_EXTERNAL_PUBKEY;
|
||||
extern std::string NOTARY_PUBKEY;
|
||||
extern std::string NOTARY_PUBKEY,NOTARY_ADDRESS;
|
||||
extern int32_t KOMODO_EXCHANGEWALLET;
|
||||
extern int32_t VERUS_MIN_STAKEAGE;
|
||||
extern std::string DONATION_PUBKEY;
|
||||
extern uint8_t ASSETCHAINS_PRIVATE;
|
||||
extern int32_t USE_EXTERNAL_PUBKEY;
|
||||
extern char NOTARYADDRS[64][64]; // should be depreciated later. Only affects labs.
|
||||
extern char NOTARYADDRS[64][64];
|
||||
extern char NOTARY_ADDRESSES[NUM_KMD_SEASONS][64][64];
|
||||
extern int32_t KOMODO_TESTNODE, KOMODO_SNAPSHOT_INTERVAL;
|
||||
extern int32_t KOMODO_TESTNODE, KOMODO_SNAPSHOT_INTERVAL,IS_STAKED_NOTARY,STAKED_ERA;
|
||||
extern int32_t ASSETCHAINS_EARLYTXIDCONTRACT;
|
||||
extern int32_t ASSETCHAINS_STAKED_SPLIT_PERCENTAGE;
|
||||
int tx_height( const uint256 &hash );
|
||||
extern std::vector<std::string> vWhiteListAddress;
|
||||
extern std::map <std::int8_t, int32_t> mapHeightEvalActivate;
|
||||
void komodo_netevent(std::vector<uint8_t> payload);
|
||||
int32_t getacseason(uint32_t timestamp);
|
||||
int32_t getkmdseason(int32_t height);
|
||||
|
||||
#define IGUANA_MAXSCRIPTSIZE 10001
|
||||
#define KOMODO_KVDURATION 1440
|
||||
@@ -342,8 +425,19 @@ uint64_t komodo_accrued_interest(int32_t *txheightp,uint32_t *locktimep,uint256
|
||||
int32_t komodo_currentheight();
|
||||
int32_t komodo_notarized_bracket(struct notarized_checkpoint *nps[2],int32_t height);
|
||||
arith_uint256 komodo_adaptivepow_target(int32_t height,arith_uint256 bnTarget,uint32_t nTime);
|
||||
bool hush_hardfork_active(uint32_t time);
|
||||
|
||||
uint256 Parseuint256(const char *hexstr);
|
||||
void komodo_sendmessage(int32_t minpeers, int32_t maxpeers, const char *message, std::vector<uint8_t> payload);
|
||||
CBlockIndex *komodo_getblockindex(uint256 hash);
|
||||
int32_t komodo_nextheight();
|
||||
CBlockIndex *komodo_blockindex(uint256 hash);
|
||||
CBlockIndex *komodo_chainactive(int32_t height);
|
||||
int32_t komodo_blockheight(uint256 hash);
|
||||
bool komodo_txnotarizedconfirmed(uint256 txid);
|
||||
int32_t komodo_blockload(CBlock& block, CBlockIndex *pindex);
|
||||
uint32_t komodo_chainactive_timestamp();
|
||||
uint32_t GetLatestTimestamp(int32_t height);
|
||||
|
||||
#ifndef KOMODO_NSPV_FULLNODE
|
||||
#define KOMODO_NSPV_FULLNODE (KOMODO_NSPV <= 0)
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// Copyright 2019 The Hush developers
|
||||
/******************************************************************************
|
||||
* Copyright © 2014-2019 The SuperNET Developers. *
|
||||
* *
|
||||
@@ -19,7 +20,6 @@
|
||||
/*#include "secp256k1/include/secp256k1.h"
|
||||
#include "secp256k1/include/secp256k1_schnorrsig.h"
|
||||
#include "secp256k1/include/secp256k1_musig.h"
|
||||
|
||||
int32_t dummy_linker_tricker()
|
||||
{
|
||||
secp256k1_context *ctx = 0; std::vector<uint8_t> musig64; CPubKey pk; secp256k1_schnorrsig musig; secp256k1_pubkey combined_pk;
|
||||
@@ -27,8 +27,6 @@ int32_t dummy_linker_tricker()
|
||||
return(1);
|
||||
}*/
|
||||
|
||||
int32_t MarmaraValidateCoinbase(int32_t height,CTransaction tx);
|
||||
|
||||
int32_t pax_fiatstatus(uint64_t *available,uint64_t *deposited,uint64_t *issued,uint64_t *withdrawn,uint64_t *approved,uint64_t *redeemed,char *base)
|
||||
{
|
||||
int32_t baseid; struct komodo_state *sp; int64_t netliability,maxallowed,maxval;
|
||||
@@ -702,8 +700,29 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim
|
||||
{
|
||||
if ( i == 0 && txn_count > 1 && block.vtx[txn_count-1].vout.size() > 0 && block.vtx[txn_count-1].vout[0].nValue == 5000 )
|
||||
{
|
||||
/*
|
||||
if ( block.vtx[txn_count-1].vin.size() == 1 && GetTransaction(block.vtx[txn_count-1].vin[0].prevout.hash,tx,hash,false) && block.vtx[0].vout[0].scriptPubKey == tx.vout[block.vtx[txn_count-1].vin[0].prevout.n].scriptPubKey )
|
||||
notmatched = 1;
|
||||
*/
|
||||
if ( block.vtx[txn_count-1].vin.size() == 1 ) {
|
||||
uint256 hashNotaryProofVin = block.vtx[txn_count-1].vin[0].prevout.hash;
|
||||
int fNotaryProofVinTxFound = GetTransaction(hashNotaryProofVin,tx,hash,false);
|
||||
if (!fNotaryProofVinTxFound) {
|
||||
// try to search in the same block
|
||||
BOOST_FOREACH(const CTransaction &txInThisBlock, block.vtx) {
|
||||
if (txInThisBlock.GetHash() == hashNotaryProofVin) {
|
||||
fNotaryProofVinTxFound = 1;
|
||||
tx = txInThisBlock;
|
||||
hash = block.GetHash();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( fNotaryProofVinTxFound && block.vtx[0].vout[0].scriptPubKey == tx.vout[block.vtx[txn_count-1].vin[0].prevout.n].scriptPubKey )
|
||||
{
|
||||
notmatched = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
n = block.vtx[i].vin.size();
|
||||
for (j=0; j<n; j++)
|
||||
@@ -719,15 +738,6 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( height > 0 && ASSETCHAINS_MARMARA != 0 && (height & 1) == 0 )
|
||||
{
|
||||
if ( MarmaraValidateCoinbase(height,block.vtx[0]) < 0 )
|
||||
{
|
||||
fprintf(stderr,"MARMARA error ht.%d constrains even height blocks to pay 100%% to CC in vout0 with opreturn\n",height);
|
||||
return(-1);
|
||||
}
|
||||
}
|
||||
// we don't want these checks in VRSC, leave it at the Sapling upgrade
|
||||
if ( ASSETCHAINS_SYMBOL[0] == 0 ||
|
||||
((ASSETCHAINS_COMMISSION != 0 || ASSETCHAINS_FOUNDERS_REWARD) && height > 1) ||
|
||||
NetworkUpgradeActive(height, Params().GetConsensus(), Consensus::UPGRADE_SAPLING) )
|
||||
@@ -1232,7 +1242,6 @@ void komodo_stateind_set(struct komodo_state *sp,uint32_t *inds,int32_t n,uint8_
|
||||
printf("numR.%d numV.%d numN.%d count.%d\n",numR,numV,numN,count);
|
||||
/*else if ( func == 'K' ) // KMD height: stop after 1st
|
||||
else if ( func == 'T' ) // KMD height+timestamp: stop after 1st
|
||||
|
||||
else if ( func == 'N' ) // notarization, scan backwards 1440+ blocks;
|
||||
else if ( func == 'V' ) // price feed: can stop after 1440+
|
||||
else if ( func == 'R' ) // opreturn:*/
|
||||
@@ -2016,7 +2025,6 @@ const char *Techstocks[] =
|
||||
{ "AAPL","ADBE","ADSK","AKAM","AMD","AMZN","ATVI","BB","CDW","CRM","CSCO","CYBR","DBX","EA","FB","GDDY","GOOG","GRMN","GSAT","HPQ","IBM","INFY","INTC","INTU","JNPR","MSFT","MSI","MU","MXL","NATI","NCR","NFLX","NTAP","NVDA","ORCL","PANW","PYPL","QCOM","RHT","S","SHOP","SNAP","SPOT","SYMC","SYNA","T","TRIP","TWTR","TXN","VMW","VOD","VRSN","VZ","WDC","XRX","YELP","YNDX","ZEN"
|
||||
};
|
||||
const char *Metals[] = { "XAU", "XAG", "XPT", "XPD", };
|
||||
|
||||
const char *Markets[] = { "DJIA", "SPX", "NDX", "VIX" };
|
||||
*/
|
||||
|
||||
@@ -2142,7 +2150,6 @@ int32_t get_cryptoprices(uint32_t *prices,const char *list[],int32_t n,std::vect
|
||||
}
|
||||
return(price);
|
||||
}
|
||||
|
||||
uint32_t get_currencyprice(const char *symbol)
|
||||
{
|
||||
char url[512]; cJSON *json,*obj; uint32_t price = 0;
|
||||
@@ -2155,7 +2162,6 @@ uint32_t get_currencyprice(const char *symbol)
|
||||
}
|
||||
return(price);
|
||||
}
|
||||
|
||||
int32_t get_stocks(const char *list[],int32_t n)
|
||||
{
|
||||
int32_t i,errs=0; uint32_t price;
|
||||
@@ -2822,3 +2828,4 @@ int32_t komodo_priceget(int64_t *buf64,int32_t ind,int32_t height,int32_t numblo
|
||||
pthread_mutex_unlock(&pricemutex);
|
||||
return(retval);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
// Copyright 2019 The Hush Developers
|
||||
|
||||
/******************************************************************************
|
||||
* Copyright © 2014-2019 The SuperNET Developers. *
|
||||
* *
|
||||
@@ -52,7 +54,6 @@ int32_t KOMODO_INSYNC,KOMODO_LASTMINED,prevKOMODO_LASTMINED,KOMODO_CCACTIVATE,JU
|
||||
std::string NOTARY_PUBKEY,ASSETCHAINS_NOTARIES,ASSETCHAINS_OVERRIDE_PUBKEY,DONATION_PUBKEY,ASSETCHAINS_SCRIPTPUB,NOTARY_ADDRESS,ASSETCHAINS_SELFIMPORT,ASSETCHAINS_CCLIB;
|
||||
uint8_t NOTARY_PUBKEY33[33],ASSETCHAINS_OVERRIDE_PUBKEY33[33],ASSETCHAINS_OVERRIDE_PUBKEYHASH[20],ASSETCHAINS_PUBLIC,ASSETCHAINS_PRIVATE,ASSETCHAINS_TXPOW,ASSETCHAINS_MARMARA;
|
||||
int8_t ASSETCHAINS_ADAPTIVEPOW;
|
||||
bool VERUS_MINTBLOCKS;
|
||||
std::vector<uint8_t> Mineropret;
|
||||
std::vector<std::string> vWhiteListAddress;
|
||||
char NOTARYADDRS[64][64];
|
||||
@@ -83,23 +84,14 @@ std::vector<std::string> ASSETCHAINS_PRICES,ASSETCHAINS_STOCKS;
|
||||
#define _ASSETCHAINS_EQUIHASH 0
|
||||
uint32_t ASSETCHAINS_NUMALGOS = 3;
|
||||
uint32_t ASSETCHAINS_EQUIHASH = _ASSETCHAINS_EQUIHASH;
|
||||
uint32_t ASSETCHAINS_VERUSHASH = 1;
|
||||
uint32_t ASSETCHAINS_VERUSHASHV1_1 = 2;
|
||||
const char *ASSETCHAINS_ALGORITHMS[] = {"equihash", "verushash", "verushash11"};
|
||||
uint64_t ASSETCHAINS_NONCEMASK[] = {0xffff,0xfffffff,0xfffffff};
|
||||
uint32_t ASSETCHAINS_NONCESHIFT[] = {32,16,16};
|
||||
uint32_t ASSETCHAINS_HASHESPERROUND[] = {1,4096,4096};
|
||||
const char *ASSETCHAINS_ALGORITHMS[] = {"equihash"};
|
||||
uint64_t ASSETCHAINS_NONCEMASK[] = {0xffff};
|
||||
uint32_t ASSETCHAINS_NONCESHIFT[] = {32};
|
||||
uint32_t ASSETCHAINS_HASHESPERROUND[] = {1};
|
||||
uint32_t ASSETCHAINS_ALGO = _ASSETCHAINS_EQUIHASH;
|
||||
// min diff returned from GetNextWorkRequired needs to be added here for each algo, so they can work with ac_staked.
|
||||
uint32_t ASSETCHAINS_MINDIFF[] = {537857807,504303375,487526159};
|
||||
// ^ wrong!
|
||||
// Verus proof of stake controls
|
||||
uint32_t ASSETCHAINS_MINDIFF[] = {537857807};
|
||||
int32_t ASSETCHAINS_LWMAPOS = 0; // percentage of blocks should be PoS
|
||||
int32_t VERUS_BLOCK_POSUNITS = 1024; // one block is 1000 units
|
||||
int32_t VERUS_MIN_STAKEAGE = 150; // 1/2 this should also be a cap on the POS averaging window, or startup could be too easy
|
||||
int32_t VERUS_CONSECUTIVE_POS_THRESHOLD = 7;
|
||||
int32_t VERUS_NOPOS_THRESHHOLD = 150; // if we have no POS blocks in this many blocks, set to default difficulty
|
||||
|
||||
int32_t ASSETCHAINS_SAPLING = -1;
|
||||
int32_t ASSETCHAINS_OVERWINTER = -1;
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user