//Write your own contracts here. Currently compiles using solc v0.4.15+commit.bbb8e64f. pragma solidity ^0.4.25; contract DAPP { uint curr_account_number = 0; uint num_users = 0; uint txn_amount = 1; struct User { uint id; string name; address addr; uint[] connected_peers; uint[] account_numbers; } struct JointAccount { uint account_number; mapping(uint => uint) mem2bal; } mapping(uint => User) users; mapping(uint => JointAccount) accounts; mapping(uint => uint) parent; function get_num_users() public view returns (uint) { return num_users; } function registerUser(uint user_id, string user_name) public { User storage s = users[user_id]; s.id = user_id; s.name = user_name; s.addr = msg.sender; num_users += 1; } function createAccount(uint user_id1, uint user_id2) public { User storage s1 = users[user_id1]; User storage s2 = users[user_id2]; s1.connected_peers.push(user_id2); s2.connected_peers.push(user_id1); accounts[curr_account_number] = JointAccount({account_number: curr_account_number}); accounts[curr_account_number].mem2bal[user_id1] = 5; accounts[curr_account_number].mem2bal[user_id2] = 5; s1.account_numbers.push(curr_account_number); s2.account_numbers.push(curr_account_number); curr_account_number += 1; } mapping(uint => bool) visited; uint[] queue; function shortestPath(uint user_id1, uint user_id2) internal { // mapping(uint => uint) depth; for (uint j=0;j < num_users; j+=1) { visited[users[j].id] = false; } visited[user_id1] = true; // depth[user_id1] = 0; queue.length = 0; queue.push(user_id1); bool flag = false; while(!flag) { uint id = queue[0]; delete queue[0]; for (uint i=0;i < users[id].connected_peers.length; i+=1) { if (!visited[users[id].connected_peers[i]]) { queue.push(users[id].connected_peers[i]); // depth[users[id].connected_peers[i]] = depth[id]+1; parent[users[id].connected_peers[i]] = id; } if (users[id].connected_peers[i] == user_id2) { flag = true; break; } } } } function send (uint user_id1, uint user_id2) public { for (uint i=0; i < users[user_id1].connected_peers.length; i+= 1) { if (users[user_id1].connected_peers[i] == user_id2) { accounts[users[user_id1].account_numbers[i]].mem2bal[user_id1] -= txn_amount; accounts[users[user_id1].account_numbers[i]].mem2bal[user_id2] += txn_amount; break; } } } function sendAmount(uint user_id1, uint user_id2) public returns (bool) { shortestPath(user_id1, user_id2); uint temp = user_id2 ; while (temp != user_id1) { for (uint i=0; i < users[temp].connected_peers.length; i+= 1) { if (users[temp].connected_peers[i] == parent[temp]) { if (accounts[users[temp].account_numbers[i]].mem2bal[parent[temp]] < txn_amount) return false ; } } temp = parent[temp]; } temp = user_id2 ; while (temp != user_id1) { send(parent[temp], temp); temp = parent[temp]; } return true; } function closeAccount(uint user_id1, uint user_id2) public { User storage s1 = users[user_id1]; User storage s2 = users[user_id2]; for (uint i=0; i < s1.connected_peers.length; i+= 1) { if (s1.connected_peers[i] == user_id2) { delete s1.connected_peers[i]; delete accounts[s1.account_numbers[i]]; delete s1.account_numbers[i]; for (uint j=0;j < s2.connected_peers.length; j += 1) { if (s2.connected_peers[j] == user_id1) { delete s2.connected_peers[j]; delete s2.account_numbers[j]; break; } } break; } } } }
0.4.25