diff --git a/src/ac.json b/src/ac.json new file mode 100644 index 000000000..7f3f7ba03 --- /dev/null +++ b/src/ac.json @@ -0,0 +1,338 @@ +{ + "REVS": { + "ac_supply": "1300000" + } + , + + "SUPERNET": { + "ac_supply": "816061" + } + , + + "DEX": { + "ac_supply": "999999" + } + , + + "PANGEA": { + "ac_supply": "999999" + } + + , + "JUMBLR": { + "ac_supply": "999999" + } + , + + "BET": { + "ac_supply": "999999" + } + , + + "CRYPTO": { + "ac_supply": "999999" + } + , + + "HODL": { + "ac_supply": "9999999" + } + , + + "MSHARK": { + "ac_supply": "1400000" + } + , + + "BOTS": { + "ac_supply": "999999" + } + , + + "MGW": { + "ac_supply": "999999" + } + , + "COQUICASH": { + "ac_supply": "72000000", + "ac_reward": "7200000000", + "ac_staked": "50", + "ac_halving": "420000", + "ac_cc": "2", + "ac_ccenable": "227,235,236,241", + "addnode": [ + "78.47.108.168" + ] + } + , + + "WLC": { + "ac_supply": "210000000" + } + , + + "KV": { + "ac_supply": "1000000" + } + , + + "CEAL": { + "ac_supply": "366666666" + } + , + + "MESH": { + "ac_supply": "1000007" + } + , + + "AXO": { + "ac_supply": "200000000", + "ac_ccactivate": "130000" + } + , + + "ETOMIC": { + "ac_supply": "100000000" + } + , + + "BTCH": { + "ac_supply": "20998641" + } + , + + "PIZZA": { + "ac_supply": "100000000" + } + , + + "BEER": { + "ac_supply": "100000000" + } + , + + "NINJA": { + "ac_supply": "100000000" + } + , + + "OOT": { + "ac_supply": "216000000", + "ac_sapling": "5000000" + } + , + + "BNTN": { + "ac_supply": "500000000" + } + , + + "CHAIN": { + "ac_supply": "999999" + } + , + + "PRLPAY": { + "ac_supply": "500000000" + } + , + + "DSEC": { + "ac_supply": "7000000" + } + , + + "GLXT": { + "ac_supply": "10000000000" + } + , + + "EQL": { + "ac_supply": "500000000", + "ac_ccactivate": "205000" + } + , + + "ZILLA": { + "ac_supply": "11000000", + "ac_sapling": "5000000", + "addnode": [ + "51.68.215.104" + ] + } + , + + "RFOX": { + "ac_supply": "1000000000", + "ac_reward": "100000000" + } + , + + "SEC": { + "ac_supply": "1000000000", + "ac_cc": "333" + } + , + + "CCL": { + "ac_supply": "200000000", + "ac_end": "1", + "ac_cc": "2", + "addressindex": "1", + "spentindex": "1", + "addnode": [ + "142.93.136.89", + "195.201.22.89" + ] + } + , + + "PIRATE": { + "ac_supply": "0", + "ac_reward": "25600000000", + "ac_halving": "77777", + "ac_private": "1", + "addnode": [ + "136.243.102.225" + ] + } + , + + "PGT": { + "ac_supply": "10000000", + "ac_end": "1", + "addnode": [ + "190.114.254.104" + ] + } + , + + "DION": { + "ac_supply": "3900000000", + "ac_reward": "22260000000", + "ac_staked": "100", + "ac_cc": "1", + "ac_end": "4300000000", + "addnode": [ + "51.75.124.34" + ] + } + , + + "KMDICE": { + "ac_supply": "10500000", + "ac_reward": "2500000000", + "ac_halving": "210000", + "ac_cc": "2", + "addressindex": "1", + "spentindex": "1", + "addnode": [ + "144.76.217.232" + ] + } + , + + "KSB": { + "ac_supply": "1000000000", + "ac_end": "1", + "ac_public": "1", + "addnode": [ + "37.187.225.231" + ] + } + , + + "OUR": { + "ac_reward": "1478310502", + "ac_halving": "525600", + "ac_cc": "42", + "ac_supply": "100000000", + "ac_perc": "77700", + "ac_staked": "93", + "ac_pubkey": "02652a3f3e00b3a1875a918314f0bac838d6dd189a346fa623f5efe9541ac0b98c", + "ac_public": "1", + "addnode": [ + "51.255.195.65", + "217.182.129.38", + "37.187.225.231" + ] + } + , + + "ILN": { + "ac_supply": "10000000000", + "ac_cc": "2", + "addnode": ["51.75.122.83"] + } + , + + "RICK": { + "ac_supply": "90000000000", + "ac_reward": "100000000", + "ac_cc": "3", + "addnode": ["138.201.136.145"] + } + , + + "MORTY": { + "ac_supply": "90000000000", + "ac_reward": "100000000", + "ac_cc": "3", + "addnode": ["138.201.136.145"] + } + , + + "KOIN": { + "ac_supply": "125000000", + "addnode": ["3.0.32.10"] + } + , + + "ZEXO": { + "ac_reward": "1478310502", + "ac_halving": "525600", + "ac_cc": "42", + "ac_ccenable": "236", + "ac_supply": "100000000", + "ac_perc": "77700", + "ac_staked": "93", + "ac_pubkey": "02713bd85e054db923694b6b7a85306264edf4d6bd6d331814f2b40af444b3ebbc", + "ac_public": "1", + "addnode": [ + "195.201.20.230", + "80.240.17.222" + ] + } + , + + "K64": { + "ac_reward": "0", + "ac_supply": "64000777", + "ac_staked": "10", + "addnode": ["18.197.20.21"] + } + , + + "HUSH3": { + "ac_sapling": "1", + "ac_founders": "1", + "ac_reward": "0,1125000000,562500000", + "ac_end": "128,340000,5422111", + "ac_blocktime": "150", + "ac_supply": "6178674", + "ac_halving": "129,340000,840000", + "ac_cc": "2", + "ac_cclib": "hush3", + "ac_ccenable": "228,234,235,236,241", + "ac_perc": "11111111", + "ac_eras": "3", + "ac_script": "76a9145eb10cf64f2bab1b457f1f25e658526155928fac88ac", + "clientname": "GoldenSandtrout", + "addnode": [ + "188.165.212.101", + "136.243.227.142", + "5.9.224.250" + ] + } +} diff --git a/src/assetchains.json b/src/assetchains.json index 20dd04ee2..e68872d6b 100644 --- a/src/assetchains.json +++ b/src/assetchains.json @@ -44,9 +44,16 @@ "ac_supply": "999999" }, { - "ac_name": "COQUI", + "ac_name": "COQUICASH", "ac_supply": "72000000", - "ac_ccactivate": "200000" + "ac_reward": "7200000000", + "ac_staked": "50", + "ac_halving": "420000", + "ac_cc": "2", + "ac_ccenable": "227,235,236,241", + "addnode": [ + "78.47.108.168" + ] }, { "ac_name": "WLC", @@ -235,12 +242,6 @@ "ac_cc": "3", "addnode": ["138.201.136.145"] }, - { - "ac_name": "VOTE2019", - "ac_supply": "123651638", - "ac_public": "1", - "addnode": ["95.213.238.98"] - }, { "ac_name": "KOIN", "ac_supply": "125000000", diff --git a/src/rpc/rawtransaction.cpp b/src/rpc/rawtransaction.cpp index b00f8c6c5..209126a5a 100644 --- a/src/rpc/rawtransaction.cpp +++ b/src/rpc/rawtransaction.cpp @@ -727,27 +727,31 @@ UniValue verifytxoutproof(const UniValue& params, bool fHelp) UniValue createrawtransaction(const UniValue& params, bool fHelp) { + string examplescriptPubKey = "21021ce1eac70455c3e6c52d67c133549b8aed4a588fba594372e8048e65c4f0fcb6ac"; + if (fHelp || params.size() < 2 || params.size() > 4) throw runtime_error( "createrawtransaction [{\"txid\":\"id\",\"vout\":n},...] {\"address\":amount,...} ( locktime ) ( expiryheight )\n" - "\nCreate a transaction spending the given inputs and sending to the given addresses.\n" + "\nCreate a transaction spending the given inputs and creating new outputs.\n" + "Outputs can be addresses or standart scripts (in hex) or data.\n" "Returns hex-encoded raw transaction.\n" "Note that the transaction's inputs are not signed, and\n" "it is not stored in the wallet or transmitted to the network.\n" "\nArguments:\n" - "1. \"transactions\" (string, required) A json array of json objects\n" + "1. \"inputs\" (array, required) A json array of json objects\n" " [\n" " {\n" " \"txid\":\"id\", (string, required) The transaction id\n" - " \"vout\":n (numeric, required) The output number\n" - " \"sequence\":n (numeric, optional) The sequence number\n" - " }\n" + " \"vout\":n, (numeric, required) The output number\n" + " \"sequence\":n (numeric, optional) The sequence number\n" + " } \n" " ,...\n" " ]\n" - "2. \"addresses\" (string, required) a json object with addresses as keys and amounts as values\n" + "2. \"outputs\" (object, required) a json object with outputs\n" " {\n" - " \"address\": x.xxx (numeric, required) The key is the Komodo address, the value is the " + CURRENCY_UNIT + " amount\n" + " \"address\": x.xxx, (numeric or string, required) The key is the komodo address or script (in hex), the numeric value (can be string) is the " + CURRENCY_UNIT + " amount\n" + " \"data\": \"hex\" (string, required) The key is \"data\", the value is hex encoded data\n" " ,...\n" " }\n" "3. locktime (numeric, optional, default=0) Raw locktime. Non-0 value also locktime-activates inputs\n" @@ -757,7 +761,11 @@ UniValue createrawtransaction(const UniValue& params, bool fHelp) "\nExamples\n" + HelpExampleCli("createrawtransaction", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"{\\\"address\\\":0.01}\"") - + HelpExampleRpc("createrawtransaction", "[{\"txid\":\"myid\",\"vout\":0}], {\"address\":0.01}") + + HelpExampleCli("createrawtransaction", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"{\\\""+examplescriptPubKey+"\\\":0.01}\"") + + HelpExampleCli("createrawtransaction", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"{\\\"data\\\":\\\"00010203\\\"}\"") + + HelpExampleRpc("createrawtransaction", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\", \"{\\\"address\\\":0.01}\"") + + HelpExampleRpc("createrawtransaction", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\", \"{\\\""+examplescriptPubKey+"\\\":0.01}\"") + + HelpExampleRpc("createrawtransaction", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\", \"{\\\"data\\\":\\\"00010203\\\"}\"") ); LOCK(cs_main); @@ -817,22 +825,61 @@ UniValue createrawtransaction(const UniValue& params, bool fHelp) } std::set destinations; + //std::set destinations; + vector addrList = sendTo.getKeys(); - for (const std::string& name_ : addrList) { - CTxDestination destination = DecodeDestination(name_); - if (!IsValidDestination(destination)) { - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, std::string("Invalid Komodo address: ") + name_); + + if (addrList.size() != sendTo.size()) { + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, std::string("Invalid outputs")); // for checking edge case, should never happened ... + } + + //for (const std::string& name_ : addrList) { + for (size_t idx = 0; idx < sendTo.size(); idx++) { + + const std::string& name_ = addrList[idx]; + + CScript scriptPubKey; + CTxDestination destination; + + if (name_ == "data") { + std::vector data = ParseHexV(sendTo[name_].getValStr(),"Data"); + CTxOut out(0, CScript() << OP_RETURN << data); + rawTx.vout.push_back(out); + } else { + destination = DecodeDestination(name_); + if (IsValidDestination(destination)) { + scriptPubKey = GetScriptForDestination(destination); + } else if (IsHex(name_)) { + std::vector data(ParseHex(name_)); + scriptPubKey = CScript(data.begin(), data.end()); + // destination is not valid, but we should convert it to valid anyway, to be able to check duplicates, + // so we need to get destination from existing scriptPubKey via ExtractDestination + if (!(ExtractDestination(scriptPubKey, destination) && + (scriptPubKey.IsPayToPublicKeyHash() || scriptPubKey.IsPayToPublicKey() || scriptPubKey.IsPayToScriptHash()) + )) { + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, std::string("Invalid script: ") + name_ + std::string(" (only P2PKH, P2PK and P2SH scripts are allowed)")); + } + } + else { + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, std::string("Invalid Komodo address or script: ") + name_); + } + + if (!(fExperimentalMode && IS_KOMODO_NOTARY)) { + // support of sending duplicates in createrawtransaction requires experimental features enabled and + // notary flag, to prevent common users to get messed up with duplicates + + //if (!destinations.insert(EncodeDestination(destination)).second) { + if (!destinations.insert(destination).second) { + throw JSONRPCError(RPC_INVALID_PARAMETER, std::string("Invalid parameter, duplicated destination: ") + name_); + } + } + + // CAmount nAmount = AmountFromValue(sendTo[name_]); // operator[](const std::string& key) const; + CAmount nAmount = AmountFromValue(sendTo[idx]); // operator[](size_t index) const; + + CTxOut out(nAmount, scriptPubKey); + rawTx.vout.push_back(out); } - - if (!destinations.insert(destination).second) { - throw JSONRPCError(RPC_INVALID_PARAMETER, std::string("Invalid parameter, duplicated address: ") + name_); - } - - CScript scriptPubKey = GetScriptForDestination(destination); - CAmount nAmount = AmountFromValue(sendTo[name_]); - - CTxOut out(nAmount, scriptPubKey); - rawTx.vout.push_back(out); } return EncodeHexTx(rawTx);