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); }
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); }
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; }
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; } }
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); }
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); }
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); }
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; } }
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); } }
public static void Encode(XdrDataOutputStream stream, TransactionResultMeta encodedTransactionResultMeta) { TransactionResultPair.Encode(stream, encodedTransactionResultMeta.Result); LedgerEntryChanges.Encode(stream, encodedTransactionResultMeta.FeeProcessing); TransactionMeta.Encode(stream, encodedTransactionResultMeta.TxApplyProcessing); }