Skip to content

Instantly share code, notes, and snippets.

@overcat
Created May 3, 2023 01:10
Show Gist options
  • Save overcat/6048c801fa4f46a042e4a60732df0b87 to your computer and use it in GitHub Desktop.
Save overcat/6048c801fa4f46a042e4a60732df0b87 to your computer and use it in GitHub Desktop.
import time
from stellar_sdk import (
Network,
Keypair,
TransactionBuilder,
)
from stellar_sdk import xdr as stellar_xdr
from stellar_sdk.soroban import SorobanServer, ContractAuth, AuthorizedInvocation
from stellar_sdk.soroban.soroban_rpc import GetTransactionStatus
from stellar_sdk.soroban.types import Address
rpc_server_url = "https://rpc-futurenet.stellar.org:443/"
soroban_server = SorobanServer(rpc_server_url)
network_passphrase = Network.FUTURENET_NETWORK_PASSPHRASE
# https://github.com/stellar/soroban-examples/tree/v0.6.0/auth
contract_id = "7b0663d0d49ca605eb511c88914c627d271b0abc8cb47eb065efc7069b80ada6"
tx_submitter_kp = Keypair.from_secret(
"SAAPYAPTTRZMCUZFPG3G66V4ZMHTK4TWA6NS7U4F7Z3IMUD52EK4DDEV"
)
func_name = "test_sign"
args = [Address(tx_submitter_kp.public_key)]
invocation = AuthorizedInvocation(
contract_id=contract_id,
function_name=func_name,
args=args,
sub_invocations=[],
)
contract_auth = ContractAuth(
address=None,
nonce=None,
root_invocation=invocation,
)
source = soroban_server.load_account(tx_submitter_kp.public_key)
tx = (
TransactionBuilder(source, network_passphrase)
.add_time_bounds(0, 0)
.append_invoke_contract_function_op(
contract_id=contract_id,
function_name=func_name,
parameters=args,
auth=[contract_auth],
)
.build()
)
simulate_transaction_data = soroban_server.simulate_transaction(tx)
print(f"simulated transaction: {simulate_transaction_data}")
print(f"setting footprint and signing transaction...")
assert simulate_transaction_data.results is not None
tx.set_footpoint(simulate_transaction_data.results[0].footprint)
tx.sign(tx_submitter_kp)
print(f"Signed XDR:\n{tx.to_xdr()}")
send_transaction_data = soroban_server.send_transaction(tx)
print(f"sent transaction: {send_transaction_data}")
while True:
print("waiting for transaction to be confirmed...")
get_transaction_data = soroban_server.get_transaction(send_transaction_data.hash)
if get_transaction_data.status != GetTransactionStatus.NOT_FOUND:
break
time.sleep(3)
print(f"transaction: {get_transaction_data}")
if get_transaction_data.status == GetTransactionStatus.SUCCESS:
assert get_transaction_data.result_meta_xdr is not None
transaction_meta = stellar_xdr.TransactionMeta.from_xdr(
get_transaction_data.result_meta_xdr
)
result = transaction_meta.v3.tx_result.result.results[0].tr.invoke_host_function_result.success # type: ignore
print(f"Function result: {result}")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment