//Write your own contracts here. Currently compiles using solc v0.4.15+commit.bbb8e64f. pragma solidity ^0.4.25; contract p2p { struct User { uint user_id; string user_name; uint[] connected_users; mapping(uint => uint) edge_balances; // uint[] balances; } // User[] users; uint[] users; mapping(uint => User) registered_users; mapping(uint=>bool) visited; mapping(uint=>uint) pred; uint[] user_nodes; uint[] user_nodes_next; function registerUser(uint user_id, string user_name) public { User memory u = User(user_id,user_name,new uint[](0)); registered_users[user_id]= u; users.push(user_id); // users.push(User(user_id,user_name, new uint[](0),new uint[](0))); } function createAcc(uint user_id_1,uint user_id_2, uint balance) public{ registered_users[user_id_1].connected_users.push(user_id_2); registered_users[user_id_1].edge_balances[user_id_2]=balance; registered_users[user_id_2].connected_users.push(user_id_1); registered_users[user_id_2].edge_balances[user_id_1]=balance; } function sendAmount(uint user_id_1,uint user_id_2,uint balance) public returns(uint){ // User memory u1 = registered_users[user_id_1]; // User memory u2 = registered_users[user_id_2]; user_nodes.length=0; user_nodes_next.length=0; uint i; for(i=0;i<users.length;i++){ visited[users[i]]=false; pred[users[i]]=0; } i=0; uint size = 1; user_nodes.push(user_id_1); visited[user_id_1]=true; // bool found = false; do{ uint size_next = 0; for(i=0;i<size;i++){ User u = registered_users[user_nodes[i]]; for(uint j=0;j<u.connected_users.length;j++){ uint user_id = u.connected_users[i]; if(!visited[user_id] && u.edge_balances[user_id]>=balance){ if(user_id!=user_id_2) { visited[user_id] = true; pred[user_id] = user_nodes[i]; user_nodes_next.push(user_id); size_next++; } else{ pred[user_id_2]=user_nodes[i]; visited[user_id_2]=true; break; } } } } user_nodes.length=0; for(i=0;i<size_next;i++){ user_nodes.push(user_nodes_next[i]); } size = size_next; user_nodes_next.length=0; } while(size > 0); uint return_value; if(visited[user_id_2]){ return_value=1; uint curr_user=user_id_2; while(curr_user!=user_id_1){ registered_users[curr_user].edge_balances[pred[curr_user]]+=balance; registered_users[pred[curr_user]].edge_balances[curr_user]-=balance; curr_user = pred[curr_user]; } } else{ return_value=0; } for(i=0;i<users.length;i++){ visited[users[i]]=false; pred[users[i]]=0; } user_nodes.length=0; user_nodes_next.length=0; return return_value; } }
0.4.25