From 736a5cc15c42bb46090f5038352d6473410e23c5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 28 Mar 2019 05:42:16 -1100 Subject: [PATCH] Price bits --- src/komodo_gateway.h | 102 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 92 insertions(+), 10 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 03816ee79..3a06d14b6 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -1549,13 +1549,79 @@ void komodo_passport_iteration() } extern std::vector Mineropret; +#define PRICES_MAXCHANGE (COIN / 100) +#define PRICES_SIZEBIT0 (sizeof(uint32_t) * 4) + +int32_t komodo_heightpricebits(uint32_t prevbits[4],int32_t nHeight) +{ + CBlockIndex *pindex; CBlock block; int32_t numvouts; std::vector vopret; + if ( (pindex= komodo_chainactive(nHeight)) != 0 ) + { + if ( komodo_blockload(block,pindex) == 0 ) + { + numvouts = (int32_t)block.vout[0].size(); + GetOpReturnData(block.vout[numvouts-1].scriptPubKey,vopret); + if ( vopret.size() == PRICES_SIZEBIT0 ) + { + memcpy(prevbits,&vopret[0],PRICES_SIZEBIT0); + return(0); + } + } + } + fprintf(stderr,"couldnt get pricebits for %d\n",nHeight); + return(-1); +} + +uint32_t komodo_pricenew(uint32_t price,uint32_t refprice,int64_t tolerance) +{ + uint32_t highprice,lowprice; + highprice = ((uint64_t)refprice * (COIN + tolerance)) / COIN; + lowprice = ((uint64_t)refprice * (COIN - tolerance)) / COIN; + if ( price > highprice ) + return(highprice); + else if ( price < lowprice ) + return(lowprice); + else return(0); +} + +int32_t komodo_pricecmp(uint32_t pricebitsA[4],uint32_t pricebitsB[4],int64_t tolerance) +{ + int32_t i; + for (i=1; i<4; i++) + if ( komodo_pricenew(pricebitsA[i],pricebitsB[i],tolerance) != 0 ) + return(-1); + return(0); +} + +int32_t komodo_priceclamp(uint32_t pricebits[4],uint32_t refprices[4],int64_t tolerance) +{ + int32_t i; uint32_t newprice; + for (i=1; i<4; i++) + { + if ( (newprice= komodo_pricenew(pricebits[i],refprices[i],tolerance)) != 0 ) + { + fprintf(stderr,"priceclamp[%d] %u -> %u\n",i,pricebits[i],newprice); + pricebits[i] = newprice; + } + } + return(0); +} CScript komodo_mineropret(int32_t nHeight) { - CScript opret; - if ( Mineropret.size() != 0 ) + CScript opret; uint32_t pricebits[4],prevbits[4]; + if ( Mineropret.size() == PRICES_SIZEBIT0 ) { - //fprintf(stderr,"use Mineropret[%d]\n",(int32_t)Mineropret.size()); + if ( komodo_heightpricebits(prevbits,nHeight-1) == 0 ) + { + memcpy(pricebits,&Mineropret[0],PRICES_SIZEBIT0); + if ( komodo_pricecmp(pricebit,prevbits,PRICES_MAXCHANGE) < 0 ) + { + komodo_priceclamp(pricebits,prevbits,PRICES_MAXCHANGE); + fprintf(stderr,"update Mineropret to clamped prices\n"); + memcpy(&Mineropret[0],pricebits,PRICES_SIZEBIT0); + } + } return(opret << OP_RETURN << Mineropret); } return(opret); @@ -1563,18 +1629,34 @@ CScript komodo_mineropret(int32_t nHeight) int32_t komodo_opretvalidate(int32_t nHeight,CScript scriptPubKey) { - std::vector vopret; uint32_t pricebits[4]; int32_t i,lag,lag2; + std::vector vopret; uint32_t pricebits[4],prevbits[4]; int32_t i,lag,lag2; if ( ASSETCHAINS_CBOPRET != 0 ) { GetOpReturnData(scriptPubKey,vopret); - if ( vopret.size() == sizeof(pricebits) ) + if ( vopret.size() == PRICES_SIZEBIT0 ) { - memcpy(pricebits,&vopret[0],sizeof(pricebits)); + memcpy(pricebits,&vopret[0],PRICES_SIZEBIT0); lag = (int32_t)(time(NULL) - pricebits[0]); + if ( lag < 0 ) + lag = -lag; lag2 = (int32_t)(pricebits[0] - komodo_heightstamp(nHeight-1)); fprintf(stderr,"ht.%d: t%u lag.%d %.4f USD, %.4f GBP, %.4f EUR htstamp.%d [%d]\n",nHeight,pricebits[0],lag,(double)pricebits[1]/10000,(double)pricebits[2]/10000,(double)pricebits[3]/10000,komodo_heightstamp(nHeight-1),lag2); + if ( lag < ASSETCHAINS_BLOCKTIME && Mineropret.size() == PRICES_SIZEBIT0 ) + { + memcpy(prevbits,&Mineropret[0],PRICES_SIZEBIT0); + if ( komodo_pricecmp(pricebits,prevbits,PRICES_MAXCHANGE) < 0 ) + return(-1); + } + if ( nHeight > 1 ) + { + if ( komodo_heightpricebits(prevbits,nHeight-1) == 0 ) + { + if ( komodo_pricecmp(pricebits,prevbits,PRICES_MAXCHANGE) < 0 ) + return(-1); + } else return(-1); + } return(0); - } else fprintf(stderr,"wrong size %d vs %d, scriptPubKey size %d [%02x]\n",(int32_t)vopret.size(),(int32_t)sizeof(pricebits),(int32_t)scriptPubKey.size(),scriptPubKey[0]); + } else fprintf(stderr,"wrong size %d vs %d, scriptPubKey size %d [%02x]\n",(int32_t)vopret.size(),(int32_t)PRICES_SIZEBIT0,(int32_t)scriptPubKey.size(),scriptPubKey[0]); return(-1); } return(0); @@ -1632,9 +1714,9 @@ void komodo_cbopretupdate() { if ( get_btcusd(pricebits) == 0 ) { - if ( Mineropret.size() != sizeof(pricebits) ) - Mineropret.resize(sizeof(pricebits)); - memcpy(&Mineropret[0],pricebits,sizeof(pricebits)); + if ( Mineropret.size() != PRICES_SIZEBIT0 ) + Mineropret.resize(PRICES_SIZEBIT0); + memcpy(&Mineropret[0],pricebits,PRICES_SIZEBIT0); //int32_t i; for (i=0; i