diff --git a/dapps/addNewPatient/addNewPatient.py b/dapps/addNewPatient/addNewPatient.py index 3a05867..f12b5b8 100644 --- a/dapps/addNewPatient/addNewPatient.py +++ b/dapps/addNewPatient/addNewPatient.py @@ -4,35 +4,63 @@ # root window root = tk.Tk() -root.geometry("450x450") +root.geometry("1350x450") root.resizable(False, False) root.title('Add & View Patients') # store user input +logged_in_account = tk.StringVar() doctor_account = tk.StringVar() -contract_address = tk.StringVar() +deploy_transfer_btn = tk.StringVar() +current_contract_address = tk.StringVar() +current_contract_owner = tk.StringVar() patient_address = tk.StringVar() patient_data_contract = tk.StringVar() patient_prescription_contract = tk.StringVar() - -def deploy_contract(): - - contract, address, hash, receipt = deployContracts.compile_and_deploy_contract( - contractDetailsPatientToken.abi, - contractDetailsPatientToken.bytecode, - doctor_account.get() # doctor deploys contract - ) - - variables.add_new_patient_contract_var = contract - contract_address.set(address) - set_contract_address(address) - - print("\nThe Receipt which is given after the construction transact\n", receipt, "\n") - print("The deployed machine contract", variables.add_new_patient_contract_var) - print("The deployed contracts address", contract_address.get()) - - return contract, address - +patient_to_check = tk.StringVar() + +def initial_account_load(): + set_entry_value(logged_in_entry, deployContracts.w3.eth.default_account) + +def deploy_transfer_contract(): + + if deploy_transfer_btn.get() == "Deploy Contract": + + deployContracts.change_default_account(doctor_account.get()) + + contract, address, hash, receipt = deployContracts.compile_and_deploy_contract( + contractDetailsPatientToken.abi, + contractDetailsPatientToken.bytecode, + doctor_account.get() # doctor deploys contract + ) + + variables.add_new_patient_contract_var = contract + current_contract_address.set(address) + set_contract_address(address) + + print("\nThe Receipt which is given after the construction transact\n", receipt, "\n") + print("The deployed machine contract", variables.add_new_patient_contract_var) + print("The deployed contracts address", current_contract_address.get()) + + set_deploy_transfer_btn_name("Transfer Contract Ownership") + + set_entry_value(current_owner_entry, doctor_account.get()) + + return contract, address + + else: + + contractInteraction.transfer_contract_ownership( + variables.add_new_patient_contract_var, + doctor_account.get() + ) + + new_logged_in_account = deployContracts.change_default_account(doctor_account.get()) + + set_entry_value(logged_in_entry, new_logged_in_account) + + current_contract_owner.set(new_logged_in_account) + set_entry_value(current_owner_entry, current_contract_owner.get()) def add_new_patient(): @@ -55,6 +83,24 @@ def add_new_patient(): return +def get_patient_status(): + + exists, data_con, prescipt_con = contractInteraction.get_patient( + variables.add_new_patient_contract_var, + patient_to_check.get() + ) + + print("PATIENT EXISTS", exists) + print("CONTRACT 1", data_con) + print("CONTRACT 2", prescipt_con) + + if exists: + set_entry_value(patient_status_entry, "Patient Assigned To Doctor") + else: + set_entry_value(patient_status_entry, "No Record Of Patient With Doctor") + + return + # show accounts in terminal when launched print("\nList of accounts:") deployContracts.show_accounts() @@ -62,72 +108,126 @@ def add_new_patient(): ## Tkinter ## -# deploy contract frame -deploy = Frame(root) -deploy.pack(padx=10, pady=10, fill='x', expand=True) -# user account -account_label = Label(deploy, text="Enter Doctor Account") +### User Interaction -> Left Side ### + +# user interaction frame +user_frame = Frame(root, width=450) +user_frame.pack(side=LEFT, fill='x', padx=10, pady=10, expand=True) + +# target account -> delpoy contract +account_label = Label(user_frame, text="Doctor Account That Will Own The Contract:") account_label.pack(fill='x', expand=True) -account_entry = Entry(deploy, textvariable=doctor_account) +account_entry = Entry(user_frame, textvariable=doctor_account) account_entry.pack(fill='x', expand=True) # deploy contract button deploy_btn = Button( - deploy, - text="Deploy Contract", - command=deploy_contract + user_frame, + textvariable=deploy_transfer_btn, + command=deploy_transfer_contract ) deploy_btn.pack(fill='x', expand=True, pady=10) # add patient frame -patient = Frame(root) -patient.pack(padx=10, pady=10, fill='x', expand=True) +add_patient_frame = Frame(user_frame) +add_patient_frame.pack(pady=10, fill='x', expand=True) # patient account -account_label = Label(patient, text="Enter patient Account") -account_label.pack(fill='x', expand=True) +target_account_label = Label(add_patient_frame, text="Enter Patient Account To Add") +target_account_label.pack(pady=10, fill='x', expand=True) -account_entry = Entry(patient, textvariable=patient_address) -account_entry.pack(fill='x', expand=True) +target_account_entry = Entry(add_patient_frame, textvariable=patient_address) +target_account_entry.pack(fill='x', expand=True) -# data contract of patient address -account_label = Label(patient, text="Enter Data Contract Address") -account_label.pack(fill='x', expand=True) +# patients data contract address +token_transferring_label = Label(add_patient_frame, text="Enter Patient Data Contract") +token_transferring_label.pack(fill='x', expand=True) -account_entry = Entry(patient, textvariable=patient_data_contract) -account_entry.pack(fill='x', expand=True) +token_transferring_entry = Entry(add_patient_frame, textvariable=patient_data_contract) +token_transferring_entry.pack(fill='x', expand=True) -# prescription contract of patient address -account_label = Label(patient, text="Enter Prescription Contract Address") -account_label.pack(fill='x', expand=True) +# patients prescription contract address +token_transferring_label = Label(add_patient_frame, text="Enter Patient Prescription Contract") +token_transferring_label.pack(fill='x', expand=True) -account_entry = Entry(patient, textvariable=patient_prescription_contract) -account_entry.pack(fill='x', expand=True) +token_transferring_entry = Entry(add_patient_frame, textvariable=patient_prescription_contract) +token_transferring_entry.pack(fill='x', expand=True) -# add patient button button = Button( - patient, - text='Add New Patient', - command=add_new_patient) + add_patient_frame, + text='Assign Patient To Doctor', + command=add_new_patient + ) button.pack(fill='x', expand=True, pady=10) -# details frame -details_frame = Frame(root) -details_frame.pack(padx=10, pady=10, fill='x', expand=True) +### Logged In User Account ### + +# logged in user frame +logged_in_frame = Frame(root, width=400) +logged_in_frame.pack(side=LEFT, fill='x', padx=10, pady=10, expand=True) + +#logged in +logged_in_label = Label(logged_in_frame, text="Account Logged In:") +logged_in_label.pack(side=TOP, expand=True) + +logged_in_entry = Entry(logged_in_frame, textvariable=logged_in_account.get()) +logged_in_entry.pack(side=TOP, fill='x', pady=10, expand=True) + # contract label -contract_label = Label(details_frame, text="Current Contract Address:") +contract_label = Label(logged_in_frame, text="Current Contract Address:") contract_label.pack(fill='x', expand=True) # contract address -current_contract = Entry(details_frame) +current_contract = Entry(logged_in_frame) current_contract.pack(fill='x', expand=True) +# current contract owner +current_owner_label = Label(logged_in_frame,text="Current Owner") +current_owner_label.pack(fill='x', expand=True) + +current_owner_entry = Entry(logged_in_frame, textvariable=current_contract_owner) +current_owner_entry.pack(fill='x', expand=True) + +# check patient frame +check_patient_frame = Frame(root) +check_patient_frame.pack(side=LEFT, padx=10, pady=10, fill='x', expand=TRUE) + +# check patient -> patient account +check_patient_label = Label(check_patient_frame, text="Patient Account:") +check_patient_label.pack(fill='x', expand=True) + +check_patient_entry = Entry(check_patient_frame, textvariable=patient_to_check) +check_patient_entry.pack(fill='x', expand=True) + +button = Button( + check_patient_frame, + text='Check Patient Belongs to Doctor', + command=get_patient_status + ) +button.pack(fill='x', expand=True, pady=10) + +# check patient -> patient exists +patient_status_label = Label(check_patient_frame, text="Patient Status:") +patient_status_label.pack(fill='x', expand=True) + +patient_status_entry = Entry(check_patient_frame) +patient_status_entry.pack(fill='x', expand=True) + def set_contract_address(address): current_contract.delete(0, END) current_contract.insert(0, address) - + +def set_deploy_transfer_btn_name(btn_text): + deploy_transfer_btn.set(btn_text) + +def set_entry_value(entry, value): + entry.delete(0, END) + entry.insert(0, value) + +set_deploy_transfer_btn_name("Deploy Contract") +initial_account_load() root.mainloop() \ No newline at end of file diff --git a/dapps/fromContract/getMachines.py b/dapps/fromContract/getMachines.py new file mode 100644 index 0000000..0e0ae72 --- /dev/null +++ b/dapps/fromContract/getMachines.py @@ -0,0 +1,22 @@ +from library import deployContracts, variables, contractInteraction, getContracts + +from library import contractDetailsMachine as machine_cd +from library import contractDetailsMachineData as data_cd +from library import contractDetailsPatientToken as patient_cd +from library import contractDetailsPrescription as prescription_cd + + +def get_all_contract_address_on_block(): + + + contract_addresses = getContracts.get_contracts("machine", machine_cd) + + #print("\n\nADDRESSES", contract_addresses) + + #getContracts.check_contracts(contract_addresses) + + return + + + +get_all_contract_address_on_block() \ No newline at end of file diff --git a/library/contractDetailsPatientToken.py b/library/contractDetailsPatientToken.py index 492a208..75a263b 100644 --- a/library/contractDetailsPatientToken.py +++ b/library/contractDetailsPatientToken.py @@ -1,29 +1,6 @@ import json abi = json.loads("""[ - { - "inputs": [ - { - "internalType": "address", - "name": "patient", - "type": "address" - }, - { - "internalType": "address", - "name": "dataContract", - "type": "address" - }, - { - "internalType": "address", - "name": "prescriptionContract", - "type": "address" - } - ], - "name": "addNewPatient", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [], "stateMutability": "nonpayable", @@ -79,24 +56,6 @@ "name": "ApprovalForAll", "type": "event" }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "anonymous": false, "inputs": [ @@ -107,7 +66,7 @@ "type": "bool" } ], - "name": "ContractOwnershipChanged", + "name": "ContractOwnershipTransfered", "type": "event" }, { @@ -149,113 +108,55 @@ "type": "event" }, { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { + "anonymous": false, "inputs": [ { + "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { + "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { + "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], - "name": "safeTransferFrom", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "name": "Transfer", + "type": "event" }, { "inputs": [ { "internalType": "address", - "name": "from", + "name": "patient", "type": "address" }, { "internalType": "address", - "name": "to", + "name": "dataContract", "type": "address" }, - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "safeTransferFrom", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ { "internalType": "address", - "name": "operator", + "name": "prescriptionContract", "type": "address" - }, - { - "internalType": "bool", - "name": "approved", - "type": "bool" } ], - "name": "setApprovalForAll", + "name": "addNewPatient", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "anonymous": false, "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, { "internalType": "address", "name": "to", @@ -267,20 +168,7 @@ "type": "uint256" } ], - "name": "transferFrom", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", + "name": "approve", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -448,6 +336,82 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -498,7 +462,43 @@ ], "stateMutability": "view", "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" } ]""") -bytecode = "60806040526000600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200005357600080fd5b506040518060400160405280600c81526020017f50617469656e74546f6b656e00000000000000000000000000000000000000008152506040518060400160405280600381526020017f50544b00000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000d8929190620001f9565b508060019080519060200190620000f1929190620001f9565b50505062000114620001086200012b60201b60201c565b6200013360201b60201c565b62000125336200013360201b60201c565b6200030e565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200020790620002a9565b90600052602060002090601f0160209004810192826200022b576000855562000277565b82601f106200024657805160ff191683800117855562000277565b8280016001018555821562000277579182015b828111156200027657825182559160200191906001019062000259565b5b5090506200028691906200028a565b5090565b5b80821115620002a55760008160009055506001016200028b565b5090565b60006002820490506001821680620002c257607f821691505b60208210811415620002d957620002d8620002df565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b612af2806200031e6000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c80638da5cb5b116100ad578063c87b56dd11610071578063c87b56dd14610330578063c8f0096a14610360578063e87ab7fe14610390578063e985e9c5146103ac578063f2fde38b146103dc5761012c565b80638da5cb5b1461028b57806395d89b41146102a9578063a22cb465146102c7578063b5368e20146102e3578063b88d4fde146103145761012c565b806342842e0e116100f457806342842e0e146101e75780636352211e1461020357806366fd838c1461023357806370a0823114610251578063715018a6146102815761012c565b806301ffc9a71461013157806306fdde0314610161578063081812fc1461017f578063095ea7b3146101af57806323b872dd146101cb575b600080fd5b61014b60048036038101906101469190611f26565b6103f8565b604051610158919061228f565b60405180910390f35b6101696104da565b60405161017691906122aa565b60405180910390f35b61019960048036038101906101949190611f80565b61056c565b6040516101a691906121ff565b60405180910390f35b6101c960048036038101906101c49190611ee6565b6105b2565b005b6101e560048036038101906101e09190611dd0565b6106ca565b005b61020160048036038101906101fc9190611dd0565b61072a565b005b61021d60048036038101906102189190611f80565b61074a565b60405161022a91906121ff565b60405180910390f35b61023b6107d1565b604051610248919061240c565b60405180910390f35b61026b60048036038101906102669190611d10565b6107d7565b604051610278919061240c565b60405180910390f35b61028961088f565b005b6102936108a3565b6040516102a091906121ff565b60405180910390f35b6102b16108cd565b6040516102be91906122aa565b60405180910390f35b6102e160048036038101906102dc9190611ea6565b61095f565b005b6102fd60048036038101906102f89190611d10565b610975565b60405161030b92919061221a565b60405180910390f35b61032e60048036038101906103299190611e23565b610a9e565b005b61034a60048036038101906103459190611f80565b610b00565b60405161035791906122aa565b60405180910390f35b61037a60048036038101906103759190611d10565b610b68565b604051610387919061228f565b60405180910390f35b6103aa60048036038101906103a59190611d7d565b610c1e565b005b6103c660048036038101906103c19190611d3d565b610d9f565b6040516103d3919061228f565b60405180910390f35b6103f660048036038101906103f19190611d10565b610e33565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104c357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104d357506104d282610e7f565b5b9050919050565b6060600080546104e990612600565b80601f016020809104026020016040519081016040528092919081815260200182805461051590612600565b80156105625780601f1061053757610100808354040283529160200191610562565b820191906000526020600020905b81548152906001019060200180831161054557829003601f168201915b5050505050905090565b600061057782610ee9565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105bd8261074a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561062e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610625906123cc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661064d610f34565b73ffffffffffffffffffffffffffffffffffffffff16148061067c575061067b81610676610f34565b610d9f565b5b6106bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b2906123ec565b60405180910390fd5b6106c58383610f3c565b505050565b6106db6106d5610f34565b82610ff5565b61071a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610711906122cc565b60405180910390fd5b61072583838361108a565b505050565b61074583838360405180602001604052806000815250610a9e565b505050565b60008061075683611384565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156107c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107bf906123ac565b60405180910390fd5b80915050919050565b60075481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f9061236c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108976113c1565b6108a1600061143f565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546108dc90612600565b80601f016020809104026020016040519081016040528092919081815260200182805461090890612600565b80156109555780601f1061092a57610100808354040283529160200191610955565b820191906000526020600020905b81548152906001019060200180831161093857829003601f168201915b5050505050905090565b61097161096a610f34565b8383611505565b5050565b6000806109806113c1565b60005b600980549050811015610a97578373ffffffffffffffffffffffffffffffffffffffff16600982815481106109bb576109ba612739565b5b906000526020600020906003020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610a8457600060098281548110610a1f57610a1e612739565b5b906000526020600020906003020190508060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16935093505050610a99565b8080610a8f90612663565b915050610983565b505b915091565b610aaf610aa9610f34565b83610ff5565b610aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae5906122cc565b60405180910390fd5b610afa84848484611672565b50505050565b6060610b0b82610ee9565b6000610b156116ce565b90506000815111610b355760405180602001604052806000815250610b60565b80610b3f846116e5565b604051602001610b509291906121db565b6040516020818303038152906040525b915050919050565b6000610b726113c1565b6000805b600980549050811015610c14578373ffffffffffffffffffffffffffffffffffffffff1660098281548110610bae57610bad612739565b5b906000526020600020906003020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610c0157600191505b8080610c0c90612663565b915050610b76565b5080915050919050565b610c266113c1565b6001600754610c3591906124c0565b600781905550600960405180606001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610e3b6113c1565b610e448161143f565b7f05654f36e2550343773cc40980261000be3091f4642ecb17b89d3fc29d3aec816001604051610e74919061228f565b60405180910390a150565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610ef2816117bd565b610f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f28906123ac565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610faf8361074a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806110018361074a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061104357506110428185610d9f565b5b8061108157508373ffffffffffffffffffffffffffffffffffffffff166110698461056c565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166110aa8261074a565b73ffffffffffffffffffffffffffffffffffffffff1614611100576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f79061230c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611170576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111679061232c565b60405180910390fd5b61117d83838360016117fe565b8273ffffffffffffffffffffffffffffffffffffffff1661119d8261074a565b73ffffffffffffffffffffffffffffffffffffffff16146111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea9061230c565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461137f8383836001611924565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6113c9610f34565b73ffffffffffffffffffffffffffffffffffffffff166113e76108a3565b73ffffffffffffffffffffffffffffffffffffffff161461143d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114349061238c565b60405180910390fd5b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156b9061234c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611665919061228f565b60405180910390a3505050565b61167d84848461108a565b6116898484848461192a565b6116c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bf906122ec565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b6060600060016116f484611ac1565b01905060008167ffffffffffffffff81111561171357611712612768565b5b6040519080825280601f01601f1916602001820160405280156117455781602001600182028036833780820191505090505b509050600082602001820190505b6001156117b2578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161179c5761179b6126db565b5b04945060008514156117ad576117b2565b611753565b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166117df83611384565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600181111561191e57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146118925780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461188a9190612516565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461191d5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461191591906124c0565b925050819055505b5b50505050565b50505050565b600061194b8473ffffffffffffffffffffffffffffffffffffffff16611c14565b15611ab4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611974610f34565b8786866040518563ffffffff1660e01b81526004016119969493929190612243565b602060405180830381600087803b1580156119b057600080fd5b505af19250505080156119e157506040513d601f19601f820116820180604052508101906119de9190611f53565b60015b611a64573d8060008114611a11576040519150601f19603f3d011682016040523d82523d6000602084013e611a16565b606091505b50600081511415611a5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a53906122ec565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611ab9565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611b1f577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611b1557611b146126db565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611b5c576d04ee2d6d415b85acef81000000008381611b5257611b516126db565b5b0492506020810190505b662386f26fc100008310611b8b57662386f26fc100008381611b8157611b806126db565b5b0492506010810190505b6305f5e1008310611bb4576305f5e1008381611baa57611ba96126db565b5b0492506008810190505b6127108310611bd9576127108381611bcf57611bce6126db565b5b0492506004810190505b60648310611bfc5760648381611bf257611bf16126db565b5b0492506002810190505b600a8310611c0b576001810190505b80915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000611c4a611c458461244c565b612427565b905082815260208101848484011115611c6657611c6561279c565b5b611c718482856125be565b509392505050565b600081359050611c8881612a60565b92915050565b600081359050611c9d81612a77565b92915050565b600081359050611cb281612a8e565b92915050565b600081519050611cc781612a8e565b92915050565b600082601f830112611ce257611ce1612797565b5b8135611cf2848260208601611c37565b91505092915050565b600081359050611d0a81612aa5565b92915050565b600060208284031215611d2657611d256127a6565b5b6000611d3484828501611c79565b91505092915050565b60008060408385031215611d5457611d536127a6565b5b6000611d6285828601611c79565b9250506020611d7385828601611c79565b9150509250929050565b600080600060608486031215611d9657611d956127a6565b5b6000611da486828701611c79565b9350506020611db586828701611c79565b9250506040611dc686828701611c79565b9150509250925092565b600080600060608486031215611de957611de86127a6565b5b6000611df786828701611c79565b9350506020611e0886828701611c79565b9250506040611e1986828701611cfb565b9150509250925092565b60008060008060808587031215611e3d57611e3c6127a6565b5b6000611e4b87828801611c79565b9450506020611e5c87828801611c79565b9350506040611e6d87828801611cfb565b925050606085013567ffffffffffffffff811115611e8e57611e8d6127a1565b5b611e9a87828801611ccd565b91505092959194509250565b60008060408385031215611ebd57611ebc6127a6565b5b6000611ecb85828601611c79565b9250506020611edc85828601611c8e565b9150509250929050565b60008060408385031215611efd57611efc6127a6565b5b6000611f0b85828601611c79565b9250506020611f1c85828601611cfb565b9150509250929050565b600060208284031215611f3c57611f3b6127a6565b5b6000611f4a84828501611ca3565b91505092915050565b600060208284031215611f6957611f686127a6565b5b6000611f7784828501611cb8565b91505092915050565b600060208284031215611f9657611f956127a6565b5b6000611fa484828501611cfb565b91505092915050565b611fb68161254a565b82525050565b611fc58161255c565b82525050565b6000611fd68261247d565b611fe08185612493565b9350611ff08185602086016125cd565b611ff9816127ab565b840191505092915050565b600061200f82612488565b61201981856124a4565b93506120298185602086016125cd565b612032816127ab565b840191505092915050565b600061204882612488565b61205281856124b5565b93506120628185602086016125cd565b80840191505092915050565b600061207b602d836124a4565b9150612086826127bc565b604082019050919050565b600061209e6032836124a4565b91506120a98261280b565b604082019050919050565b60006120c16025836124a4565b91506120cc8261285a565b604082019050919050565b60006120e46024836124a4565b91506120ef826128a9565b604082019050919050565b60006121076019836124a4565b9150612112826128f8565b602082019050919050565b600061212a6029836124a4565b915061213582612921565b604082019050919050565b600061214d6020836124a4565b915061215882612970565b602082019050919050565b60006121706018836124a4565b915061217b82612999565b602082019050919050565b60006121936021836124a4565b915061219e826129c2565b604082019050919050565b60006121b6603d836124a4565b91506121c182612a11565b604082019050919050565b6121d5816125b4565b82525050565b60006121e7828561203d565b91506121f3828461203d565b91508190509392505050565b60006020820190506122146000830184611fad565b92915050565b600060408201905061222f6000830185611fad565b61223c6020830184611fad565b9392505050565b60006080820190506122586000830187611fad565b6122656020830186611fad565b61227260408301856121cc565b81810360608301526122848184611fcb565b905095945050505050565b60006020820190506122a46000830184611fbc565b92915050565b600060208201905081810360008301526122c48184612004565b905092915050565b600060208201905081810360008301526122e58161206e565b9050919050565b6000602082019050818103600083015261230581612091565b9050919050565b60006020820190508181036000830152612325816120b4565b9050919050565b60006020820190508181036000830152612345816120d7565b9050919050565b60006020820190508181036000830152612365816120fa565b9050919050565b600060208201905081810360008301526123858161211d565b9050919050565b600060208201905081810360008301526123a581612140565b9050919050565b600060208201905081810360008301526123c581612163565b9050919050565b600060208201905081810360008301526123e581612186565b9050919050565b60006020820190508181036000830152612405816121a9565b9050919050565b600060208201905061242160008301846121cc565b92915050565b6000612431612442565b905061243d8282612632565b919050565b6000604051905090565b600067ffffffffffffffff82111561246757612466612768565b5b612470826127ab565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006124cb826125b4565b91506124d6836125b4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561250b5761250a6126ac565b5b828201905092915050565b6000612521826125b4565b915061252c836125b4565b92508282101561253f5761253e6126ac565b5b828203905092915050565b600061255582612594565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156125eb5780820151818401526020810190506125d0565b838111156125fa576000848401525b50505050565b6000600282049050600182168061261857607f821691505b6020821081141561262c5761262b61270a565b5b50919050565b61263b826127ab565b810181811067ffffffffffffffff8211171561265a57612659612768565b5b80604052505050565b600061266e826125b4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156126a1576126a06126ac565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b612a698161254a565b8114612a7457600080fd5b50565b612a808161255c565b8114612a8b57600080fd5b50565b612a9781612568565b8114612aa257600080fd5b50565b612aae816125b4565b8114612ab957600080fd5b5056fea2646970667358221220ce47e925698b3b5482ecd7c16f89d3b9d8f9f975bcbecb210e1f517a4cae236464736f6c63430008070033" +bytecode = "60806040526000600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200005357600080fd5b506040518060400160405280600c81526020017f50617469656e74546f6b656e00000000000000000000000000000000000000008152506040518060400160405280600381526020017f50544b00000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000d8929190620001f9565b508060019080519060200190620000f1929190620001f9565b50505062000114620001086200012b60201b60201c565b6200013360201b60201c565b62000125336200013360201b60201c565b6200030e565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200020790620002a9565b90600052602060002090601f0160209004810192826200022b576000855562000277565b82601f106200024657805160ff191683800117855562000277565b8280016001018555821562000277579182015b828111156200027657825182559160200191906001019062000259565b5b5090506200028691906200028a565b5090565b5b80821115620002a55760008160009055506001016200028b565b5090565b60006002820490506001821680620002c257607f821691505b60208210811415620002d957620002d8620002df565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6128ee806200031e6000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c80638da5cb5b116100ad578063c87b56dd11610071578063c87b56dd14610330578063c8f0096a14610360578063e87ab7fe14610390578063e985e9c5146103ac578063f2fde38b146103dc5761012c565b80638da5cb5b1461028b57806395d89b41146102a9578063a22cb465146102c7578063b5368e20146102e3578063b88d4fde146103145761012c565b806342842e0e116100f457806342842e0e146101e75780636352211e1461020357806366fd838c1461023357806370a0823114610251578063715018a6146102815761012c565b806301ffc9a71461013157806306fdde0314610161578063081812fc1461017f578063095ea7b3146101af57806323b872dd146101cb575b600080fd5b61014b60048036038101906101469190611cc0565b6103f8565b6040516101589190612029565b60405180910390f35b6101696104da565b6040516101769190612044565b60405180910390f35b61019960048036038101906101949190611d1a565b61056c565b6040516101a69190611f99565b60405180910390f35b6101c960048036038101906101c49190611c80565b6105b2565b005b6101e560048036038101906101e09190611b6a565b6106ca565b005b61020160048036038101906101fc9190611b6a565b61072a565b005b61021d60048036038101906102189190611d1a565b61074a565b60405161022a9190611f99565b60405180910390f35b61023b6107fc565b60405161024891906121a6565b60405180910390f35b61026b60048036038101906102669190611aaa565b610802565b60405161027891906121a6565b60405180910390f35b6102896108ba565b005b6102936108ce565b6040516102a09190611f99565b60405180910390f35b6102b16108f8565b6040516102be9190612044565b60405180910390f35b6102e160048036038101906102dc9190611c40565b61098a565b005b6102fd60048036038101906102f89190611aaa565b6109a0565b60405161030b929190611fb4565b60405180910390f35b61032e60048036038101906103299190611bbd565b610ac9565b005b61034a60048036038101906103459190611d1a565b610b2b565b6040516103579190612044565b60405180910390f35b61037a60048036038101906103759190611aaa565b610b93565b6040516103879190612029565b60405180910390f35b6103aa60048036038101906103a59190611b17565b610c49565b005b6103c660048036038101906103c19190611ad7565b610dca565b6040516103d39190612029565b60405180910390f35b6103f660048036038101906103f19190611aaa565b610e5e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104c357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104d357506104d282610eaa565b5b9050919050565b6060600080546104e9906123cb565b80601f0160208091040260200160405190810160405280929190818152602001828054610515906123cb565b80156105625780601f1061053757610100808354040283529160200191610562565b820191906000526020600020905b81548152906001019060200180831161054557829003601f168201915b5050505050905090565b600061057782610f14565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105bd8261074a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561062e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062590612166565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661064d610f5f565b73ffffffffffffffffffffffffffffffffffffffff16148061067c575061067b81610676610f5f565b610dca565b5b6106bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b290612106565b60405180910390fd5b6106c58383610f67565b505050565b6106db6106d5610f5f565b82611020565b61071a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071190612186565b60405180910390fd5b6107258383836110b5565b505050565b61074583838360405180602001604052806000815250610ac9565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156107f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ea90612146565b60405180910390fd5b80915050919050565b60075481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086a906120e6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108c261131c565b6108cc600061139a565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610907906123cb565b80601f0160208091040260200160405190810160405280929190818152602001828054610933906123cb565b80156109805780601f1061095557610100808354040283529160200191610980565b820191906000526020600020905b81548152906001019060200180831161096357829003601f168201915b5050505050905090565b61099c610995610f5f565b8383611460565b5050565b6000806109ab61131c565b60005b600980549050811015610ac2578373ffffffffffffffffffffffffffffffffffffffff16600982815481106109e6576109e5612535565b5b906000526020600020906003020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610aaf57600060098281548110610a4a57610a49612535565b5b906000526020600020906003020190508060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16935093505050610ac4565b8080610aba9061242e565b9150506109ae565b505b915091565b610ada610ad4610f5f565b83611020565b610b19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1090612186565b60405180910390fd5b610b25848484846115cd565b50505050565b6060610b3682610f14565b6000610b40611629565b90506000815111610b605760405180602001604052806000815250610b8b565b80610b6a84611640565b604051602001610b7b929190611f75565b6040516020818303038152906040525b915050919050565b6000610b9d61131c565b6000805b600980549050811015610c3f578373ffffffffffffffffffffffffffffffffffffffff1660098281548110610bd957610bd8612535565b5b906000526020600020906003020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610c2c57600191505b8080610c379061242e565b915050610ba1565b5080915050919050565b610c5161131c565b6001600754610c60919061225a565b600781905550600960405180606001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610e6661131c565b610e6f8161139a565b7fd343d0dee30ef8ca0d7672d51449779c672b1c67a6c496870ff741efe62ce6ab6001604051610e9f9190612029565b60405180910390a150565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610f1d816117a1565b610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5390612146565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610fda8361074a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061102c8361074a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061106e575061106d8185610dca565b5b806110ac57508373ffffffffffffffffffffffffffffffffffffffff166110948461056c565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166110d58261074a565b73ffffffffffffffffffffffffffffffffffffffff161461112b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112290612086565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561119b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611192906120a6565b60405180910390fd5b6111a683838361180d565b6111b1600082610f67565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461120191906122e1565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611258919061225a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611317838383611812565b505050565b611324610f5f565b73ffffffffffffffffffffffffffffffffffffffff166113426108ce565b73ffffffffffffffffffffffffffffffffffffffff1614611398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138f90612126565b60405180910390fd5b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156114cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c6906120c6565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115c09190612029565b60405180910390a3505050565b6115d88484846110b5565b6115e484848484611817565b611623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161a90612066565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60606000821415611688576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061179c565b600082905060005b600082146116ba5780806116a39061242e565b915050600a826116b391906122b0565b9150611690565b60008167ffffffffffffffff8111156116d6576116d5612564565b5b6040519080825280601f01601f1916602001820160405280156117085781602001600182028036833780820191505090505b5090505b600085146117955760018261172191906122e1565b9150600a856117309190612477565b603061173c919061225a565b60f81b81838151811061175257611751612535565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561178e91906122b0565b945061170c565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b505050565b60006118388473ffffffffffffffffffffffffffffffffffffffff166119ae565b156119a1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611861610f5f565b8786866040518563ffffffff1660e01b81526004016118839493929190611fdd565b602060405180830381600087803b15801561189d57600080fd5b505af19250505080156118ce57506040513d601f19601f820116820180604052508101906118cb9190611ced565b60015b611951573d80600081146118fe576040519150601f19603f3d011682016040523d82523d6000602084013e611903565b606091505b50600081511415611949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194090612066565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506119a6565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60006119e46119df846121e6565b6121c1565b905082815260208101848484011115611a00576119ff612598565b5b611a0b848285612389565b509392505050565b600081359050611a228161285c565b92915050565b600081359050611a3781612873565b92915050565b600081359050611a4c8161288a565b92915050565b600081519050611a618161288a565b92915050565b600082601f830112611a7c57611a7b612593565b5b8135611a8c8482602086016119d1565b91505092915050565b600081359050611aa4816128a1565b92915050565b600060208284031215611ac057611abf6125a2565b5b6000611ace84828501611a13565b91505092915050565b60008060408385031215611aee57611aed6125a2565b5b6000611afc85828601611a13565b9250506020611b0d85828601611a13565b9150509250929050565b600080600060608486031215611b3057611b2f6125a2565b5b6000611b3e86828701611a13565b9350506020611b4f86828701611a13565b9250506040611b6086828701611a13565b9150509250925092565b600080600060608486031215611b8357611b826125a2565b5b6000611b9186828701611a13565b9350506020611ba286828701611a13565b9250506040611bb386828701611a95565b9150509250925092565b60008060008060808587031215611bd757611bd66125a2565b5b6000611be587828801611a13565b9450506020611bf687828801611a13565b9350506040611c0787828801611a95565b925050606085013567ffffffffffffffff811115611c2857611c2761259d565b5b611c3487828801611a67565b91505092959194509250565b60008060408385031215611c5757611c566125a2565b5b6000611c6585828601611a13565b9250506020611c7685828601611a28565b9150509250929050565b60008060408385031215611c9757611c966125a2565b5b6000611ca585828601611a13565b9250506020611cb685828601611a95565b9150509250929050565b600060208284031215611cd657611cd56125a2565b5b6000611ce484828501611a3d565b91505092915050565b600060208284031215611d0357611d026125a2565b5b6000611d1184828501611a52565b91505092915050565b600060208284031215611d3057611d2f6125a2565b5b6000611d3e84828501611a95565b91505092915050565b611d5081612315565b82525050565b611d5f81612327565b82525050565b6000611d7082612217565b611d7a818561222d565b9350611d8a818560208601612398565b611d93816125a7565b840191505092915050565b6000611da982612222565b611db3818561223e565b9350611dc3818560208601612398565b611dcc816125a7565b840191505092915050565b6000611de282612222565b611dec818561224f565b9350611dfc818560208601612398565b80840191505092915050565b6000611e1560328361223e565b9150611e20826125b8565b604082019050919050565b6000611e3860258361223e565b9150611e4382612607565b604082019050919050565b6000611e5b60248361223e565b9150611e6682612656565b604082019050919050565b6000611e7e60198361223e565b9150611e89826126a5565b602082019050919050565b6000611ea160298361223e565b9150611eac826126ce565b604082019050919050565b6000611ec4603e8361223e565b9150611ecf8261271d565b604082019050919050565b6000611ee760208361223e565b9150611ef28261276c565b602082019050919050565b6000611f0a60188361223e565b9150611f1582612795565b602082019050919050565b6000611f2d60218361223e565b9150611f38826127be565b604082019050919050565b6000611f50602e8361223e565b9150611f5b8261280d565b604082019050919050565b611f6f8161237f565b82525050565b6000611f818285611dd7565b9150611f8d8284611dd7565b91508190509392505050565b6000602082019050611fae6000830184611d47565b92915050565b6000604082019050611fc96000830185611d47565b611fd66020830184611d47565b9392505050565b6000608082019050611ff26000830187611d47565b611fff6020830186611d47565b61200c6040830185611f66565b818103606083015261201e8184611d65565b905095945050505050565b600060208201905061203e6000830184611d56565b92915050565b6000602082019050818103600083015261205e8184611d9e565b905092915050565b6000602082019050818103600083015261207f81611e08565b9050919050565b6000602082019050818103600083015261209f81611e2b565b9050919050565b600060208201905081810360008301526120bf81611e4e565b9050919050565b600060208201905081810360008301526120df81611e71565b9050919050565b600060208201905081810360008301526120ff81611e94565b9050919050565b6000602082019050818103600083015261211f81611eb7565b9050919050565b6000602082019050818103600083015261213f81611eda565b9050919050565b6000602082019050818103600083015261215f81611efd565b9050919050565b6000602082019050818103600083015261217f81611f20565b9050919050565b6000602082019050818103600083015261219f81611f43565b9050919050565b60006020820190506121bb6000830184611f66565b92915050565b60006121cb6121dc565b90506121d782826123fd565b919050565b6000604051905090565b600067ffffffffffffffff82111561220157612200612564565b5b61220a826125a7565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006122658261237f565b91506122708361237f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156122a5576122a46124a8565b5b828201905092915050565b60006122bb8261237f565b91506122c68361237f565b9250826122d6576122d56124d7565b5b828204905092915050565b60006122ec8261237f565b91506122f78361237f565b92508282101561230a576123096124a8565b5b828203905092915050565b60006123208261235f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156123b657808201518184015260208101905061239b565b838111156123c5576000848401525b50505050565b600060028204905060018216806123e357607f821691505b602082108114156123f7576123f6612506565b5b50919050565b612406826125a7565b810181811067ffffffffffffffff8211171561242557612424612564565b5b80604052505050565b60006124398261237f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561246c5761246b6124a8565b5b600182019050919050565b60006124828261237f565b915061248d8361237f565b92508261249d5761249c6124d7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b61286581612315565b811461287057600080fd5b50565b61287c81612327565b811461288757600080fd5b50565b61289381612333565b811461289e57600080fd5b50565b6128aa8161237f565b81146128b557600080fd5b5056fea2646970667358221220eae2e1c234cf12f6f634dcb83d0152bdb0846d455b487a06b96fa38d0f5c7bc464736f6c63430008070033" diff --git a/library/contractInteraction.py b/library/contractInteraction.py index 5717180..ff28d47 100644 --- a/library/contractInteraction.py +++ b/library/contractInteraction.py @@ -78,7 +78,18 @@ def add_new_patient( ).transact() print("Patient Added") return patient_exists, patient, data_contract, prescription_contract + +def get_patient(deployed_contract, patient): + + patient_exists = deployed_contract.functions.checkIfPatientExists(patient).call() + + if patient_exists == False: + return patient_exists, "", "" + else: + data_contract, prescription_contract = deployed_contract.functions.getPatient(patient).call() + + return patient_exists, data_contract, prescription_contract def transfer_contract_ownership(contract, target_account): @@ -86,7 +97,7 @@ def transfer_contract_ownership(contract, target_account): tranfer_contract_event = contract.events.ContractOwnershipTransfered().getLogs() - print("\nTransfer Ownership Event", transfer_contract_ownership) + print("\nTransfer Ownership Event", tranfer_contract_event) return diff --git a/library/deployContracts.py b/library/deployContracts.py index 9d83aca..1d443fd 100644 --- a/library/deployContracts.py +++ b/library/deployContracts.py @@ -3,7 +3,8 @@ # test environment #w3 = Web3(Web3.WebsocketProvider("ws://192.168.0.24:8540")) -w3 = Web3(Web3.EthereumTesterProvider()) +w3 = Web3(Web3.HTTPProvider("HTTP://127.0.0.1:7545")) +#w3 = Web3(Web3.EthereumTesterProvider()) #gethaddr = "http://127.0.0.1:8545" #gethaddr = "://127.0.0.1:3334" diff --git a/library/getContracts.py b/library/getContracts.py new file mode 100644 index 0000000..d05c316 --- /dev/null +++ b/library/getContracts.py @@ -0,0 +1,56 @@ +from web3 import Web3 + +w3 = Web3(Web3.HTTPProvider("HTTP://127.0.0.1:7545")) + + +#returns the contracts on the blockchain of a particular type +def get_contracts(type, known_contract): + + matching_contracts = [] + total_blocks = w3.eth.get_block('latest')["number"] + + for i in range(1, total_blocks+1): + + if (w3.eth.get_transaction(w3.eth.get_block(i)["transactions"][0].hex())["to"] == None and w3.eth.get_transaction_receipt(w3.eth.get_block(i)["transactions"][0].hex())["contractAddress"] not in matching_contracts): + + # contract address + ca = w3.eth.get_transaction_receipt(w3.eth.get_block(i)["transactions"][0].hex())["contractAddress"] + + # bytecode + bc = w3.eth.getTransaction(w3.eth.get_block(i)["transactions"][0].hex())["input"] + + bc_type = check_bytecode_type(type, bc, known_contract.bytecode) + + if bc_type == type: + type_contract = w3.eth.contract(address=ca, abi=known_contract.abi) + matching_contracts.append(type_contract) + + return matching_contracts + +def check_bytecode_type(type, bc, known_bytecode): + + #print("\n\n\nBYTECODE", bc) + #print("\n\n\nKNONW BC", known_bytecode) + + print("\n", bc == "0x" + known_bytecode) + + if bc == "0x" + known_bytecode: + return type + else: + return "" + +def get_addresses(): + block = w3.eth.get_block('latest') + print("\n\n\n", block) + + + all_addresses = list(set([ + w3.eth.get_transaction(w3.eth.get_block(i)["transactions"][0].hex())["to"] + for i in reversed(range(1, block["number"])) + if w3.eth.get_transaction(w3.eth.get_block(i)["transactions"][0].hex())["to"] is not None + ])) + + print("\n\n\n", all_addresses) + + + return all_addresses \ No newline at end of file diff --git a/smartContracts/patientToken.sol b/smartContracts/patientToken.sol index 6cc97eb..439aa36 100644 --- a/smartContracts/patientToken.sol +++ b/smartContracts/patientToken.sol @@ -27,7 +27,7 @@ contract PatientToken is ERC721, Ownable { // events event Minted(address indexed minter, uint256 nftId); - event ContractOwnershipChanged(bool success); + event ContractOwnershipTransfered(bool success); function addNewPatient( address patient, @@ -80,6 +80,6 @@ contract PatientToken is ERC721, Ownable { onlyOwner { _transferOwnership(newOwner); - emit ContractOwnershipChanged(true); + emit ContractOwnershipTransfered(true); } }