Created
May 3, 2023 01:33
-
-
Save overcat/97ec432df23fb304c1f7f656cde08347 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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