private async Task <(string, decimal)> ProcessAccountMergeAsync(HorizonAccountOperation operation, string address) { var tx = await _client.GetTransactionAsync(operation.TransactionHash); var xdr = Convert.FromBase64String(tx.ResultMetaXdr); var reader = new XdrDataInputStream(xdr); var txMeta = TransactionMeta.Decode(reader); var mergeMeta = txMeta.Operations.First ( op => op.Changes.InnerValue.Any ( c => c.Discriminant.InnerValue == LedgerEntryChangeType.LedgerEntryChangeTypeEnum.LEDGER_ENTRY_REMOVED && KeyPair.FromXdrPublicKey(c.Removed.Account.AccountID.InnerValue).Address == operation.SourceAccount ) ); var sourceAccountStateMeta = mergeMeta.Changes.InnerValue .First ( c => c.Discriminant.InnerValue == LedgerEntryChangeType.LedgerEntryChangeTypeEnum.LEDGER_ENTRY_STATE && KeyPair.FromXdrPublicKey(c.State.Data.Account.AccountID.InnerValue).Address == operation.SourceAccount ); var amount = sourceAccountStateMeta.State.Data.Account.Balance.InnerValue * _nativeAssetMultiplier; if (address.Equals(operation.Into, StringComparison.InvariantCultureIgnoreCase)) { return(_nativeAssetCode, amount); } return(_nativeAssetCode, -amount); }
public void TestDecodeTxMeta() { var txMeta = "AAAAAAAAAAEAAAADAAAAAABZMEIAAAAAAAAAAN1WENUWtSJL+M+tGluVdjhsBb27iFtEjYeHD7YBOwWlAAAAAC09a8AAWTBCAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAwBZL8QAAAAAAAAAAP1qe44j+i4uIT+arbD4QDQBt8ryEeJd7a0jskQ3nwDeAALU1gZ4V7UACD1BAAAAHgAAAAoAAAAAAAAAAAAAAAABAAAAAAAACgAAAAARC07BokpLTOF+/vVKBwiAlop7hHGJTNeGGlY4MoPykwAAAAEAAAAAK+Lzfd3yDD+Ov0GbYu1g7SaIBrKZeBUxoCunkLuI7aoAAAABAAAAAERmsKL73CyLV/HvjyQCERDXXpWE70Xhyb6MR5qPO3yQAAAAAQAAAABSORGwAdyuanN3sNOHqNSpACyYdkUM3L8VafUu69EvEgAAAAEAAAAAeCzqJNkMM/jLvyuMIfyFHljBlLCtDyj17RMycPuNtRMAAAABAAAAAIEi4R7juq15ymL00DNlAddunyFT4FyUD4muC4t3bobdAAAAAQAAAACaNpLL5YMfjOTdXVEqrAh99LM12sN6He6pHgCRAa1f1QAAAAEAAAAAqB+lfAPV9ak+Zkv4aTNZwGaFFAfui4+yhM3dGhoYJ+sAAAABAAAAAMNJrEvdMg6M+M+n4BDIdzsVSj/ZI9SvAp7mOOsvAD/WAAAAAQAAAADbHA6xiKB1+G79mVqpsHMOleOqKa5mxDpP5KEp/Xdz9wAAAAEAAAAAAAAAAAAAAAEAWTBCAAAAAAAAAAD9anuOI/ouLiE/mq2w+EA0AbfK8hHiXe2tI7JEN58A3gAC1NXZOuv1AAg9QQAAAB4AAAAKAAAAAAAAAAAAAAAAAQAAAAAAAAoAAAAAEQtOwaJKS0zhfv71SgcIgJaKe4RxiUzXhhpWODKD8pMAAAABAAAAACvi833d8gw/jr9Bm2LtYO0miAaymXgVMaArp5C7iO2qAAAAAQAAAABEZrCi+9wsi1fx748kAhEQ116VhO9F4cm+jEeajzt8kAAAAAEAAAAAUjkRsAHcrmpzd7DTh6jUqQAsmHZFDNy/FWn1LuvRLxIAAAABAAAAAHgs6iTZDDP4y78rjCH8hR5YwZSwrQ8o9e0TMnD7jbUTAAAAAQAAAACBIuEe47qtecpi9NAzZQHXbp8hU+BclA+JrguLd26G3QAAAAEAAAAAmjaSy+WDH4zk3V1RKqwIffSzNdrDeh3uqR4AkQGtX9UAAAABAAAAAKgfpXwD1fWpPmZL+GkzWcBmhRQH7ouPsoTN3RoaGCfrAAAAAQAAAADDSaxL3TIOjPjPp+AQyHc7FUo/2SPUrwKe5jjrLwA/1gAAAAEAAAAA2xwOsYigdfhu/ZlaqbBzDpXjqimuZsQ6T+ShKf13c/cAAAABAAAAAAAAAAA="; var bytes = Convert.FromBase64String(txMeta); var transactionMeta = TransactionMeta.Decode(new XdrDataInputStream(bytes)); Assert.AreEqual(1, transactionMeta.Operations.Length); }
public static TransactionResultMeta Decode(XdrDataInputStream stream) { TransactionResultMeta decodedTransactionResultMeta = new TransactionResultMeta(); decodedTransactionResultMeta.Result = TransactionResultPair.Decode(stream); decodedTransactionResultMeta.FeeProcessing = LedgerEntryChanges.Decode(stream); decodedTransactionResultMeta.TxApplyProcessing = TransactionMeta.Decode(stream); return(decodedTransactionResultMeta); }
public long GetAccountMergeAmount(string metaXdrBase64, string sourceAddress) { var xdr = Convert.FromBase64String(metaXdrBase64); var reader = new XdrDataInputStream(xdr); var txMeta = TransactionMeta.Decode(reader); var mergeMeta = txMeta.Operations.First(op => { return(op.Changes.InnerValue.Any(c => { return c.Discriminant.InnerValue == LedgerEntryChangeType.LedgerEntryChangeTypeEnum.LEDGER_ENTRY_REMOVED && KeyPair.FromXdrPublicKey(c.Removed.Account.AccountID.InnerValue).Address == sourceAddress; })); }); var sourceAccountStateMeta = mergeMeta.Changes.InnerValue.First(c => c.Discriminant.InnerValue == LedgerEntryChangeType.LedgerEntryChangeTypeEnum.LEDGER_ENTRY_STATE && KeyPair.FromXdrPublicKey(c.State.Data.Account.AccountID.InnerValue).Address == sourceAddress); return(sourceAccountStateMeta.State.Data.Account.Balance.InnerValue); }