diff --git a/frontend/src/components/Nav/index.js b/frontend/src/components/Nav/index.js index aba179c4..9b863f11 100644 --- a/frontend/src/components/Nav/index.js +++ b/frontend/src/components/Nav/index.js @@ -46,7 +46,7 @@ const Nav = ({history}) => { const [modalOpen, setModalOpen] = useState(false) const [sellPriceModalOpen, setSellPriceModalOpen] = useState(false) const [styleBody, setStyleBody] = useState(false) - const [newSellPriceMsat, setNewSellPriceMsat] = useState('') + const [newSellPriceMsat, setNewSellPriceMsat] = useState(0) const session = true; const sellPrice = useSelector(selectSellPriceInfo); @@ -114,6 +114,7 @@ const Nav = ({history}) => { sellPriceMsat: newSellPriceMsat, } dispatch(setSellPrice(newSellPriceMsat)); + setNewSellPriceMsat(0); toggleSellPriceModal() } @@ -253,11 +254,14 @@ const Nav = ({history}) => { {sellPrice &&
+
+ Current Sell Price: {sellPrice.getPriceMsat() / 1000} sats +
- - setNewSellPriceMsat(e.target.value)} type="text" name="sellPrice" className="edit-input"/> + + setNewSellPriceMsat(e.target.value)} type="text" name="sellPrice" className="edit-input"/>
diff --git a/frontend/src/components/Profile/index.js b/frontend/src/components/Profile/index.js index ea7c424b..56045eed 100644 --- a/frontend/src/components/Profile/index.js +++ b/frontend/src/components/Profile/index.js @@ -243,6 +243,7 @@ const Profile = (props) => { const handleMenuClick = (e) => { e.stopPropagation() } + console.log(user && user.getProfileName()); return(
@@ -408,25 +409,14 @@ const Profile = (props) => {
- {user ?
- - setName(e.target.value)} type="text" name="name" className="edit-input"/> -
-
-
: -
-
-
setName(e.target.value)} type="text" name="name" className="edit-input"/>
- - } diff --git a/itests/tests/conftest.py b/itests/tests/conftest.py index b29f79aa..3711838c 100644 --- a/itests/tests/conftest.py +++ b/itests/tests/conftest.py @@ -180,30 +180,3 @@ def random_image(): @pytest.fixture def random_image_base64_string(random_image): yield bytes_to_base64_string(random_image) - - -# @pytest.fixture -# def connected_peer_id(other_admin_stub): -# # Add the main node as a peer -# create_peer_response = other_admin_stub.CreatePeer( -# squeak_admin_pb2.CreatePeerRequest( -# peer_name="test_peer", -# host="squeaknode", -# port=8774, -# ) -# ) -# peer_id = create_peer_response.peer_id -# # Set the peer to be downloading -# other_admin_stub.SetPeerDownloading( -# squeak_admin_pb2.SetPeerDownloadingRequest( -# peer_id=peer_id, -# downloading=True, -# ) -# ) -# yield peer_id -# # Delete the peer -# other_admin_stub.DeletePeer( -# squeak_admin_pb2.DeletePeerRequest( -# peer_id=peer_id, -# ) -# ) diff --git a/itests/tests/test_squeak_node.py b/itests/tests/test_squeak_node.py index 2fcfde47..01cbe2e8 100644 --- a/itests/tests/test_squeak_node.py +++ b/itests/tests/test_squeak_node.py @@ -70,23 +70,17 @@ def test_get_sell_price(admin_stub): # Get the sell price price = get_sell_price(admin_stub) - assert price.price_msat == 0 - assert not price.price_msat_is_set - assert price.default_price_msat == 1000000 + assert price.price_msat == 1000000 set_sell_price(admin_stub, 98765) price = get_sell_price(admin_stub) assert price.price_msat == 98765 - assert price.price_msat_is_set - assert price.default_price_msat == 1000000 clear_sell_price(admin_stub) price = get_sell_price(admin_stub) - assert price.price_msat == 0 - assert not price.price_msat_is_set - assert price.default_price_msat == 1000000 + assert price.price_msat == 1000000 def test_get_external_address(admin_stub): diff --git a/proto/squeak_admin.proto b/proto/squeak_admin.proto index 374bc1ef..aac106b7 100644 --- a/proto/squeak_admin.proto +++ b/proto/squeak_admin.proto @@ -1299,12 +1299,6 @@ message GetSellPriceRequest { message GetSellPriceReply { /// The price in msats int64 price_msat = 1; - - /// Price is set - bool price_msat_is_set = 2; - - /// The default price in msats - int64 default_price_msat = 3; } message TwitterAccount { diff --git a/squeaknode/admin/squeak_admin_server_handler.py b/squeaknode/admin/squeak_admin_server_handler.py index 1ffac425..09ea0b86 100644 --- a/squeaknode/admin/squeak_admin_server_handler.py +++ b/squeaknode/admin/squeak_admin_server_handler.py @@ -1015,16 +1015,9 @@ class SqueakAdminServerHandler(object): def handle_get_sell_price(self, request): logger.info("Handle get sell price") sell_price_msat = self.squeak_controller.get_sell_price_msat() - price_msat_is_set = sell_price_msat is not None - default_sell_price_msat = self.squeak_controller.get_default_sell_price_msat() logger.info("sell price: {}".format(sell_price_msat)) - logger.info("price_msat_is_set: {}".format(price_msat_is_set)) - logger.info("default_sell_price_msat: {}".format( - default_sell_price_msat)) return squeak_admin_pb2.GetSellPriceReply( price_msat=sell_price_msat, - price_msat_is_set=price_msat_is_set, - default_price_msat=default_sell_price_msat, ) def handle_add_twitter_account(self, request): diff --git a/squeaknode/node/price_policy.py b/squeaknode/node/price_policy.py deleted file mode 100644 index bcbc6824..00000000 --- a/squeaknode/node/price_policy.py +++ /dev/null @@ -1,60 +0,0 @@ -# MIT License -# -# Copyright (c) 2020 Jonathan Zernik -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. -import logging -from typing import Optional - -from squeaknode.config.config import SqueaknodeConfig -from squeaknode.core.peer_address import PeerAddress -from squeaknode.core.squeak_peer import SqueakPeer -from squeaknode.node.node_settings import NodeSettings -from squeaknode.node.squeak_store import SqueakStore - - -logger = logging.getLogger(__name__) - - -class PricePolicy: - - def __init__(self, squeak_store: SqueakStore, config: SqueaknodeConfig, node_settings: NodeSettings): - # self.squeak_db = squeak_db - self.squeak_store = squeak_store - self.config = config - self.node_settings = node_settings - - def get_price(self) -> int: - """Get the price to sell this squeak to this peer. - - """ - sell_price_msat = self.get_sell_price_msat() - if sell_price_msat is None: - return self.get_default_price() - return sell_price_msat - - def get_peer(self, peer_address: PeerAddress) -> Optional[SqueakPeer]: - # return self.squeak_db.get_peer_by_address(peer_address) - return self.squeak_store.get_peer_by_address(peer_address) - - def get_default_price(self) -> int: - return self.config.node.price_msat - - def get_sell_price_msat(self) -> Optional[int]: - return self.node_settings.get_sell_price_msat() diff --git a/squeaknode/node/squeak_controller.py b/squeaknode/node/squeak_controller.py index 5160263c..e8c23718 100644 --- a/squeaknode/node/squeak_controller.py +++ b/squeaknode/node/squeak_controller.py @@ -30,6 +30,8 @@ from squeak.core.keys import SqueakPublicKey from squeaknode.client.network_controller import NetworkController from squeaknode.core.download_result import DownloadResult +from squeaknode.core.lightning_address import LightningAddressHostPort +from squeaknode.core.offer import Offer from squeaknode.core.peer_address import Network from squeaknode.core.peer_address import PeerAddress from squeaknode.core.received_offer import ReceivedOffer @@ -129,6 +131,20 @@ class SqueakController: ) return sent_payment_id + def get_packaged_offer( + self, + squeak_hash: bytes, + peer_address: PeerAddress, + price_msat: int, + lnd_external_address: Optional[LightningAddressHostPort], + ) -> Optional[Offer]: + return self.squeak_store.get_packaged_offer( + squeak_hash, + peer_address, + price_msat, + lnd_external_address, + ) + def decrypt_private_squeak( self, squeak_hash: bytes, @@ -144,8 +160,8 @@ class SqueakController: def get_squeak(self, squeak_hash: bytes) -> Optional[CSqueak]: return self.squeak_store.get_squeak(squeak_hash) - # def get_squeak_secret_key(self, squeak_hash: bytes) -> Optional[bytes]: - # return self.squeak_store.get_squeak_secret_key(squeak_hash) + def get_squeak_secret_key(self, squeak_hash: bytes) -> Optional[bytes]: + return self.squeak_store.get_squeak_secret_key(squeak_hash) def delete_squeak(self, squeak_hash: bytes) -> None: self.squeak_store.delete_squeak(squeak_hash) @@ -295,6 +311,20 @@ class SqueakController: ) -> List[SqueakEntry]: return self.squeak_store.get_liked_squeak_entries(limit, last_entry) + def lookup_squeaks( + self, + public_keys: List[SqueakPublicKey], + min_block: Optional[int], + max_block: Optional[int], + reply_to_hash: Optional[bytes], + ) -> List[bytes]: + return self.squeak_store.lookup_squeaks( + public_keys, + min_block, + max_block, + reply_to_hash, + ) + def get_squeak_entries_for_public_key( self, public_key: SqueakPublicKey, @@ -423,8 +453,11 @@ class SqueakController: def clear_sell_price_msat(self) -> None: self.node_settings.clear_sell_price_msat() - def get_sell_price_msat(self) -> Optional[int]: - return self.node_settings.get_sell_price_msat() + def get_sell_price_msat(self) -> int: + configured_price = self.node_settings.get_sell_price_msat() + if configured_price is None: + return self.config.node.price_msat + return configured_price def get_default_sell_price_msat(self) -> int: return self.config.node.price_msat diff --git a/squeaknode/node/squeak_node.py b/squeaknode/node/squeak_node.py index 5a16a5ce..cce86c45 100644 --- a/squeaknode/node/squeak_node.py +++ b/squeaknode/node/squeak_node.py @@ -180,7 +180,7 @@ class SqueakNode: def create_peer_handler(self): self.peer_handler = SqueakPeerServerHandler( - self.squeak_store, + self.squeak_controller, self.node_settings, self.config, ) diff --git a/squeaknode/node/squeak_store.py b/squeaknode/node/squeak_store.py index c4f2bc40..d044e9c4 100644 --- a/squeaknode/node/squeak_store.py +++ b/squeaknode/node/squeak_store.py @@ -221,6 +221,7 @@ class SqueakStore: self.save_sent_offer(sent_offer) return sent_offer + # TODO: remove this method. Do this logic in squeakcontroller. def get_packaged_offer( self, squeak_hash: bytes, diff --git a/squeaknode/server/squeak_peer_server_handler.py b/squeaknode/server/squeak_peer_server_handler.py index b59f03bc..fc392eeb 100644 --- a/squeaknode/server/squeak_peer_server_handler.py +++ b/squeaknode/server/squeak_peer_server_handler.py @@ -29,8 +29,7 @@ from squeaknode.core.lightning_address import LightningAddressHostPort from squeaknode.core.offer import Offer from squeaknode.core.peer_address import Network from squeaknode.core.peer_address import PeerAddress -from squeaknode.node.price_policy import PricePolicy -from squeaknode.node.squeak_store import SqueakStore +from squeaknode.node.squeak_controller import SqueakController logger = logging.getLogger(__name__) @@ -48,18 +47,18 @@ class SqueakPeerServerHandler(object): def __init__( self, - squeak_store: SqueakStore, + squeak_controller: SqueakController, node_settings, config, ): - self.squeak_store = squeak_store + self.squeak_controller = squeak_controller self.node_settings = node_settings self.config = config def handle_get_squeak_bytes(self, squeak_hash_str) -> Optional[bytes]: squeak_hash = bytes.fromhex(squeak_hash_str) logger.info("Handle get squeak for hash: {}".format(squeak_hash_str)) - squeak = self.squeak_store.get_squeak(squeak_hash) + squeak = self.squeak_controller.get_squeak(squeak_hash) if not squeak: raise NotFoundError() return squeak.serialize() @@ -71,7 +70,7 @@ class SqueakPeerServerHandler(object): price_msat = self.get_price_for_squeak() if price_msat > 0: raise PaymentRequiredError() - secret_key = self.squeak_store.get_squeak_secret_key(squeak_hash) + secret_key = self.squeak_controller.get_squeak_secret_key(squeak_hash) if not secret_key: raise NotFoundError() return secret_key @@ -89,7 +88,7 @@ class SqueakPeerServerHandler(object): price_msat = self.get_price_for_squeak() if price_msat == 0: raise NotFoundError() - # TODO: lnd_external_address should be configured inside SqueakStore. + # TODO: lnd_external_address should be configured inside SqueakStore/SqueakController. lnd_external_address: Optional[LightningAddressHostPort] = None if self.config.lnd.external_host: lnd_external_address = LightningAddressHostPort( @@ -97,7 +96,7 @@ class SqueakPeerServerHandler(object): port=self.config.lnd.port, ) logger.info(lnd_external_address) - offer = self.squeak_store.get_packaged_offer( + offer = self.squeak_controller.get_packaged_offer( squeak_hash, client_addr, price_msat, @@ -117,10 +116,9 @@ class SqueakPeerServerHandler(object): SqueakPublicKey.from_bytes(bytes.fromhex(pubkey_str)) for pubkey_str in pubkey_strs ] - # Add separate endpoint for replies. # reply_to_hash = interest.hashReplySqk if interest.hashReplySqk != EMPTY_HASH else None - return self.squeak_store.lookup_squeaks( + return self.squeak_controller.lookup_squeaks( pubkeys, min_block, max_block, @@ -128,9 +126,4 @@ class SqueakPeerServerHandler(object): ) def get_price_for_squeak(self) -> int: - price_policy = PricePolicy( - self.squeak_store, - self.config, - self.node_settings, - ) - return price_policy.get_price() + return self.squeak_controller.get_sell_price_msat() diff --git a/tests/node/test_price_policy.py b/tests/node/test_price_policy.py deleted file mode 100644 index a1de941b..00000000 --- a/tests/node/test_price_policy.py +++ /dev/null @@ -1,39 +0,0 @@ -# MIT License -# -# Copyright (c) 2020 Jonathan Zernik -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. -import mock -import pytest - -from squeaknode.node.price_policy import PricePolicy - - -@pytest.fixture() -def price_policy(): - yield PricePolicy(None, None, None) - - -def test_get_price(price_policy, user_config): - with mock.patch.object(price_policy, 'get_peer', autospec=True) as mock_get_peer, \ - mock.patch.object(price_policy, 'get_sell_price_msat', autospec=True) as mock_get_sell_price_msat: - mock_get_peer.return_value = None - mock_get_sell_price_msat.return_value = 555 - - assert price_policy.get_price() == 555