Ejemplo n.º 1
0
        public static StObject Formatted(StObject source)
        {
            if (AffectedNode.IsAffectedNode(source))
            {
                return(new AffectedNode(source));
            }

            if (TransactionMeta.IsTransactionMeta(source))
            {
                var meta = new TransactionMeta {
                    fields = source.fields
                };
                return(meta);
            }

            var ledgerEntryType = LedgerEntryType(source);

            if (ledgerEntryType != null)
            {
                return(LedgerFormatted(source, ledgerEntryType));
            }

            var transactionType = TransactionType(source);

            if (transactionType != null)
            {
                return(TransactionFormatted(source, transactionType));
            }

            return(source);
        }
Ejemplo n.º 2
0
        public static TransactionMeta Decode(XdrDataInputStream stream)
        {
            TransactionMeta decodedTransactionMeta = new TransactionMeta();
            int             discriminant           = stream.ReadInt();

            decodedTransactionMeta.Discriminant = discriminant;

            switch (decodedTransactionMeta.Discriminant)
            {
            case 0:
                int operationssize = stream.ReadInt();
                decodedTransactionMeta.Operations = new OperationMeta[operationssize];

                for (int i = 0; i < operationssize; i++)
                {
                    decodedTransactionMeta.Operations[i] = OperationMeta.Decode(stream);
                }

                break;

            case 1:
                decodedTransactionMeta.V1 = TransactionMetaV1.Decode(stream);
                break;
            }

            return(decodedTransactionMeta);
        }
        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);
        }
Ejemplo n.º 5
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 static void Encode(IByteWriter stream, TransactionMeta encodedTransactionMeta) {
 XdrEncoding.EncodeInt32(encodedTransactionMeta.Discriminant, stream);
 switch (encodedTransactionMeta.Discriminant) {
 case 0:
 int operationssize = encodedTransactionMeta.Operations.Length;
 XdrEncoding.EncodeInt32(operationssize, stream);
 for (int i = 0; i < operationssize; i++) {
   OperationMeta.Encode(stream, encodedTransactionMeta.Operations[i]);
 }
 break;
 }
 }
 public static TransactionMeta Decode(IByteReader stream) {
   TransactionMeta decodedTransactionMeta = new TransactionMeta();
 decodedTransactionMeta.Discriminant = XdrEncoding.DecodeInt32(stream);
 switch (decodedTransactionMeta.Discriminant) {
 case 0:
 int operationssize = XdrEncoding.DecodeInt32(stream);
 decodedTransactionMeta.Operations = new OperationMeta[operationssize];
 for (int i = 0; i < operationssize; i++) {
   decodedTransactionMeta.Operations[i] = OperationMeta.Decode(stream);
 }
 break;
 }
   return decodedTransactionMeta;
 }
Ejemplo n.º 8
0
 public static void Encode(XdrDataOutputStream stream, TransactionMeta encodedTransactionMeta)
 {
     stream.WriteInt(encodedTransactionMeta.Discriminant);
     switch (encodedTransactionMeta.Discriminant)
     {
     case 0:
         var operationssize = encodedTransactionMeta.Operations.Length;
         stream.WriteInt(operationssize);
         for (var i = 0; i < operationssize; i++)
         {
             OperationMeta.Encode(stream, encodedTransactionMeta.Operations[i]);
         }
         break;
     }
 }
Ejemplo n.º 9
0
 public static void Encode(IByteWriter stream, TransactionMeta encodedTransactionMeta)
 {
     XdrEncoding.EncodeInt32(encodedTransactionMeta.Discriminant, stream);
     switch (encodedTransactionMeta.Discriminant)
     {
     case 0:
         int operationssize = encodedTransactionMeta.Operations.Length;
         XdrEncoding.EncodeInt32(operationssize, stream);
         for (int i = 0; i < operationssize; i++)
         {
             OperationMeta.Encode(stream, encodedTransactionMeta.Operations[i]);
         }
         break;
     }
 }
