//Write your own contracts here. Currently compiles using solc v0.4.15+commit.bbb8e64f. pragma solidity ^0.4.18; contract SimpleChannel { struct user{ uint id; string name; uint[] nbr_list; mapping(uint => uint) nbr_balances; } uint[] public user_list; mapping(uint => user) public user_map; mapping(uint => bool) private visited; mapping(uint => uint) public parent; function getUserNbrs(uint user_id) public view returns (uint[]){ var usero = user_map[user_id]; return usero.nbr_list; } function getUserNbrBalance(uint user_id, uint nbr_id) public view returns (uint){ var usero = user_map[user_id]; return usero.nbr_balances[nbr_id]; } function getPath(uint user_id) public view returns (uint[]){ uint[] memory pth = new uint[](user_list.length); uint curr_id = user_id; uint i = 0; while(curr_id!=0){ pth[i] = curr_id; curr_id = parent[curr_id]; i += 1; } return pth; } function registerUser(uint user_id, string user_name) public { user_list.push(user_id); var data = user_map[user_id]; data.id = user_id; data.name = user_name; } function createAcc(uint user_id1, uint user_id2, uint balance1, uint balance2) public { var user1 = user_map[user_id1]; var user2 = user_map[user_id2]; user1.nbr_list.push(user_id2); user2.nbr_list.push(user_id1); user1.nbr_balances[user_id2] = balance1; user2.nbr_balances[user_id1] = balance2; } function sendAmount(uint user_id1, uint user_id2, uint amt) public { for(uint i = 0;i<user_list.length;i++){ visited[user_list[i]] = false; parent[user_list[i]] = 0; } uint[] memory queue = new uint[](user_list.length); visited[user_id1] = true; queue[0] = user_id1; uint curr_idx = 0; uint nxt_idx = 1; bool found = false; while(curr_idx<queue.length && !found){ var curr_user = user_map[queue[curr_idx]]; for(uint j = 0;j<curr_user.nbr_list.length;j++){ uint nbr_user = curr_user.nbr_list[j]; if(!visited[nbr_user] && curr_user.nbr_balances[nbr_user] >= amt){ queue[nxt_idx] = nbr_user; nxt_idx = nxt_idx + 1; parent[nbr_user] = queue[curr_idx]; visited[nbr_user] = true; if(nbr_user==user_id2){ found = true; } } } curr_idx = curr_idx + 1; } if(found){ curr_idx= user_id2; while(curr_idx!=user_id1){ curr_user = user_map[curr_idx]; nxt_idx = parent[curr_idx]; curr_user.nbr_balances[nxt_idx] += amt; curr_user = user_map[nxt_idx]; curr_user.nbr_balances[curr_idx] -= amt; curr_idx = nxt_idx; } }else{ // Do nothing } } function arrayPop(uint user_id1, uint user_id2) private { var user1 = user_map[user_id1]; var user1_nbrs = user1.nbr_list; uint i = 0; while (i<user1_nbrs.length && user1_nbrs[i]!=user_id2 ){ i++; } require(i<user1_nbrs.length); user1_nbrs[i] = user1_nbrs[user1_nbrs.length-1]; user1_nbrs.length--; } function closeAccount(uint user_id1, uint user_id2) public { arrayPop(user_id1, user_id2); arrayPop(user_id2, user_id1); } }
0.4.18