// Copyright (c) 2016-2024 The Hush developers // Distributed under the GPLv3 software license, see the accompanying // file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html /* simple stub custom cc Just update the functions in this file, then from ~/hush3/src/cc ../hush-cli -ac_name=CUSTOM stop ./makecustom ../hush-smart-chain -ac_name=CUSTOM -ac_cclib=custom -ac_cc=2 ... The above will rebuild hushd and get it running again */ CScript custom_opret(uint8_t funcid,CPubKey pk) { CScript opret; uint8_t evalcode = EVAL_CUSTOM; opret << OP_RETURN << E_MARSHAL(ss << evalcode << funcid << pk); return(opret); } uint8_t custom_opretdecode(CPubKey &pk,CScript scriptPubKey) { std::vector vopret; uint8_t e,f; GetOpReturnData(scriptPubKey,vopret); if ( vopret.size() > 2 && E_UNMARSHAL(vopret,ss >> e; ss >> f; ss >> pk) != 0 && e == EVAL_CUSTOM ) { return(f); } return(0); } UniValue custom_rawtxresult(UniValue &result,std::string rawtx,int32_t broadcastflag) { CTransaction tx; if ( rawtx.size() > 0 ) { result.push_back(Pair("hex",rawtx)); if ( DecodeHexTx(tx,rawtx) != 0 ) { if ( broadcastflag != 0 && myAddtomempool(tx) != 0 ) RelayTransaction(tx); result.push_back(Pair("txid",tx.GetHash().ToString())); result.push_back(Pair("result","success")); } else result.push_back(Pair("error","decode hex")); } else result.push_back(Pair("error","couldnt finalize CCtx")); return(result); } UniValue custom_func0(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) { UniValue result(UniValue::VOBJ); result.push_back(Pair("result","success")); result.push_back(Pair("message","just an example of an information returning rpc")); return(result); } // send yourself 1 coin to your CC address using normal utxo from your -pubkey UniValue custom_func1(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) { CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), hush_nextheight()); std::string rawtx; UniValue result(UniValue::VOBJ); CPubKey mypk; int64_t amount = COIN; int32_t broadcastflag=0; if ( txfee == 0 ) txfee = CUSTOM_TXFEE; mypk = pubkey2pk(Mypubkey()); if ( AddNormalinputs2(mtx,COIN+txfee,64) >= COIN+txfee ) // add utxo to mtx { // make op_return payload as normal. CScript opret = custom_opret('1',mypk); std::vector> vData = std::vector>(); if ( makeCCopret(opret, vData) ) { // make vout0 with op_return included as payload. mtx.vout.push_back(MakeCC1vout(cp->evalcode,amount,mypk,&vData)); fprintf(stderr, "vout size2.%li\n", mtx.vout.size()); rawtx = FinalizeCCTx(0,cp,mtx,mypk,txfee,CScript()); return(custom_rawtxresult(result,rawtx,broadcastflag)); } } return(result); } bool custom_validate(struct CCcontract_info *cp,int32_t height,Eval *eval,const CTransaction tx) { return false; }