function executeSigned(address to, uint value, bytes calldata data, uint gasPrice, uint gasLimit, bytes calldata signature) external
        onlyAuthorisedKeysOrSelf(_recoverSigner(address(this), to, value, data, nextNonce, gasPrice, gasLimit, signature))
        returns (bytes memory) {

        
        uint256 gasUsed = gasleft();

        
        (bool success, bytes memory result) = to.call.value(value)(data);

        
        gasUsed = gasUsed - gasleft();

        
        require(success);

        
        require(gasUsed <= gasLimit);

        
        emit SignedExecuted(address(this), to, value, data, nextNonce, gasPrice, gasLimit, result);

        
        nextNonce++;

        
        msg.sender.transfer((gasUsed + 40000 + (msg.data.length * 68)) * gasPrice);

        
        return result;
    }