I'm home now and almost going bed. That's my life. Today free time is about 1h...
I have just tested the json object and array created by the functions using 'jq' tool. I think this is a pretty fair way of testing if json objects are correctly built!
So, I just pipped the 'echo' command at the end of stopms both functions through "jq '.'" like this:
echo "{$pairs}" | jq '.'
Result is:
{
"n1yswZYByRv3okGDHs1oDaevq8gsDaYZzC": "0.079319635",
"2NFafKRugHFdYEib7xVfkT6bvtkUKK8oShZ": "0.079319635"
}
Which I think it's perfect.
and
echo "[$items]" | jq '.'
result is:
[
"n1yswZYByRv3okGDHs1oDaevq8gsDaYZzC",
"2NFafKRugHFdYEib7xVfkT6bvtkUKK8oShZ"
]
which I think its also perfect.
Now, according to the examples from bitcoin core:
> bitcoin-cli sendmany "" "{\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\":0.01,\"1353tsE8YMTA4EuV7dgUXGjNFf9KpVvKHz\":0.02}" 1 "" "[\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\",\"1353tsE8YMTA4EuV7dgUXGjNFf9KpVvKHz\"]"
So the functions outputs are not matching exactly the docs example. The thing is that the docs example wouldn't also pass in a json checker tool like jsonlint. This said,I think the backslashes escaping the inner double quotes of each address can be removed.
Example:
> bitcoin-cli sendmany "" "{"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX":0.01,"1353tsE8YMTA4EuV7dgUXGjNFf9KpVvKHz":0.02}" 1 "" "["1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX","1353tsE8YMTA4EuV7dgUXGjNFf9KpVvKHz"]"
Now, there is a question that might be asked at this point. Will these backslashes be handled by bitcoin core and removed later to pass the command to the RPC server? Are they really needed? I would take a chance in saying they are not needed.
The same for the double quotes outside the {} and the []. But I think I can try these to some extent. I can try to issue the command manually in terminal and see if bitcoin core complains or it it runs the command smoothly.
The other thing I think I need to change is the value of each key because as they are numbers (floating point) they probably don't need to be wrapped around with double quotes. At least the example from the docs have no double quotes around the key values. So the command will become:
> bitcoin-cli sendmany "" {"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX":0.01,"1353tsE8YMTA4EuV7dgUXGjNFf9KpVvKHz":0.02} 1 "" ["1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX","1353tsE8YMTA4EuV7dgUXGjNFf9KpVvKHz"]
I think this might be enough to bitcoin core run the command smoothly!
Summarizing, regarding the validity of json objects built by the functions, I think they are perfect! However, I'll test the command with the changes I said. No backslashes, no double quotes around key values and no outer double quotes wrapping {} and [] around.
In a couple of minutes I'll update this post!
About the improved stomp functions, I'll leave them for later after I have this actual version running and for after figuring out all tricks to make the command to work.
Update:
ok, so I tested 2 versions of the command directly in terminal and I typed in the command myself by hand (no scripts)
Attempt 1 - no backslashes and no outter double quotes wrapping {} and [] around and no double quotes around key values(the floating point numbers):
bitcoin-cli -testnet sendmany "" {"n1yswZYByRv3okGDHs1oDaevq8gsDaYZzC":0.079319635, "2NFafKRugHFdYEib7xVfkT6bvtkUKK8oShZ":0.079319635} 6 "Payments" ["n1yswZYByRv3okGDHs1oDaevq8gsDaYZzC", "2NFafKRugHFdYEib7xVfkT6bvtkUKK8oShZ"] true 6 CONSERVATIVE
Result:
error: Error parsing JSON:{n1yswZYByRv3okGDHs1oDaevq8gsDaYZzC:0.079319635,
Attempt 2 - re-added back the outter double quotes wrapping {} and []. Still no backslashes and no double quotes wrapping around key values
bitcoin-cli -testnet sendmany "" "{"n1yswZYByRv3okGDHs1oDaevq8gsDaYZzC":0.079319635, "2NFafKRugHFdYEib7xVfkT6bvtkUKK8oShZ":0.079319635}" 6 "Payments" "["n1yswZYByRv3okGDHs1oDaevq8gsDaYZzC", "2NFafKRugHFdYEib7xVfkT6bvtkUKK8oShZ"]" true 6 CONSERVATIVE
Result:
error: Error parsing JSON:{n1yswZYByRv3okGDHs1oDaevq8gsDaYZzC:0.079319635, 2NFafKRugHFdYEib7xVfkT6bvtkUKK8oShZ:0.079319635}
Attempt 3 - readded backslashes because it's clear that they are needed.
bitcoin-cli -testnet sendmany "" "{\"n1yswZYByRv3okGDHs1oDaevq8gsDaYZzC\":"0.079319635", \"2NFafKRugHFdYEib7xVfkT6bvtkUKK8oShZ\":"0.079319635"}" 6 "Payments" "[\"n1yswZYByRv3okGDHs1oDaevq8gsDaYZzC\", \"2NFafKRugHFdYEib7xVfkT6bvtkUKK8oShZ\"]" true 6 CONSERVATIVE
Result:
error code: -3
error message:
Invalid amount
Ok, but no problem here because I foun out the problem... I'm just dumb and stupid. That's all. Bitcoin lowest decimal value is 1x10^(-8). Meaning 8 decimal places and in my code I was using "%.9f". Damn stupid of me!
I have already tried the command from the script and yes, I get an error but it's not from the script, is an "insuficient funds error". But it's a bug in my code. It's a matter of math. I mean, let's say I have 0.08444443 BTC to send to 2 addresses. What I'm doing is to divide that amount by 2 which would be 0.042222215. But this value is 9 decimal places long. So I format it to 8 decimal places and those to last decimal places becomes one by rounding up the 15 to 2 (or 20 if we consider 9 decimal places). This in turn generates insufficient amount error because 0.042222 * 2 is more than the total I had originally to send. So I have here a rounding problem I need to fix.