Skip to content

Commit 8107153

Browse files
committed
Add invoke function
1 parent d9c9da1 commit 8107153

3 files changed

Lines changed: 66 additions & 0 deletions

File tree

src/soroban/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,4 @@
1+
from soroban.invoke import *
12
from soroban.models import *
3+
4+
__all__ = ["invoke"]

src/soroban/invoke.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import time
2+
3+
import stellar_sdk
4+
from stellar_sdk import xdr
5+
from stellar_sdk.exceptions import SdkError
6+
from stellar_sdk.soroban_rpc import GetTransactionStatus, SendTransactionStatus
7+
8+
import soroban.models as soroban_models
9+
10+
__all__ = ["invoke"]
11+
12+
13+
def invoke(
14+
contract_id: str,
15+
function_name: str,
16+
args: list[xdr.SCVal],
17+
*,
18+
source_account: stellar_sdk.Keypair | str | None = None,
19+
network: soroban_models.NetworkConfig | None = None,
20+
):
21+
identity = soroban_models.Identity.from_source_account(account=source_account)
22+
23+
soroban_server = stellar_sdk.SorobanServer(network.soroban_rpc_url)
24+
source_account = soroban_server.load_account(identity.public_key)
25+
26+
tx = (
27+
stellar_sdk.TransactionBuilder(
28+
source_account, network.passphrase, base_fee=network.base_fee
29+
)
30+
.add_time_bounds(0, 0)
31+
.append_invoke_contract_function_op(
32+
contract_id=contract_id,
33+
function_name=function_name,
34+
parameters=args,
35+
)
36+
.build()
37+
)
38+
tx = soroban_server.prepare_transaction(tx)
39+
tx.sign(identity.keypair)
40+
transaction = soroban_server.send_transaction(tx)
41+
42+
if transaction.status != SendTransactionStatus.PENDING:
43+
raise SdkError("Failed to send transaction")
44+
45+
i = 0
46+
while i < 10:
47+
transaction_result = soroban_server.get_transaction(transaction.hash)
48+
if transaction_result.status != GetTransactionStatus.NOT_FOUND:
49+
break
50+
time.sleep(3)
51+
i += 1
52+
else:
53+
raise SdkError("Timeout: could not validate transaction")
54+
55+
if transaction_result.status == GetTransactionStatus.SUCCESS:
56+
transaction_meta = xdr.TransactionMeta.from_xdr(
57+
transaction_result.result_meta_xdr
58+
)
59+
if transaction_meta.v3.soroban_meta.return_value.type == xdr.SCValType.SCV_VOID:
60+
return transaction_meta
61+
else:
62+
raise SdkError(f"Transaction failed: {transaction_result.result_xdr}")

src/soroban/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ def from_source_account(
4646
class NetworkConfig(BaseSettings):
4747
soroban_rpc_url: HttpUrl = HttpUrl("https://soroban-testnet.stellar.org:443")
4848
passphrase: str = Network.TESTNET_NETWORK_PASSPHRASE
49+
base_fee: int = 100
4950

5051
model_config = SettingsConfigDict(env_file="network.toml")
5152

0 commit comments

Comments
 (0)