Skip to content

Instantly share code, notes, and snippets.

@overcat
Created May 3, 2023 01:33
Show Gist options
  • Save overcat/97ec432df23fb304c1f7f656cde08347 to your computer and use it in GitHub Desktop.
Save overcat/97ec432df23fb304c1f7f656cde08347 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 AuthorizedInvocation, ContractAuth, SorobanServer
from stellar_sdk.soroban.soroban_rpc import GetTransactionStatus
from stellar_sdk.soroban.types import Address, Bytes, Int128
rpc_server_url = "https://rpc-futurenet.stellar.org:443/"
soroban_server = SorobanServer(rpc_server_url)
network_passphrase = Network.FUTURENET_NETWORK_PASSPHRASE
submitter_kp = Keypair.from_secret(
"SBPTTA3D3QYQ6E2GSACAZDUFH2UILBNG3EBJCK3NNP7BE4O757KGZUGA"
) # GAERW3OYAVYMZMPMVKHSCDS4ORFPLT5Z3YXA4VM3BVYEA2W7CG3V6YYB
from_kp = Keypair.from_secret(
"SAAPYAPTTRZMCUZFPG3G66V4ZMHTK4TWA6NS7U4F7Z3IMUD52EK4DDEV"
) # GDAT5HWTGIU4TSSZ4752OUC4SABDLTLZFRPZUJ3D6LKBNEPA7V2CIG54
spender_kp = Keypair.from_secret(
"SAEZSI6DY7AXJFIYA4PM6SIBNEYYXIEM2MSOTHFGKHDW32MBQ7KVO6EN"
) # GBMLPRFCZDZJPKUPHUSHCKA737GOZL7ERZLGGMJ6YGHBFJZ6ZKMKCZTM
native_token_contract_id = (
"d93f5c7bb0ebc4a9c8f727c5cebc4e41194d38257e1d0d910356b43bfc528813"
)
source = soroban_server.load_account(submitter_kp.public_key)
args = [
Address(from_kp.public_key), # from
Address(spender_kp.public_key), # spender
Int128(1000), # amount
]
func_name = "incr_allow"
from_nonce = soroban_server.get_nonce(native_token_contract_id, from_kp.public_key)
spender_nonce = soroban_server.get_nonce(native_token_contract_id, spender_kp.public_key)
from_root_invocation = AuthorizedInvocation(
contract_id=native_token_contract_id,
function_name=func_name,
args=args,
sub_invocations=[],
)
spender_root_invocation = AuthorizedInvocation(
contract_id=native_token_contract_id,
function_name=func_name,
args=args,
sub_invocations=[],
)
from_contract_auth = ContractAuth(
address=Address(from_kp.public_key),
nonce=from_nonce,
root_invocation=from_root_invocation,
)
from_contract_auth.sign(from_kp, network_passphrase)
spender_contract_auth = ContractAuth(
address=Address(spender_kp.public_key),
nonce=spender_nonce,
root_invocation=spender_root_invocation,
)
spender_contract_auth.sign(spender_kp, network_passphrase)
tx = (
TransactionBuilder(source, network_passphrase)
.add_time_bounds(0, 0)
.append_invoke_contract_function_op(
contract_id=native_token_contract_id,
function_name=func_name,
parameters=args,
auth=[from_contract_auth, spender_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(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