Skip to content

Commit a1c37c4

Browse files
authored
Merge pull request #337 from michaelhly/get-fee-for-versioned-message
Support VersionedMessage in get_fee_for_message
2 parents 25a5837 + 56ed977 commit a1c37c4

File tree

7 files changed

+64
-8
lines changed

7 files changed

+64
-8
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44

55
## Added
66

7-
- Add VersionedTransaction support to `send_transaction` and `simulate_transaction` methods [(#334)](https://github.com/michaelhly/solana-py/pull/334):
7+
- Add VersionedTransaction support to `send_transaction` and `simulate_transaction` methods [(#334)](https://github.com/michaelhly/solana-py/pull/334)
8+
- Support VersionedMessage in `get_fee_for_message` methods [(#336)](https://github.com/michaelhly/solana-py/pull/336)
89

910
## Changed
1011

src/solana/rpc/api.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from typing import Dict, List, Optional, Sequence, Union
66

77
from solders.keypair import Keypair
8-
from solders.message import Message
8+
from solders.message import VersionedMessage
99
from solders.pubkey import Pubkey
1010
from solders.rpc.responses import (
1111
GetAccountInfoMaybeJsonParsedResp,
@@ -411,7 +411,9 @@ def get_epoch_schedule(self) -> GetEpochScheduleResp:
411411
"""
412412
return self._provider.make_request(self._get_epoch_schedule, GetEpochScheduleResp)
413413

414-
def get_fee_for_message(self, message: Message, commitment: Optional[Commitment] = None) -> GetFeeForMessageResp:
414+
def get_fee_for_message(
415+
self, message: VersionedMessage, commitment: Optional[Commitment] = None
416+
) -> GetFeeForMessageResp:
415417
"""Returns the fee for a message.
416418
417419
Args:

src/solana/rpc/async_api.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from typing import Dict, List, Optional, Sequence, Union
55

66
from solders.keypair import Keypair
7-
from solders.message import Message
7+
from solders.message import VersionedMessage
88
from solders.pubkey import Pubkey
99
from solders.rpc.responses import (
1010
GetAccountInfoMaybeJsonParsedResp,
@@ -424,7 +424,7 @@ async def get_epoch_schedule(self) -> GetEpochScheduleResp:
424424
return await self._provider.make_request(self._get_epoch_schedule, GetEpochScheduleResp)
425425

426426
async def get_fee_for_message(
427-
self, message: Message, commitment: Optional[Commitment] = None
427+
self, message: VersionedMessage, commitment: Optional[Commitment] = None
428428
) -> GetFeeForMessageResp:
429429
"""Returns the fee for a message.
430430

src/solana/rpc/core.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
from solders.account_decoder import UiAccountEncoding, UiDataSliceConfig
1111
from solders.commitment_config import CommitmentLevel
12-
from solders.message import Message
12+
from solders.message import MessageV0, VersionedMessage
1313
from solders.pubkey import Pubkey
1414
from solders.rpc.config import (
1515
RpcAccountInfoConfig,
@@ -254,8 +254,13 @@ def _get_epoch_info_body(self, commitment: Optional[Commitment]) -> GetEpochInfo
254254
config = RpcContextConfig(commitment=commitment_to_use)
255255
return GetEpochInfo(config)
256256

257-
def _get_fee_for_message_body(self, message: Message, commitment: Optional[Commitment]) -> GetFeeForMessage:
257+
def _get_fee_for_message_body(
258+
self, message: VersionedMessage, commitment: Optional[Commitment]
259+
) -> GetFeeForMessage:
258260
commitment_to_use = _COMMITMENT_TO_SOLDERS[commitment or self._commitment]
261+
# weird mypy hack:
262+
if isinstance(message, MessageV0):
263+
return GetFeeForMessage(message, commitment_to_use)
259264
return GetFeeForMessage(message, commitment_to_use)
260265

261266
def _get_inflation_governor_body(self, commitment: Optional[Commitment]) -> GetInflationGovernor:

tests/docker-compose.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
version: '3'
22
services:
33
localnet:
4-
image: "solanalabs/solana:v1.10.25"
4+
image: "solanalabs/solana:v1.13.6"
55
ports:
66
- "8899:8899"
77
- "8900:8900"

tests/integration/test_async_http_client.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,31 @@ async def test_get_fee_for_transaction_message(stubbed_sender, stubbed_receiver,
376376
assert fee_resp.value is not None
377377

378378

379+
@pytest.mark.integration
380+
async def test_get_fee_for_versioned_message(
381+
stubbed_sender: Keypair, stubbed_receiver: Pubkey, test_http_client_async: AsyncClient
382+
):
383+
"""Test that gets a fee for a transaction using get_fee_for_message."""
384+
# Get a recent blockhash
385+
resp = await test_http_client_async.get_latest_blockhash()
386+
recent_blockhash = resp.value.blockhash
387+
assert recent_blockhash is not None
388+
msg = MessageV0.try_compile(
389+
payer=stubbed_sender.pubkey(),
390+
instructions=[
391+
sp.transfer(
392+
sp.TransferParams(from_pubkey=stubbed_sender.pubkey(), to_pubkey=stubbed_receiver, lamports=1000)
393+
)
394+
],
395+
address_lookup_table_accounts=[],
396+
recent_blockhash=recent_blockhash,
397+
)
398+
# get fee for transaction
399+
fee_resp = await test_http_client_async.get_fee_for_message(msg)
400+
assert_valid_response(fee_resp)
401+
assert fee_resp.value is not None
402+
403+
379404
@pytest.mark.integration
380405
async def test_get_block_commitment(test_http_client_async):
381406
"""Test get block commitment."""

tests/integration/test_http_client.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,29 @@ def test_get_fee_for_transaction(stubbed_sender, stubbed_receiver, test_http_cli
347347
assert fee_resp.value is not None
348348

349349

350+
@pytest.mark.integration
351+
def test_get_fee_for_versioned_message(stubbed_sender: Keypair, stubbed_receiver: Pubkey, test_http_client: Client):
352+
"""Test that gets a fee for a transaction using get_fee_for_message."""
353+
# Get a recent blockhash
354+
resp = test_http_client.get_latest_blockhash()
355+
recent_blockhash = resp.value.blockhash
356+
assert recent_blockhash is not None
357+
msg = MessageV0.try_compile(
358+
payer=stubbed_sender.pubkey(),
359+
instructions=[
360+
sp.transfer(
361+
sp.TransferParams(from_pubkey=stubbed_sender.pubkey(), to_pubkey=stubbed_receiver, lamports=1000)
362+
)
363+
],
364+
address_lookup_table_accounts=[],
365+
recent_blockhash=recent_blockhash,
366+
)
367+
# get fee for transaction
368+
fee_resp = test_http_client.get_fee_for_message(msg)
369+
assert_valid_response(fee_resp)
370+
assert fee_resp.value is not None
371+
372+
350373
@pytest.mark.integration
351374
def test_get_block_commitment(test_http_client: Client):
352375
"""Test get block commitment."""

0 commit comments

Comments
 (0)