Ejemplo n.º 10
0
        public static TransactionMeta Decode(IByteReader stream)
        {
            TransactionMeta decodedTransactionMeta = new TransactionMeta();

            decodedTransactionMeta.Discriminant = XdrEncoding.DecodeInt32(stream);
            switch (decodedTransactionMeta.Discriminant)
            {
            case 0:
                int operationssize = XdrEncoding.DecodeInt32(stream);
                decodedTransactionMeta.Operations = new OperationMeta[operationssize];
                for (int i = 0; i < operationssize; i++)
                {
                    decodedTransactionMeta.Operations[i] = OperationMeta.Decode(stream);
                }
                break;
            }
            return(decodedTransactionMeta);
        }
Ejemplo n.º 11
0
        public void test_parsing_transaction_meta_with_STArray()
        {
            TransactionMeta meta  = (TransactionMeta)StObject.FromJObject(JObject.Parse(this.metastring));
            StArray         nodes = meta[StArray.AffectedNodes];

            // Some helper methods to get enum fields
            Assert.AreEqual(TransactionEngineResult.tesSUCCESS, meta.TransactionResult());

            StObject firstAffected = nodes[0];

            Assert.AreEqual(
                LedgerEntryType.AccountRoot,
                ((AccountRoot)firstAffected[StObject.ModifiedNode]).LedgerEntryType());

            Assert.True(firstAffected.Has(StObject.ModifiedNode));
            Assert.AreEqual(new UInt32((long)35), this.finalSequence(firstAffected));
            Assert.AreEqual(new UInt32((long)177), this.finalSequence(nodes[1]));
        }
        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);
        }
Ejemplo n.º 13
0
        public static TransactionMeta Decode(XdrDataInputStream stream)
        {
            var decodedTransactionMeta = new TransactionMeta();
            var discriminant           = stream.ReadInt();

            decodedTransactionMeta.Discriminant = discriminant;
            switch (decodedTransactionMeta.Discriminant)
            {
            case 0:
                var operationssize = stream.ReadInt();
                decodedTransactionMeta.Operations = new OperationMeta[operationssize];
                for (var i = 0; i < operationssize; i++)
                {
                    decodedTransactionMeta.Operations[i] = OperationMeta.Decode(stream);
                }
                break;
            }
            return(decodedTransactionMeta);
        }
Ejemplo n.º 14
0
        public static void Encode(XdrDataOutputStream stream, TransactionMeta encodedTransactionMeta)
        {
            stream.WriteInt((int)encodedTransactionMeta.Discriminant);
            switch (encodedTransactionMeta.Discriminant)
            {
            case 0:
                int operationssize = encodedTransactionMeta.Operations.Length;
                stream.WriteInt(operationssize);
                for (int i = 0; i < operationssize; i++)
                {
                    OperationMeta.Encode(stream, encodedTransactionMeta.Operations[i]);
                }
                break;

            case 1:
                TransactionMetaV1.Encode(stream, encodedTransactionMeta.V1);
                break;

            case 2:
                TransactionMetaV2.Encode(stream, encodedTransactionMeta.V2);
                break;
            }
        }
