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);
        }
예제 #3
0
        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);
        }