|  |  | @ -3362,16 +3362,6 @@ static json_t *user_stats(const user_instance_t *user) | 
			
		
	
		
		
			
				
					
					|  |  |  | 	return val; |  |  |  | 	return val; | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static void upstream_block(ckpool_t *ckp, const int height, const char *workername, |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			   const double diff) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 	char *msg; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 	ASPRINTF(&msg, "{\"method\":\"block\",\"workername\":\"%s\",\"diff\":%lf,\"height\":%d,\"name\":\"%s\"}\n", |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		 workername, diff, height, ckp->name); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 	connector_upstream_msg(ckp, msg); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | static void block_solve(ckpool_t *ckp, const char *blockhash) |  |  |  | static void block_solve(ckpool_t *ckp, const char *blockhash) | 
			
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	ckmsg_t *block, *tmp, *found = NULL; |  |  |  | 	ckmsg_t *block, *tmp, *found = NULL; | 
			
		
	
	
		
		
			
				
					|  |  | @ -3420,10 +3410,13 @@ static void block_solve(ckpool_t *ckp, const char *blockhash) | 
			
		
	
		
		
			
				
					
					|  |  |  | 		json_set_string(val, "createcode", __func__); |  |  |  | 		json_set_string(val, "createcode", __func__); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		json_get_int(&height, val, "height"); |  |  |  | 		json_get_int(&height, val, "height"); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		json_get_double(&diff, val, "diff"); |  |  |  | 		json_get_double(&diff, val, "diff"); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		ckdbq_add(ckp, ID_BLOCK, val); |  |  |  | 		if (ckp->remote) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			json_set_string(val, "name", ckp->name); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			upstream_msgtype(ckp, val, SM_BLOCK); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			json_decref(val); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		} else | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			ckdbq_add(ckp, ID_BLOCK, val); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		free(found); |  |  |  | 		free(found); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (ckp->remote) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			upstream_block(ckp, height, workername, diff); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	if (!workername) { |  |  |  | 	if (!workername) { | 
			
		
	
	
		
		
			
				
					|  |  | @ -6711,7 +6704,7 @@ static void parse_remote_blocksubmit(ckpool_t *ckp, json_t *val, const char *buf | 
			
		
	
		
		
			
				
					
					|  |  |  | 	send_generator(ckp, gbt_block, GEN_PRIORITY); |  |  |  | 	send_generator(ckp, gbt_block, GEN_PRIORITY); | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static void parse_remote_block(sdata_t *sdata, json_t *val, const char *buf) |  |  |  | static void parse_remote_block(ckpool_t *ckp, sdata_t *sdata, json_t *val, const char *buf) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	json_t *workername_val = json_object_get(val, "workername"), |  |  |  | 	json_t *workername_val = json_object_get(val, "workername"), | 
			
		
	
		
		
			
				
					
					|  |  |  | 		*name_val = json_object_get(val, "name"); |  |  |  | 		*name_val = json_object_get(val, "name"); | 
			
		
	
	
		
		
			
				
					|  |  | @ -6738,6 +6731,10 @@ static void parse_remote_block(sdata_t *sdata, json_t *val, const char *buf) | 
			
		
	
		
		
			
				
					
					|  |  |  | 	LOGWARNING("%s", msg); |  |  |  | 	LOGWARNING("%s", msg); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	stratum_broadcast_message(sdata, msg); |  |  |  | 	stratum_broadcast_message(sdata, msg); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	free(msg); |  |  |  | 	free(msg); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	/* Make a duplicate for use by ckdbq_add */ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	val = json_deep_copy(val); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	ckdbq_add(ckp, ID_BLOCK, val); | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static void send_remote_pong(sdata_t *sdata, stratum_instance_t *client) |  |  |  | static void send_remote_pong(sdata_t *sdata, stratum_instance_t *client) | 
			
		
	
	
		
		
			
				
					|  |  | @ -6820,12 +6817,12 @@ static void parse_trusted_msg(ckpool_t *ckp, sdata_t *sdata, json_t *val, stratu | 
			
		
	
		
		
			
				
					
					|  |  |  | 		parse_remote_auth(ckp, sdata, val, client, client->id); |  |  |  | 		parse_remote_auth(ckp, sdata, val, client, client->id); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	else if (!safecmp(method, stratum_msgs[SM_SHAREERR])) |  |  |  | 	else if (!safecmp(method, stratum_msgs[SM_SHAREERR])) | 
			
		
	
		
		
			
				
					
					|  |  |  | 		parse_remote_shareerr(ckp, sdata, val, buf); |  |  |  | 		parse_remote_shareerr(ckp, sdata, val, buf); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	else if (!safecmp(method, stratum_msgs[SM_BLOCK])) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		parse_remote_block(ckp, sdata, val, buf); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	else if (!safecmp(method, "workers")) |  |  |  | 	else if (!safecmp(method, "workers")) | 
			
		
	
		
		
			
				
					
					|  |  |  | 		parse_remote_workers(sdata, val, buf); |  |  |  | 		parse_remote_workers(sdata, val, buf); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	else if (!safecmp(method, "submitblock")) |  |  |  | 	else if (!safecmp(method, "submitblock")) | 
			
		
	
		
		
			
				
					
					|  |  |  | 		parse_remote_blocksubmit(ckp, val, buf); |  |  |  | 		parse_remote_blocksubmit(ckp, val, buf); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	else if (!safecmp(method, "block")) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		parse_remote_block(sdata, val, buf); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 	else if (!safecmp(method, "ping")) |  |  |  | 	else if (!safecmp(method, "ping")) | 
			
		
	
		
		
			
				
					
					|  |  |  | 		send_remote_pong(sdata, client); |  |  |  | 		send_remote_pong(sdata, client); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	else |  |  |  | 	else | 
			
		
	
	
		
		
			
				
					|  |  | 
 |