From 11a4aa09c6672d46200daa7b0fcca305f43fa276 Mon Sep 17 00:00:00 2001 From: Vivek Teega Date: Mon, 18 Mar 2019 14:44:24 +0530 Subject: [PATCH] Smart contract integration - Half Done --- .gitignore | 2 + __pycache__/models.cpython-36.pyc | Bin 1863 -> 0 bytes __pycache__/parsing.cpython-36.pyc | Bin 2356 -> 0 bytes config.ini | 8 +- databases/teega.db | Bin 24576 -> 0 bytes models.py | 9 + parsing.py | 123 ++++++++++- .../electionbetting.db | Bin 12288 -> 8192 bytes {databases => tokens}/rmt.db | Bin 24576 -> 24576 bytes track-tokens-mod.py | 33 ++- tracktokens-smartcontract.py | 198 ++++++++++++++++++ 11 files changed, 351 insertions(+), 22 deletions(-) delete mode 100644 __pycache__/models.cpython-36.pyc delete mode 100644 __pycache__/parsing.cpython-36.pyc delete mode 100644 databases/teega.db rename .app.py.swp => smartContracts/electionbetting.db (59%) rename {databases => tokens}/rmt.db (98%) create mode 100644 tracktokens-smartcontract.py diff --git a/.gitignore b/.gitignore index f59eb20..2c227b7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ tree.db .idea/ flo_addresses.txt +__pycache__/ +*.swp diff --git a/__pycache__/models.cpython-36.pyc b/__pycache__/models.cpython-36.pyc deleted file mode 100644 index 5486d69d382776c68dbe382ecce32fd11fd31b62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1863 zcma)-O>f&q5Qa%g{H7e%PQOyOO-`*Y7SP;+AZQcUtOKmznrzt5dAOl z(!Zh+j&P+@yUcaT_oP=3*q|P=VeK=&4p>l!EOZ@kFC7+r+-^yCxSz{m&x(qo|ru$0jFU%&1YH$K=OuM)>tSbDCinyW=|1`Cr*uDhvh%QIc_ zrU7v@j!aY(4X>dnOi~neE9R2?tSDa2xx5+~6-CFV68caLurNi>LM3D}G=Dhi9rDTi z`)D$2YnWUhjI+r;Tuh$xrkqtja49FMKKTWX6)(?_LD7Nk8t5kYzaaJA`9ejwK!BGf z6S+fg%eA@9hG7 zN8>Fu!d283nLA{1GH;>2OF1H=-X-%M8Pbb-pUekjt{+41ZBuRs4Lv1ItM^b7xBuF) z&2S&%TB_D!UCTOX(iApgtmFDeaQC3DAc)Krl54dId;Pelwf{9Jv9G-JBNAN_mv)l}EW$ z#E2;|nZ<-He&3#ImMt5W7`=&S`)WHM?q4g%>@276gDzEdPNFrvT5-k0{by~X=QRi` zk6Xg~1iR~X_9=Py$^5UnKE_eHL6gK*@Df+i$Yy+B;K&X5R@x#j79pa-(aJtL$t2HMgg)YE0?k6RrI6NlEOMkR9avYo(u4J+FFUZl4CDfAM=r`P zY#^89DcA+c@3F8q#mQ`Qz{%ieqgiNQpp{q9NlxcKv1(qiT_)`#UW_j#PC3p}9omhplLOuO z&k7~8w8V(!-_XdW|9)a>0Uo@%w(+zWB^&!VVz_Z5+26Pu=Yyx|?KsOe)M)2<(pT|d znC4HmbyDg)(HrAfm6%@|A2vZ+V%hlOQ%sBK7!Sa>sV>!;Clpvaxn;P<-sU&O?9Y)1lq7o?26oN{ItAf4m^$7KO;DWf9Da<@kF8_ z@Gb@?1WLOWlGWD1RYTvE+O7nVT7lGatQM7!&d^pL5s79j)JkPZHuPcb+S*&$VwGhG zR-_R{@>KLOMe>8pOF-`zTTI58rqF9=aO7ukK`*GHE z=F4s5M132652^se`p)tDt5_Dj8?-0BYIEidZ+n{WzN>Un*6o z8IA@xbp|Iy9g|3Xg6H34)1Be=*@$R(2XB<;(J=$rq6qjR7XZwMUE;1V*|3K7Ie0`e zH3Q!J7?={kQ3CkEd847_RyC_kT0^0F6!2aTWxz(@?xxYY3HB9#`{wiy{El^RwYvXL z$shZEJ66L)eT;9H6k?mXi$wFAn9V(mf1a~q5qchXBQr_y$cV}5HD83?&g$S zoDyPFa%f7?P06j$j(q*Jn3QoYBX5*u8L}Yq9?u4-mhI>Su=IBvlV1P)6ieB!FRo>D zDC>P4{%E0O(BVxd$tNR9s6?&M+)_yyx^1cjkK;1gp5&=6O;u^ER2~?OG%mJHGX3`) zJ3Z6NExgk&hDlyt$Dy+%TS9`JFRqhP(WmM~J{g_7z@Rc!=X){J#al)< z))ANXDyy01NHRydNItq&_^x$C$z@kimfF!kotVW~Y(tqjHPJUVY z=8Yd_Z@9W+c6zddoo?mH0NgvdPdZ46UtCgPsV!DiC!afX;aqLgQLJBV;isw=I=Gw; z$4TQM4P~t3#vK_YsbPZ*}FZ9aT7brb#zSh_>w?LH8p|if)53>wkLc`eTY5bqVfOa z^Nklv33Zjmk2V(LJQd_N7Rp%@i#g#nZ%$nDKN%Hrk|m!~(JToeUr>q1Bm9o<`(6L6 I@A*rA0z&@rnE(I) diff --git a/config.ini b/config.ini index dd03e28..dcddbc0 100644 --- a/config.ini +++ b/config.ini @@ -1,12 +1,6 @@ [DEFAULT] NET = testnet -DB_NAME = tree.db -ROOT_ADDRESS = FHQ5rPqqMZT4r3oqpecM54E7tieQoJwZTK -INIT_TOKEN_NO = 21000000 FLO_CLI_PATH = /usr/local/bin/flo-cli -START_BLOCK = 461275 - -;if 'ranchimalltest#100' is on blockchain, set value to 'ranchimalltest' -PREFIX = ranchimall +START_BLOCK = 489130 diff --git a/databases/teega.db b/databases/teega.db deleted file mode 100644 index 1dc57ab8853b322ebf8df9a9678805be6a2f3e19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24576 zcmeI)O>^5s7yw|&A8~Brmz9-uKzf;gu}6n>E8FNVn`h zc9Fom&#)}>IYJD>r08pfzQ!$1JF)Q&-Lg~tySgc6@57(c^k{tTkjZ?z{zLlLwclwM z8VG;@2!H?xfB*=900@AG2F>npb+(b|0R{2nF1p}0xrJk#2 z*f3j!jw7Z@W(G7`M~~%J7kydnqHROlN$q(3SR%W%#a?X$v5n8rvz|KB{rF6*(?{mT zJFtyDwueWRsc5bf3zyIML`RjfWjdFAqHT_4{%O8aG?CriWnXPg^2MqzdFy`c?|Dy+ zo|8M)G@Cfi^y~~Uoe+02w=)C>xQBz;`l5C$cl<-Q%+*CCk>xn{D*e}3&kV=4>|ww) zitqZ9=w0z&AD@#!u$D|~##^_ozC6loW?gN%)@>i-zIAE3=q9DjH(#GNo5*IftXB?F zCNF78%^tSDIv6}OEzK%R{ic1^tteuJt5>w{*TRq+bQ}24 zD$4xug?8q;1Lw2-eU~_{N!&fXXW53ST86o2n7Xy^zT7WKQZX;)I9(EWLB)ABUlc@D z%B#9A=J{M+DGEwS5F|;@2_h$yBvt1WNhlIQ5iyU8p1@9`j)sW(MD3{3VMBWM?BcLd z;hGmG`2+r3$UlDc^tn8ghbA8)>H<$REmt6%z!Rbsiv^+xyqHteyrhB!X(mmo6oYrp=Ft^LMicGvCnkF)~~1V8`;KmY_l z00ck)1V8`;-eCc+6kBDI-WKDv7vGje%IN8IbkeBMUo5B~|2c3Z(N@Uq<&bOnebMiS zxI4S_J>_Q9kGz}o+FWjQ`g3ABX#86NHhsLCMzpwk9A&XM`}@dAq<8m|-X}}U2DR|p z&2$7)6C(6wZ7UpBSgX+; zXdnOrAOHd&00JNY0w4ea_b1@xS5_GBW3N4`LDAy6?WSsdtJUg*I1M{9347u9vS-5% zs_UT64N=Q2U0NT^s~f<9CMejgbXqBNte3ID<`&d>6{wW@k2LgP+P;$B=o mkFU`LQxq(lkQZc@EtkDIOJhB~yZ(QZMYAx^5Q}Eng#HAHAt5jT diff --git a/models.py b/models.py index 7b02965..9cd4822 100644 --- a/models.py +++ b/models.py @@ -2,6 +2,7 @@ from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, Float, String, ForeignKey Base = declarative_base() +ContractBase = declarative_base() class Extra(Base): __tablename__ = "extra" @@ -43,4 +44,12 @@ class Webtable(Base): transferDescription = Column('transferDescription', String) blockchainReference = Column('blockchainReference', String) +class ContractStructure(ContractBase): + __tablename__ = "contractstructure" + + id = Column('id', Integer, primary_key=True) + attribute = Column('attribute', String) + index = Column('index', Integer) + value = Column('value', String) + diff --git a/parsing.py b/parsing.py index 5f7d710..629c664 100644 --- a/parsing.py +++ b/parsing.py @@ -5,6 +5,7 @@ operation = None address = None amount = None + def isTransfer(text): wordlist = ['transfer','send','give'] #keep everything lowercase textList = text.split(' ') @@ -22,6 +23,31 @@ def isIncorp(text): return True return False + +def isSmartContract(text): + textList = text.split(' ') + for word in textList: + if word[-1] == '@': + return word + return False + + +def isSmartContractPay(text): + wordlist = text.split(' ') + if len(wordlist) != 2: + return False + smartContractTrigger = re.findall(r"smartContractTrigger:'.*'", text)[0].split('smartContractTrigger:')[1] + smartContractTrigger = smartContractTrigger[1:-1] + smartContractName = re.findall(r"smartContractName:.*@", text)[0].split('smartContractName:')[1] + smartContractName = smartContractName[:-1] + + if smartContractTrigger and smartContractName: + contractconditions = { 'smartContractTrigger':smartContractTrigger, 'smartContractName':smartContractName } + return contractconditions + else: + return False + + def extractOperation(text): operationList = ['send', 'transfer', 'give'] # keep everything lowercase count = 0 @@ -35,6 +61,7 @@ def extractOperation(text): return returnval +# todo pass marker to the function and support all types def extractAmount(text): count = 0 returnval = None @@ -61,6 +88,7 @@ def extractMarker(text): return word return False + def extractInitTokens(text): base_units = {'thousand':10**3 , 'million':10**6 ,'billion':10**9, 'trillion':10**12} textList = text.split(' ') @@ -74,27 +102,106 @@ def extractInitTokens(text): continue +def extractAddress(text): + textList = text.split(' ') + for word in textList: + if word[-1] == '$': + return word + return False + + +def extractContractType(text): + operationList = ['betting*'] # keep everything lowercase + count = 0 + returnval = None + for operation in operationList: + count = count + text.count(operation) + if count > 1: + return 'Too many' + if count == 1 and (returnval is None): + returnval = operation + return returnval + + +def extractContractCondition(text): + return text.split("contractcondition:")[1][1:-1] + + +def extractContractConditions(text, contracttype, marker): + rulestext = re.split('contractconditions:\s*', text)[-1] + rulelist = re.split('\d\.\s*', rulestext) + if contracttype == 'betting*': + extractedRules = {} + for rule in rulelist: + if rule=='': + continue + elif rule[:19]=='userassetcommitment': + pattern = re.compile('[^userassetcommitment="].*[^"]') + searchResult = pattern.search(rule).group(0) + extractedRules['userassetcommitment'] = searchResult.split(marker)[0] + elif rule[:17]=='smartcontractpays': + conditions = rule.split('smartcontractpays=')[1] + if conditions[0]=='"' or conditions[0]=="'" or conditions[-1]=='"' or conditions[-1]=="'": + conditionlist = conditions[1:-1].split('|') + extractedRules['smartcontractpays'] = {} + for idx, condition in enumerate(conditionlist): + extractedRules['smartcontractpays'][idx] = condition.strip() + else: + print("something is wrong with smartcontractpays conditions") + + + return extractedRules + return False + + # Combine test def parse_flodata(string): if string[0:5] == 'text:': string = string.split('text:')[1] - cleanstring = re.sub(' +', ' ', string) - cleanstring = cleanstring.lower() + nospacestring = re.sub(' +', ' ', string) + cleanstring = nospacestring.lower() + if isTransfer(cleanstring): + if isSmartContract(cleanstring): + contractname = isSmartContract(cleanstring) + marker = extractMarker(cleanstring) + operation = extractOperation(cleanstring) + amount = extractAmount(cleanstring) + contractcondition = extractContractCondition(cleanstring) + parsed_data = { 'type': 'transfer', 'transferType': 'smartContract', 'flodata': string, 'tokenIdentification': marker[:-1], + 'operation': operation, 'tokenAmount': amount, 'contractName': contractname, 'contractCondition': contractcondition} + else: + marker = extractMarker(cleanstring) + operation = extractOperation(cleanstring) + amount = extractAmount(cleanstring) + address = extractAddress(nospacestring) + parsed_data = {'type': 'transfer', 'transferType': 'token', 'flodata': string, 'tokenIdentification': marker[:-1], 'operation': operation, + 'amount': amount, 'address': address} + + elif isSmartContractPay(nospacestring): + contractConditions = isSmartContractPay(nospacestring) + parsed_data = {'type': 'smartContractPays', 'flodata': string, 'smartContractTrigger':contractConditions['smartContractTrigger'], 'smartContractName':contractConditions['smartContractName']} + + elif isSmartContract(cleanstring): + contractname = isSmartContract(cleanstring) marker = extractMarker(cleanstring) - operation = extractOperation(cleanstring) - amount = extractAmount(cleanstring) - parsed_data = {'type': 'transfer', 'flodata': string, 'marker': marker, 'operation': operation, - 'amount': amount} + contracttype = extractContractType(cleanstring) + contractaddress = extractAddress(nospacestring) + contractconditions = extractContractConditions(cleanstring, 'betting*', marker) + parsed_data = {'type': 'smartContractIncorporation', 'contractType': contracttype[:-1], 'tokenIdentification': marker[:-1], 'contractName': contractname[:-1], 'contractAddress':contractaddress[:-1], 'flodata': string, 'contractConditions': contractconditions} + elif isIncorp(cleanstring): incMarker = extractMarker(cleanstring) initTokens = extractInitTokens(cleanstring) - parsed_data = {'type': 'incorporation', 'flodata': string, 'marker': incMarker, 'initTokens': initTokens} + parsed_data = {'type': 'tokenIncorporation', 'flodata': string, 'tokenIdentification': incMarker[:-1], 'tokenAmount': initTokens} + else: parsed_data = {'type': 'noise'} + return parsed_data - return parsed_data \ No newline at end of file +result = parse_flodata('create electionbetting@ at address oM4pCYsbT5xg7bqLNCTXmoADUs6zBwLfXi$ of type betting* using the token rmt# with contractconditions: 1. userAssetCommitment="1rmt" 2. smartContractPays="NAMO=WIN | NAMO=LOOSE 3. expirydate=1553040000"') +print(result) \ No newline at end of file diff --git a/.app.py.swp b/smartContracts/electionbetting.db similarity index 59% rename from .app.py.swp rename to smartContracts/electionbetting.db index 63d64cef70ec041c619303c662c867f92ad5400d..dfe0768d499e0149f30928b32615970434f70c3c 100644 GIT binary patch literal 8192 zcmeI%!EVzq7yw|WtXo=%1_>cRWztUoX=Bi-D;$PYX`w`;EKN&VHg@3PHZHShlFD}I zI&m4i0B^yShu~Rw4xFwXf+6jU^jk^n*uNe7yZuV{wZ|2MVIm@`phm6{!yr2Vgpl0) z*43;S`nfc3XI1uoS;>*go$pt5lwrLh`oe+&D1ZVefC4Ch0w{n2D1ZVefCB%yz-i4` zxw*M%e7>P*f5Zk!tOOk>sYE(ZskqpYYXq*-bD`%v_guIT4{OB&525Mz++8;Szug1> zjpsdrVu30pct6#7`@R!2UOGY6Y4bQ_$M#}E*7cE&(m!H4L9^uqhp^`!!Ws|Pi|bi# zZkD!*_0#%ceY3`;ucfr~R(D`Q0Te(16hHwKKmim$0Te(16hMJYVAaf%^}=0t%#}`E zL#}ud%a}$iD6f>E94GM!LoU+6QXc>I0`^v`MgYTX|9z@wP_5_*OgPzQ8|Ry? z+f_ZyhOG+7hzdP&mhyM#RMu_ZX|?MIO&>nNtm(DeUDtlPlqVZzdy(xsXJ@$d2<0o8 r*!9_7o1uo{Lq4FHh~5F@^5lWJu~^fm5&O&QmXSr27ZE*8F_-uSg?rxh literal 12288 zcmeI&OG?8)7zgmFD>pvSogj|7Xe({g$EFAc7e#bY7t-oR2-9ZLhUV4Dq(u=ufp_o- zdI-@Qcm;2vUqao8&~B^$fj^VSd>_dVvIt4Hd~w?1^-`J9SZ8eO^Y&_I`G9>i85=ue zIZTev7-0|=gJ{MgI(?TmG@5d3oD07&SRnZcUB!OR zlHIu9XscM}NrTf+Qpd{Y*%RryL4jWe%C&a0%#t>b2EoMigc?ef%OA3%v`G+anadhk zs-IClNIII6q~WjS)Q&g!u`8ls&NO}DNz^JwHcTGp7Y0*~9tB0fEnRut&M PeM>6(&E5-Lp(XnQ$AWeF diff --git a/databases/rmt.db b/tokens/rmt.db similarity index 98% rename from databases/rmt.db rename to tokens/rmt.db index f12fe0663bb52b0d6ce2f6e2217b3468bf412404..5c9835238d78708f06fb0432d4d582cf03fc11aa 100644 GIT binary patch delta 80 zcmZoTz}Rqrae_1>+e8^>Mz)O!OZ3?o`7bl@U*0SzaFSnFn~{|vkb@;Z$->1g$}v4F kt;#tdG&8igqQo+#xY9DRs5qiH-O|q@ozWrRVUd6W0Kz&LKmY&$ delta 28 kcmZoTz}Rqrae_1>>qHr6M%Il9OY|4B2q= commentTransferAmount: @@ -216,6 +233,8 @@ def startWorking(transaction_data, parsed_data): session.commit() session.close() + + # Read configuration config = configparser.ConfigParser() config.read('config.ini') @@ -255,6 +274,7 @@ response = subprocess.check_output(string, shell=True) current_index = json.loads(response.decode("utf-8")) print("current_block_height : " + str(current_index)) + for blockindex in range( startblock, current_index ): print(blockindex) @@ -279,5 +299,4 @@ for blockindex in range( startblock, current_index ): if parsed_data['type'] != 'noise': print(blockindex) print(parsed_data['type']) - startWorking(transaction_data, parsed_data) - + startWorking(transaction_data, parsed_data) \ No newline at end of file diff --git a/tracktokens-smartcontract.py b/tracktokens-smartcontract.py new file mode 100644 index 0000000..eb144f4 --- /dev/null +++ b/tracktokens-smartcontract.py @@ -0,0 +1,198 @@ +import requests +import json +import sqlite3 +import argparse +import configparser +import subprocess +import sys +import parsing +import os +import shutil +from sqlalchemy.orm import sessionmaker, relationship +from sqlalchemy import create_engine, func, desc +from models import Extra, TransactionHistory, TransactionTable, TransferLogs, Webtable, Base, ContractStructure, ContractBase + + +def startWorking(transaction_data, parsed_data): + + # Do the necessary checks for the inputs and outputs + + # Create inputlist and outputlist + inputlist = [] + querylist = [] + + for obj in transaction_data["vin"]: + querylist.append([obj["txid"], obj["vout"]]) + + if len(querylist) > 1: + print("Program has detected more than one input address ") + print("This transaction will be discarded") + return + + inputval = 0 + inputadd = '' + + for query in querylist: + string = "{} getrawtransaction {} 1".format(localapi, str(query[0])) + response = subprocess.check_output(string, shell=True) + content = json.loads(response.decode("utf-8")) + + for objec in content["vout"]: + if objec["n"] == query[1]: + inputadd = objec["scriptPubKey"]["addresses"][0] + inputval = inputval + objec["value"] + + inputlist = [[inputadd, inputval]] + + if len(transaction_data["vout"]) > 2: + print("Program has detected more than one output address ") + print("This transaction will be discarded") + return + + outputlist = [] + for obj in transaction_data["vout"]: + if obj["scriptPubKey"]["type"] == "pubkeyhash": + if inputlist[0][0] == obj["scriptPubKey"]["addresses"][0]: + continue + + outputlist.append([obj["scriptPubKey"]["addresses"][0], obj["value"]]) + + print("\n\nInput List") + print(inputlist) + print("\nOutput List") + print(outputlist) + + + # Do operations as per the type of transaction + if parsed_data['type'] == 'transfer': + print('Found a transaction of the type transfer') + + if parsed_data['transferType'] == 'smartContract': + print('do something') + + elif parsed_data['transferType'] == 'token': + engine = create_engine('sqlite:///tokens/{}.db'.format(parsed_data['tokenIdentification']), echo=True) + Base.metadata.create_all(bind=engine) + session = sessionmaker(bind=engine)() + availableTokens = session.query(func.sum(TransactionTable.transferBalance)).filter_by(address=inputlist[0][0]).all()[0][0] + commentTransferAmount = parsed_data['amount'] + if availableTokens is None: + print("The input address dosen't exist in our database ") + + elif availableTokens < commentTransferAmount: + print( + "\nThe transfer amount passed in the comments is more than the user owns\nThis transaction will be discarded\n") + return + + elif availableTokens >= commentTransferAmount: + print("well i've reached here") + + elif parsed_data['type'] == 'tokenIncorporation': + if not os.path.isfile('./tokens/{}.db'.format(parsed_data['tokenIdentification'])): + engine = create_engine('sqlite:///tokens/{}.db'.format(parsed_data['tokenIdentification']), echo=True) + Base.metadata.create_all(bind=engine) + session = sessionmaker(bind=engine)() + session.add(TransactionTable(address=outputlist[0][0], parentid=0, transferBalance=parsed_data['tokenAmount'])) + session.commit() + session.close() + else: + print('Transaction rejected as the token with same name has already been incorporated') + + elif parsed_data['type'] == 'smartContractIncorporation': + if not os.path.isfile('./smartContracts/{}.db'.format(parsed_data['contractName'])): + if parsed_data['contractType'] == 'betting': + print("Smart contract is of the type betting") + if parsed_data['contractName'] is not None and parsed_data['contractAddress'] == outputlist[0][0]: + print("Hey I have passed the first test for smart contract") + engine = create_engine('sqlite:///smartContracts/{}.db'.format(parsed_data['contractName']), echo=True) + ContractBase.metadata.create_all(bind=engine) + session = sessionmaker(bind=engine)() + session.add(ContractStructure(attribute='contractType', index=0, value=parsed_data['contractType'])) + session.add(ContractStructure(attribute='contractName', index=0, value=parsed_data['contractName'])) + session.add( + ContractStructure(attribute='tokenIdentification', index=0, value=parsed_data['tokenIdentification'])) + session.add( + ContractStructure(attribute='contractAddress', index=0, value=parsed_data['contractAddress'][:-1])) + session.add( + ContractStructure(attribute='flodata', index=0, + value=parsed_data['flodata'])) + session.add( + ContractStructure(attribute='userassetcommitment', index=0, + value=parsed_data['contractConditions']['userassetcommitment'].split(parsed_data['tokenIdentification'][:-1])[0])) + for key, value in parsed_data['contractConditions']['smartcontractpays'].items(): + session.add(ContractStructure(attribute='exitconditions', index=key, value=value)) + session.commit() + session.close() + else: + print('Transaction rejected as a smartcontract with same name has already been incorporated') + elif parsed_data['type'] == 'smartContractPays': + print('Found a transaction of the type smartContractPays') + + + + +# Read configuration +config = configparser.ConfigParser() +config.read('config.ini') + +# Read command line arguments +parser = argparse.ArgumentParser(description='Script tracks RMT using FLO data on the FLO blockchain - https://flo.cash') +parser.add_argument('-r', '--reset', nargs='?', const=1, type=int, help='Purge existing db and rebuild it') +args = parser.parse_args() + +# Assignment the flo-cli command +if config['DEFAULT']['NET'] == 'mainnet': + neturl = 'https://florincoin.info/' + localapi = config['DEFAULT']['FLO_CLI_PATH'] +elif config['DEFAULT']['NET'] == 'testnet': + neturl = 'https://testnet.florincoin.info/' + localapi = '{} --testnet'.format(config['DEFAULT']['FLO_CLI_PATH']) +else: + print("NET parameter is wrong\nThe script will exit now ") + + +# Delete database and smartcontract directory if reset is set to 1 +if args.reset == 1: + apppath = os.path.dirname(os.path.realpath(__file__)) + dirpath = os.path.join(apppath, 'tokens') + shutil.rmtree(dirpath) + os.mkdir(dirpath) + dirpath = os.path.join(apppath, 'smartContracts') + shutil.rmtree(dirpath) + os.mkdir(dirpath) + + +# Read start block no +startblock = int(config['DEFAULT']['START_BLOCK']) + +# Find current block height +string = "{} getblockcount".format(localapi) +response = subprocess.check_output(string, shell=True) +current_index = json.loads(response.decode("utf-8")) +print("current_block_height : " + str(current_index)) + + +for blockindex in range( startblock, current_index ): + print(blockindex) + + # Scan every block + string = "{} getblockhash {}".format(localapi, str(blockindex)) + response = subprocess.check_output(string, shell=True) + blockhash = response.decode("utf-8") + + string = "{} getblock {}".format(localapi, str(blockhash)) + response = subprocess.check_output(string, shell=True) + blockinfo = json.loads(response.decode("utf-8")) + + # Scan every transaction + for transaction in blockinfo["tx"]: + string = "{} getrawtransaction {} 1".format(localapi, str(transaction)) + response = subprocess.check_output(string, shell=True) + transaction_data = json.loads(response.decode("utf-8")) + text = transaction_data["floData"] + + parsed_data = parsing.parse_flodata(text) + if parsed_data['type'] != 'noise': + print(blockindex) + print(parsed_data['type']) + startWorking(transaction_data, parsed_data) \ No newline at end of file