simple.py 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578
  1. # python3 -m pip install pycryptodomex uvarint pyteal web3 coincurve
  2. import sys
  3. sys.path.append("..")
  4. from admin import PortalCore, Account
  5. from gentest import GenTest
  6. from base64 import b64decode
  7. from typing import List, Tuple, Dict, Any, Optional, Union
  8. import base64
  9. import random
  10. import time
  11. import hashlib
  12. import uuid
  13. import json
  14. from algosdk.v2client.algod import AlgodClient
  15. from algosdk.kmd import KMDClient
  16. from algosdk import account, mnemonic
  17. from algosdk.encoding import decode_address, encode_address
  18. from algosdk.future import transaction
  19. from pyteal import compileTeal, Mode, Expr
  20. from pyteal import *
  21. from algosdk.logic import get_application_address
  22. from vaa_verify import get_vaa_verify
  23. from algosdk.future.transaction import LogicSig
  24. from test_contract import get_test_app
  25. from algosdk.v2client import indexer
  26. import pprint
  27. class AlgoTest(PortalCore):
  28. def __init__(self) -> None:
  29. super().__init__()
  30. def getBalances(self, client: AlgodClient, account: str) -> Dict[int, int]:
  31. balances: Dict[int, int] = dict()
  32. accountInfo = client.account_info(account)
  33. # set key 0 to Algo balance
  34. balances[0] = accountInfo["amount"]
  35. assets: List[Dict[str, Any]] = accountInfo.get("assets", [])
  36. for assetHolding in assets:
  37. assetID = assetHolding["asset-id"]
  38. amount = assetHolding["amount"]
  39. balances[assetID] = amount
  40. return balances
  41. def createTestApp(
  42. self,
  43. client: AlgodClient,
  44. sender: Account,
  45. ) -> int:
  46. approval, clear = get_test_app(client)
  47. globalSchema = transaction.StateSchema(num_uints=4, num_byte_slices=30)
  48. localSchema = transaction.StateSchema(num_uints=0, num_byte_slices=16)
  49. app_args = []
  50. txn = transaction.ApplicationCreateTxn(
  51. sender=sender.getAddress(),
  52. on_complete=transaction.OnComplete.NoOpOC,
  53. approval_program=b64decode(approval["result"]),
  54. clear_program=b64decode(clear["result"]),
  55. global_schema=globalSchema,
  56. local_schema=localSchema,
  57. app_args=app_args,
  58. sp=client.suggested_params(),
  59. )
  60. signedTxn = txn.sign(sender.getPrivateKey())
  61. client.send_transaction(signedTxn)
  62. response = self.waitForTransaction(client, signedTxn.get_txid())
  63. assert response.applicationIndex is not None and response.applicationIndex > 0
  64. txn = transaction.PaymentTxn(sender = sender.getAddress(), sp = client.suggested_params(),
  65. receiver = get_application_address(response.applicationIndex), amt = 300000)
  66. signedTxn = txn.sign(sender.getPrivateKey())
  67. client.send_transaction(signedTxn)
  68. return response.applicationIndex
  69. def parseSeqFromLog(self, txn):
  70. return int.from_bytes(b64decode(txn.innerTxns[0]["logs"][0]), "big")
  71. def getVAA(self, client, sender, sid, app):
  72. if sid == None:
  73. raise Exception("getVAA called with a sid of None")
  74. saddr = get_application_address(app)
  75. # SOOO, we send a nop txn through to push the block forward
  76. # one
  77. # This is ONLY needed on a local net... the indexer will sit
  78. # on the last block for 30 to 60 seconds... we don't want this
  79. # log in prod since it is wasteful of gas
  80. if (self.INDEXER_ROUND > 512): # until they fix it
  81. print("indexer is broken in local net... stop/clean/restart the sandbox")
  82. sys.exit(0)
  83. txns = []
  84. txns.append(
  85. transaction.ApplicationCallTxn(
  86. sender=sender.getAddress(),
  87. index=self.tokenid,
  88. on_complete=transaction.OnComplete.NoOpOC,
  89. app_args=[b"nop"],
  90. sp=client.suggested_params(),
  91. )
  92. )
  93. self.sendTxn(client, sender, txns, False)
  94. while True:
  95. nexttoken = ""
  96. while True:
  97. response = self.myindexer.search_transactions( min_round=self.INDEXER_ROUND, note_prefix=self.NOTE_PREFIX, next_page=nexttoken)
  98. # pprint.pprint(response)
  99. for x in response["transactions"]:
  100. # pprint.pprint(x)
  101. for y in x["inner-txns"]:
  102. if y["application-transaction"]["application-id"] != self.coreid:
  103. continue
  104. if len(y["logs"]) == 0:
  105. continue
  106. args = y["application-transaction"]["application-args"]
  107. if len(args) < 2:
  108. continue
  109. if base64.b64decode(args[0]) != b'publishMessage':
  110. continue
  111. seq = int.from_bytes(base64.b64decode(y["logs"][0]), "big")
  112. if seq != sid:
  113. # print(str(seq) + " != " + str(sid))
  114. continue
  115. if y["sender"] != saddr:
  116. continue;
  117. emitter = decode_address(y["sender"])
  118. payload = base64.b64decode(args[1])
  119. # pprint.pprint([seq, y["sender"], payload.hex()])
  120. # sys.exit(0)
  121. return self.gt.genVaa(emitter, seq, payload)
  122. if 'next-token' in response:
  123. nexttoken = response['next-token']
  124. else:
  125. self.INDEXER_ROUND = response['current-round'] + 1
  126. break
  127. time.sleep(1)
  128. def publishMessage(self, client, sender, vaa, appid):
  129. aa = decode_address(get_application_address(appid)).hex()
  130. emitter_addr = self.optin(client, sender, self.coreid, 0, aa)
  131. txns = []
  132. sp = client.suggested_params()
  133. a = transaction.ApplicationCallTxn(
  134. sender=sender.getAddress(),
  135. index=appid,
  136. on_complete=transaction.OnComplete.NoOpOC,
  137. app_args=[b"test1", vaa, self.coreid],
  138. foreign_apps = [self.coreid],
  139. accounts=[emitter_addr],
  140. sp=sp
  141. )
  142. a.fee = a.fee * 2
  143. txns.append(a)
  144. resp = self.sendTxn(client, sender, txns, True)
  145. self.INDEXER_ROUND = resp.confirmedRound
  146. return self.parseSeqFromLog(resp)
  147. def createTestAsset(self, client, sender):
  148. txns = []
  149. a = transaction.PaymentTxn(
  150. sender = sender.getAddress(),
  151. sp = client.suggested_params(),
  152. receiver = get_application_address(self.testid),
  153. amt = 300000
  154. )
  155. txns.append(a)
  156. sp = client.suggested_params()
  157. a = transaction.ApplicationCallTxn(
  158. sender=sender.getAddress(),
  159. index=self.testid,
  160. on_complete=transaction.OnComplete.NoOpOC,
  161. app_args=[b"setup"],
  162. sp=sp
  163. )
  164. a.fee = a.fee * 2
  165. txns.append(a)
  166. transaction.assign_group_id(txns)
  167. grp = []
  168. pk = sender.getPrivateKey()
  169. for t in txns:
  170. grp.append(t.sign(pk))
  171. client.send_transactions(grp)
  172. resp = self.waitForTransaction(client, grp[-1].get_txid())
  173. aid = int.from_bytes(resp.__dict__["logs"][0], "big")
  174. print("Opting " + sender.getAddress() + " into " + str(aid))
  175. self.asset_optin(client, sender, aid, sender.getAddress())
  176. txns = []
  177. a = transaction.ApplicationCallTxn(
  178. sender=sender.getAddress(),
  179. index=self.testid,
  180. on_complete=transaction.OnComplete.NoOpOC,
  181. app_args=[b"mint"],
  182. foreign_assets = [aid],
  183. sp=sp
  184. )
  185. a.fee = a.fee * 2
  186. txns.append(a)
  187. resp = self.sendTxn(client, sender, txns, True)
  188. # self.INDEXER_ROUND = resp.confirmedRound
  189. return aid
  190. def getCreator(self, client, sender, asset_id):
  191. return client.asset_info(asset_id)["params"]["creator"]
  192. def testAttest(self, client, sender, asset_id):
  193. taddr = get_application_address(self.tokenid)
  194. aa = decode_address(taddr).hex()
  195. emitter_addr = self.optin(client, sender, self.coreid, 0, aa)
  196. creator = self.getCreator(client, sender, asset_id)
  197. c = client.account_info(creator)
  198. wormhole = c.get("auth-addr") == taddr
  199. if not wormhole:
  200. creator = self.optin(client, sender, self.tokenid, asset_id, b"native".hex())
  201. txns = []
  202. sp = client.suggested_params()
  203. a = transaction.ApplicationCallTxn(
  204. sender=sender.getAddress(),
  205. index=self.tokenid,
  206. on_complete=transaction.OnComplete.NoOpOC,
  207. app_args=[b"attestToken", asset_id],
  208. foreign_apps = [self.coreid],
  209. foreign_assets = [asset_id],
  210. accounts=[emitter_addr, creator, c["address"]],
  211. sp=sp
  212. )
  213. a.fee = a.fee * 2
  214. txns.append(a)
  215. resp = self.sendTxn(client, sender, txns, True)
  216. # Point us at the correct round
  217. self.INDEXER_ROUND = resp.confirmedRound
  218. # print(encode_address(resp.__dict__["logs"][0]))
  219. # print(encode_address(resp.__dict__["logs"][1]))
  220. return self.parseSeqFromLog(resp)
  221. def transferAsset(self, client, sender, asset_id, quantity, receiver, chain, fee, payload = None):
  222. taddr = get_application_address(self.tokenid)
  223. aa = decode_address(taddr).hex()
  224. emitter_addr = self.optin(client, sender, self.coreid, 0, aa)
  225. # asset_id 0 is ALGO
  226. if asset_id == 0:
  227. wormhole = False
  228. else:
  229. creator = self.getCreator(client, sender, asset_id)
  230. c = client.account_info(creator)
  231. wormhole = c.get("auth-addr") == taddr
  232. txns = []
  233. if not wormhole:
  234. creator = self.optin(client, sender, self.tokenid, asset_id, b"native".hex())
  235. print("non wormhole account " + creator)
  236. sp = client.suggested_params()
  237. if (asset_id != 0) and (not self.asset_optin_check(client, sender, asset_id, creator)):
  238. print("Looks like we need to optin")
  239. txns.append(
  240. transaction.PaymentTxn(
  241. sender=sender.getAddress(),
  242. receiver=creator,
  243. amt=100000,
  244. sp=sp
  245. )
  246. )
  247. # The tokenid app needs to do the optin since it has signature authority
  248. a = transaction.ApplicationCallTxn(
  249. sender=sender.getAddress(),
  250. index=self.tokenid,
  251. on_complete=transaction.OnComplete.NoOpOC,
  252. app_args=[b"optin", asset_id],
  253. foreign_assets = [asset_id],
  254. accounts=[creator],
  255. sp=sp
  256. )
  257. a.fee = a.fee * 2
  258. txns.append(a)
  259. self.sendTxn(client, sender, txns, False)
  260. txns = []
  261. if asset_id == 0:
  262. print("asset_id == 0")
  263. txns.append(transaction.PaymentTxn(
  264. sender=sender.getAddress(),
  265. receiver=creator,
  266. amt=quantity,
  267. sp=sp,
  268. ))
  269. accounts=[emitter_addr, creator, creator]
  270. else:
  271. print("asset_id != 0")
  272. txns.append(
  273. transaction.AssetTransferTxn(
  274. sender = sender.getAddress(),
  275. sp = sp,
  276. receiver = creator,
  277. amt = quantity,
  278. index = asset_id
  279. ))
  280. accounts=[emitter_addr, creator, c["address"]]
  281. args = [b"sendTransfer", asset_id, quantity, decode_address(receiver), chain, fee]
  282. if None != payload:
  283. args.append(payload)
  284. # pprint.pprint(args)
  285. a = transaction.ApplicationCallTxn(
  286. sender=sender.getAddress(),
  287. index=self.tokenid,
  288. on_complete=transaction.OnComplete.NoOpOC,
  289. app_args=args,
  290. foreign_apps = [self.coreid],
  291. foreign_assets = [asset_id],
  292. accounts=accounts,
  293. sp=sp
  294. )
  295. a.fee = a.fee * 2
  296. txns.append(a)
  297. resp = self.sendTxn(client, sender, txns, True)
  298. self.INDEXER_ROUND = resp.confirmedRound
  299. # pprint.pprint(resp.__dict__)
  300. # print(encode_address(resp.__dict__["logs"][0]))
  301. # print(encode_address(resp.__dict__["logs"][1]))
  302. return self.parseSeqFromLog(resp)
  303. def asset_optin_check(self, client, sender, asset, receiver):
  304. if receiver not in self.asset_cache:
  305. self.asset_cache[receiver] = {}
  306. if asset in self.asset_cache[receiver]:
  307. return True
  308. ai = client.account_info(receiver)
  309. if "assets" in ai:
  310. for x in ai["assets"]:
  311. if x["asset-id"] == asset:
  312. self.asset_cache[receiver][asset] = True
  313. return True
  314. return False
  315. def asset_optin(self, client, sender, asset, receiver):
  316. if self.asset_optin_check(client, sender, asset, receiver):
  317. return
  318. pprint.pprint(["asset_optin", asset, receiver])
  319. sp = client.suggested_params()
  320. optin_txn = transaction.AssetTransferTxn(
  321. sender = sender.getAddress(),
  322. sp = sp,
  323. receiver = receiver,
  324. amt = 0,
  325. index = asset
  326. )
  327. transaction.assign_group_id([optin_txn])
  328. signed_optin = optin_txn.sign(sender.getPrivateKey())
  329. client.send_transactions([signed_optin])
  330. resp = self.waitForTransaction(client, signed_optin.get_txid())
  331. assert self.asset_optin_check(client, sender, asset, receiver), "The optin failed"
  332. print("woah! optin succeeded")
  333. def simple_test(self):
  334. # q = bytes.fromhex(gt.genAssetMeta(gt.guardianPrivKeys, 1, 1, 1, bytes.fromhex("4523c3F29447d1f32AEa95BEBD00383c4640F1b4"), 1, 8, b"USDC", b"CircleCoin"))
  335. # pprint.pprint(self.parseVAA(q))
  336. # sys.exit(0)
  337. # vaa = self.parseVAA(bytes.fromhex("01000000011300c412b9e5b304bde8f8633a41568991ca56b7c11a925847f0059e95010ec5241b761719f12d3f4a79d1515e08152b2e8584cd1e8217dd7743c2bf863b78b2bf040001aebade2f601a4e9083585b1bb5f98d421f116e0393f525b95d51afbe69051587531771dc127a5e9d7b74662bb7ac378d44181522dc748b1b0cbfe1b1de6ed39d01024b4e9fc86ac64aaeef84ea14e4265c3c186042a3ae9ab2933bf06c0cbf326b3c2b89e7d9854fc5204a447bd202592a72d1d6db3d007bef9fea0e35953afbd9f1010342e4446ac94545a0447851eda5d5e3b8c97c6f4ef338977562cd4ecbee2b8fea42d536d7655c28a7f7fb2ff5fc8e5775e892d853c9b2e4969f9ce054ede801700104af0d783996ccfd31d6fc6f86b634288cd2f9cc29695cfcbf12d915c1b9c383dc792c7abbe8126cd917fb8658a8de843d64171122db182453584c0c330e8889730105f34d45ec63ec0a0c4535303fd9c83a0fad6b0a112b27306a288c1b46f2a78399754536ecb07f1ab6c32d92ed50b11fef3668b23d5c1ca010ec4c924441367eac0006566671ff859eec8429874ba9e07dd107b22859cf5029928bebec6eb73cdca6752f91bb252bca76cb15ede1121a84a9a54dad126f50f282a47f7d30880ef86a3900076d0d1241e1fc9d039810a8aebd7cab863017c9420eb67f4578577c5ec4d37162723dcd6213ff6895f280a88ba70de1a5b9257fe2937cbdea007e84886abc46dd0108b24dcddaae10f5e12b7085a0c3885a050640af17ba265a448102401854183e9f3ae9a14cad1af64eb57c6f145c6f709d7ed6bb8712a6b315dc2780c9eb42812e0109df696bf506dfcd8fce57968a84d5f773706b117fad31f86bbb089ede77d71a6e54b7729f79a82e7d6e4a6797380796fbcb9ba9428e8fcdf0400515f8205b31c5010a90a03c76fdec510712b2a6ee52cc0b6df5c921437896756f34b3782aa486eb5b5d02df783664257539233502ec25bbda7dd754afc139823da8a43c0d3c91c279000b33549edd8353c4d577cb273b88b545ae547ad01e85161a4fbbbb371cff453d6311c787254e2852c3b874ea60c67d40efc3ee3f24b51bc3fe95cc0a873e8a3fb6000ce2e206214ae2b4b048857f061ed3cf8cef060c67a85ad863f266145238c5d2a85e38b4eb9b3be4d33f502df4c45762504eb43a6bf78f01363d1399b67c354df8000d2d362d64a2e3d1583e1299238829cc11d81e9b9820121c0a2eb91d542aa54c993861e8225bc3e8d028dc128d284118703a4ec69144d69402efd72a29bb9f6b8f000e6bf56fa3ae6303f495f1379b450eb52580d7d9098dd909762e6186d19e06480d2bba8f06602dbd6d3d5deac7080fc2e61bd1be97e442b63435c91fa72b33534c000fad870b47c86f6997286bd4def4bacc5a8abbfef3f730f62183c638131004ea2f706ab73ebfe8f4879bf54f580444acec212e96e41abaf4acfc3383f05478e528001089599974feaab33862cd881af13f1645079bd2fa2ff07ca744674c8556aaf97c5c9c90df332d5b4ad1428776b68612f0b1ecb98c2ebc83f44f42426f180062cd00116aa93eecb4d528afaa07b72484acd5b79ad20e9ad8e55ce37cb9138b4c12a8eb3d10fa7d932b06ac441905e0226d3420101971a72c5488e4bfef222de8c3acd1011203a3e3d8ec938ffbc3a27d8caf50fc925bd25bd286d5ad6077dffd7e205ce0806e166b661d502f8c49acf88d42fde20e6015830d5517a0bfd40f79963ded4d2d006227697a000f68690008a0ae83030f1423aa97121527f65bbbb97925b43b95231bb0478fd650a057cc4b00000000000000072003000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000000000008cf9ee7255420a50c55ef35d4bdcdd8048dee5c3c1333ecd97aff98869ea280780008000000000000000000000000000000000000000000000000000000000007a1206869206d6f6d"))
  338. # pprint.pprint(vaa)
  339. # sys.exit(0)
  340. gt = GenTest(False)
  341. self.gt = gt
  342. client = self.getAlgodClient()
  343. print("Generating the foundation account...")
  344. foundation = self.getTemporaryAccount(client)
  345. player = self.getTemporaryAccount(client)
  346. player2 = self.getTemporaryAccount(client)
  347. player3 = self.getTemporaryAccount(client)
  348. self.coreid = 4
  349. print("coreid = " + str(self.coreid))
  350. self.tokenid = 6
  351. print("token bridge " + str(self.tokenid) + " address " + get_application_address(self.tokenid))
  352. self.testid = self.createTestApp(client, player2)
  353. print("testid " + str(self.testid) + " address " + get_application_address(self.testid))
  354. print("Lets create a brand new non-wormhole asset and try to attest and send it out")
  355. self.testasset = self.createTestAsset(client, player2)
  356. print("test asset id: " + str(self.testasset))
  357. print("Lets try to create an attest for a non-wormhole thing with a huge number of decimals")
  358. # paul - attestFromAlgorand
  359. sid = self.testAttest(client, player2, self.testasset)
  360. print("... track down the generated VAA")
  361. vaa = self.getVAA(client, player, sid, self.tokenid)
  362. v = self.parseVAA(bytes.fromhex(vaa))
  363. print("We got a " + v["Meta"])
  364. # pprint.pprint(self.getBalances(client, player.getAddress()))
  365. # pprint.pprint(self.getBalances(client, player2.getAddress()))
  366. # pprint.pprint(self.getBalances(client, player3.getAddress()))
  367. #
  368. # print("Lets transfer that asset to one of our other accounts... first lets create the vaa")
  369. # # paul - transferFromAlgorand
  370. # sid = self.transferAsset(client, player2, self.testasset, 100, player3.getAddress(), 8, 0)
  371. # print("... track down the generated VAA")
  372. # vaa = self.getVAA(client, player, sid, self.tokenid)
  373. # print(".. and lets pass that to player3")
  374. # self.submitVAA(bytes.fromhex(vaa), client, player3)
  375. #
  376. # pprint.pprint(self.getBalances(client, player.getAddress()))
  377. # pprint.pprint(self.getBalances(client, player2.getAddress()))
  378. # pprint.pprint(self.getBalances(client, player3.getAddress()))
  379. #
  380. # # Lets split it into two parts... the payload and the fee
  381. # print("Lets split it into two parts... the payload and the fee")
  382. # sid = self.transferAsset(client, player2, self.testasset, 1000, player3.getAddress(), 8, 500)
  383. # print("... track down the generated VAA")
  384. # vaa = self.getVAA(client, player, sid, self.tokenid)
  385. # print(".. and lets pass that to player3 with fees being passed to player acting as a relayer")
  386. # self.submitVAA(bytes.fromhex(vaa), client, player)
  387. #
  388. # pprint.pprint(self.getBalances(client, player.getAddress()))
  389. # pprint.pprint(self.getBalances(client, player2.getAddress()))
  390. # pprint.pprint(self.getBalances(client, player3.getAddress()))
  391. #
  392. # # Now it gets tricky, lets create a virgin account...
  393. # pk, addr = account.generate_account()
  394. # emptyAccount = Account(pk)
  395. #
  396. # print("How much is in the empty account? (" + addr + ")")
  397. # pprint.pprint(self.getBalances(client, emptyAccount.getAddress()))
  398. #
  399. # # paul - transferFromAlgorand
  400. # print("Lets transfer algo this time.... first lets create the vaa")
  401. # sid = self.transferAsset(client, player2, 0, 1000000, emptyAccount.getAddress(), 8, 0)
  402. # print("... track down the generated VAA")
  403. # vaa = self.getVAA(client, player, sid, self.tokenid)
  404. ## pprint.pprint(vaa)
  405. # print(".. and lets pass that to the empty account.. but use somebody else to relay since we cannot pay for it")
  406. #
  407. # # paul - redeemOnAlgorand
  408. # self.submitVAA(bytes.fromhex(vaa), client, player)
  409. #
  410. # print("=================================================")
  411. #
  412. # print("How much is in the source account now?")
  413. # pprint.pprint(self.getBalances(client, player2.getAddress()))
  414. #
  415. # print("How much is in the empty account now?")
  416. # pprint.pprint(self.getBalances(client, emptyAccount.getAddress()))
  417. #
  418. # print("How much is in the player3 account now?")
  419. # pprint.pprint(self.getBalances(client, player3.getAddress()))
  420. #
  421. # print("Lets transfer more algo.. splut 50/50 with the relayer.. going to player3")
  422. # sid = self.transferAsset(client, player2, 0, 1000000, player3.getAddress(), 8, 500000)
  423. # print("... track down the generated VAA")
  424. # vaa = self.getVAA(client, player, sid, self.tokenid)
  425. # print(".. and lets pass that to player3.. but use the previously empty account to relay it")
  426. # self.submitVAA(bytes.fromhex(vaa), client, emptyAccount)
  427. #
  428. # print("How much is in the source account now?")
  429. # pprint.pprint(self.getBalances(client, player2.getAddress()))
  430. #
  431. # print("How much is in the empty account now?")
  432. # pprint.pprint(self.getBalances(client, emptyAccount.getAddress()))
  433. #
  434. # print("How much is in the player3 account now?")
  435. # pprint.pprint(self.getBalances(client, player3.getAddress()))
  436. #
  437. # print("How about a payload3")
  438. # sid = self.transferAsset(client, player2, 0, 100, player3.getAddress(), 8, 0, b'hi mom')
  439. # print("... track down the generated VAA")
  440. # vaa = self.getVAA(client, player, sid, self.tokenid)
  441. #
  442. # print(".. and lets pass that to the wrong account")
  443. # try:
  444. # self.submitVAA(bytes.fromhex(vaa), client, emptyAccount)
  445. # except:
  446. # print("Exception thrown... nice")
  447. #
  448. # print(".. and lets pass that to the right account")
  449. # self.submitVAA(bytes.fromhex(vaa), client, player3)
  450. # print("player account: " + player.getAddress())
  451. # pprint.pprint(client.account_info(player.getAddress()))
  452. # print("player2 account: " + player2.getAddress())
  453. # pprint.pprint(client.account_info(player2.getAddress()))
  454. # print("foundation account: " + foundation.getAddress())
  455. # pprint.pprint(client.account_info(foundation.getAddress()))
  456. #
  457. # print("core app: " + get_application_address(self.coreid))
  458. # pprint.pprint(client.account_info(get_application_address(self.coreid))),
  459. #
  460. # print("token app: " + get_application_address(self.tokenid))
  461. # pprint.pprint(client.account_info(get_application_address(self.tokenid))),
  462. #
  463. # print("asset app: " + chain_addr)
  464. # pprint.pprint(client.account_info(chain_addr))
  465. core = AlgoTest()
  466. core.simple_test()