Ejemplo n.º 15
0
        public TransactionResult(JObject json, Source resultMessageSource)
        {
            Message = json;

            try
            {
                if (resultMessageSource == Source.transaction_subscription_notification)
                {
                    EngineResult = TransactionEngineResult.FromString(json.GetValue("engine_result").ToObject<string>());
                    Validated = json.GetValue("validated").ToObject<bool>();
                    LedgerHash = Hash256.Translate.FromString(json.GetValue("ledger_hash").ToObject<string>());
                    LedgerIndex = new UInt32(json.GetValue("ledger_index").ToObject<long>());

                    JToken transaction;
                    if (json.TryGetValue("transaction", out transaction))
                    {
                        Txn = (Transaction) StObject.FromJObject(transaction.ToObject<JObject>());
                        Hash = Txn[Hash256.hash];
                    }

                    JToken meta;
                    if (json.TryGetValue("meta", out meta))
                    {
                        Meta = (TransactionMeta)StObject.FromJObject(meta.ToObject<JObject>());
                    }
                }
                else if (resultMessageSource == Source.request_tx_result)
                {
                    JToken validated;
                    Validated = json.TryGetValue("validated", out validated) && validated.ToObject<bool>();

                    JToken meta;
                    if (Validated && !json.TryGetValue("meta", out meta))
                    {
                        throw new InvalidOperationException("It's validated, why doesn't it have meta??");
                    }

                    if (Validated)
                    {
                        Meta = (TransactionMeta)StObject.FromJObject(json.GetValue("meta").ToObject<JObject>());
                        EngineResult = TransactionEngineResult.FromNumber(Meta[UInt8.TransactionResult]);
                        Txn = (Transaction)StObject.FromJObject(json);
                        Hash = Txn[Hash256.hash];
                        LedgerHash = null; // XXXXXX
                    }
                }
                else if (resultMessageSource == Source.request_account_tx)
                {
                    JToken validated;
                    Validated = json.TryGetValue("validated", out validated) && validated.ToObject<bool>();

                    JToken meta;
                    if (Validated && !json.TryGetValue("meta", out meta))
                    {
                        throw new InvalidOperationException("It's validated, why doesn't it have meta??");
                    }

                    if (Validated)
                    {
                        var tx = json.GetValue("tx").ToObject<JObject>();
                        Meta = (TransactionMeta)StObject.FromJObject(json.GetValue("meta").ToObject<JObject>());
                        EngineResult = TransactionEngineResult.FromNumber(Meta[UInt8.TransactionResult]);
                        Txn = (Transaction)StObject.FromJObject(tx);
                        Hash = Txn[Hash256.hash];
                        LedgerIndex = new UInt32(tx.GetValue("ledger_index").ToObject<long>());
                        LedgerHash = null;
                    }
                }
                else if (resultMessageSource == Source.request_account_tx_binary)
                {
                    JToken validated;
                    Validated = json.TryGetValue("validated", out validated) && validated.ToObject<bool>();

                    JToken meta;
                    if (Validated && !json.TryGetValue("meta", out meta))
                    {
                        throw new InvalidOperationException("It's validated, why doesn't it have meta??");
                    }

                    if (Validated)
                    {
                        /*
                        {
                            "ledger_index": 3378767,
                            "meta": "201 ...",
                            "tx_blob": "120 ...",
                            "validated": true
                        },
                        */

                        var tx = json.GetValue("tx_blob").ToObject<string>();
                        byte[] decodedTx = B16.Decode(tx);
                        Meta = (TransactionMeta)StObject.Translate.FromHex(json.GetValue("meta").ToObject<string>());
                        Txn = (Transaction)StObject.Translate.FromBytes(decodedTx);
                        Hash = Hash256.TransactionId(decodedTx);
                        Txn.Add(Field.hash, Hash);

                        EngineResult = Meta.TransactionResult();
                        LedgerIndex = new UInt32(json.GetValue("ledger_index").ToObject<long>());
                        LedgerHash = null;
                    }
                }
            }
            catch (JsonException e)
            {
                throw new ApplicationException("Json deserialization failed.", e);
            }
        }
Ejemplo n.º 16
0
 public static void Encode(XdrDataOutputStream stream, TransactionResultMeta encodedTransactionResultMeta)
 {
     TransactionResultPair.Encode(stream, encodedTransactionResultMeta.Result);
     LedgerEntryChanges.Encode(stream, encodedTransactionResultMeta.FeeProcessing);
     TransactionMeta.Encode(stream, encodedTransactionResultMeta.TxApplyProcessing);
 }