diff --git a/.idea/gradle.xml b/.idea/gradle.xml index dbe604a60c..da117a274a 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -11,7 +11,7 @@ diff --git a/.idea/misc.xml b/.idea/misc.xml index 8e44652cdd..703e5d4b89 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -5,41 +5,6 @@ - - - - diff --git a/app/build.gradle b/app/build.gradle index d6bf56e099..dff789a723 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -44,10 +44,10 @@ android { } dependencies { - implementation project(':ripple-core') implementation project(':card-common') implementation project(':card-android') implementation project(':server-android') + implementation project(':ripple-core-0.0.1') // implementation 'com.github.TangemCash:card-common:0.1.2' // implementation 'com.github.TangemCash:card-android:0.1.3' diff --git a/app/src/main/java/com/tangem/domain/wallet/xrp/XrpEngine.java b/app/src/main/java/com/tangem/domain/wallet/xrp/XrpEngine.java index 4cd6d5b250..d79b9ca4cd 100644 --- a/app/src/main/java/com/tangem/domain/wallet/xrp/XrpEngine.java +++ b/app/src/main/java/com/tangem/domain/wallet/xrp/XrpEngine.java @@ -6,8 +6,6 @@ import android.util.Log; import com.ripple.core.coretypes.AccountID; import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.types.known.tx.signed.SignedTransaction; -import com.ripple.core.types.known.tx.txns.Payment; import com.ripple.crypto.ecdsa.ECDSASignature; import com.ripple.encodings.addresses.Addresses; import com.ripple.utils.HashUtils; @@ -26,10 +24,6 @@ import com.tangem.util.CryptoUtil; import com.tangem.util.DecimalDigitsInputFilter; import com.tangem.wallet.R; -import org.spongycastle.asn1.ASN1EncodableVector; -import org.spongycastle.asn1.ASN1Integer; -import org.spongycastle.asn1.DERSequence; - import java.math.BigDecimal; import java.math.BigInteger; import java.util.Arrays; @@ -364,7 +358,7 @@ public class XrpEngine extends CoinEngine { fee = Long.toString(convertToInternalAmount(feeValue).longValueExact()); - Payment payment = new Payment(); + XrpPayment payment = new XrpPayment(); // Put `as` AccountID field Account, `Object` o payment.as(AccountID.Account, coinData.getWallet()); @@ -373,7 +367,7 @@ public class XrpEngine extends CoinEngine { payment.as(UInt32.Sequence, coinData.getSequence()); payment.as(com.ripple.core.coretypes.Amount.Fee, fee); - SignedTransaction signedTx = payment.prepare(canonisePubKey(ctx.getCard().getWalletPublicKeyRar())); + XrpSignedTransaction signedTx = payment.prepare(canonisePubKey(ctx.getCard().getWalletPublicKeyRar())); return new SignTask.TransactionToSign() { @@ -449,8 +443,7 @@ public class XrpEngine extends CoinEngine { throw new Exception("Invalid wallet address in answer!"); } coinData.setBalanceConfirmed(Long.parseLong(rippleResponse.getResult().getAccount_data().getBalance())); - } - else if (rippleResponse.getResult().getError_code().equals(19)) // "Account not found" + } else if (rippleResponse.getResult().getError_code().equals(19)) // "Account not found" coinData.setAccountNotFound(true); } catch (Exception e) { e.printStackTrace(); diff --git a/app/src/main/java/com/tangem/domain/wallet/xrp/XrpPayment.java b/app/src/main/java/com/tangem/domain/wallet/xrp/XrpPayment.java new file mode 100644 index 0000000000..1d202c922f --- /dev/null +++ b/app/src/main/java/com/tangem/domain/wallet/xrp/XrpPayment.java @@ -0,0 +1,17 @@ +package com.tangem.domain.wallet.xrp; + +import com.ripple.core.types.known.tx.txns.Payment; + +public class XrpPayment extends Payment { + + public XrpPayment() { + super(); + } + + public XrpSignedTransaction prepare(byte[] pubKeyBytes) { + XrpSignedTransaction tx = XrpSignedTransaction.fromTx(this); + tx.prepare(pubKeyBytes); + return tx; + } + +} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/tx/signed/SignedTransaction.java b/app/src/main/java/com/tangem/domain/wallet/xrp/XrpSignedTransaction.java similarity index 74% rename from ripple-core/src/main/java/com/ripple/core/types/known/tx/signed/SignedTransaction.java rename to app/src/main/java/com/tangem/domain/wallet/xrp/XrpSignedTransaction.java index 56440a9bf1..29babc095b 100644 --- a/ripple-core/src/main/java/com/ripple/core/types/known/tx/signed/SignedTransaction.java +++ b/app/src/main/java/com/tangem/domain/wallet/xrp/XrpSignedTransaction.java @@ -1,41 +1,32 @@ -package com.ripple.core.types.known.tx.signed; +package com.tangem.domain.wallet.xrp; import com.ripple.core.coretypes.Amount; import com.ripple.core.coretypes.Blob; import com.ripple.core.coretypes.STObject; import com.ripple.core.coretypes.hash.HalfSha512; -import com.ripple.core.coretypes.hash.Hash256; import com.ripple.core.coretypes.hash.prefixes.HashPrefix; import com.ripple.core.coretypes.uint.UInt32; import com.ripple.core.serialized.BytesList; import com.ripple.core.serialized.MultiSink; -import com.ripple.core.serialized.enums.TransactionType; import com.ripple.core.types.known.tx.Transaction; +import com.ripple.core.types.known.tx.signed.SignedTransaction; import java.util.Arrays; -public class SignedTransaction { - private SignedTransaction(Transaction of) { - // TODO: is this just over kill ? +public class XrpSignedTransaction extends SignedTransaction { + private XrpSignedTransaction(Transaction of) { txn = (Transaction) STObject.fromBytes(of.toBytes()); } - protected SignedTransaction() { + protected XrpSignedTransaction() { } - public Transaction txn; - public Hash256 hash; - - public byte[] signingData; - public byte[] previousSigningData; - public String tx_blob; - - public static SignedTransaction fromTx(Transaction tx) { - return new SignedTransaction(tx); + public static XrpSignedTransaction fromTx(Transaction tx) { + return new XrpSignedTransaction(tx); } public void prepare(byte[] pubKeyBytes) { - prepare(pubKeyBytes,null, null, null); + prepare(pubKeyBytes, null, null, null); } public void prepare(byte[] pubKeyBytes, @@ -87,8 +78,4 @@ public class SignedTransaction { previousSigningData = signingData; // } } - - public TransactionType transactionType() { - return txn.transactionType(); - } } diff --git a/ripple-core-0.0.1/build.gradle b/ripple-core-0.0.1/build.gradle new file mode 100644 index 0000000000..31be8312e1 --- /dev/null +++ b/ripple-core-0.0.1/build.gradle @@ -0,0 +1,2 @@ +configurations.maybeCreate("default") +artifacts.add("default", file('ripple-core-0.0.1-SNAPSHOT.jar')) \ No newline at end of file diff --git a/ripple-core-0.0.1/ripple-core-0.0.1-SNAPSHOT.jar b/ripple-core-0.0.1/ripple-core-0.0.1-SNAPSHOT.jar new file mode 100644 index 0000000000..0600aabbdb Binary files /dev/null and b/ripple-core-0.0.1/ripple-core-0.0.1-SNAPSHOT.jar differ diff --git a/ripple-core/.gitignore b/ripple-core/.gitignore deleted file mode 100644 index ea8c4bf7f3..0000000000 --- a/ripple-core/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target diff --git a/ripple-core/README.md b/ripple-core/README.md deleted file mode 100644 index d89d96f5e8..0000000000 --- a/ripple-core/README.md +++ /dev/null @@ -1,391 +0,0 @@ -# SerializedTypes Overview - -Ripple uses a node store, where objects are keyed by a 32byte hash value. - -These keys are created by hashing a binary representation of the whole object -prefixed with a name-spacing sequence of bytes, unique to each class of object. -As such, a method of consistently producing a binary sequence from a given -object was required. - -Objects have fields, which are a pairing of a type and a name. Names are simply -ordinals used to look up preassigned names in a per type table. The type ordinal, -similarly, is used to lookup a given class. - -In ripple-lib-java the type equates to a `SerializedType`, with types such as 32 -bit unsigned integer, variable length byte strings and even arrays of objects. -The fields have an ordinal quality, and can be deterministically sorted, -important for consistent binary representation. - -There are also container types: An STObject, short for `SerializedType Object`, -is an associative container of fields to other SerializedTypes (even an STObject -itself). An STArray is an array of STObjects with a single Field, mapped to an -STObject, containing an arbitrary amount of Field -> SerializedType pairs. (See -notes below on differences to C++ implementation) - -## Types - -Following is a survey of some of the classes, sorted somewhat topologically. - -The following json representation of metadata related to a finalized transaction -can be used as a concrete example and will be referenced later. - -```java -/** - * - * # Transaction Meta JSON - * - * { - * "TransactionResult": "tesSUCCESS", - * - * {@link com.ripple.core.types.known.tx.result.TransactionResult} - * {@link com.ripple.core.fields.Field.TransactionResult} - * {@link com.ripple.core.coretypes.uint.UInt8} - * - * "TransactionIndex": 0, - * - * {@link com.ripple.core.types.known.tx.result.TransactionMeta#transactionIndex} - * {@link com.ripple.core.coretypes.uint.UInt32} - * - * "AffectedNodes": [ - * - * {@link com.ripple.core.types.known.tx.result.TransactionMeta#affectedNodes} - * - * { - - * - * {@link com.ripple.core.types.known.tx.result.AffectedNode} - - * - * "NewFields": { - * - * {@link com.ripple.core.types.known.tx.result.AffectedNode#nodeAsFinal()} - * - * "Sequence": 103929, - * - * {@link com.ripple.core.fields.Field#Sequence} - * - * - * "TakerGets": { - * - * {@link com.ripple.core.coretypes.Amount} - * - * "currency": "ILS", - * - * {@link com.ripple.core.coretypes.Currency} - * - * "value": "1694.768", - * - * {@link com.ripple.core.coretypes.AccountID} - * - * "issuer": "rNPRNzBB92BVpAhhZr4iXDTveCgV5Pofm9" - * - * {@link java.math.BigDecimal} - * - * }, - * - * - * "Account": "raD5qJMAShLeHZXf9wjUmo6vRK4arj9cF3", - * - * {@link com.ripple.core.coretypes.AccountID} - * - * "BookDirectory": "62A3338CAF2E1BEE510FC33DE1863C56948E962CCE173CA55C14BE8A20D7F000", - * - * {@link com.ripple.core.coretypes.Quality#fromBookDirectory} - * - * "TakerPays": "98957503520", - * - * {@link com.ripple.core.coretypes.Amount} - * {@link com.ripple.core.coretypes.Amount#isNative()} - * - * "OwnerNode": "000000000000000E" - * - * {@link com.ripple.core.types.known.sle.entries.Offer#ownerNodeDirectoryIndex} - * }, - * - * "LedgerIndex": "3596CE72C902BAFAAB56CC486ACAF9B4AFC67CF7CADBB81A4AA9CBDC8C5CB1AA", - * - * {@link com.ripple.core.coretypes.hash.Hash256#index} - * - * "LedgerEntryType": "Offer" - * - * {@link com.ripple.core.serialized.enums.LedgerEntryType} - * {@link com.ripple.core.types.known.sle.entries.Offer} - * } - * }, - * - * - * { - - * - * {@link com.ripple.core.types.known.tx.result.AffectedNode} - - * - * "NewFields": { - * - * {@link com.ripple.core.types.known.tx.result.AffectedNode#nodeAsFinal()} - * - * "RootIndex": "62A3338CAF2E1BEE510FC33DE1863C56948E962CCE173CA55C14BE8A20D7F000", - * - * com.ripple.core.coretypes.hash.Hash256#index - * - * "TakerGetsIssuer": "92D705968936C419CE614BF264B5EEB1CEA47FF4", - * - * {@link com.ripple.core.coretypes.Currency} - * {@link com.ripple.core.coretypes.hash.Hash160} - * {@link com.ripple.core.fields.Field#TakerGetsIssuer} - * - * "ExchangeRate": "5C14BE8A20D7F000", - * - * {@link com.ripple.core.coretypes.Quality#fromBookDirectory} - * - * "TakerGetsCurrency": "000000000000000000000000494C530000000000" - * - * {@link com.ripple.core.coretypes.Currency} - * {@link com.ripple.core.coretypes.hash.Hash160} - * {@link com.ripple.core.fields.Field#TakerGetsCurrency} - * - * }, - * - * "LedgerIndex": "62A3338CAF2E1BEE510FC33DE1863C56948E962CCE173CA55C14BE8A20D7F000", - * - * {@link com.ripple.core.coretypes.hash.Hash256#index} - * - * "LedgerEntryType": "DirectoryNode" - * - * {@link com.ripple.core.types.known.sle.entries.DirectoryNode} - * {@link com.ripple.core.serialized.enums.LedgerEntryType#DirectoryNode} - * } - * }, - * - * { - * "ModifiedNode": { - * - * {@link com.ripple.core.types.known.tx.result.AffectedNode} - * {@link com.ripple.core.types.known.tx.result.AffectedNode#isModifiedNode()} - * - * "FinalFields": { - * - * {@link com.ripple.core.types.known.tx.result.AffectedNode#nodeAsFinal()} - * - * "RootIndex": "801C5AFB5862D4666D0DF8E5BE1385DC9B421ED09A4269542A07BC0267584B64", - * - * {@link com.ripple.core.types.known.sle.entries.DirectoryNode#rootIndex} - * - * "Flags": 0, - * "Owner": "raD5qJMAShLeHZXf9wjUmo6vRK4arj9cF3", - * - * {@link com.ripple.core.coretypes.hash.Index#ownerDirectory} - * - * "IndexPrevious": "0000000000000000" - * - * {@link com.ripple.core.types.known.sle.entries.DirectoryNode#hasPreviousIndex} - * {@link com.ripple.core.types.known.sle.entries.DirectoryNode#prevIndex} - * }, - * - * "LedgerIndex": "AB03F8AA02FFA4635E7CE2850416AEC5542910A2B4DBE93C318FEB08375E0DB5", - * - * "LedgerEntryType": "DirectoryNode" - * } - * }, - * { - * "ModifiedNode": { - * - * {@link com.ripple.core.types.known.tx.result.AffectedNode} - * {@link com.ripple.core.types.known.tx.result.AffectedNode#isModifiedNode()} - * - * "FinalFields": { - * - * {@link com.ripple.core.types.known.tx.result.AffectedNode#nodeAsFinal()} - * - * "Sequence": 103930, - * "Flags": 0, - * "Account": "raD5qJMAShLeHZXf9wjUmo6vRK4arj9cF3", - * "OwnerCount": 9, - * "Balance": "106861218302" - * - * {@link com.ripple.core.coretypes.Amount} - * }, - * - * "LedgerIndex": "CF23A37E39A571A0F22EC3E97EB0169936B520C3088963F16C5EE4AC59130B1B", - * - * {@link com.ripple.core.coretypes.hash.Index#accountRoot} - * - * "LedgerEntryType": "AccountRoot", - * - * {@link com.ripple.core.types.known.sle.entries.AccountRoot} - * {@link com.ripple.core.serialized.enums.LedgerEntryType#AccountRoot} - * - * "PreviousFields": { - * - * {@link com.ripple.core.types.known.tx.result.AffectedNode#nodeAsPrevious()} - * - * "Sequence": 103929, - * "OwnerCount": 8, - * "Balance": "106861218312" - * }, - * - * "PreviousTxnID": "DE15F43F4A73C4F6CB1C334D9E47BDE84467C0902796BB81D4924885D1C11E6D", - * - * {@link com.ripple.core.types.known.tx.Transaction#hash} - * - * "PreviousTxnLgrSeq": 3225338 - * - * {@link com.ripple.core.coretypes.uint.UInt32} - * } - * } - * ] - * } -*/ -``` - -* Note that ALL field names are, by convention, upper case (in fact field names (index, hash) may be -lower cased but are not serialized) - -* The `AffectedNodes` is an STArray. As stated, the immediate -children each contain only a single key (or [Field](src/main/java/com/ripple/core/fields/Field.java#L138-L140)) - - * ModifiedNode - -Moving on. - -``` -com -└── ripple - ├── serialized - ├── core - │ - ├── enums - │   ├── LedgerEntryType - │   ├── EngineResult - │   └── TransactionType -``` - -* In the json above look at the [TransactionResult](src/main/java/com/ripple/core/fields/Field.java#L164) field. - Note that it has a Type of of UINT8, yet clearly it's represented in json as a string. - -#### com.ripple.core.fields.Type - - This is a simple Java enum(eration) of the various types. eg. - - UINT32(2) - - This definition implies giving the static ordinal `2` to the UINT32 type. - -#### com.ripple.core.fields.Field - - Consider the following definition of a field - - QualityIn(20, Type.UINT32) - - As stated before a Field has name and type ordinals, but it also has an - implied symbolic string representation (as seen used in the json above) - - The string name can be looked up via a `code`, which is an integer created by - shifting the type ordinal 16 bits to the left and ORing it with the name. - - See: [com.ripple.core.fields.Field#fromCode](src/main/java/com/ripple/core/fields/Field.java) - -#### com.ripple.core.fields.HasField - - This is simply an interface for returning a Field. We know that a Field - implies a Type and a name and there's a set amount of them. For each concrete - class implementation of a given Type, we create a XXXfield class that - implements HasField - - eg. - - ```java - protected abstract static class STArrayField implements HasField{} - public static STArrayField starrayField(final Field f) { - return new STArrayField(){ @Override public Field getField() {return f;}}; - } - ``` - - Then we can create static members on the concrete class - - ```java - static public STArrayField AffectedNodes = starrayField(Field.AffectedNodes); - static public STArrayField Signatures = starrayField(Field.Signatures); - static public STArrayField Template = starrayField(Field.Template); - ``` - - Later this is used create an api that looks as so - - ```java - if (transactionType() == TransactionType.Payment && meta.has(STArray.AffectedNodes)) { - STArray affected = meta.get(STArray.AffectedNodes); - for (STObject node : affected) { - if (node.has(STObject.CreatedNode)) { - STObject created = node.get(STObject.CreatedNode); - ``` - - This is implemented by overloading get() - - ```java - public STArray get(STArray.STArrayField f) { - return (STArray) fields.get(f.getField()); - } - ``` - -### com.ripple.core.serialized - -#### com.ripple.core.serialized.SerializedType - -```java -public interface SerializedType { - Object toJSON(); - byte[] toBytes(); - String toHex(); - void toBytesSink(BytesSink to); - Type type(); -} -``` - -#### com.ripple.core.serialized.BytesList - -A dynamic array of byte[]. Used by TypeTranslators to avoid needless -copying (see fromParser(parser, hint)). - -#### com.ripple.core.serialized.BinaryParser - -Responsible for decoding Fields and VL encoded structures. - -#### com.ripple.core.serialized.TypeTranslator - -Handles converting a SerializedType instances to/from json, binary and other non -SerializedType values. - -Has methods like fromHex, fromBytes, which delegate to fromParser. - -#### com.ripple.core.serialized.BinarySerializer - -Responsible for encoding Fields/SerializeType into binary. - -## Notes - -* In the C++ implementation of serialized objects, an STObject can, itself, be - assigned a Field, which is stored outside of the associative structure. - - This is problematic when storing as json. Consider this pseudocode. - - ```python - >>> so = STObject() - >>> so.name = "FieldName" - >>> so["FieldOfDreams"] = "A Kevin Costner Movie" - >>> sa = STArray([so]) - ``` - - How could `sa` be declared as json? - - ```json - >>> [{"FieldName" : {"FieldOfDreams": "A Kevin Costner Movie"}}] - ``` - - This is in fact how rippled works. There is no 1:1 mapping of STObject to {} - - In ripple-lib(-java)? there is, and single key children of STArrays are enforced. - -* Ripple uses 32 byte hashes for object indexes, taking half of a SHA512 hash, - which is ~%33 faster than SHA256. - -* Simply using google protocol buffers was considered inadequate [link](https://github.com/ripple/rippled/blob/ee51968820fc41c5aeadf2067bfdae54ff21fa66/BinaryFormats.txt#L16) \ No newline at end of file diff --git a/ripple-core/build.gradle b/ripple-core/build.gradle deleted file mode 100644 index 7ee498ed2c..0000000000 --- a/ripple-core/build.gradle +++ /dev/null @@ -1,52 +0,0 @@ -apply plugin: 'java' -apply plugin: 'kotlin' - -description = 'ripple-core' - -version = '0.0.1-SNAPSHOT' - -sourceCompatibility = 1.8 -targetCompatibility = 1.8 - -dependencies { - compile 'net.i2p.crypto:eddsa:0.2.0' - compile 'org.bouncycastle:bcprov-jdk15on:1.58' - compile 'org.json:json:20171018' - compile 'com.fasterxml.jackson.core:jackson-databind:2.9.3' - testCompile 'junit:junit:4.12' - testCompile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" - testCompile "org.jetbrains.kotlinx:kotlinx-coroutines-core:0.22.5" -} -buildscript { - ext.kotlin_version = '1.3.0' - repositories { - mavenCentral() - } - dependencies { - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} -repositories { - mavenCentral() -} -compileKotlin { - kotlinOptions { - jvmTarget = "1.8" - } -} -compileTestKotlin { - kotlinOptions { - jvmTarget = "1.8" - } -} - -task getDeps(type: Copy) { - from configurations.compile - into "$rootDir/jars/" -} - -kotlin { - experimental { - coroutines "enable" - } -} \ No newline at end of file diff --git a/ripple-core/src/main/java/README.java b/ripple-core/src/main/java/README.java deleted file mode 100644 index 0d01f2dfc7..0000000000 --- a/ripple-core/src/main/java/README.java +++ /dev/null @@ -1,206 +0,0 @@ -/** - * - * # Transaction Meta JSON - * - * { - * "TransactionResult": "tesSUCCESS", - * - * {@link com.ripple.core.types.known.tx.result.TransactionResult} - * {@link com.ripple.core.fields.Field.TransactionResult} - * {@link com.ripple.core.coretypes.uint.UInt8} - * - * "TransactionIndex": 0, - * - * {@link com.ripple.core.types.known.tx.result.TransactionMeta#transactionIndex} - * {@link com.ripple.core.coretypes.uint.UInt32} - * - * "AffectedNodes": [ - * - * {@link com.ripple.core.types.known.tx.result.TransactionMeta#affectedNodes} - * - * { - * "CreatedNode": { - * - * {@link com.ripple.core.types.known.tx.result.AffectedNode} - * {@link com.ripple.core.types.known.tx.result.AffectedNode#isCreatedNode()} - * - * "NewFields": { - * - * {@link com.ripple.core.types.known.tx.result.AffectedNode#nodeAsFinal()} - * - * "Sequence": 103929, - * - * {@link com.ripple.core.fields.Field#Sequence} - * - * - * "TakerGets": { - * - * {@link com.ripple.core.coretypes.Amount} - * - * "currency": "ILS", - * - * {@link com.ripple.core.coretypes.Currency} - * - * "value": "1694.768", - * - * {@link com.ripple.core.coretypes.AccountID} - * - * "issuer": "rNPRNzBB92BVpAhhZr4iXDTveCgV5Pofm9" - * - * {@link java.math.BigDecimal} - * - * }, - * - * - * "Account": "raD5qJMAShLeHZXf9wjUmo6vRK4arj9cF3", - * - * {@link com.ripple.core.coretypes.AccountID} - * - * "BookDirectory": "62A3338CAF2E1BEE510FC33DE1863C56948E962CCE173CA55C14BE8A20D7F000", - * - * {@link com.ripple.core.coretypes.Quality#fromBookDirectory} - * - * "TakerPays": "98957503520", - * - * {@link com.ripple.core.coretypes.Amount} - * {@link com.ripple.core.coretypes.Amount#isNative()} - * - * "OwnerNode": "000000000000000E" - * - * {@link com.ripple.core.types.known.sle.entries.Offer#ownerNodeDirectoryIndex} - * }, - * - * "LedgerIndex": "3596CE72C902BAFAAB56CC486ACAF9B4AFC67CF7CADBB81A4AA9CBDC8C5CB1AA", - * - * {@link com.ripple.core.coretypes.hash.Hash256#index} - * - * "LedgerEntryType": "Offer" - * - * {@link com.ripple.core.serialized.enums.LedgerEntryType} - * {@link com.ripple.core.types.known.sle.entries.Offer} - * } - * }, - * - * - * { - * "CreatedNode": { - * - * {@link com.ripple.core.types.known.tx.result.AffectedNode} - * {@link com.ripple.core.types.known.tx.result.AffectedNode#isCreatedNode()} - * - * "NewFields": { - * - * {@link com.ripple.core.types.known.tx.result.AffectedNode#nodeAsFinal()} - * - * "RootIndex": "62A3338CAF2E1BEE510FC33DE1863C56948E962CCE173CA55C14BE8A20D7F000", - * - * com.ripple.core.coretypes.hash.Hash256#index - * - * "TakerGetsIssuer": "92D705968936C419CE614BF264B5EEB1CEA47FF4", - * - * {@link com.ripple.core.coretypes.Currency} - * {@link com.ripple.core.coretypes.hash.Hash160} - * {@link com.ripple.core.fields.Field#TakerGetsIssuer} - * - * "ExchangeRate": "5C14BE8A20D7F000", - * - * {@link com.ripple.core.coretypes.Quality#fromBookDirectory} - * - * "TakerGetsCurrency": "000000000000000000000000494C530000000000" - * - * {@link com.ripple.core.coretypes.Currency} - * {@link com.ripple.core.coretypes.hash.Hash160} - * {@link com.ripple.core.fields.Field#TakerGetsCurrency} - * - * }, - * - * "LedgerIndex": "62A3338CAF2E1BEE510FC33DE1863C56948E962CCE173CA55C14BE8A20D7F000", - * - * {@link com.ripple.core.coretypes.hash.Hash256#index} - * - * "LedgerEntryType": "DirectoryNode" - * - * {@link com.ripple.core.types.known.sle.entries.DirectoryNode} - * {@link com.ripple.core.serialized.enums.LedgerEntryType#DirectoryNode} - * } - * }, - * - * { - * "ModifiedNode": { - * - * {@link com.ripple.core.types.known.tx.result.AffectedNode} - * {@link com.ripple.core.types.known.tx.result.AffectedNode#isModifiedNode()} - * - * "FinalFields": { - * - * {@link com.ripple.core.types.known.tx.result.AffectedNode#nodeAsFinal()} - * - * "RootIndex": "801C5AFB5862D4666D0DF8E5BE1385DC9B421ED09A4269542A07BC0267584B64", - * - * {@link com.ripple.core.types.known.sle.entries.DirectoryNode#rootIndex} - * - * "Flags": 0, - * "Owner": "raD5qJMAShLeHZXf9wjUmo6vRK4arj9cF3", - * - * {@link com.ripple.core.coretypes.hash.Index#ownerDirectory} - * - * "IndexPrevious": "0000000000000000" - * - * {@link com.ripple.core.types.known.sle.entries.DirectoryNode#hasPreviousIndex} - * {@link com.ripple.core.types.known.sle.entries.DirectoryNode#prevIndex} - * }, - * - * "LedgerIndex": "AB03F8AA02FFA4635E7CE2850416AEC5542910A2B4DBE93C318FEB08375E0DB5", - * - * "LedgerEntryType": "DirectoryNode" - * } - * }, - * { - * "ModifiedNode": { - * - * {@link com.ripple.core.types.known.tx.result.AffectedNode} - * {@link com.ripple.core.types.known.tx.result.AffectedNode#isModifiedNode()} - * - * "FinalFields": { - * - * {@link com.ripple.core.types.known.tx.result.AffectedNode#nodeAsFinal()} - * - * "Sequence": 103930, - * "Flags": 0, - * "Account": "raD5qJMAShLeHZXf9wjUmo6vRK4arj9cF3", - * "OwnerCount": 9, - * "Balance": "106861218302" - * - * {@link com.ripple.core.coretypes.Amount} - * }, - * - * "LedgerIndex": "CF23A37E39A571A0F22EC3E97EB0169936B520C3088963F16C5EE4AC59130B1B", - * - * {@link com.ripple.core.coretypes.hash.Index#accountRoot} - * - * "LedgerEntryType": "AccountRoot", - * - * {@link com.ripple.core.types.known.sle.entries.AccountRoot} - * {@link com.ripple.core.serialized.enums.LedgerEntryType#AccountRoot} - * - * "PreviousFields": { - * - * {@link com.ripple.core.types.known.tx.result.AffectedNode#nodeAsPrevious()} - * - * "Sequence": 103929, - * "OwnerCount": 8, - * "Balance": "106861218312" - * }, - * - * "PreviousTxnID": "DE15F43F4A73C4F6CB1C334D9E47BDE84467C0902796BB81D4924885D1C11E6D", - * - * {@link com.ripple.core.types.known.tx.Transaction#hash} - * - * "PreviousTxnLgrSeq": 3225338 - * - * {@link com.ripple.core.coretypes.uint.UInt32} - * } - * } - * ] - * } -*/ \ No newline at end of file diff --git a/ripple-core/src/main/java/com/ripple/core/binary/FileSTWriter.java b/ripple-core/src/main/java/com/ripple/core/binary/FileSTWriter.java deleted file mode 100644 index e46af9db43..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/binary/FileSTWriter.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.ripple.core.binary; - -import com.ripple.core.serialized.StreamSink; - -import java.io.*; - -public class FileSTWriter extends STWriter implements Closeable { - BufferedOutputStream out; - - private FileSTWriter(StreamSink sink, BufferedOutputStream out) { - super(sink); - this.out = out; - } - - public static FileSTWriter fromFile(String path) { - FileOutputStream fos = null; - try { - fos = new FileOutputStream(path); - } catch (FileNotFoundException e) { - throw new RuntimeException(e); - } - BufferedOutputStream out = new BufferedOutputStream(fos); - StreamSink sink = new StreamSink(out); - - return new FileSTWriter(sink, out); - } - - @Override - public void close() throws IOException { - out.close(); - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/binary/STReader.java b/ripple-core/src/main/java/com/ripple/core/binary/STReader.java deleted file mode 100644 index dc3655073b..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/binary/STReader.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.ripple.core.binary; - -import com.ripple.core.coretypes.*; -import com.ripple.core.coretypes.hash.Hash128; -import com.ripple.core.coretypes.hash.Hash160; -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.coretypes.hash.prefixes.HashPrefix; -import com.ripple.core.coretypes.uint.UInt16; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.coretypes.uint.UInt64; -import com.ripple.core.coretypes.uint.UInt8; -import com.ripple.core.serialized.BinaryParser; -import com.ripple.core.serialized.StreamBinaryParser; -import com.ripple.core.types.known.sle.LedgerEntry; -import com.ripple.core.types.known.tx.Transaction; -import com.ripple.core.types.known.tx.result.TransactionMeta; -import com.ripple.core.types.known.tx.result.TransactionResult; - -import java.util.Arrays; -import java.util.Date; - -public class STReader { - protected BinaryParser parser; - public STReader(BinaryParser parser) { - this.parser = parser; - } - public STReader(String hex) { - this.parser = new BinaryParser(hex); - } - - public static STReader fromFile(String arg) { - return new STReader(StreamBinaryParser.fromFile(arg)); - } - - public UInt8 uInt8() { - return UInt8.fromParser(parser); - } - public UInt16 uInt16() { - return UInt16.fromParser(parser); - } - public UInt32 uInt32() { - return UInt32.fromParser(parser); - } - public UInt64 uInt64() { - return UInt64.fromParser(parser); - } - public Hash128 hash128() { - return Hash128.fromParser(parser); - } - public Hash160 hash160() { - return Hash160.fromParser(parser); - } - public Currency currency() { - return Currency.fromParser(parser); - } - public Hash256 hash256() { - return Hash256.fromParser(parser); - } - public Vector256 vector256() { - return Vector256.fromParser(parser); - } - public AccountID accountID() { - return AccountID.fromParser(parser); - } - public Blob variableLength() { - int hint = parser.readVLLength(); - return Blob.fromParser(parser, hint); - } - public Amount amount() { - return Amount.fromParser(parser); - } - public PathSet pathSet() { - return PathSet.fromParser(parser); - } - - public STObject stObject() { - return STObject.fromParser(parser); - } - public STObject vlStObject() { - return STObject.fromParser(parser, parser.readVLLength()); - } - - public HashPrefix hashPrefix() { - byte[] read = parser.read(4); - for (HashPrefix hashPrefix : HashPrefix.values()) { - if (Arrays.equals(read, hashPrefix.bytes())) { - return hashPrefix; - } - } - return null; - } - - public STArray stArray() { - return STArray.fromParser(parser); - } - public Date rippleDate() { - return RippleDate.fromParser(parser); - } - - public BinaryParser parser() { - return parser; - } - - public TransactionResult readTransactionResult(UInt32 ledgerIndex) { - Hash256 hash = hash256(); - Transaction txn = (Transaction) vlStObject(); - TransactionMeta meta = (TransactionMeta) vlStObject(); - return new TransactionResult(ledgerIndex.longValue(), hash, txn, meta); - } - - public LedgerEntry readLE() { - Hash256 index = hash256(); - STObject object = vlStObject(); - LedgerEntry le = (LedgerEntry) object; - le.index(index); - return le; - } - - public int readOneInt() { - return parser.readOneInt(); - } - - public boolean end() { - return parser.end(); - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/binary/STWriter.java b/ripple-core/src/main/java/com/ripple/core/binary/STWriter.java deleted file mode 100644 index 77f28eb7f7..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/binary/STWriter.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.ripple.core.binary; - -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.serialized.BinarySerializer; -import com.ripple.core.serialized.BytesSink; -import com.ripple.core.serialized.SerializedType; -import com.ripple.core.serialized.StreamSink; -import com.ripple.core.types.known.sle.LedgerEntry; -import com.ripple.core.types.known.tx.result.TransactionResult; - -import java.io.*; - -public class STWriter implements BytesSink, Closeable { - BytesSink sink; - BinarySerializer serializer; - public STWriter(BytesSink bytesSink) { - serializer = new BinarySerializer(bytesSink); - sink = bytesSink; - } - - private OutputStream stream; - private STWriter(BytesSink sink, OutputStream stream) { - this(sink); - this.stream = stream; - } - - public static STWriter toFile(String path) { - try { - FileOutputStream fos = new FileOutputStream(path); - BufferedOutputStream bos = new BufferedOutputStream(fos); - return new STWriter(new StreamSink(bos), bos); - } catch (FileNotFoundException e) { - throw new RuntimeException(e); - } - } - - public void write(SerializedType obj) { - obj.toBytesSink(sink); - } - public void writeVl(SerializedType obj) { - serializer.addLengthEncoded(obj); - } - - @Override - public void add(byte aByte) { - sink.add(aByte); - } - - @Override - public void add(byte[] bytes) { - sink.add(bytes); - } - - public void write(TransactionResult result) { - write(result.hash); - writeVl(result.txn); - writeVl(result.meta); - } - - public void write(Hash256 hash256, LedgerEntry le) { - write(hash256); - writeVl(le); - } - - @Override - public void close() throws IOException { - if (this.stream != null) { - this.stream.close(); - } - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/cache/SLECache.java b/ripple-core/src/main/java/com/ripple/core/cache/SLECache.java deleted file mode 100644 index 55552ede01..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/cache/SLECache.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.ripple.core.cache; - -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.types.known.sle.LedgerEntry; -import com.ripple.core.types.known.tx.result.AffectedNode; -import com.ripple.core.types.known.tx.result.TransactionMeta; -import com.ripple.core.types.known.tx.result.TransactionResult; - -import java.util.TreeMap; - -public class SLECache { - private final TreeMap cache = new TreeMap(); - - public static class CacheEntry { - public LedgerEntry le; - public UInt32 prevTxnIndex; - public UInt32 prevLedger; - public boolean deleted = false; - - public void upateLedgerEntry(LedgerEntry le, UInt32 ledgerIndex, UInt32 txnIndex) { - if (doUpdate(txnIndex, ledgerIndex)) { - // in the first case - prevTxnIndex = txnIndex; - prevLedger = ledgerIndex; - - if (le == null) { - deleted = true; - } - this.le = le; - } - } - - private boolean doUpdate(UInt32 txnIndex, UInt32 ledgerIndex) { - if (le == null && !deleted) { - return true; - } - if (prevLedger == null) { - return true; - } - int ledgerCmp = ledgerIndex.compareTo(prevLedger); - if (ledgerCmp == 1) { - return true; - } - if (ledgerCmp == 0) { - if (prevTxnIndex == null) { - // We don't know, should log a warning or something - // Should we keep the first one that we have of this index - // or can we assume that the latest is the best? - return true; - } - if (txnIndex.compareTo(prevTxnIndex) == 1) { - // This happened AFTER - return true; - } - } - //ledgerCmp == -1 or txnIndex <= previousTxnIndex ss - return false; - } - } - - public boolean cache(LedgerEntry le, UInt32 validatedLedgerIndex) { - Hash256 index = le.ledgerIndex(); - CacheEntry ce = getOrCreate(index); - ce.upateLedgerEntry(le, validatedLedgerIndex, null); - return true; - } - - private CacheEntry getEntry(Hash256 index) { - return cache.get(index); - } - - private CacheEntry createEntry(Hash256 index) { - CacheEntry ce = new CacheEntry(); - cache.put(index, ce); - return ce; - } - - public LedgerEntry get(Hash256 index) { - CacheEntry entry = getEntry(index); - return entry == null || entry.deleted ? null : entry.le; - } - - public void updateFromTransactionResult(TransactionResult tr) { - if (!tr.validated) { - return; - } - - TransactionMeta meta = tr.meta; - UInt32 ledgerIndex = tr.ledgerIndex; - UInt32 txnIndex = meta.transactionIndex(); - - for (AffectedNode an : meta.affectedNodes()) { - Hash256 index = an.ledgerIndex(); - CacheEntry ce = getOrCreate(index); - ce.upateLedgerEntry(an.isDeletedNode() ? null : (LedgerEntry) an.nodeAsFinal(), - ledgerIndex, - txnIndex); - } - } - - private CacheEntry getOrCreate(Hash256 index) { - CacheEntry already = getEntry(index); - if (already == null) { - return createEntry(index); - } else { - return already; - } - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/coretypes/AccountID.java b/ripple-core/src/main/java/com/ripple/core/coretypes/AccountID.java deleted file mode 100644 index 606c5b2b71..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/coretypes/AccountID.java +++ /dev/null @@ -1,188 +0,0 @@ -package com.ripple.core.coretypes; - -import com.ripple.core.coretypes.hash.Hash160; -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.coretypes.hash.Index; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.fields.AccountIDField; -import com.ripple.core.fields.Field; -import com.ripple.core.fields.Type; -import com.ripple.core.serialized.BinaryParser; -import com.ripple.core.serialized.BytesSink; -import com.ripple.core.serialized.TypeTranslator; -import com.ripple.crypto.Seed; -import com.ripple.crypto.keys.IKeyPair; -import com.ripple.encodings.addresses.Addresses; -import com.ripple.encodings.common.B16; -import com.ripple.utils.Utils; - -/** - * Originally it was intended that AccountIDs would be variable length so that's - * why they are variable length encoded as top level field objects. - * - * Note however, that in practice, all account ids are just 160 bit hashes. - * Consider the fields TakerPaysIssuer and fixed length encoding of issuers in - * amount serializations. - * - * Thus, we extend Hash160 which affords us some functionality. - */ -public class AccountID extends Hash160 { - public static final AccountID NEUTRAL = fromInteger(1); - public static final AccountID XRP_ISSUER = fromInteger(0); - - public final String address; - - public AccountID(byte[] bytes) { - this(bytes, encodeAddress(bytes)); - } - - public AccountID(byte[] bytes, String address) { - super(bytes); - this.address = address; - } - - // Static from* constructors - public static AccountID fromString(String value) { - if (value.length() == 160 / 4) { - return fromBytes(B16.decode(value)); - } else { - return fromAddress(value); - } - } - - static public AccountID fromAddress(String address) { - byte[] bytes = Addresses.decodeAccountID(address); - return new AccountID(bytes, address); - } - - static public AccountID fromParser(BinaryParser parser) { - return translate.fromParser(parser); - } - - static public AccountID fromHex(String hex) { - return translate.fromHex(hex); - } - - public static AccountID fromKeyPair(IKeyPair kp) { - byte[] bytes = kp.id(); - return new AccountID(bytes, encodeAddress(bytes)); - } - - public static AccountID fromPassPhrase(String phrase) { - return fromKeyPair(Seed.fromPassPhrase(phrase).keyPair()); - } - - static public AccountID fromSeed(String seed) { - return fromKeyPair(Seed.getKeyPair(seed)); - } - - private static AccountID fromInteger(Integer n) { - return fromBytes(Utils.padTo160(new UInt32(n).toByteArray())); - } - - public static AccountID fromBytes(byte[] bytes) { - return new AccountID(bytes, encodeAddress(bytes)); - } - - @Override - public int hashCode() { - return address.hashCode(); - } - - @Override - public String toString() { - return address; - } - - public Issue issue(String code) { - return new Issue(Currency.fromString(code), this); - } - - public Issue issue(Currency c) { - return new Issue(c, this); - } - - public boolean isNativeIssuer() { - return this == XRP_ISSUER || equals(XRP_ISSUER); - } - - // SerializedType interface implementation - @Override - public Object toJSON() { - return toString(); - } - - @Override - public byte[] toBytes() { - return translate.toBytes(this); - } - - @Override - public String toHex() { - return translate.toHex(this); - } - - @Override - public void toBytesSink(BytesSink to) { - to.add(bytes()); - } - - @Override - public Type type() { - return Type.AccountID; - } - - public Hash256 lineIndex(Issue issue) { - if (issue.isNative()) throw new AssertionError(); - return Index.rippleState(this, issue.issuer(), issue.currency()); - } - - public static class Translator extends TypeTranslator { - @Override - public AccountID fromParser(BinaryParser parser, Integer hint) { - if (hint == null) { - hint = 20; - } - return AccountID.fromBytes(parser.read(hint)); - } - - @Override - public String toString(AccountID obj) { - return obj.toString(); - } - - @Override - public AccountID fromString(String value) { - return AccountID.fromString(value); - } - } - - // - - static public Translator translate = new Translator(); - - // helpers - - private static String encodeAddress(byte[] address) { - return Addresses.encodeAccountID(address); - } - - // Typed field definitions - private static AccountIDField accountField(final Field f) { - return new AccountIDField() { - @Override - public Field getField() { - return f; - } - }; - } - - static public AccountIDField Account = accountField(Field.Account); - static public AccountIDField Owner = accountField(Field.Owner); - static public AccountIDField Destination = accountField(Field.Destination); - static public AccountIDField Issuer = accountField(Field.Issuer); - static public AccountIDField Target = accountField(Field.Target); - static public AccountIDField RegularKey = accountField(Field.RegularKey); - static public AccountIDField Authorize = accountField(Field.Authorize); - static public AccountIDField Unauthorize = accountField(Field.Unauthorize); -} diff --git a/ripple-core/src/main/java/com/ripple/core/coretypes/Amount.java b/ripple-core/src/main/java/com/ripple/core/coretypes/Amount.java deleted file mode 100644 index 3813a5ac09..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/coretypes/Amount.java +++ /dev/null @@ -1,790 +0,0 @@ -package com.ripple.core.coretypes; - -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.ripple.core.coretypes.uint.UInt64; -import com.ripple.core.fields.AmountField; -import com.ripple.core.fields.Field; -import com.ripple.core.fields.Type; -import com.ripple.core.serialized.BinaryParser; -import com.ripple.core.serialized.BytesSink; -import com.ripple.core.serialized.SerializedType; -import com.ripple.core.serialized.TypeTranslator; -import org.json.JSONObject; - -import java.math.BigDecimal; -import java.math.BigInteger; -import java.math.MathContext; -import java.math.RoundingMode; -import java.util.Objects; - -/** - * In ripple, amounts are either XRP, the native currency, or an IOU of - * a given currency as issued by a designated account. - */ -public class Amount extends Number implements SerializedType, Comparable - -{ - - private static BigDecimal TAKER_PAYS_FOR_THAT_DAMN_OFFER = new BigDecimal("1000000000000.000100"); - -// public static final Amount NEUTRAL_ZERO = new Amount(Currency.NEUTRAL, AccountID.NEUTRAL); - - /** - * Thrown when an Amount is constructed with an invalid value - */ - public static class PrecisionError extends RuntimeException { - public Amount illegal; - - public PrecisionError(String s) { - super(s); - } - - public PrecisionError(String s, Amount amount) { - super(s); - illegal = amount; - } - } - - // For rounding/multiplying/dividing - public static final MathContext MATH_CONTEXT = new MathContext(16, RoundingMode.HALF_UP); - // The maximum amount of digits in mantissa of an IOU amount - public static final int MAXIMUM_IOU_PRECISION = 16; - // The smallest quantity of an XRP is a drop, 1 millionth of an XRP - public static final int MAXIMUM_NATIVE_SCALE = 6; - // Defines bounds for native amounts - public static final BigDecimal MAX_NATIVE_VALUE = parseDecimal("100,000,000,000.0"); - public static final BigDecimal MIN_NATIVE_VALUE = parseDecimal("0.000,001"); - - // These are flags used when serializing to binary form - public static final UInt64 BINARY_FLAG_IS_IOU = new UInt64("8000000000000000", 16); - public static final UInt64 BINARY_FLAG_IS_NON_NEGATIVE_NATIVE = new UInt64("4000000000000000", 16); - - public static final Amount ONE_XRP = fromString("1.0"); - - // TODO, even though all these fields are effectively final, and only - // ever set it would be nice to actually use the final modifier. - // Perhaps create an amount builder. - - // The quantity of XRP or Issue(currency/issuer pairing) - // When native, the value unit is XRP, not drops. - private BigDecimal value; - private Currency currency; - // If the currency is XRP - private boolean isNative; - // Normally, in the constructor of an Amount the value is checked - // that it's scale/precision and quantity are correctly bounded. - // If unbounded is true, these checks are skipped. - // This is there for historical ledgers that contain amounts that - // would now be considered malformed (in the sense of the transaction - // engine result class temMALFORMED) - private boolean unbounded = false; - // The ZERO account is used for specifying the issuer for native - // amounts. In practice the issuer is never used when an - // amount is native. - private AccountID issuer; - - private UInt64 mantissa; - // The exponent is always calculated. - private int exponent; - - public Amount(BigDecimal value, Currency currency, AccountID issuer) { - this(value, currency, issuer, false); - } - - public Amount(BigDecimal xrpScaleValue) { - isNative = true; - currency = Currency.XRP; - this.setAndCheckValue(xrpScaleValue); - } - - public Amount(Number xrpScaleValue) { - isNative = true; - currency = Currency.XRP; - this.setAndCheckValue(BigDecimal.valueOf(xrpScaleValue.doubleValue())); - } - - public Amount(BigDecimal value, Currency currency, AccountID issuer, boolean isNative, boolean unbounded) { - this.isNative = isNative; - this.currency = currency; - this.unbounded = unbounded; - this.setAndCheckValue(value); - // done AFTER set value which sets some default values - this.issuer = issuer; - } - - public Amount(Currency currency, AccountID account) { - this(BigDecimal.ZERO, currency, account); - } - - // Private constructors - Amount(BigDecimal newValue, Currency currency, AccountID issuer, boolean isNative) { - this(newValue, currency, issuer, isNative, false); - } - - private Amount(BigDecimal value, String currency, String issuer) { - this(value, currency); - if (issuer != null) { - this.issuer = AccountID.fromString(issuer); - } - } - - public Amount(BigDecimal value, String currency) { - isNative = false; - this.currency = Currency.fromString(currency); - this.setAndCheckValue(value); - } - - private void setAndCheckValue(BigDecimal value) { - this.value = value.stripTrailingZeros(); - initialize(); - } - - private void initialize() { - if (isNative()) { - issuer = AccountID.XRP_ISSUER; - if (!unbounded) { - checkXRPBounds(); - } - // Offset is unused for native amounts - exponent = -6; // compared to drops. - } else { - issuer = AccountID.NEUTRAL; - exponent = calculateExponent(); - - if (value.precision() > MAXIMUM_IOU_PRECISION && !unbounded) { - String err = "value precision of " + value.precision() + - " is greater than maximum " + - "iou precision of " + MAXIMUM_IOU_PRECISION; - throw new PrecisionError(err, this); - } - } - mantissa = calculateMantissa(); - } - - private Amount newValue(BigDecimal newValue) { - return newValue(newValue, false, false); - } - - private Amount newValue(BigDecimal newValue, boolean round, boolean unbounded) { - if (round) { - newValue = roundValue(newValue, isNative); - } - return new Amount(newValue, currency, issuer, isNative, unbounded); - } - - private Amount newValue(BigDecimal val, boolean round) { - return newValue(val, round, false); - } - - /* Getters and Setters */ - - public BigDecimal value() { - return value; - } - - public Currency currency() { - return currency; - } - - public AccountID issuer() { - return issuer; - } - - public Issue issue() { - // TODO: store the currency and issuer as an Issue - return new Issue(currency, issuer); - } - - private UInt64 mantissa() { - // Having this lazily computed and then cached would give significant - // performance boosts in some single threaded contexts. Given the inputs - // for the method are at least effectively final, and the method is - // essentially a pure function, it seems probably safe to do. It - // seems at worst, that in a multi threaded context, some extra work - // will be done in rare cases? - // TODO: check this assumption - return mantissa; - } - - public int exponent() { - return exponent; - } - - public boolean isNative() { - return isNative; - } - - public String currencyString() { - return currency.toString(); - } - - public String issuerString() { - if (issuer == null) { - return ""; - } - return issuer.toString(); - } - - /* Offset & Mantissa Helpers */ - - /** - * @return a positive value for the mantissa - */ - private UInt64 calculateMantissa() { - if (isNative()) { - return new UInt64(bigIntegerDrops().abs()); - } else { - return new UInt64(bigIntegerIOUMantissa()); - } - } - - private int calculateExponent() { - return -MAXIMUM_IOU_PRECISION + value.precision() - value.scale(); - } - - private BigInteger bigIntegerIOUMantissa() { - return exactBigIntegerScaledByPowerOfTen(-exponent).abs(); - } - - private BigInteger bigIntegerDrops() { - return exactBigIntegerScaledByPowerOfTen(MAXIMUM_NATIVE_SCALE); - } - - private BigInteger exactBigIntegerScaledByPowerOfTen(int n) { - return value.scaleByPowerOfTen(n).toBigIntegerExact(); - } - - /* Equality testing */ - - private boolean equalValue(Amount amt) { - return compareTo(amt) == 0; - } - @Override - public boolean equals(Object obj) { - if (obj instanceof Amount) { - return equals((Amount) obj); - } - return super.equals(obj); - } - - public boolean equals(Amount amt) { - return equalValue(amt) && - currency.equals(amt.currency) && - (isNative() || issuer.equals(amt.issuer)); - } - - public boolean equalsExceptIssuer(Amount amt) { - return equalValue(amt) && - currencyString().equals(amt.currencyString()); - } - - public int compareTo(Amount amount) { - Objects.requireNonNull(amount); - return value.compareTo(amount.value); - } - - public boolean isZero() { - return value.signum() == 0; - } - - public boolean isNegative() { - return value.signum() == -1; - } - - // Maybe you want !isNegative() - // Any amount that !isNegative() isn't necessarily positive - // Is a zero amount strictly positive? no - public boolean isPositive() { - return value.signum() == 1; - } - - /** - - Arithmetic Operations - - There's no checking if an amount is of a different currency/issuer. - - All operations return amounts of the same currency/issuer as the - first operand. - - eg. - - amountOne.add(amountTwo) - - The currency/issuer of the resultant amount, is that of `amountOne` - - Divide and multiply are equivalent to the javascript ripple-lib - ratio_human and product_human. - - */ - public Amount add(BigDecimal augend) { - return newValue(value.add(augend), true); - } - - public Amount add(Amount augend) { - return add(augend.value); - } - - public Amount add(Number augend) { - return add(BigDecimal.valueOf(augend.doubleValue())); - } - - public Amount subtract(BigDecimal subtrahend) { - return newValue(value.subtract(subtrahend), true); - } - - public Amount subtract(Amount subtrahend) { - return subtract(subtrahend.value); - } - - public Amount subtract(Number subtrahend) { - return subtract(BigDecimal.valueOf(subtrahend.doubleValue())); - } - - public Amount multiply(BigDecimal divisor) { - return newValue(value.multiply(divisor, MATH_CONTEXT), true); - } - - public Amount multiply(Amount multiplicand) { - return multiply(multiplicand.value); - } - - public Amount multiply(Number multiplicand) { - return multiply(BigDecimal.valueOf(multiplicand.doubleValue())); - } - - public Amount divide(BigDecimal divisor) { - return newValue(value.divide(divisor, MATH_CONTEXT), true); - } - - public Amount divide(Amount divisor) { - return divide(divisor.value); - } - - public Amount divide(Number divisor) { - return divide(BigDecimal.valueOf(divisor.doubleValue())); - } - - public Amount negate() { - return newValue(value.negate()); - } - - public Amount abs() { - return newValue(value.abs()); - } - public Amount min(Amount val) { - return (compareTo(val) <= 0 ? this : val); - } - public Amount max(Amount val) { - return (compareTo(val) >= 0 ? this : val); - } - - /* Offer related helpers */ - public BigDecimal computeQuality(Amount toExchangeThisWith) { - return value.divide(toExchangeThisWith.value, MathContext.DECIMAL128); - } - /** - * @return Amount - * The real native unit is a drop, one million of which are an XRP. - * We want `one` unit at XRP scale (1e6 drops), or if it's an IOU, - * just `one`. - */ - public Amount one() { - if (isNative()) { - return ONE_XRP; - } else { - return issue().amount(1); - } - } - - /* Serialized Type implementation */ - - @Override - public Object toJSON() { - if (isNative()) { - return toDropsString(); - } else { - return toJSONObject(); - } - } - - public JSONObject toJSONObject() { - if (isNative()) { - throw new RuntimeException("Native amounts must be serialized as a string"); - } - - JSONObject out = new JSONObject(); - out.put("currency", currencyString()); - out.put("value", valueText()); - out.put("issuer", issuerString()); - return out; - } - - @Override - public byte[] toBytes() { - return translate.toBytes(this); - } - - @Override - public String toHex() { - return translate.toHex(this); - } - - @Override - public void toBytesSink(BytesSink to) { - // TODO: probably better off using long - UInt64 man = mantissa(); - - if (isNative()) { - if (!isNegative()) { - man = man.or(BINARY_FLAG_IS_NON_NEGATIVE_NATIVE); - } - to.add(man.toByteArray()); - } else { - int exponent = exponent(); - UInt64 packed; - - if (isZero()) { - packed = BINARY_FLAG_IS_IOU; - } else if (isNegative()) { - packed = man.or(new UInt64(512 + /* 0 + */ 97 + exponent).shiftLeft(64 - 10)); - } else { - packed = man.or(new UInt64(512 + 256 + 97 + exponent).shiftLeft(64 - 10)); - } - - to.add(packed.toByteArray()); - to.add(currency.bytes()); - to.add(issuer.bytes()); - } - } - - @Override - public Type type() { - return Type.Amount; - } - - public static class Translator extends TypeTranslator { - @Override - public Amount fromString(String s) { - // We need to use the full dotted.path here, otherwise - // we get confused with the AmountField Amount - return com.ripple.core.coretypes.Amount.fromString(s); - } - - @Override - public Amount fromParser(BinaryParser parser, Integer hint) { - BigDecimal value; - byte[] mantissa = parser.read(8); - byte b1 = mantissa[0], b2 = mantissa[1]; - - boolean isIOU = (b1 & 0x80) != 0; - boolean isPositive = (b1 & 0x40) != 0; - int sign = isPositive ? 1 : -1; - - if (isIOU) { - mantissa[0] = 0; - Currency curr = Currency.fromParser(parser); - AccountID issuer = AccountID.fromParser(parser); - int exponent = ((b1 & 0x3F) << 2) + ((b2 & 0xff) >> 6) - 97; - mantissa[1] &= 0x3F; - - value = new BigDecimal(new BigInteger(sign, mantissa), -exponent); - return new Amount(value, curr, issuer, false); - } else { - mantissa[0] &= 0x3F; - value = xrpFromDropsMantissa(mantissa, sign); - return new Amount(value); - } - } - - @Override - public String toString(Amount obj) { - return obj.stringRepr(); - } - - public JSONObject toJSONObject(Amount obj) { - return obj.toJSONObject(); - } - - @Override - public Amount fromJSONObject(JSONObject jsonObject) { - String valueString = jsonObject.getString("value"); - String issuerString = jsonObject.getString("issuer"); - String currencyString = jsonObject.getString("currency"); - return new Amount(new BigDecimal(valueString), currencyString, issuerString); - } - - @Override - public Amount fromJacksonObject(ObjectNode object) { - checkField(object, "value"); - checkField(object, "issuer"); - checkField(object, "currency"); - String value = object.get("value").asText(); - String issuer = object.get("issuer").asText(); - String currency = object.get("currency").asText(); - return new Amount(new BigDecimal(value), currency, issuer); - } - - private void checkField(ObjectNode object, String field) { - if (!object.has(field)) { - throw new IllegalArgumentException(object + "is missing `" + - field + "`"); - } - } - } - static public Translator translate = new Translator(); - - public static BigDecimal xrpFromDropsMantissa(byte[] mantissa, int sign) { - return new BigDecimal(new BigInteger(sign, mantissa), 6); - } - - /* Number overides */ - @Override - public int intValue() { - return value.intValueExact(); - } - - @Override - public long longValue() { - return value.longValueExact(); - } - - @Override - public float floatValue() { - return value.floatValue(); - } - - @Override - public double doubleValue() { - return value.doubleValue(); - } - - public BigInteger bigIntegerValue() { - return value.toBigIntegerExact(); - } - - public Amount newIssuer(AccountID issuer) { - return new Amount(value, currency, issuer, isNative, unbounded); - } - - public Amount copy() { - return new Amount(value, currency, issuer, isNative, unbounded); - } - - // Static constructors - public static Amount fromString(String val) { - if (val.contains("/")) { - return fromIOUString(val); - } else if (val.contains(".")) { - return fromXrpString(val); - } else { - return fromDropString(val); - } - - } - - public static Amount fromParser(BinaryParser parser) { - return translate.fromParser(parser); - } - - public static Amount fromHex(String hex) { - return translate.fromHex(hex); - } - public static Amount fromBytes(byte[] bytes) { - return translate.fromBytes(bytes); - } - - public static Amount fromJSONObject(JSONObject jsonObject) { - return translate.fromJSONObject(jsonObject); - } - - public static Amount fromJacksonObject(ObjectNode object) { - return translate.fromJacksonObject(object); - } - - public static Amount fromValue(Object amount) { - return translate.fromValue(amount); - } - - public static Amount fromDropString(String val) { - BigDecimal xrp = new BigDecimal(val).scaleByPowerOfTen(-6); - checkDropsValueWhole(val); - return new Amount(xrp); - } - - public static Amount fromIOUString(String val) { - String[] split = val.split("/"); - if (split.length == 1) { - throw new RuntimeException("IOU string must be in the form " + - "number/currencyString or " + - "number/currencyString/issuerString"); - } else if (split.length == 2) { - return new Amount(new BigDecimal(split[0]), split[1]); - } else { - return new Amount(new BigDecimal(split[0]), split[1], split[2]); - } - } - - @Deprecated - private static Amount fromXrpString(String valueString) { - BigDecimal val = new BigDecimal(valueString); - return new Amount(val); - } - - /** - * @return A String representation as used by ripple json format - */ - public String stringRepr() { - if (isNative()) { - return toDropsString(); - } else { - return iouTextFull(); - } - } - - public String toDropsString() { - if (!isNative()) { - throw new RuntimeException("Amount is not native"); - } - return bigIntegerDrops().toString(); - } - - private String iouText() { - return String.format("%s/%s", valueText(), currencyString()); - } - - public String iouTextFull() { - return String.format("%s/%s/%s", valueText(), currencyString(), issuerString()); - } - - public String toTextFull() { - if (isNative()) { - return nativeText(); - } else { - return iouTextFull(); - } - } - - public String nativeText() { - return String.format("%s/XRP", valueText()); - } - - @Override - public String toString() { - return toTextFull(); - } - - public String toText() { - if (isNative()) { - return nativeText(); - } else { - return iouText(); - } - } - - /** - * @return A String containing the value (in XRP scale when native) - * as a decimal number - * - */ - public String valueText() { - return value.signum() == 0 ? "0" : value().toPlainString(); - } - - private void checkLowerDropBound(BigDecimal val) { - if (val.scale() > 6) { - PrecisionError bigger = getOutOfBoundsError(val, - "smaller than min native value", - MIN_NATIVE_VALUE); - bigger.illegal = this; - throw bigger; - } - } - - private void checkUpperBound(BigDecimal val) { - if (val.compareTo(MAX_NATIVE_VALUE) > 0) { - PrecisionError bigger = getOutOfBoundsError(val, - "bigger than max native value ", - MAX_NATIVE_VALUE); - bigger.illegal = this; - throw bigger; - } - } - - private static PrecisionError getOutOfBoundsError( - BigDecimal abs, - String sized, - BigDecimal bound) { - return new PrecisionError( - abs.toPlainString() + " absolute XRP is " + sized + bound); - } - - private void checkXRPBounds() { - BigDecimal v = value.abs(); - try { - checkLowerDropBound(v); - checkUpperBound(v); - } catch (PrecisionError e) { - if (v.compareTo(TAKER_PAYS_FOR_THAT_DAMN_OFFER) == 0) { - return; - } - throw e; - } - } - - - private static int significantDigits(BigDecimal input) { - input = input.stripTrailingZeros(); - return input.scale() < 0 - ? input.precision() - input.scale() - : input.precision(); - } - - public int significantDigits() { - return significantDigits(value); - } - - public static void checkDropsValueWhole(String drops) { - boolean contains = drops.contains("."); - if (contains) { - throw new RuntimeException("Drops string contains floating point is decimal"); - } - } - - public static BigDecimal roundValue(BigDecimal value, boolean nativeSrc) { - int i = value.precision() - value.scale(); - return value.setScale(nativeSrc ? MAXIMUM_NATIVE_SCALE : - MAXIMUM_IOU_PRECISION - i, - MATH_CONTEXT.getRoundingMode()); - } - - private static BigDecimal parseDecimal(String s) { - return new BigDecimal(s.replace(",", "")); //# .scaleByPowerOfTen(6); - } - - private static AmountField amountField(final Field f) { - return new AmountField() { - @Override - public Field getField() { - return f; - } - }; - } - - static public AmountField Amount = amountField(Field.Amount); - static public AmountField Balance = amountField(Field.Balance); - static public AmountField LimitAmount = amountField(Field.LimitAmount); - static public AmountField DeliveredAmount = amountField(Field.DeliveredAmount); - static public AmountField TakerPays = amountField(Field.TakerPays); - static public AmountField TakerGets = amountField(Field.TakerGets); - static public AmountField LowLimit = amountField(Field.LowLimit); - static public AmountField HighLimit = amountField(Field.HighLimit); - static public AmountField Fee = amountField(Field.Fee); - static public AmountField SendMax = amountField(Field.SendMax); - static public AmountField DeliverMin = amountField(Field.DeliverMin); - static public AmountField MinimumOffer = amountField(Field.MinimumOffer); - static public AmountField RippleEscrow = amountField(Field.RippleEscrow); - static public AmountField taker_gets_funded = amountField(Field.taker_gets_funded); - static public AmountField taker_pays_funded = amountField(Field.taker_pays_funded); - -} diff --git a/ripple-core/src/main/java/com/ripple/core/coretypes/Blob.java b/ripple-core/src/main/java/com/ripple/core/coretypes/Blob.java deleted file mode 100644 index 48708f78f5..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/coretypes/Blob.java +++ /dev/null @@ -1,119 +0,0 @@ - -package com.ripple.core.coretypes; - -import com.ripple.core.fields.BlobField; -import com.ripple.core.fields.Field; -import com.ripple.core.fields.Type; -import com.ripple.core.serialized.BinaryParser; -import com.ripple.core.serialized.BytesSink; -import com.ripple.core.serialized.SerializedType; -import com.ripple.core.serialized.TypeTranslator; -import com.ripple.encodings.common.B16; -import org.bouncycastle.util.encoders.Hex; - -public class Blob implements SerializedType { - public Blob(byte[] bytes) { - buffer = bytes.clone(); - } - - private final byte[] buffer; - - @Override - public Object toJSON() { - return translate.toJSON(this); - } - - @Override - public byte[] toBytes() { - return buffer; - } - - @Override - public String toHex() { - return translate.toHex(this); - } - - @Override - public void toBytesSink(BytesSink to) { - translate.toBytesSink(this, to); - } - - @Override - public Type type() { - return Type.Blob; - } - - public static Blob fromBytes(byte[] bytes) { - return new Blob(bytes); - } - - public static Blob fromHex(String hex) { - return fromBytes(B16.decode(hex)); - } - - public static Blob fromParser(BinaryParser parser, int hint) { - return translate.fromParser(parser, hint); - } - public static Blob fromParser(BinaryParser parser) { - return translate.fromParser(parser, null); - } - - public static class Translator extends TypeTranslator { - @Override - public Blob fromParser(BinaryParser parser, Integer hint) { - if (hint == null) { - hint = parser.size() - parser.pos(); - } - return new Blob(parser.read(hint)); - } - - @Override - public Object toJSON(Blob obj) { - return toString(obj); - } - - @Override - public String toString(Blob obj) { - return B16.encode(obj.buffer); - } - - @Override - public Blob fromString(String value) { - return new Blob(Hex.decode(value)); - } - - @Override - public void toBytesSink(Blob obj, BytesSink to) { - to.add(obj.buffer.clone()); - } - } - - static public Translator translate = new Translator(); - - private static BlobField blobField(final Field f) { - return new BlobField() { - @Override - public Field getField() { - return f; - } - }; - } - - static public BlobField PublicKey = blobField(Field.PublicKey); - static public BlobField MessageKey = blobField(Field.MessageKey); - static public BlobField SigningPubKey = blobField(Field.SigningPubKey); - static public BlobField TxnSignature = blobField(Field.TxnSignature); - static public BlobField MasterSignature = blobField(Field.MasterSignature); - static public BlobField Signature = blobField(Field.Signature); - static public BlobField Domain = blobField(Field.Domain); - static public BlobField FundCode = blobField(Field.FundCode); - static public BlobField RemoveCode = blobField(Field.RemoveCode); - static public BlobField ExpireCode = blobField(Field.ExpireCode); - static public BlobField CreateCode = blobField(Field.CreateCode); - - static public BlobField MemoType = blobField(Field.MemoType); - static public BlobField MemoData = blobField(Field.MemoData); - static public BlobField MemoFormat = blobField(Field.MemoFormat); - static public BlobField Condition = blobField(Field.Condition); - static public BlobField Fulfillment = blobField(Field.Fulfillment); -} diff --git a/ripple-core/src/main/java/com/ripple/core/coretypes/Currency.java b/ripple-core/src/main/java/com/ripple/core/coretypes/Currency.java deleted file mode 100644 index 27832e335b..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/coretypes/Currency.java +++ /dev/null @@ -1,250 +0,0 @@ -package com.ripple.core.coretypes; - -import com.ripple.core.coretypes.hash.Hash160; -import com.ripple.core.coretypes.uint.UInt64; -import com.ripple.core.serialized.BinaryParser; -import com.ripple.core.serialized.BytesSink; -import com.ripple.encodings.common.B16; -import com.ripple.utils.Utils; - -import java.math.BigDecimal; -import java.math.BigInteger; -import java.math.MathContext; -import java.util.Date; -import java.util.concurrent.TimeUnit; - -/** - * Funnily enough, yes, in rippled a currency is represented by a Hash160 type. - * For the sake of consistency and convenience, this quirk is repeated here. - * - * https://gist.github.com/justmoon/8597643 - */ -public class Currency extends Hash160 { - public static final Currency NEUTRAL = new Currency(Utils.padTo160(BigInteger.ONE.toByteArray())); - public static final Currency XRP = new Currency(Utils.padTo160(BigInteger.ZERO.toByteArray())); - - @Override - public Object toJSON() { - return translate.toJSON(this); - } - - @Override - public byte[] toBytes() { - return translate.toBytes(this); - } - - @Override - public String toHex() { - return translate.toHex(this); - } - - @Override - public void toBytesSink(BytesSink to) { - translate.toBytesSink(this, to); - } - - public boolean isNative() { - return this == Currency.XRP || equals(Currency.XRP); - } - - public boolean isIOU() { - return !isNative(); - } - - public static enum Type { - HASH, - ISO, // three letter isoCode - DEMURRAGE, - UNKNOWN; - - public static Type fromByte(byte typeByte) { - if (typeByte == 0x00) { - return ISO; - } else if (typeByte == 0x01) { - return DEMURRAGE; - } else if ((typeByte & 0x80) != 0) { - return HASH; - } else { - return UNKNOWN; - } - } - } - Type type; - - public static class Demurrage { - Date interestStart; - String isoCode; - double interestRate; - - static public BigDecimal applyRate(BigDecimal amount, BigDecimal rate, TimeUnit time, long units) { - BigDecimal appliedRate = getSeconds(time, units).divide(rate, MathContext.DECIMAL64); - BigDecimal factor = BigDecimal.valueOf(Math.exp(appliedRate.doubleValue())); - return amount.multiply(factor, MathContext.DECIMAL64); - } - - static public BigDecimal calculateRate(BigDecimal rate, TimeUnit time, long units) { - BigDecimal seconds = getSeconds(time, units); - BigDecimal log = ln(rate); - return seconds.divide(log, MathContext.DECIMAL64); - } - - private static BigDecimal ln(BigDecimal bd) { - return BigDecimal.valueOf(Math.log(bd.doubleValue())); - } - - private static BigDecimal getSeconds(TimeUnit time, long units) { - return BigDecimal.valueOf(time.toSeconds(units)); - } - - public Demurrage(byte[] bytes) { - BinaryParser parser = new BinaryParser(bytes); - parser.skip(1); // The type - isoCode = isoCodeFromBytesAndOffset(parser.read(3), 0);// The isoCode - interestStart = RippleDate.fromParser(parser); - long l = UInt64.fromParser(parser).longValue(); - interestRate = Double.longBitsToDouble(l); - } - } - public Demurrage demurrage = null; - public Currency(byte[] bytes) { - super(bytes); - type = Type.fromByte(this.hash[0]); - if (type == Type.DEMURRAGE) { - demurrage = new Demurrage(bytes); - } - } - - /** - * It's better to extend HashTranslator than the Hash160.Translator directly - * That way the generics can still vibe with the @Override - */ - private static class CurrencyTranslator extends HashTranslator { - @Override - public int byteWidth() { - return 20; - } - - @Override - public Currency newInstance(byte[] b) { - return new Currency(b); - } - - @Override - public Object toJSON(Currency obj) { - return obj.toString(); - } - - @Override - public Currency fromString(String value) { - if (value.length() == 40 /* byteWidth() * 2 */) { - return newInstance(B16.decode(value)); - } else if (value.equals("XRP")) { - return XRP; - } else { - if (!(value.length() == 3)) { -// if (!value.matches("[A-Z0-9]{3}")) { - throw new RuntimeException("Currency code must be 3 characters"); - } - return newInstance(encodeCurrency(value)); - } - } - } - - public static Currency fromString(String currency) { - return translate.fromString(currency); - } - - public static Currency fromParser(BinaryParser parser) { - return translate.fromParser(parser); - } - - @Override - public String toString() { - switch (type) { - case ISO: - String code = getCurrencyCodeFromTLCBytes(bytes()); - if (code.equals("XRP")) { - // HEX of the bytes - return super.toString(); - } else if (code.equals("\0\0\0")) { - return "XRP"; - } else { - // the 3 letter isoCode - return code; - } - case HASH: - case DEMURRAGE: - case UNKNOWN: - default: - return super.toString(); - } - } - - public String humanCode() { - if (type == Type.ISO) { - return getCurrencyCodeFromTLCBytes(hash); - } else if (type == Type.DEMURRAGE) { - return isoCodeFromBytesAndOffset(hash, 1); - } else { - throw new IllegalStateException("No human code for currency of type " + type); - } - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof Currency) { - Currency other = (Currency) obj; - byte[] bytes = this.bytes(); - byte[] otherBytes = other.bytes(); - - if (type == Type.ISO && other.type == Type.ISO) { - return (bytes[12] == otherBytes[12] && - bytes[13] == otherBytes[13] && - bytes[14] == otherBytes[14]); - } - } - return super.equals(obj); // Full comparison - } - - private static CurrencyTranslator translate = new CurrencyTranslator(); - - /* - * The following are static methods, legacy from when there was no - * usage of Currency objects, just String with "XRP" ambiguity. - * */ - public static byte[] encodeCurrency(String currencyCode) { - byte[] currencyBytes = new byte[20]; - currencyBytes[12] = (byte) currencyCode.codePointAt(0); - currencyBytes[13] = (byte) currencyCode.codePointAt(1); - currencyBytes[14] = (byte) currencyCode.codePointAt(2); - return currencyBytes; - } - - public static String getCurrencyCodeFromTLCBytes(byte[] bytes) { - int i; - boolean zeroInNonCurrencyBytes = true; - - for (i = 0; i < 20; i++) { - zeroInNonCurrencyBytes = zeroInNonCurrencyBytes && - ((i == 12 || i == 13 || i == 14) || // currency bytes (0 or any other) - bytes[i] == 0); // non currency bytes (0) - } - - if (zeroInNonCurrencyBytes) { - return isoCodeFromBytesAndOffset(bytes, 12); - } else { - throw new IllegalStateException("Currency is invalid"); - } - } - - private static char charFrom(byte[] bytes, int i) { - return (char) bytes[i]; - } - - private static String isoCodeFromBytesAndOffset(byte[] bytes, int offset) { - char a = charFrom(bytes, offset); - char b = charFrom(bytes, offset + 1); - char c = charFrom(bytes, offset + 2); - return "" + a + b + c; - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/coretypes/Flags.java b/ripple-core/src/main/java/com/ripple/core/coretypes/Flags.java deleted file mode 100644 index 9b0c319dcf..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/coretypes/Flags.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.ripple.core.coretypes; - -import com.ripple.core.fields.Type; -import com.ripple.core.serialized.BytesSink; -import com.ripple.core.serialized.SerializedType; - -import java.util.BitSet; - -// TODO -public class Flags extends BitSet implements SerializedType { - @Override - public Object toJSON() { - return null; - } - - @Override - public byte[] toBytes() { - return new byte[0]; - } - - @Override - public String toHex() { - return null; - } - - @Override - public void toBytesSink(BytesSink to) { - - } - - @Override - public Type type() { - return Type.UInt32; - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/coretypes/Issue.java b/ripple-core/src/main/java/com/ripple/core/coretypes/Issue.java deleted file mode 100644 index 44f75dae82..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/coretypes/Issue.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.ripple.core.coretypes; - -import com.ripple.core.coretypes.hash.Hash160; -import org.json.JSONObject; - -import java.math.BigDecimal; - -/** - * Represents a currency/issuer pair - */ -public class Issue implements Comparable { - - public static final Issue XRP = fromString("XRP"); - final Currency currency; - final AccountID issuer; - - public Issue(Currency currency, AccountID issuer) { - this.currency = currency; - this.issuer = issuer; - } - - public static Issue fromString(String pair) { - String[] split = pair.split("/"); - return fromStringPair(split); - } - - private static Issue fromStringPair(String[] split) { - if (split.length == 2) { - return new Issue(Currency.fromString(split[0]), AccountID.fromString(split[1])); - } else if (split[0].equals("XRP")) { - return new Issue(Currency.XRP, AccountID.XRP_ISSUER); - } else { - throw new RuntimeException("Issue string must be XRP or $currency/$issuer"); - } - } - - /** - * See {@link com.ripple.core.fields.Field#TakerGetsCurrency} - * See {@link com.ripple.core.fields.Field#TakerGetsIssuer} - * - * TODO: better handling of Taker(Gets|Pays)(Issuer|Curency) - * maybe special subclasses of AccountID / Currency - * respectively? - */ - public static Issue from160s(Hash160 currency, Hash160 issuer) { - return new Issue(new Currency(currency.bytes()), - new AccountID(issuer.toBytes())); - } - - public Currency currency() { - return currency; - } - - public AccountID issuer() { - return issuer; - } - - @Override - public String toString() { - if (isNative()) { - return "XRP"; - } else { - return String.format("%s/%s", currency, issuer); - } - } - - public JSONObject toJSON() { - JSONObject o = new JSONObject(); - o.put("currency", currency); - if (!isNative()) { - o.put("issuer", issuer); - } - return o; - } - - public Amount amount(BigDecimal value) { - return new Amount(value, currency, issuer, isNative()); - } - - public boolean isNative() { - return this == XRP || currency.equals(Currency.XRP); - } - - public Amount amount(Number value) { - return new Amount(BigDecimal.valueOf(value.doubleValue()), currency, issuer, isNative()); - } - - @Override - public int compareTo(Issue o) { - int ret = issuer.compareTo(o.issuer); - if (ret != 0) { - return ret; - } - ret = currency.compareTo(o.currency); - return ret; - } - - public Amount roundedAmount(BigDecimal amount) { - return amount(Amount.roundValue(amount, isNative())); - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/coretypes/IssuePair.java b/ripple-core/src/main/java/com/ripple/core/coretypes/IssuePair.java deleted file mode 100644 index 0196e67f86..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/coretypes/IssuePair.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.ripple.core.coretypes; - -import org.json.JSONObject; - -import java.text.MessageFormat; - -public class IssuePair implements Comparable { - public final Issue pays; - public final Issue gets; - - public IssuePair(Issue pays, Issue gets) { - this.pays = pays; - this.gets = gets; - } - - @Override - public String toString() { - return MessageFormat.format("{0}/{1}", pays, gets); - } - - @Override - public int compareTo(IssuePair o) { - int cmp = pays.compareTo(o.pays); - if (cmp == 0) { - cmp = gets.compareTo(o.gets); - } - return cmp; - } - - public JSONObject toJSON() { - JSONObject ret = new JSONObject(); - ret.put("taker_gets", gets.toJSON()); - ret.put("taker_pays", pays.toJSON()); - return ret; - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/coretypes/PathSet.java b/ripple-core/src/main/java/com/ripple/core/coretypes/PathSet.java deleted file mode 100644 index b054229787..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/coretypes/PathSet.java +++ /dev/null @@ -1,273 +0,0 @@ -package com.ripple.core.coretypes; - -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.ripple.core.fields.Field; -import com.ripple.core.fields.PathSetField; -import com.ripple.core.fields.Type; -import com.ripple.core.serialized.BinaryParser; -import com.ripple.core.serialized.BytesSink; -import com.ripple.core.serialized.SerializedType; -import com.ripple.core.serialized.TypeTranslator; -import org.json.JSONArray; -import org.json.JSONObject; - -import java.util.ArrayList; - -public class PathSet extends ArrayList implements SerializedType { - public static byte PATH_SEPARATOR_BYTE = (byte) 0xFF; - public static byte PATHSET_END_BYTE = (byte) 0x00; - - public PathSet(){} - - public static PathSet fromJSONArray(JSONArray array) { - return translate.fromJSONArray(array); - } - - public static PathSet fromHex(String hex) { - return translate.fromHex(hex); - } - - public static class Hop { - public static byte TYPE_ACCOUNT = (byte) 0x01; - public static byte TYPE_CURRENCY = (byte) 0x10; - public static byte TYPE_ISSUER = (byte) 0x20; - public static final int TYPE_ACCOUNT_CURRENCY_ISSUER = TYPE_CURRENCY | TYPE_ACCOUNT | TYPE_ISSUER; - public static final int TYPE_ACCOUNT_CURRENCY = TYPE_CURRENCY | TYPE_ACCOUNT; - public static int VALID_TYPE_MASK = ~(TYPE_ACCOUNT | TYPE_CURRENCY | TYPE_ISSUER); - - public AccountID account; - public AccountID issuer; - public Currency currency; - private int type; - - public boolean hasIssuer() { - return issuer != null; - } - public boolean hasCurrency() { - return currency != null; - } - public boolean hasAccount() { - return account != null; - } - - public int getType() { - if (type == 0) { - synthesizeType(); - } - return type; - } - - static public Hop fromJSONObject(JSONObject json) { - Hop hop = new Hop(); - if (json.has("account")) { - hop.account = AccountID.fromAddress(json.getString("account")); - } - if (json.has("issuer")) { - hop.issuer = AccountID.fromAddress(json.getString("issuer")); - } - if (json.has("currency")) { - hop.currency = Currency.fromString(json.getString("currency")); - } - if (json.has("type")) { - hop.type = json.getInt("type"); - } - return hop; - } - - public void synthesizeType() { - type = 0; - - if (hasAccount()) type |= TYPE_ACCOUNT; - if (hasCurrency()) type |= TYPE_CURRENCY; - if (hasIssuer()) type |= TYPE_ISSUER; - } - - public JSONObject toJSONObject() { - JSONObject object = new JSONObject(); - object.put("type", getType()); - - if (hasAccount()) object.put("account", account.toJSON()); - if (hasIssuer()) object.put("issuer", issuer.toJSON()); - if (hasCurrency()) object.put("currency", currency.toJSON()); - return object; - } - - public static Hop fromJacksonObject(ObjectNode json) { - Hop hop = new Hop(); - if (json.has("account")) { - hop.account = AccountID.fromAddress(json.get("account").asText()); - } - if (json.has("issuer")) { - hop.issuer = AccountID.fromAddress(json.get("issuer").asText()); - } - if (json.has("currency")) { - hop.currency = Currency.fromString(json.get("currency").asText()); - } - if (json.has("type")) { - hop.type = json.get("type").asInt(); - } - return hop; - - } - } - public static class Path extends ArrayList { - static public Path fromJSONArray(JSONArray array) { - Path path = new Path(); - int nHops = array.length(); - for (int i = 0; i < nHops; i++) { - JSONObject hop = array.getJSONObject(i); - path.add(Hop.fromJSONObject(hop)); - } - - return path; - } - static public Path fromJacksonArray(ArrayNode array) { - Path path = new Path(); - int nHops = array.size(); - for (int i = 0; i < nHops; i++) { - ObjectNode hop = (ObjectNode) array.get(i); - path.add(Hop.fromJacksonObject(hop)); - } - return path; - } - public JSONArray toJSONArray() { - JSONArray array = new JSONArray(); - for (Hop hop : this) { - array.put(hop.toJSONObject()); - } - return array; - } - } - - public JSONArray toJSONArray() { - JSONArray array = new JSONArray(); - for (Path path : this) { - array.put(path.toJSONArray()); - } - return array; - } - - // SerializedType interface implementation - @Override - public Object toJSON() { - return toJSONArray(); - } - - @Override - public void toBytesSink(BytesSink buffer) { - int n = 0; - for (Path path : this) { - if (n++ != 0) { - buffer.add(PATH_SEPARATOR_BYTE); - } - for (Hop hop : path) { - int type = hop.getType(); - buffer.add((byte) type); - if (hop.hasAccount()) { - buffer.add(hop.account.bytes()); - } - if (hop.hasCurrency()) { - buffer.add(hop.currency.bytes()); - } - if (hop.hasIssuer()) { - buffer.add(hop.issuer.bytes()); - } - } - } - buffer.add(PATHSET_END_BYTE); - } - - @Override - public Type type() { - return Type.PathSet; - } - - @Override - public String toHex() { - return translate.toHex(this); - } - - @Override - public byte[] toBytes() { - return translate.toBytes(this); - } - - - public static class Translator extends TypeTranslator { - @Override - public PathSet fromParser(BinaryParser parser, Integer hint) { - PathSet pathSet = new PathSet(); - PathSet.Path path = null; - while (!parser.end()) { - byte type = parser.readOne(); - if (type == PATHSET_END_BYTE) { - break; - } - if (path == null) { - path = new PathSet.Path(); - pathSet.add(path); - } - if (type == PATH_SEPARATOR_BYTE) { - path = null; - continue; - } - - PathSet.Hop hop = new PathSet.Hop(); - path.add(hop); - if ((type & Hop.TYPE_ACCOUNT) != 0) { - hop.account = AccountID.fromParser(parser); - } - if ((type & Hop.TYPE_CURRENCY) != 0) { - hop.currency = Currency.fromParser(parser); - } - if ((type & Hop.TYPE_ISSUER) != 0) { - hop.issuer = AccountID.fromParser(parser); - } - } - - return pathSet; - } - - @Override - public PathSet fromJSONArray(JSONArray array) { - PathSet paths = new PathSet(); - - int nPaths = array.length(); - - for (int i = 0; i < nPaths; i++) { - JSONArray path = array.getJSONArray(i); - paths.add(Path.fromJSONArray(path)); - } - return paths; - - } - - @Override - public PathSet fromJacksonArray(ArrayNode array) { - PathSet paths = new PathSet(); - - int nPaths = array.size(); - - for (int i = 0; i < nPaths; i++) { - ArrayNode path = (ArrayNode) array.get(i); - paths.add(Path.fromJacksonArray(path)); - } - - return paths; - } - } - static public Translator translate = new Translator(); - - public static PathSet fromParser(BinaryParser parser) { - return translate.fromParser(parser); - } - public static PathSet fromBytes(byte[] bytes) { - return translate.fromBytes(bytes); - } - - private static PathSetField pathsetField(final Field f) { - return new PathSetField(){ @Override public Field getField() {return f;}}; - } - static public PathSetField Paths = pathsetField(Field.Paths); -} diff --git a/ripple-core/src/main/java/com/ripple/core/coretypes/Quality.java b/ripple-core/src/main/java/com/ripple/core/coretypes/Quality.java deleted file mode 100644 index 212da6d78e..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/coretypes/Quality.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.ripple.core.coretypes; - -import com.ripple.core.coretypes.hash.Hash256; - -import java.math.BigDecimal; -import java.math.BigInteger; - -public class Quality { - /** - * Finds the quality (TakerPays/TakerGets) ratio packed into the last 64 - * bits of root DirectoryNode ledger indexes. - */ - public static BigDecimal fromBookDirectory(Hash256 bookDirectory, - boolean payIsNative, - boolean getIsNative) { - // The last 7 bytes contains the mantissa - byte[] mantissa = bookDirectory.slice(-7); - // Most significant byte has the exponent packed - int exponent = ( bookDirectory.get(-8) & 0xFF) - 100; - // Return the value in XRP scale, rather than drops, as stored. - int scale = -(payIsNative ? exponent - 6 : - getIsNative ? exponent + 6 : exponent); - BigInteger unsignedBig = new BigInteger(1, mantissa); - return new BigDecimal(unsignedBig, scale); - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/coretypes/RippleDate.java b/ripple-core/src/main/java/com/ripple/core/coretypes/RippleDate.java deleted file mode 100644 index 71a94e1ce9..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/coretypes/RippleDate.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.ripple.core.coretypes; - -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.serialized.BinaryParser; - -import java.text.SimpleDateFormat; -import java.util.*; - -//public class RippleDate extends Date implements SerializedType { -public class RippleDate extends Date { - private static final SimpleDateFormat sdf = new SimpleDateFormat(); - - public static long RIPPLE_EPOCH_SECONDS_OFFSET = 0x386D4380; - static { - sdf.setTimeZone(new SimpleTimeZone(0, "GMT")); - sdf.applyPattern("dd MMM yyyy HH:mm:ss z"); - - /** - * Magic constant tested and documented. - * - * Seconds since the unix epoch from unix time (accounting leap years etc) - * at 1/January/2000 GMT - */ - GregorianCalendar cal = new GregorianCalendar(TimeZone.getTimeZone("GMT")); - cal.set(2000, Calendar.JANUARY, 1, 0, 0, 0); - long computed = cal.getTimeInMillis() / 1000; - assertEquals("01 Jan 2000 00:00:00 GMT", sdf.format(cal.getTime())); // TODO - assertEquals(RippleDate.RIPPLE_EPOCH_SECONDS_OFFSET, computed); - } - - static public String gmtString(Date date) { - return sdf.format(date); - } - - private static void assertEquals(String s, String s1) { - if (!s.equals(s1)) throw new AssertionError(String.format("%s != %s", s, s1)); - } - private static void assertEquals(long a, long b) { - if (a != b) throw new AssertionError(String.format("%s != %s", a, b)); - } - - private RippleDate() { - super(); - } - private RippleDate(long milliseconds) { - super(milliseconds); - } - - public long secondsSinceRippleEpoch() { - return ((this.getTime() / 1000) - RIPPLE_EPOCH_SECONDS_OFFSET); - } - public static RippleDate fromSecondsSinceRippleEpoch(Number seconds) { - return new RippleDate((seconds.longValue() + RIPPLE_EPOCH_SECONDS_OFFSET) * 1000); - } - public static RippleDate fromParser(BinaryParser parser) { - UInt32 uInt32 = UInt32.fromParser(parser); - return fromSecondsSinceRippleEpoch(uInt32); - } - public static RippleDate now() { - return new RippleDate(); - } - -/* @Override - public Object toJSON() { - return secondsSinceRippleEpoch(); - } - - @Override - public byte[] toBytes() { - return new UInt32(secondsSinceRippleEpoch()).toBytes(); - } - - @Override - public String toHex() { - return new UInt32(secondsSinceRippleEpoch()).toHex(); - } - - @Override - public void toBytesSink(BytesSink to) { - new UInt32(secondsSinceRippleEpoch()).toBytesSink(to); - }*/ -} diff --git a/ripple-core/src/main/java/com/ripple/core/coretypes/STArray.java b/ripple-core/src/main/java/com/ripple/core/coretypes/STArray.java deleted file mode 100644 index 6e7b0191f3..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/coretypes/STArray.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.ripple.core.coretypes; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.ripple.core.fields.Field; -import com.ripple.core.fields.STArrayField; -import com.ripple.core.fields.Type; -import com.ripple.core.serialized.BinaryParser; -import com.ripple.core.serialized.BytesSink; -import com.ripple.core.serialized.SerializedType; -import com.ripple.core.serialized.TypeTranslator; -import org.json.JSONArray; -import org.json.JSONObject; - -import java.util.ArrayList; - -public class STArray extends ArrayList implements SerializedType { - - public JSONArray toJSONArray() { - JSONArray array = new JSONArray(); - - for (STObject so : this) { - array.put(so.toJSON()); - } - - return array; - } - - @Override - public Object toJSON() { - return toJSONArray(); - } - - @Override - public byte[] toBytes() { - return translate.toBytes(this); - } - - @Override - public String toHex() { - return translate.toHex(this); - } - - @Override - public void toBytesSink(BytesSink to) { - for (STObject stObject : this) { - stObject.toBytesSink(to); - } - } - - @Override - public Type type() { - return Type.STArray; - } - - public static STArray fromParser(BinaryParser parser) { - return translate.fromParser(parser); - } - public static STArray fromBytes(byte[] bytes) { - return translate.fromBytes(bytes); - } - public static STArray fromHex(String hex) { - return translate.fromHex(hex); - } - - public static class Translator extends TypeTranslator { - @Override - public STArray fromParser(BinaryParser parser, Integer hint) { - STArray stArray = new STArray(); - while (!parser.end()) { - Field field = parser.readField(); - if (field == Field.ArrayEndMarker) { - break; - } - STObject outer = new STObject(); - // assert field.getType() == Type.STObject; - outer.put(field, STObject.fromParser(parser)); - stArray.add(STObject.formatted(outer)); - } - return stArray; - } - - public JSONArray toJSONArray(STArray obj) { - return obj.toJSONArray(); - } - - @Override - public STArray fromJSONArray(JSONArray jsonArray) { - STArray arr = new STArray(); - - for (int i = 0; i < jsonArray.length(); i++) { - Object o = jsonArray.get(i); - arr.add(STObject.fromJSONObject((JSONObject) o)); - } - - return arr; - } - @Override - public STArray fromJacksonArray(ArrayNode jsonArray) { - STArray arr = new STArray(); - - for (int i = 0; i < jsonArray.size(); i++) { - ObjectNode object = (ObjectNode) jsonArray.get(i); - arr.add(STObject.fromJacksonObject(object)); - } - - return arr; - } - } - static public Translator translate = new Translator(); - - public STArray(){} - - private static STArrayField starrayField(final Field f) { - return new STArrayField(){ @Override public Field getField() {return f;}}; - } - - static public STArrayField AffectedNodes = starrayField(Field.AffectedNodes); - static public STArrayField SignerEntries = starrayField(Field.SignerEntries); - static public STArrayField Signers = starrayField(Field.Signers); - - static public STArrayField Template = starrayField(Field.Template); - static public STArrayField Necessary = starrayField(Field.Necessary); - static public STArrayField Sufficient = starrayField(Field.Sufficient); - static public STArrayField Majorities = starrayField(Field.Majorities); - static public STArrayField Memos = starrayField(Field.Memos); - static public STArrayField ArrayEndMarker = starrayField(Field.ArrayEndMarker); -} diff --git a/ripple-core/src/main/java/com/ripple/core/coretypes/STObject.java b/ripple-core/src/main/java/com/ripple/core/coretypes/STObject.java deleted file mode 100644 index b02988c082..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/coretypes/STObject.java +++ /dev/null @@ -1,489 +0,0 @@ -package com.ripple.core.coretypes; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.ripple.core.coretypes.hash.HalfSha512; -import com.ripple.core.coretypes.hash.Hash128; -import com.ripple.core.coretypes.hash.Hash160; -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.coretypes.hash.prefixes.HashPrefix; -import com.ripple.core.coretypes.uint.UInt16; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.coretypes.uint.UInt64; -import com.ripple.core.coretypes.uint.UInt8; -import com.ripple.core.fields.*; -import com.ripple.core.formats.Format; -import com.ripple.core.formats.LEFormat; -import com.ripple.core.formats.TxFormat; -import com.ripple.core.serialized.*; -import com.ripple.core.serialized.enums.EngineResult; -import com.ripple.core.serialized.enums.LedgerEntryType; -import com.ripple.core.serialized.enums.TransactionType; -import org.json.JSONObject; - -import java.util.EnumMap; -import java.util.Iterator; -import java.util.TreeMap; -import java.util.function.Predicate; - -public class STObject implements SerializedType, Iterable { - // Internally the fields are stored in a TreeMap - public static class FieldsMap extends TreeMap {} -// public static class FieldsMap extends HashMap {} - - protected FieldsMap fields; - public Format format; - - public STObject() { - fields = new FieldsMap(); - } - public STObject(FieldsMap fieldsMap) { - fields = fieldsMap; - } - - public static STObject fromJSON(String json) { - return fromJSONObject(new JSONObject(json)); - } - public static STObject fromJSONObject(JSONObject json) { - return translate.fromJSONObject(json); - } - public static STObject fromJacksonObject(ObjectNode object) { - return translate.fromJacksonObject(object); - } - public static STObject fromHex(String hex) { - return STObject.translate.fromHex(hex); - } - public static STObject fromBytes(byte[] bytes) { - return translate.fromBytes(bytes); - } - public static STObject fromParser(BinaryParser parser) { - return translate.fromParser(parser); - } - public static STObject fromParser(BinaryParser parser, Integer hint) { - return translate.fromParser(parser, hint); - } - - @Override - public Iterator iterator() { -// return fields.keySet().stream().sorted().iterator(); - return fields.keySet().iterator(); - } - - public String prettyJSON() { - return translate.toJSONObject(this).toString(2); - } - - /** - * @return a subclass of STObject using the same fields - * - * If the object has a TransactionType or LedgerEntryType - * then we can up)grade to a child class, with more specific - * helper methods, and we can use `instanceof` to great effect. - */ - public static STObject formatted(STObject source) { - return STObjectFormatter.format(source); - - } - - public Format getFormat() { - if (format == null) computeFormat(); - return format; - } - - public static class FormatException extends RuntimeException { - FormatException(String s) { - super(s); - } - } - - public void checkFormat() { - Format fmt = getFormat(); - EnumMap requirements = fmt.requirements(); - for (Field field : this) { - if (!requirements.containsKey(field)) { - throw new FormatException(fmt.name() + - " doesn't have field: " + field); - } - } - for (Field field : requirements.keySet()) { - Format.Requirement req = requirements.get(field); - if (!has(field)) { - if (req == Format.Requirement.REQUIRED) { - throw new FormatException(fmt.name() + - " requires " + field + " of type " - + field.getType()); - } - } else { - SerializedType type = get(field); - if (type.type() != field.getType()) { - if (!(field.getType() == Type.Hash160 && - type.type() == Type.AccountID)) { - throw new FormatException(type.toString() + - " is not " + field.getType()); - } - } - } - } - } - - public void setFormat(Format format) { - this.format = format; - } - - private void computeFormat() { - UInt16 tt = get(UInt16.TransactionType); - if (tt != null) { - setFormat(TxFormat.fromNumber(tt)); - } - UInt16 let = get(UInt16.LedgerEntryType); - if (let != null) { - setFormat(LEFormat.fromNumber(let)); - } - } - - public FieldsMap getFields() { - return fields; - } - - public SerializedType get(Field field) { - return fields.get(field); - } - - protected Hash256 signingHash(HashPrefix txSign) { - HalfSha512 signing = HalfSha512.prefixed256(txSign); - toBytesSink(signing, Field::isSigningField); - return signing.finish(); - } - - protected byte[] signingData(HashPrefix txSign) { - BytesList bl = new BytesList(); - bl.add(txSign.bytes()); - toBytesSink(bl, Field::isSigningField); - return bl.bytes(); - } - - protected static EngineResult engineResult(STObject obj) { - return (EngineResult) obj.get(Field.TransactionResult); - } - - static public LedgerEntryType ledgerEntryType(STObject obj) { - return (LedgerEntryType) obj.get(Field.LedgerEntryType); - } - - public static TransactionType transactionType(STObject obj) { - return (TransactionType) obj.get(Field.TransactionType); - } - - public SerializedType remove(Field f) { - return fields.remove(f); - } - - public boolean has(Field f) { - return fields.containsKey(f); - } - - public boolean has(T hf) { - return has(hf.getField()); - } - - public void put (UInt8Field f, UInt8 o) {put(f.getField(), o);} - public void put (Vector256Field f, Vector256 o) {put(f.getField(), o);} - public void put (BlobField f, Blob o) {put(f.getField(), o);} - public void put (UInt64Field f, UInt64 o) {put(f.getField(), o);} - public void put (UInt32Field f, UInt32 o) {put(f.getField(), o);} - public void put (UInt16Field f, UInt16 o) {put(f.getField(), o);} - public void put (PathSetField f, PathSet o) {put(f.getField(), o);} - public void put (STObjectField f, STObject o) {put(f.getField(), o);} - public void put (Hash256Field f, Hash256 o) {put(f.getField(), o);} - public void put (Hash160Field f, Hash160 o) {put(f.getField(), o);} - public void put (Hash128Field f, Hash128 o) {put(f.getField(), o);} - public void put (STArrayField f, STArray o) {put(f.getField(), o);} - public void put (AmountField f, Amount o) {put(f.getField(), o);} - public void put (AccountIDField f, AccountID o) {put(f.getField(), o);} - - public void putTranslated(T f, Object value) { - putTranslated(f.getField(), value); - } - - public STObject as(T f, Object value) { - putTranslated(f.getField(), value); - return this; - } - - public void put(Field f, SerializedType value) { - fields.put(f, value); - } - - public void putTranslated(Field f, Object value) { - TypeTranslator typeTranslator = Translators.forField(f); - SerializedType st; - try { - st = typeTranslator.fromValue(value); - } catch (Exception e) { - throw new RuntimeException("Couldn't put `" +value+ "` into field `" + f + "`", e); - } - fields.put(f, st); - } - - public AccountID get(AccountIDField f) { - return (AccountID) get(f.getField()); - } - - public Amount get(AmountField f) { - return (Amount) get(f.getField()); - } - - public STArray get(STArrayField f) { - return (STArray) get(f.getField()); - } - - public Hash128 get(Hash128Field f) { - return (Hash128) get(f.getField()); - } - - public Hash160 get(Hash160Field f) { - return (Hash160) get(f.getField()); - } - - public Hash256 get(Hash256Field f) { - return (Hash256) get(f.getField()); - } - - public STObject get(STObjectField f) { - return (STObject) get(f.getField()); - } - - public PathSet get(PathSetField f) { - return (PathSet) get(f.getField()); - } - - public UInt16 get(UInt16Field f) { - return (UInt16) get(f.getField()); - } - - public UInt32 get(UInt32Field f) { - return (UInt32) get(f.getField()); - } - - public UInt64 get(UInt64Field f) { - return (UInt64) get(f.getField()); - } - - public UInt8 get(UInt8Field f) { - return (UInt8) get(f.getField()); - } - - public Vector256 get(Vector256Field f) { - return (Vector256) get(f.getField()); - } - - public Blob get(BlobField f) { - return (Blob) get(f.getField()); - } - - // SerializedTypes implementation - @Override - public Object toJSON() { - return translate.toJSON(this); - } - - public JSONObject toJSONObject() { - return translate.toJSONObject(this); - } - - public byte[] toBytes() { - return translate.toBytes(this); - } - - @Override - public String toHex() { - return translate.toHex(this); - } - - public void toBytesSink(BytesSink to, Predicate p) { - BinarySerializer serializer = new BinarySerializer(to); - - for (Field field : this) { - if (p.test(field)) { - SerializedType value = fields.get(field); - serializer.add(field, value); - } - } - } - @Override - public void toBytesSink(BytesSink to) { - toBytesSink(to, field -> field.isSerialized()); - } - - @Override - public Type type() { - return Type.STObject; - } - - private static class Translator extends TypeTranslator { - - @Override - public STObject fromParser(BinaryParser parser, Integer hint) { - STObject so = new STObject(); - TypeTranslator tr; - SerializedType st; - Field field; - Integer sizeHint; - - // hint, is how many bytes to parse - if (hint != null) { - // end hint - hint = parser.pos() + hint; - } - - while (!parser.end(hint)) { - field = parser.readField(); - if (field == Field.ObjectEndMarker) { - break; - } - tr = Translators.forField(field); - sizeHint = field.isVLEncoded() ? parser.readVLLength() : null; - st = tr.fromParser(parser, sizeHint); - if (st == null) { - throw new IllegalStateException("Parsed " + field + " as null"); - } - so.put(field, st); - } - - return STObject.formatted(so); - } - - @Override - public Object toJSON(STObject obj) { - return toJSONObject(obj); - } - - public JSONObject toJSONObject(STObject obj) { - JSONObject json = new JSONObject(); - - for (Field f : obj) { - SerializedType obj1 = obj.get(f); - Object object = obj1.toJSON(); - json.put(f.name(), object); - } - - return json; - } - - @Override - public STObject fromJSONObject(JSONObject jsonObject) { - STObject so = new STObject(); - - Iterator keys = jsonObject.keys(); - while (keys.hasNext()) { - String key = (String) keys.next(); - Object value = jsonObject.get(key); - Field fieldKey = Field.fromString(key); - if (fieldKey == null) { - continue; - } - so.putTranslated(fieldKey, value); - } - return STObject.formatted(so); - } - - @Override - public STObject fromJacksonObject(ObjectNode object) { - STObject so = new STObject(); - - Iterator keys = object.fieldNames(); - while (keys.hasNext()) { - String key = keys.next(); - JsonNode value = object.get(key); - Field fieldKey = Field.fromString(key); - if (fieldKey == null) { - continue; - } - so.putTranslated(fieldKey, value); - } - return STObject.formatted(so); - } - } - - public int size() { - return fields.size(); - } - - static private Translator translate = new Translator(); - - private static STObjectField stobjectField(final Field f) { - return new STObjectField() {@Override public Field getField() {return f; } }; - } - - static public STObjectField TransactionMetaData = stobjectField(Field.TransactionMetaData); - static public STObjectField CreatedNode = stobjectField(Field.CreatedNode); - static public STObjectField DeletedNode = stobjectField(Field.DeletedNode); - static public STObjectField ModifiedNode = stobjectField(Field.ModifiedNode); - static public STObjectField PreviousFields = stobjectField(Field.PreviousFields); - static public STObjectField FinalFields = stobjectField(Field.FinalFields); - static public STObjectField NewFields = stobjectField(Field.NewFields); - static public STObjectField TemplateEntry = stobjectField(Field.TemplateEntry); - static public STObjectField Signer = stobjectField(Field.Signer); - static public STObjectField SignerEntry = stobjectField(Field.SignerEntry); - static public STObjectField ObjectEndMarker = stobjectField(Field.ObjectEndMarker); - static public STObjectField Memo = stobjectField(Field.Memo); - static public STObjectField Majority = stobjectField(Field.Majority); - - private static class Translators { - @SuppressWarnings("unused") - private static TypeTranslator get(Class kls) { - try { - java.lang.reflect.Field translate = kls.getDeclaredField("translate"); - translate.setAccessible(true); - return (TypeTranslator) translate.get(kls); - } catch (Exception e) { - throw new RuntimeException("for kls: " + kls.getSimpleName(), e); - } - } - - private static TypeTranslator forType(Type type) { - switch (type) { - case STObject: return STObject.translate; // get(STObject.class); - case Amount: return Amount.translate; // get(Amount.class); - case UInt16: return UInt16.translate; // get(UInt16.class); - case UInt32: return UInt32.translate; // get(UInt32.class); - case UInt64: return UInt64.translate; // get(UInt64.class); - case Hash128: return Hash128.translate; // get(Hash128.class); - case Hash256: return Hash256.translate; // get(Hash256.class); - case Blob: return Blob.translate; // get(Blob.class); - case AccountID: return AccountID.translate; // get(AccountID.class); - case STArray: return STArray.translate; // get(STArray.class); - case UInt8: return UInt8.translate; // get(UInt8.class); - case Hash160: return Hash160.translate; // get(Hash160.class); - case PathSet: return PathSet.translate; // get(PathSet.class); - case Vector256: return Vector256.translate; // get(Vector256.class); - default: throw new IllegalStateException("Unknown type"); - } - } - - private static TypeTranslator forField(Field field) { - if (field.tag == null) { - switch (field) { - case LedgerEntryType: - field.tag = LedgerEntryType.translate; //get(LedgerEntryType.class); - break; - case TransactionType: - field.tag = TransactionType.translate;// get(TransactionType.class); - break; - case TransactionResult: - field.tag = EngineResult.translate; // get(EngineResult.class); - break; - default: - field.tag = forType(field.getType()); - break; - } - } - return getCastedTag(field); - } - - @SuppressWarnings("unchecked") - private static TypeTranslator getCastedTag(Field field) { - return (TypeTranslator) field.tag; - } - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/coretypes/STObjectFormatter.java b/ripple-core/src/main/java/com/ripple/core/coretypes/STObjectFormatter.java deleted file mode 100644 index d17b6ae0ee..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/coretypes/STObjectFormatter.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.ripple.core.coretypes; - -import com.ripple.core.serialized.enums.LedgerEntryType; -import com.ripple.core.serialized.enums.TransactionType; -import com.ripple.core.types.known.generic.Validation; -import com.ripple.core.types.known.sle.LedgerHashes; -import com.ripple.core.types.known.sle.entries.*; -import com.ripple.core.types.known.tx.result.AffectedNode; -import com.ripple.core.types.known.tx.result.TransactionMeta; -import com.ripple.core.types.known.tx.txns.*; -import com.ripple.core.types.known.tx.txns.pseudo.EnableAmendment; -import com.ripple.core.types.known.tx.txns.pseudo.SetFee; - -public class STObjectFormatter { - public static STObject format(STObject source) { - // This would need to go before the test that just checks - // for ledgerEntryType - if (AffectedNode.isAffectedNode(source)) { - return new AffectedNode(source); - } - - if (TransactionMeta.isTransactionMeta(source)) { - TransactionMeta meta = new TransactionMeta(); - meta.fields = source.fields; - return meta; - } - - LedgerEntryType ledgerEntryType = STObject.ledgerEntryType(source); - if (ledgerEntryType != null) { - return ledgerFormatted(source, ledgerEntryType); - } - - TransactionType transactionType = STObject.transactionType(source); - if (transactionType != null) { - return transactionFormatted(source, transactionType); - } - - if (Validation.isValidation(source)) { - Validation validation = new Validation(); - validation.fields = source.fields; - return validation; - } - - return source; - } - - private static STObject transactionFormatted(STObject source, TransactionType transactionType) { - STObject constructed = null; - switch (transactionType) { - case Payment: - constructed = new Payment(); - break; - case EscrowCreate: - constructed = new EscrowCreate(); - break; - case EscrowFinish: - constructed = new EscrowFinish(); - break; - case AccountSet: - constructed = new AccountSet(); - break; - case EscrowCancel: - constructed = new EscrowCancel(); - break; - case SetRegularKey: - constructed = new SetRegularKey(); - break; - case OfferCreate: - constructed = new OfferCreate(); - break; - case OfferCancel: - constructed = new OfferCancel(); - break; - case TicketCreate: - constructed = new TicketCreate(); - break; - case TicketCancel: - constructed = new TicketCancel(); - break; - case SignerListSet: - constructed = new SignerListSet(); - break; - case PaymentChannelCreate: - constructed = new PaymentChannelCreate(); - break; - case PaymentChannelFund: - constructed = new PaymentChannelFund(); - break; - case PaymentChannelClaim: - constructed = new PaymentChannelClaim(); - break; - case CheckCreate: - constructed = new CheckCreate(); - break; - case CheckCash: - constructed = new CheckCash(); - break; - case CheckCancel: - constructed = new CheckCancel(); - break; - case DepositPreauth: - constructed = new DepositPreauth(); - break; - case TrustSet: - constructed = new TrustSet(); - break; - case EnableAmendment: - constructed = new EnableAmendment(); - break; - case SetFee: - constructed = new SetFee(); - break; - } - - constructed.fields = source.fields; - return constructed; - - } - - private static STObject ledgerFormatted(STObject source, LedgerEntryType ledgerEntryType) { - STObject constructed = null; - switch (ledgerEntryType) { - case Escrow: - constructed = new Escrow(); - break; - case Offer: - constructed = new Offer(); - break; - case RippleState: - constructed = new RippleState(); - break; - case AccountRoot: - constructed = new AccountRoot(); - break; - case DirectoryNode: - if (source.has(AccountID.Owner)) { - constructed = new OwnerDirectory(); - } else { - constructed = new OfferDirectory(); - } - break; - case LedgerHashes: - constructed = new LedgerHashes(); - break; - case Amendments: - constructed = new Amendments(); - break; - case FeeSettings: - constructed = new FeeSettings(); - break; - case Ticket: - constructed = new Ticket(); - break; - case SignerList: - constructed = new SignerList(); - break; - case PayChannel: - constructed = new PayChannel(); - break; - case Check: - constructed = new Check(); - break; - case DepositPreauth: - constructed = new DepositPreauthLe(); - break; - } - constructed.fields = source.fields; - return constructed; - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/coretypes/Vector256.java b/ripple-core/src/main/java/com/ripple/core/coretypes/Vector256.java deleted file mode 100644 index 8a5eef49e5..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/coretypes/Vector256.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.ripple.core.coretypes; - -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.fields.Field; -import com.ripple.core.fields.Type; -import com.ripple.core.fields.Vector256Field; -import com.ripple.core.serialized.BinaryParser; -import com.ripple.core.serialized.BytesSink; -import com.ripple.core.serialized.SerializedType; -import com.ripple.core.serialized.TypeTranslator; -import com.ripple.encodings.common.B16; -import org.json.JSONArray; - -import java.util.ArrayList; - -public class Vector256 extends ArrayList implements SerializedType { - - @Override - public Object toJSON() { - return toJSONArray(); - } - - public JSONArray toJSONArray() { - JSONArray array = new JSONArray(); - - for (Hash256 hash256 : this) { - array.put(hash256.toString()); - } - - return array; - } - - @Override - public byte[] toBytes() { - return translate.toBytes(this); - } - - @Override - public String toHex() { - return translate.toHex(this); - } - - @Override - public void toBytesSink(BytesSink to) { - for (Hash256 hash256 : this) { - hash256.toBytesSink(to); - } - } - - @Override - public Type type() { - return Type.Vector256; - } - - /** - * This method puts the last element in the removed elements slot, and - * pops off the back, thus preserving contiguity but losing ordering. - * @param ledgerIndex the ledger entry index to remove - * - * Unused when the featureSortedDirectories amendment is applied: - * See: https://ripple.com/build/known-amendments/#sorteddirectories - */ - public boolean removeUnstable(Hash256 ledgerIndex) { - int i = indexOf(ledgerIndex); - if (i == -1) { - return false; - } - - int last = size() - 1; - Hash256 lastIndex = get(last); - set(i, lastIndex); - remove(last); - - return true; - } - - public static Vector256 fromParser(BinaryParser parser) { - return translate.fromParser(parser); - } - - public static Vector256 fromHex(String hex) { - return translate.fromHex(hex); - } - public static Vector256 fromBytes(byte[] bytes) { - return translate.fromBytes(bytes); - } - - public static class Translator extends TypeTranslator { - @Override - public Vector256 fromParser(BinaryParser parser, Integer hint) { - Vector256 vector256 = new Vector256(); - if (hint == null) { - hint = parser.size() - parser.pos(); - } - for (int i = 0; i < hint / 32; i++) { - vector256.add(Hash256.fromParser(parser)); - } - - return vector256; - } - - public JSONArray toJSONArray(Vector256 obj) { - return obj.toJSONArray(); - } - - @Override - public Vector256 fromJSONArray(JSONArray jsonArray) { - Vector256 vector = new Vector256(); - - for (int i = 0; i < jsonArray.length(); i++) { - String hex = jsonArray.getString(i); - vector.add(new Hash256(B16.decode(hex))); - } - - return vector; - } - @Override - public Vector256 fromJacksonArray(ArrayNode jsonArray) { - Vector256 vector = new Vector256(); - - for (int i = 0; i < jsonArray.size(); i++) { - String hex = jsonArray.get(i).asText(); - vector.add(new Hash256(B16.decode(hex))); - } - - return vector; - } - } - static public Translator translate = new Translator(); - - public Vector256(){} - - public static Vector256Field vector256Field(final Field f) { - return new Vector256Field(){ @Override public Field getField() {return f;}}; - } - - static public Vector256Field Indexes = vector256Field(Field.Indexes); - static public Vector256Field Hashes = vector256Field(Field.Hashes); - static public Vector256Field Amendments = vector256Field(Field.Amendments); -} diff --git a/ripple-core/src/main/java/com/ripple/core/coretypes/hash/HalfSha512.java b/ripple-core/src/main/java/com/ripple/core/coretypes/hash/HalfSha512.java deleted file mode 100644 index 560cce14a0..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/coretypes/hash/HalfSha512.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.ripple.core.coretypes.hash; - -import com.ripple.core.coretypes.hash.prefixes.Prefix; -import com.ripple.core.serialized.BytesSink; -import com.ripple.core.serialized.SerializedType; - -import java.security.MessageDigest; - -public class HalfSha512 implements BytesSink { - private MessageDigest messageDigest; - - public HalfSha512() { - try { - messageDigest = MessageDigest.getInstance("SHA-512"); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - public static HalfSha512 prefixed256(Prefix bytes) { - HalfSha512 halfSha512 = new HalfSha512(); - halfSha512.update(bytes); - return halfSha512; - } - - public void update(byte[] bytes) { - messageDigest.update(bytes); - } - - public void update(Hash256 hash) { - messageDigest.update(hash.bytes()); - } - - public MessageDigest digest() { - return messageDigest; - } - - public Hash256 finish() { - byte[] half = digestBytes(); - return new Hash256(half); - } - - private byte[] digestBytes() { - byte[] digest = messageDigest.digest(); - byte[] half = new byte[32]; - System.arraycopy(digest, 0, half, 0, 32); - return half; - } - - @Override - public void add(byte aByte) { - messageDigest.update(aByte); - } - - @Override - public void add(byte[] bytes) { - messageDigest.update(bytes); - } - - public void update(Prefix prefix) { - messageDigest.update(prefix.bytes()); - } - - public HalfSha512 add(SerializedType st) { - st.toBytesSink(this); - return this; - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/coretypes/hash/Hash.java b/ripple-core/src/main/java/com/ripple/core/coretypes/hash/Hash.java deleted file mode 100644 index 898d1b2913..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/coretypes/hash/Hash.java +++ /dev/null @@ -1,155 +0,0 @@ -package com.ripple.core.coretypes.hash; - -import com.ripple.core.serialized.BinaryParser; -import com.ripple.core.serialized.BytesSink; -import com.ripple.core.serialized.SerializedType; -import com.ripple.core.serialized.TypeTranslator; -import com.ripple.encodings.common.B16; - -import java.math.BigInteger; -import java.util.Arrays; - -abstract public class Hash implements SerializedType, Comparable { - protected final byte[] hash; - - public Hash(byte[] bytes, int size) { - hash = checkHash(bytes, size); - } - - @Override - public String toString() { - return B16.encode(hash); - } - - @Override - public int hashCode() { - // Having this lazily computed and then cached would give significant - // performance boosts in some single threaded contexts. Given the inputs - // for the method are at least effectively final, and the method is - // essentially a pure function, it seems probably safe to do. It - // seems at worst, that in a multi threaded context, some extra work - // will be done in rare cases? - // TODO: check this assumption - return Arrays.hashCode(hash); - } - - private byte[] checkHash(byte[] bytes, int size) { - int length = bytes.length; - if (length > size) { - throwIllegalArg(length, "wide"); - } else if (length == size) { - // TODO: What costs for this ? - return bytes.clone(); - } else { - throwIllegalArg(length, "small"); - } - throw new IllegalStateException("Can not get here"); - } - - private void throwIllegalArg(int length, String wrongness) { - String simpleName = getClass().getSimpleName(); - throw new IllegalArgumentException("Hash length of " + length + "bytes is too " + - wrongness + - " for " + simpleName); - } - - BigInteger bigInteger() { - return new BigInteger(1, hash); - } - - // TODO: Is a defensive copy worthwhile? Or just be adults? Never been a - // problem in practice, though others may not know to avoid mutating the - // returned array. Pity Java doesn't have something like C++ const. - // If you did it in one place, should do it EVERY WHERE, inputs/outputs and - // on every type that stores mutable arrays internally and the perf and - // maybe memory (at least GC stress) costs could add up. - // It's a bit like polishing a tur*. - public byte[] bytes() { - return hash.clone(); - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof Hash) { - return Arrays.equals(hash, ((Hash) obj).hash); - } - - return super.equals(obj); - } - - @Override - public int compareTo(Subclass another) { - byte[] thisBytes = bytes(); - byte[] bytes = another.bytes(); - - return compareBytes(thisBytes, bytes, 0, thisBytes.length); - } - - public int compareStartingAt(Subclass another, int start) { - byte[] thisBytes = bytes(); - byte[] bytes = another.bytes(); - - return compareBytes(thisBytes, bytes, start, thisBytes.length); - } - - private int compareBytes(byte[] thisBytes, byte[] bytes, int start, int numBytes) { - int thisLength = thisBytes.length; - if (!(bytes.length == thisLength)) { - throw new RuntimeException(); - } - - for (int i = start; i < numBytes; i++) { - int cmp = (thisBytes[i] & 0xFF) - (bytes[i] & 0xFF); - if (cmp != 0) { - return cmp < 0 ? -1 : 1; - } - } - return 0; - } - - public byte[] slice(int start) { - return slice(start, 0); - } - - public byte get(int i) { - if (i < 0) i += hash.length; - return hash[i]; - } - - private byte[] slice(int start, int end) { - if (start < 0) start += hash.length; - if (end <= 0) end += hash.length; - - int length = end - start; - byte[] slice = new byte[length]; - - System.arraycopy(hash, start, slice, 0, length); - return slice; - } - - static public abstract class HashTranslator extends TypeTranslator { - - public abstract T newInstance(byte[] b); - public abstract int byteWidth(); - - @Override - public T fromParser(BinaryParser parser, Integer hint) { - return newInstance(parser.read(byteWidth())); - } - - @Override - public Object toJSON(T obj) { - return B16.encode(obj.hash); - } - - @Override - public T fromString(String value) { - return newInstance(B16.decode(value)); - } - - @Override - public void toBytesSink(T obj, BytesSink to) { - to.add(obj.bytes()); - } - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/coretypes/hash/Hash128.java b/ripple-core/src/main/java/com/ripple/core/coretypes/hash/Hash128.java deleted file mode 100644 index 112340da9f..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/coretypes/hash/Hash128.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.ripple.core.coretypes.hash; - -import com.ripple.core.fields.Field; -import com.ripple.core.fields.Hash128Field; -import com.ripple.core.fields.Type; -import com.ripple.core.serialized.BinaryParser; -import com.ripple.core.serialized.BytesSink; - -public class Hash128 extends Hash { - public Hash128(byte[] bytes) { - super(bytes, 16); - } - - @Override - public Object toJSON() { - return translate.toJSON(this); - } - - @Override - public byte[] toBytes() { - return translate.toBytes(this); - } - - @Override - public String toHex() { - return translate.toHex(this); - } - - @Override - public void toBytesSink(BytesSink to) { - translate.toBytesSink(this, to); - } - - @Override - public Type type() { - return Type.Hash128; - } - - public static Hash128 fromParser(BinaryParser parser) { - return translate.fromParser(parser); - } - - public static Hash128 fromHex(String string) { - return translate.fromHex(string); - } - public static Hash128 fromBytes(byte[] bytes) { - return translate.fromBytes(bytes); - } - - public static class Translator extends HashTranslator { - @Override - public Hash128 newInstance(byte[] b) { - return new Hash128(b); - } - - @Override - public int byteWidth() { - return 16; - } - } - - public static Translator translate = new Translator(); - - private static Hash128Field hash128Field(final Field f) { - return new Hash128Field(){ @Override public Field getField() {return f;}}; - } - - static public Hash128Field EmailHash = hash128Field(Field.EmailHash); - -} diff --git a/ripple-core/src/main/java/com/ripple/core/coretypes/hash/Hash160.java b/ripple-core/src/main/java/com/ripple/core/coretypes/hash/Hash160.java deleted file mode 100644 index 5f237c195c..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/coretypes/hash/Hash160.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.ripple.core.coretypes.hash; - -import com.ripple.core.coretypes.AccountID; -import com.ripple.core.fields.Field; -import com.ripple.core.fields.Hash160Field; -import com.ripple.core.fields.Type; -import com.ripple.core.serialized.BinaryParser; -import com.ripple.core.serialized.BytesSink; - -public class Hash160 extends Hash { - public Hash160(byte[] bytes) { - super(bytes, 20); - } - - @Override - public Object toJSON() { - return translate.toJSON(this); - } - - @Override - public byte[] toBytes() { - return translate.toBytes(this); - } - - @Override - public String toHex() { - return translate.toHex(this); - } - - @Override - public void toBytesSink(BytesSink to) { - translate.toBytesSink(this, to); - } - - @Override - public Type type() { - return Type.Hash160; - } - - public static Hash160 fromParser(BinaryParser parser) { - return translate.fromParser(parser); - } - - public static Hash160 fromHex(String string) { - return translate.fromHex(string); - } - - public static Hash160 fromBytes(byte[] bytes) { - return translate.fromBytes(bytes); - } - - public static class Translator extends HashTranslator { - @Override - public Hash160 newInstance(byte[] b) { - return new Hash160(b); - } - - @Override - public int byteWidth() { - return 20; - } - - @Override - public Hash160 fromString(String value) { - if (value.startsWith("r")) { - return newInstance(AccountID.fromAddress(value).bytes()); - } - return super.fromString(value); - } - } - public static Translator translate = new Translator(); - - private static Hash160Field hash160Field(final Field f) { - return new Hash160Field(){ @Override public Field getField() {return f;}}; - } - - static public Hash160Field TakerPaysIssuer = hash160Field(Field.TakerPaysIssuer); - static public Hash160Field TakerGetsCurrency = hash160Field(Field.TakerGetsCurrency); - static public Hash160Field TakerPaysCurrency = hash160Field(Field.TakerPaysCurrency); - static public Hash160Field TakerGetsIssuer = hash160Field(Field.TakerGetsIssuer); -} diff --git a/ripple-core/src/main/java/com/ripple/core/coretypes/hash/Hash256.java b/ripple-core/src/main/java/com/ripple/core/coretypes/hash/Hash256.java deleted file mode 100644 index 678b15ef00..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/coretypes/hash/Hash256.java +++ /dev/null @@ -1,146 +0,0 @@ -package com.ripple.core.coretypes.hash; - -import com.ripple.core.coretypes.hash.prefixes.HashPrefix; -import com.ripple.core.coretypes.hash.prefixes.Prefix; -import com.ripple.core.fields.Field; -import com.ripple.core.fields.Hash256Field; -import com.ripple.core.fields.Type; -import com.ripple.core.serialized.BinaryParser; -import com.ripple.core.serialized.BytesSink; - -import java.math.BigInteger; -import java.util.TreeMap; - -public class Hash256 extends Hash { - - public static final BigInteger bookBaseSize = new BigInteger("10000000000000000", 16); - - public int divergenceDepth(Hash256 other) { - return divergenceDepth(0, other); - } - public int divergenceDepth(int i, Hash256 other) { - for (; i < 64; i++) { - if (nibblet(i) != other.nibblet(i)) { - break; - } - } - return i; - } - - public static class Hash256Map extends TreeMap { - public Hash256Map(Hash256Map cache) { - super(cache); - } - public Hash256Map() { - - } - } - public static final Hash256 ZERO_256 = new Hash256(new byte[32]); - - @Override - public Object toJSON() { - return translate.toJSON(this); - } - - @Override - public byte[] toBytes() { - return translate.toBytes(this); - } - - @Override - public String toHex() { - return translate.toHex(this); - } - - @Override - public void toBytesSink(BytesSink to) { - translate.toBytesSink(this, to); - } - - @Override - public Type type() { - return Type.Hash256; - } - - public boolean isZero() { - return this == Hash256.ZERO_256 || equals(Hash256.ZERO_256); - } - - public boolean isNonZero() { - return !isZero(); - } - - public static Hash256 fromHex(String s) { - return translate.fromHex(s); - } - public static Hash256 fromParser(BinaryParser parser) { - return translate.fromParser(parser); - } - public static Hash256 fromBytes(byte[] bytes) { - return translate.fromBytes(bytes); - } - - public Hash256(byte[] bytes) { - super(bytes, 32); - } - - public static Hash256 signingHash(byte[] blob) { - return prefixedHalfSha512(HashPrefix.txSign, blob); - } - - public static Hash256 prefixedHalfSha512(Prefix prefix, byte[] blob) { - HalfSha512 messageDigest = HalfSha512.prefixed256(prefix); - messageDigest.update(blob); - return messageDigest.finish(); - } - - public int nibblet(int depth) { - int byte_ix = depth > 0 ? depth / 2 : 0; - int b = super.hash[byte_ix]; - if (depth % 2 == 0) { - b = (b & 0xF0) >> 4; - } else { - b = b & 0x0F; - } - return b; - } - - public static class Translator extends HashTranslator { - @Override - public Hash256 newInstance(byte[] b) { - return new Hash256(b); - } - - @Override - public int byteWidth() { - return 32; - } - } - public static Translator translate = new Translator(); - - public static Hash256Field hash256Field(final Field f) { - return new Hash256Field(){ @Override public Field getField() {return f;}}; - } - - static public Hash256Field LedgerHash = hash256Field(Field.LedgerHash); - static public Hash256Field ParentHash = hash256Field(Field.ParentHash); - static public Hash256Field TransactionHash = hash256Field(Field.TransactionHash); - static public Hash256Field AccountHash = hash256Field(Field.AccountHash); - static public Hash256Field PreviousTxnID = hash256Field(Field.PreviousTxnID); - static public Hash256Field AccountTxnID = hash256Field(Field.AccountTxnID); - static public Hash256Field LedgerIndex = hash256Field(Field.LedgerIndex); - static public Hash256Field WalletLocator = hash256Field(Field.WalletLocator); - static public Hash256Field RootIndex = hash256Field(Field.RootIndex); - static public Hash256Field BookDirectory = hash256Field(Field.BookDirectory); - static public Hash256Field InvoiceID = hash256Field(Field.InvoiceID); - static public Hash256Field Nickname = hash256Field(Field.Nickname); - static public Hash256Field Amendment = hash256Field(Field.Amendment); - static public Hash256Field TicketID = hash256Field(Field.TicketID); - static public Hash256Field Channel = hash256Field(Field.Channel); - static public Hash256Field CheckID = hash256Field(Field.CheckID); - static public Hash256Field Digest = hash256Field(Field.Digest); - static public Hash256Field ConsensusHash = hash256Field(Field.ConsensusHash); - - static public Hash256Field hash = hash256Field(Field.hash); - static public Hash256Field index = hash256Field(Field.index); -} diff --git a/ripple-core/src/main/java/com/ripple/core/coretypes/hash/Index.java b/ripple-core/src/main/java/com/ripple/core/coretypes/hash/Index.java deleted file mode 100644 index 75a5900430..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/coretypes/hash/Index.java +++ /dev/null @@ -1,159 +0,0 @@ -package com.ripple.core.coretypes.hash; - -import com.ripple.core.coretypes.AccountID; -import com.ripple.core.coretypes.Currency; -import com.ripple.core.coretypes.Issue; -import com.ripple.core.coretypes.hash.prefixes.HashPrefix; -import com.ripple.core.coretypes.hash.prefixes.LedgerSpace; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.coretypes.uint.UInt64; - -import java.util.Arrays; -import java.util.List; - -import static com.ripple.core.coretypes.hash.HalfSha512.prefixed256; -import static java.util.Collections.sort; - -public class Index { - private static Hash256 createBookBase(Issue pays, Issue gets) { - return prefixed256(LedgerSpace.bookDir) - .add(pays.currency()) - .add(gets.currency()) - .add(pays.issuer()) - .add(gets.issuer()) - .finish(); - } - - /** - * - * @return a copy of index, with quality overlaid in lowest 8 bytes - */ - public static Hash256 quality(Hash256 index, UInt64 quality) { - byte[] qi = new byte[32]; - System.arraycopy(index.bytes(), 0, qi, 0, 24); - if (quality != null) System.arraycopy(quality.toBytes(), 0, qi, 24, 8); - return new Hash256(qi); - } - - /** - * @return A copy of index, with the lowest 8 bytes all zeroed. - */ - private static Hash256 zeroQuality(Hash256 fullIndex) { - return quality(fullIndex, null); - } - - public static Hash256 rippleState(AccountID a1, AccountID a2, Currency currency) { - List accounts = Arrays.asList(a1, a2); - sort(accounts); - return rippleState(accounts, currency); - } - - public static Hash256 rippleState(List sortedAccounts, Currency currency) { - HalfSha512 hasher = prefixed256(LedgerSpace.ripple); - // Low then High - for (AccountID account : sortedAccounts) account.toBytesSink(hasher); - // Currency - currency.toBytesSink(hasher); - - return hasher.finish(); - } - - /** - * - * @param rootIndex The RootIndex index for the directory node - * @param nodeIndex nullable LowNode, HighNode, OwnerNode, BookNode etc - * defining a `page` number. - * - * @return A hash of rootIndex and nodeIndex when nodeIndex is non default - * else the rootIndex. This hash is used as an index for the next - * DirectoryNode page. - */ - public static Hash256 directoryNode(Hash256 rootIndex, UInt64 nodeIndex) { - if (nodeIndex == null || nodeIndex.isZero()) { - return rootIndex; - } - - return prefixed256(LedgerSpace.dirNode) - .add(rootIndex) - .add(nodeIndex) - .finish(); - } - - public static Hash256 accountRoot(AccountID accountID) { - return prefixed256(LedgerSpace.account).add(accountID).finish(); - } - - public static Hash256 paymentChannel(AccountID account, AccountID destination, UInt32 sequence) { - return prefixed256(LedgerSpace.paymentChannel) - .add(account) - .add(destination) - .add(sequence) - .finish(); - } - - public static Hash256 escrow(AccountID account, UInt32 sequence) { - return prefixed256(LedgerSpace.escrow) - .add(account) - .add(sequence) - .finish(); - } - - public static Hash256 ownerDirectory(AccountID account) { - return Hash256.prefixedHalfSha512(LedgerSpace.ownerDir, account.bytes()); - } - - public static Hash256 transactionID(byte[] blob) { - return Hash256.prefixedHalfSha512(HashPrefix.transactionID, blob); - } - - public static Hash256 bookStart(Issue pays, Issue gets) { - return zeroQuality(createBookBase(pays, gets)); - } - - public static Hash256 bookStart(Hash256 indexFromBookRange) { - return zeroQuality(indexFromBookRange); - } - - public static Hash256 bookEnd(Hash256 base) { - byte[] end = base.bigInteger().add(Hash256.bookBaseSize).toByteArray(); - if (end.length > 32) { - byte[] source = end; - end = new byte[32]; - System.arraycopy(source, source.length - 32, end, 0, 32); - } - return new Hash256(end); - } - - public static Hash256 ledgerHashes(long prev) { - return prefixed256(LedgerSpace.skipList) - .add(new UInt32(prev >> 16)) - .finish(); - } - public static Hash256 ledgerHashes() { - return prefixed256(LedgerSpace.skipList).finish(); - } - - public static Hash256 amendments() { - return prefixed256(LedgerSpace.amendment).finish(); - } - - public static Hash256 feeSettings() { - return prefixed256(LedgerSpace.fee).finish(); - } - - public static Hash256 signerList(AccountID account) { - return prefixed256(LedgerSpace.signerList) - .add(account) - .add(UInt32.ZERO) - .finish(); - } - - public static Hash256 ticket(AccountID account, UInt32 sequence) { - return prefixed256(LedgerSpace.ticket) - .add(account) - .add(sequence) - .finish(); - } - - -} diff --git a/ripple-core/src/main/java/com/ripple/core/coretypes/hash/prefixes/HashPrefix.java b/ripple-core/src/main/java/com/ripple/core/coretypes/hash/prefixes/HashPrefix.java deleted file mode 100644 index f213d4eb38..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/coretypes/hash/prefixes/HashPrefix.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.ripple.core.coretypes.hash.prefixes; - -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.encodings.common.B16; - -/** - * The prefix codes are part of the Ripple protocol - * and existing codes cannot be arbitrarily changed. - */ -public enum HashPrefix implements Prefix { - transactionID ('T', 'X', 'N'), - txNode ('S', 'N', 'D'), - leafNode ('M', 'L', 'N'), - innerNode ('M', 'I', 'N'), - innerNodeV2 ('I', 'N', 'R'), - ledgerMaster ('L', 'W', 'R'), - txSign ('S', 'T', 'X'), - txMultiSign ('S', 'M', 'T'), - validation ('V', 'A', 'L'), - proposal ('P', 'R', 'P'), - manifest ('M', 'A', 'N'), - paymentChannelClaim ('C', 'L', 'M'); - - private UInt32 uInt32; - private byte[] bytes; - private String chars; - - @Override - public byte[] bytes() { - return bytes; - } - - public String toHex() { - return B16.encode(bytes); - } - - HashPrefix(char... chars) { - this.chars = new String(chars); - byte[] bytes = { - (byte) chars[0], - (byte) chars[1], - (byte) chars[2], - (byte) 0, - }; - uInt32 = UInt32.fromBytes(bytes); - this.bytes = bytes; - } - - public UInt32 uInt32() { - return uInt32; - } - - public String chars() { - return chars; - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/coretypes/hash/prefixes/LedgerSpace.java b/ripple-core/src/main/java/com/ripple/core/coretypes/hash/prefixes/LedgerSpace.java deleted file mode 100644 index 20f5d61388..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/coretypes/hash/prefixes/LedgerSpace.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.ripple.core.coretypes.hash.prefixes; - -import com.ripple.core.coretypes.uint.UInt16; - -public enum LedgerSpace implements Prefix { - account('a'), - dirNode('d'), - generator('g'), - - ripple('r'), - offer('o'), // Entry for an offer. - ownerDir('O'), // Directory of things owned by an account. - bookDir('B'), // Directory of order books. - contract('c'), - skipList('s'), - escrow('u'), - amendment('f'), - fee('e'), - ticket('T'), - signerList('S'), - paymentChannel('x'), - - // no longer used - nickname('n'),; - - UInt16 uInt16; - public byte[] bytes; - - @Override - public byte[] bytes() { - return bytes; - } - - LedgerSpace(char c) { - uInt16 = new UInt16((int) c); - bytes = uInt16.toByteArray(); - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/coretypes/hash/prefixes/Prefix.java b/ripple-core/src/main/java/com/ripple/core/coretypes/hash/prefixes/Prefix.java deleted file mode 100644 index 7ba8b7a62a..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/coretypes/hash/prefixes/Prefix.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.ripple.core.coretypes.hash.prefixes; - -public interface Prefix { - byte[] bytes(); -} diff --git a/ripple-core/src/main/java/com/ripple/core/coretypes/uint/UInt.java b/ripple-core/src/main/java/com/ripple/core/coretypes/uint/UInt.java deleted file mode 100644 index aae0dcedf3..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/coretypes/uint/UInt.java +++ /dev/null @@ -1,209 +0,0 @@ -package com.ripple.core.coretypes.uint; - -import com.ripple.core.serialized.BinaryParser; -import com.ripple.core.serialized.BytesSink; -import com.ripple.core.serialized.SerializedType; -import com.ripple.core.serialized.TypeTranslator; -import com.ripple.encodings.common.B16; -import com.ripple.utils.Utils; - -import java.math.BigInteger; - -abstract public class UInt extends Number implements SerializedType, Comparable { - private final BigInteger value; - - private static BigInteger[] upperBounds = new BigInteger[8]; - private static BigInteger maxUIntVal(int bits) { - return new BigInteger("2").pow(bits).subtract(BigInteger.ONE); - } - - static { - for (int i = 0; i < 8; i++) { - upperBounds[i] = maxUIntVal((i + 1) * 8 ); - } - } - - UInt(byte[] bytes) { - value = new BigInteger(1, bytes); - checkBounds(); - } - - private void checkBounds() { - BigInteger upper = upperBounds[getByteWidth() - 1]; - if (value.compareTo(upper) > 0 || value.compareTo(BigInteger.ZERO) < 0) { - throw new IllegalArgumentException("value `" + value + - "` is illegal for " + getClass().getSimpleName()); - } - } - - UInt(BigInteger bi) { - value = (bi); - checkBounds(); - } - UInt(Number s) { - value = (BigInteger.valueOf(s.longValue())); - checkBounds(); - } - UInt(String s) { - value = (new BigInteger(s)); - checkBounds(); - } - UInt(String s, int radix) { - value = (new BigInteger(s, radix)); - checkBounds(); - } - - @Override - public String toString() { - return value.toString(); - } - - public abstract int getByteWidth(); - protected abstract Subclass instanceFrom(BigInteger n); - - public Subclass add(UInt val) { - return instanceFrom(value.add(val.value)); - } - - public Subclass subtract(UInt val) { - return instanceFrom(value.subtract(val.value)); - } - - public Subclass multiply(UInt val) { - return instanceFrom(value.multiply(val.value)); - } - - public Subclass divide(UInt val) { - return instanceFrom(value.divide(val.value)); - } - - public Subclass or(UInt val) { - return instanceFrom(value.or(val.value)); - } - - public Subclass shiftLeft(int n) { - return instanceFrom(value.shiftLeft(n)); - } - - public Subclass shiftRight(int n) { - return instanceFrom(value.shiftRight(n)); - } - - public int compareTo(UInt val) { - return value.compareTo(val.value); - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof UInt) { - return equals((UInt) obj); - } - else return super.equals(obj); - } - - public boolean equals(UInt x) { - return value.equals(x.value); - } - - public String toString(int radix) { - return value.toString(radix); - } - public byte[] toByteArray() { - int length = getByteWidth(); - return Utils.leadingZeroesTrimmedOrPaddedTo(length, value.toByteArray()); - } - - abstract public Object value(); - - public BigInteger bigInteger(){ - return value; - } - - @Override - public int intValue() { - return value.intValue(); - } - - @Override - public long longValue() { - return value.longValue(); - } - - @Override - public double doubleValue() { - return value.doubleValue(); - } - - @Override - public float floatValue() { - return value.floatValue(); - } - - @Override - public byte byteValue() { - return value.byteValue(); - } - - @Override - public short shortValue() { - return value.shortValue(); - } - - public boolean lte(T sequence) { - return compareTo(sequence) < 1; - } - - public boolean testBit(int f) { - // TODO, optimized ;) // move to Uint32 - return value.testBit(f); - } - - public boolean isZero() { - return value.signum() == 0; - } - - static public abstract class UINTTranslator extends TypeTranslator { - public abstract T newInstance(BigInteger i); - public abstract int byteWidth(); - - @Override - public T fromParser(BinaryParser parser, Integer hint) { - return newInstance(new BigInteger(1, parser.read(byteWidth()))); - } - - @Override - public Object toJSON(T obj) { - if (obj.getByteWidth() <= 4) { - return obj.longValue(); - } else { - return toString(obj); - } - } - - @Override - public T fromLong(long aLong) { - return newInstance(BigInteger.valueOf(aLong)); - } - - @Override - public T fromString(String value) { - int radix = byteWidth() <= 4 ? 10 : 16; - return newInstance(new BigInteger(value, radix)); - } - - @Override - public T fromInteger(int integer) { - return fromLong(integer); - } - - @Override - public String toString(T obj) { - return B16.encode(obj.toByteArray()); - } - - @Override - public void toBytesSink(T obj, BytesSink to) { - to.add(obj.toByteArray()); - } - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/coretypes/uint/UInt16.java b/ripple-core/src/main/java/com/ripple/core/coretypes/uint/UInt16.java deleted file mode 100644 index 9634cf6082..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/coretypes/uint/UInt16.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.ripple.core.coretypes.uint; - -import com.ripple.core.fields.Field; -import com.ripple.core.fields.Type; -import com.ripple.core.fields.UInt16Field; -import com.ripple.core.serialized.BinaryParser; -import com.ripple.core.serialized.BytesSink; -import com.ripple.core.serialized.TypeTranslator; - -import java.math.BigInteger; - -public class UInt16 extends UInt { - public final static UInt16 ZERO = new UInt16(0); - - public static TypeTranslator translate = new UINTTranslator() { - @Override - public UInt16 newInstance(BigInteger i) { - return new UInt16(i); - } - - @Override - public int byteWidth() { - return 2; - } - }; - - public UInt16(byte[] bytes) { - super(bytes); - } - - public UInt16(BigInteger value) { - super(value); - } - - public UInt16(Number s) { - super(s); - } - - public UInt16(String s) { - super(s); - } - - public UInt16(String s, int radix) { - super(s, radix); - } - - public static UInt16 fromParser(BinaryParser parser) { - return translate.fromParser(parser); - } - - public static UInt16 fromHex(String string) { - return translate.fromHex(string); - } - - public static UInt16 fromBytes(byte[] bytes) { - return translate.fromBytes(bytes); - } - - @Override - public int getByteWidth() { - return 2; - } - - @Override - protected UInt16 instanceFrom(BigInteger n) { - return new UInt16(n); - } - - @Override - public Integer value() { - return intValue(); - } - - private static UInt16Field int16Field(final Field f) { - return new UInt16Field(){ @Override public Field getField() {return f;}}; - } - - static public UInt16Field LedgerEntryType = int16Field(Field.LedgerEntryType); - static public UInt16Field TransactionType = int16Field(Field.TransactionType); - static public UInt16Field SignerWeight = int16Field(Field.SignerWeight); - - @Override - public Object toJSON() { - return translate.toJSON(this); - } - - @Override - public byte[] toBytes() { - return translate.toBytes(this); - } - - @Override - public String toHex() { - return translate.toHex(this); - } - - @Override - public void toBytesSink(BytesSink to) { - translate.toBytesSink(this, to); - } - - @Override - public Type type() { - return Type.UInt16; - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/coretypes/uint/UInt32.java b/ripple-core/src/main/java/com/ripple/core/coretypes/uint/UInt32.java deleted file mode 100644 index b831c8607c..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/coretypes/uint/UInt32.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.ripple.core.coretypes.uint; - -import com.ripple.core.fields.Field; -import com.ripple.core.fields.Type; -import com.ripple.core.fields.UInt32Field; -import com.ripple.core.serialized.BinaryParser; -import com.ripple.core.serialized.BytesSink; -import com.ripple.core.serialized.TypeTranslator; - -import java.math.BigInteger; - -public class UInt32 extends UInt { - public final static UInt32 ZERO = new UInt32(0); - - public static TypeTranslator translate = new UINTTranslator() { - @Override - public UInt32 newInstance(BigInteger i) { - return new UInt32(i); - } - - @Override - public int byteWidth() { - return 4; - } - }; - - public UInt32(byte[] bytes) { - super(bytes); - } - - public UInt32(BigInteger value) { - super(value); - } - - public UInt32(Number val) { - super(val); - } - public UInt32(String s) { - super(s); - } - - public UInt32(String s, int radix) { - super(s, radix); - } - - public static UInt32 fromParser(BinaryParser binaryParser) { - return translate.fromParser(binaryParser); - } - public static UInt32 fromHex(String string) { - return translate.fromHex(string); - } - public static UInt32 fromBytes(byte[] bytes) { - return translate.fromBytes(bytes); - } - - @Override - public int getByteWidth() { - return 4; - } - - @Override - protected UInt32 instanceFrom(BigInteger n) { - return new UInt32(n); - } - - @Override - public Long value() { - return longValue(); - } - - private static UInt32Field int32Field(final Field f) { - return new UInt32Field(){ @Override public Field getField() {return f;}}; - } - - static public UInt32Field Flags = int32Field(Field.Flags); - static public UInt32Field SourceTag = int32Field(Field.SourceTag); - static public UInt32Field Sequence = int32Field(Field.Sequence); - static public UInt32Field PreviousTxnLgrSeq = int32Field(Field.PreviousTxnLgrSeq); - static public UInt32Field LedgerSequence = int32Field(Field.LedgerSequence); - static public UInt32Field CloseTime = int32Field(Field.CloseTime); - static public UInt32Field ParentCloseTime = int32Field(Field.ParentCloseTime); - static public UInt32Field SigningTime = int32Field(Field.SigningTime); - static public UInt32Field Expiration = int32Field(Field.Expiration); - static public UInt32Field TransferRate = int32Field(Field.TransferRate); - static public UInt32Field WalletSize = int32Field(Field.WalletSize); - static public UInt32Field OwnerCount = int32Field(Field.OwnerCount); - static public UInt32Field DestinationTag = int32Field(Field.DestinationTag); - static public UInt32Field HighQualityIn = int32Field(Field.HighQualityIn); - static public UInt32Field HighQualityOut = int32Field(Field.HighQualityOut); - static public UInt32Field LowQualityIn = int32Field(Field.LowQualityIn); - static public UInt32Field LowQualityOut = int32Field(Field.LowQualityOut); - static public UInt32Field QualityIn = int32Field(Field.QualityIn); - static public UInt32Field QualityOut = int32Field(Field.QualityOut); - static public UInt32Field StampEscrow = int32Field(Field.StampEscrow); - static public UInt32Field BondAmount = int32Field(Field.BondAmount); - static public UInt32Field LoadFee = int32Field(Field.LoadFee); - static public UInt32Field OfferSequence = int32Field(Field.OfferSequence); - static public UInt32Field FirstLedgerSequence = int32Field(Field.FirstLedgerSequence); - static public UInt32Field LastLedgerSequence = int32Field(Field.LastLedgerSequence); - static public UInt32Field TransactionIndex = int32Field(Field.TransactionIndex); - static public UInt32Field OperationLimit = int32Field(Field.OperationLimit); - static public UInt32Field ReferenceFeeUnits = int32Field(Field.ReferenceFeeUnits); - static public UInt32Field ReserveBase = int32Field(Field.ReserveBase); - static public UInt32Field ReserveIncrement = int32Field(Field.ReserveIncrement); - static public UInt32Field SetFlag = int32Field(Field.SetFlag); - static public UInt32Field ClearFlag = int32Field(Field.ClearFlag); - static public UInt32Field SignerQuorum = int32Field(Field.SignerQuorum); - public static UInt32Field SignerListID = int32Field(Field.SignerListID); - public static UInt32Field CancelAfter = int32Field(Field.CancelAfter); - public static UInt32Field FinishAfter = int32Field(Field.FinishAfter); - public static UInt32Field SettleDelay = int32Field(Field.SettleDelay); - - @Override - public Object toJSON() { - return translate.toJSON(this); - } - - @Override - public byte[] toBytes() { - return translate.toBytes(this); - } - - @Override - public String toHex() { - return translate.toHex(this); - } - - @Override - public void toBytesSink(BytesSink to) { - translate.toBytesSink(this, to); - } - - @Override - public Type type() { - return Type.UInt32; - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/coretypes/uint/UInt64.java b/ripple-core/src/main/java/com/ripple/core/coretypes/uint/UInt64.java deleted file mode 100644 index 3312192542..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/coretypes/uint/UInt64.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.ripple.core.coretypes.uint; - -import com.ripple.core.fields.Field; -import com.ripple.core.fields.Type; -import com.ripple.core.fields.UInt64Field; -import com.ripple.core.serialized.BinaryParser; -import com.ripple.core.serialized.BytesSink; -import com.ripple.core.serialized.TypeTranslator; - -import java.math.BigInteger; - -public class UInt64 extends UInt { - public final static UInt64 ZERO = new UInt64(0); - - public static TypeTranslator translate = new UINTTranslator() { - @Override - public UInt64 newInstance(BigInteger i) { - return new UInt64(i); - } - - @Override - public int byteWidth() { - return 8; - } - }; - - public UInt64(byte[] bytes) { - super(bytes); - } - - public UInt64(BigInteger value) { - super(value); - } - - public UInt64(Number s) { - super(s); - } - - public UInt64(String s) { - super(s); - } - - public UInt64(String s, int radix) { - super(s, radix); - } - - public static UInt64 fromParser(BinaryParser parser) { - return translate.fromParser(parser); - } - - public static UInt64 fromHex(String string) { - return translate.fromHex(string); - } - public static UInt64 fromBytes(byte[] bytes) { - return translate.fromBytes(bytes); - } - - @Override - public int getByteWidth() { - return 8; - } - - @Override - protected UInt64 instanceFrom(BigInteger n) { - return new UInt64(n); - } - - @Override - public BigInteger value() { - return bigInteger(); - } - - private static UInt64Field int64Field(final Field f) { - return new UInt64Field(){ @Override public Field getField() {return f;}}; - } - - static public UInt64Field IndexNext = int64Field(Field.IndexNext); - static public UInt64Field IndexPrevious = int64Field(Field.IndexPrevious); - static public UInt64Field BookNode = int64Field(Field.BookNode); - static public UInt64Field OwnerNode = int64Field(Field.OwnerNode); - static public UInt64Field BaseFee = int64Field(Field.BaseFee); - static public UInt64Field ExchangeRate = int64Field(Field.ExchangeRate); - static public UInt64Field LowNode = int64Field(Field.LowNode); - static public UInt64Field HighNode = int64Field(Field.HighNode); - public static UInt64Field DestinationNode = int64Field(Field.DestinationNode); - public static UInt64Field Cookie = int64Field(Field.Cookie); - - @Override - public Object toJSON() { - return translate.toJSON(this); - } - - @Override - public byte[] toBytes() { - return translate.toBytes(this); - } - - @Override - public String toHex() { - return translate.toHex(this); - } - - @Override - public void toBytesSink(BytesSink to) { - translate.toBytesSink(this, to); - } - - @Override - public Type type() { - return Type.UInt64; - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/coretypes/uint/UInt8.java b/ripple-core/src/main/java/com/ripple/core/coretypes/uint/UInt8.java deleted file mode 100644 index 528eaa8614..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/coretypes/uint/UInt8.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.ripple.core.coretypes.uint; - -import com.ripple.core.fields.Field; -import com.ripple.core.fields.Type; -import com.ripple.core.fields.UInt8Field; -import com.ripple.core.serialized.BinaryParser; -import com.ripple.core.serialized.BytesSink; -import com.ripple.core.serialized.TypeTranslator; - -import java.math.BigInteger; - -public class UInt8 extends UInt { - public final static UInt8 ZERO = new UInt8(0); - - public static TypeTranslator translate = new UINTTranslator() { - @Override - public UInt8 newInstance(BigInteger i) { - return new UInt8(i); - } - - @Override - public int byteWidth() { - return 1; - } - }; - - public UInt8(byte[] bytes) { - super(bytes); - } - - public UInt8(BigInteger value) { - super(value); - } - - public UInt8(Number s) { - super(s); - } - - public UInt8(String s) { - super(s); - } - - public UInt8(String s, int radix) { - super(s, radix); - } - - public static UInt8 fromParser(BinaryParser parser) { - return translate.fromParser(parser); - } - public static UInt8 fromHex(String hex) { - return translate.fromHex(hex); - } - public static UInt8 fromBytes(byte[] bytes) { - return translate.fromBytes(bytes); - } - - @Override - public int getByteWidth() { - return 1; - } - - @Override - protected UInt8 instanceFrom(BigInteger n) { - return new UInt8(n); - } - - @Override - public Short value() { - return shortValue(); - } - - private static UInt8Field int8Field(final Field f) { - return new UInt8Field() {@Override public Field getField() {return f; } }; - } - - static public UInt8Field CloseResolution = int8Field(Field.CloseResolution); - static public UInt8Field Method = int8Field(Field.Method); - static public UInt8Field TransactionResult = int8Field(Field.TransactionResult); - static public UInt8Field TickSize = int8Field(Field.TickSize); - - @Override - public Object toJSON() { - return translate.toJSON(this); - } - - @Override - public byte[] toBytes() { - return translate.toBytes(this); - } - - @Override - public String toHex() { - return translate.toHex(this); - } - - @Override - public void toBytesSink(BytesSink to) { - translate.toBytesSink(this, to); - } - - @Override - public Type type() { - return Type.UInt8; - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/enums/LedgerFlag.java b/ripple-core/src/main/java/com/ripple/core/enums/LedgerFlag.java deleted file mode 100644 index 99f18b5309..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/enums/LedgerFlag.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.ripple.core.enums; - -// Ledger Specific Flags -public class LedgerFlag { - public static int - // ltACCOUNT_ROOT - PasswordSpent = 0x00010000, // True, if password set fee is spent. - RequireDestTag = 0x00020000, // True, to require a DestinationTag for payments. - RequireAuth = 0x00040000, // True, to require a authorization to hold IOUs. - DisallowXRP = 0x00080000, // True, to disallow sending XRP. - DisableMaster = 0x00100000, // True, force regular key - NoFreeze = 0x00200000, // True, cannot freeze ripple states - GlobalFreeze = 0x00400000, // True, all assets frozen - DefaultRipple = 0x00800000, // True, all assets frozen - - // ltOFFER - Passive = 0x00010000, - Sell = 0x00020000, // True, offer was placed as a sell. - - // ltRIPPLE_STATE - LowReserve = 0x00010000, // True, if entry counts toward reserve. - HighReserve = 0x00020000, - LowAuth = 0x00040000, - HighAuth = 0x00080000, - LowNoRipple = 0x00100000, - HighNoRipple = 0x00200000, - LowFreeze = 0x00400000, // True, low side has set freeze flag - HighFreeze = 0x00800000; // True, high side has set freeze flag -} diff --git a/ripple-core/src/main/java/com/ripple/core/enums/TransactionFlag.java b/ripple-core/src/main/java/com/ripple/core/enums/TransactionFlag.java deleted file mode 100644 index adb7f9e910..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/enums/TransactionFlag.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.ripple.core.enums; - -// Transaction Specific Flags -public class TransactionFlag { - public static long - FullyCanonicalSig = 0x80000000L, - Universal = FullyCanonicalSig, - UniversalMask = ~Universal, - - // AccountSet flags: - RequireDestTag = 0x00010000, - OptionalDestTag = 0x00020000, - RequireAuth = 0x00040000, - OptionalAuth = 0x00080000, - DisallowXRP = 0x00100000, - AllowXRP = 0x00200000, - AccountSetMask = ~(Universal | RequireDestTag | OptionalDestTag - | RequireAuth | OptionalAuth - | DisallowXRP | AllowXRP), - - // AccountSet SetFlag/ClearFlag values - asfRequireDest = 1, - asfRequireAuth = 2, - asfDisallowXRP = 3, - asfDisableMaster = 4, - asfAccountTxnID = 5, - asfNoFreeze = 6, - asfGlobalFreeze = 7, - - // OfferCreate flags: - Passive = 0x00010000, - ImmediateOrCancel = 0x00020000, - FillOrKill = 0x00040000, - Sell = 0x00080000, - OfferCreateMask = ~(Universal | Passive | ImmediateOrCancel | FillOrKill | Sell), - - // Payment flags: - NoRippleDirect = 0x00010000, - PartialPayment = 0x00020000, - LimitQuality = 0x00040000, - PaymentMask = ~(Universal | PartialPayment | LimitQuality | NoRippleDirect), - - // TrustSet flags: - SetAuth = 0x00010000, - SetNoRipple = 0x00020000, - ClearNoRipple = 0x00040000, - SetFreeze = 0x00100000, - ClearFreeze = 0x00200000, - TrustSetMask = ~(Universal | SetAuth | SetNoRipple | ClearNoRipple | SetFreeze | ClearFreeze); -} diff --git a/ripple-core/src/main/java/com/ripple/core/fields/AccountIDField.java b/ripple-core/src/main/java/com/ripple/core/fields/AccountIDField.java deleted file mode 100644 index f31e3df14d..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/fields/AccountIDField.java +++ /dev/null @@ -1,3 +0,0 @@ -package com.ripple.core.fields; - -public abstract class AccountIDField implements HasField {} diff --git a/ripple-core/src/main/java/com/ripple/core/fields/AmountField.java b/ripple-core/src/main/java/com/ripple/core/fields/AmountField.java deleted file mode 100644 index 4666ff51f9..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/fields/AmountField.java +++ /dev/null @@ -1,3 +0,0 @@ -package com.ripple.core.fields; - -public abstract class AmountField implements HasField {} diff --git a/ripple-core/src/main/java/com/ripple/core/fields/BlobField.java b/ripple-core/src/main/java/com/ripple/core/fields/BlobField.java deleted file mode 100644 index 2925c89611..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/fields/BlobField.java +++ /dev/null @@ -1,3 +0,0 @@ -package com.ripple.core.fields; - -public abstract class BlobField implements HasField{} diff --git a/ripple-core/src/main/java/com/ripple/core/fields/Field.java b/ripple-core/src/main/java/com/ripple/core/fields/Field.java deleted file mode 100644 index 87871ecca0..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/fields/Field.java +++ /dev/null @@ -1,328 +0,0 @@ -package com.ripple.core.fields; - -import java.util.*; - -public enum Field { - // These are all presorted (verified in a static block below) - // They can then be used in a TreeMap, using the Enum (private) ordinal - // comparator - Generic(0, Type.Unknown), - Invalid(-1, Type.Unknown), - - LedgerEntryType(1, Type.UInt16), - TransactionType(2, Type.UInt16), - SignerWeight(3, Type.UInt16), - - Flags(2, Type.UInt32), - SourceTag(3, Type.UInt32), - Sequence(4, Type.UInt32), - PreviousTxnLgrSeq(5, Type.UInt32), - LedgerSequence(6, Type.UInt32), - CloseTime(7, Type.UInt32), - ParentCloseTime(8, Type.UInt32), - SigningTime(9, Type.UInt32), - Expiration(10, Type.UInt32), - TransferRate(11, Type.UInt32), - WalletSize(12, Type.UInt32), - OwnerCount(13, Type.UInt32), - DestinationTag(14, Type.UInt32), - - HighQualityIn(16, Type.UInt32), - HighQualityOut(17, Type.UInt32), - LowQualityIn(18, Type.UInt32), - LowQualityOut(19, Type.UInt32), - QualityIn(20, Type.UInt32), - QualityOut(21, Type.UInt32), - StampEscrow(22, Type.UInt32), - BondAmount(23, Type.UInt32), - LoadFee(24, Type.UInt32), - OfferSequence(25, Type.UInt32), - FirstLedgerSequence(26, Type.UInt32), // Deprecated: do not use - // Added new semantics in 9486fc416ca7c59b8930b734266eed4d5b714c50 - LastLedgerSequence(27, Type.UInt32), - TransactionIndex(28, Type.UInt32), - OperationLimit(29, Type.UInt32), - ReferenceFeeUnits(30, Type.UInt32), - ReserveBase(31, Type.UInt32), - ReserveIncrement(32, Type.UInt32), - SetFlag(33, Type.UInt32), - ClearFlag(34, Type.UInt32), - SignerQuorum(35, Type.UInt32), - CancelAfter(36, Type.UInt32), - FinishAfter(37, Type.UInt32), - SignerListID(38, Type.UInt32), - SettleDelay(39, Type.UInt32), - - IndexNext(1, Type.UInt64), - IndexPrevious(2, Type.UInt64), - BookNode(3, Type.UInt64), - OwnerNode(4, Type.UInt64), - BaseFee(5, Type.UInt64), - ExchangeRate(6, Type.UInt64), - LowNode(7, Type.UInt64), - HighNode(8, Type.UInt64), - DestinationNode(9, Type.UInt64), - Cookie(10, Type.UInt64), - - EmailHash(1, Type.Hash128), - - LedgerHash(1, Type.Hash256), - ParentHash(2, Type.Hash256), - TransactionHash(3, Type.Hash256), - AccountHash(4, Type.Hash256), - PreviousTxnID(5, Type.Hash256), - LedgerIndex(6, Type.Hash256), - WalletLocator(7, Type.Hash256), - RootIndex(8, Type.Hash256), - // Added in rippled commit: 9486fc416ca7c59b8930b734266eed4d5b714c50 - AccountTxnID(9, Type.Hash256), - BookDirectory(16, Type.Hash256), - InvoiceID(17, Type.Hash256), - Nickname(18, Type.Hash256), - Amendment(19, Type.Hash256), - TicketID(20, Type.Hash256), - Digest(21, Type.Hash256), - Channel(22, Type.Hash256), - ConsensusHash(23, Type.Hash256), - CheckID(24, Type.Hash256), - - hash(257, Type.Hash256), - index(258, Type.Hash256), - - Amount(1, Type.Amount), - Balance(2, Type.Amount), - LimitAmount(3, Type.Amount), - TakerPays(4, Type.Amount), - TakerGets(5, Type.Amount), - LowLimit(6, Type.Amount), - HighLimit(7, Type.Amount), - Fee(8, Type.Amount), - SendMax(9, Type.Amount), - DeliverMin(10, Type.Amount), - - MinimumOffer(16, Type.Amount), - RippleEscrow(17, Type.Amount), - // Added in rippled commit: e7f0b8eca69dd47419eee7b82c8716b3aa5a9e39 - DeliveredAmount(18, Type.Amount), - // These are auxiliary fields -// quality(257, Type.AMOUNT), - taker_gets_funded(258, Type.Amount), - taker_pays_funded(259, Type.Amount), - - PublicKey(1, Type.Blob), - MessageKey(2, Type.Blob), - SigningPubKey(3, Type.Blob), - TxnSignature(4, Type.Blob), - Signature(6, Type.Blob), - Domain(7, Type.Blob), - FundCode(8, Type.Blob), - RemoveCode(9, Type.Blob), - ExpireCode(10, Type.Blob), - CreateCode(11, Type.Blob), - MemoType(12, Type.Blob), - MemoData(13, Type.Blob), - MemoFormat(14, Type.Blob), - Fulfillment(16, Type.Blob), - Condition(17, Type.Blob), - MasterSignature(18, Type.Blob), - - Account(1, Type.AccountID), - Owner(2, Type.AccountID), - Destination(3, Type.AccountID), - Issuer(4, Type.AccountID), - Authorize(5, Type.AccountID), - Unauthorize(6, Type.AccountID), - Target(7, Type.AccountID), - RegularKey(8, Type.AccountID), - - ObjectEndMarker(1, Type.STObject), - - TransactionMetaData(2, Type.STObject), - CreatedNode(3, Type.STObject), - DeletedNode(4, Type.STObject), - ModifiedNode(5, Type.STObject), - PreviousFields(6, Type.STObject), - FinalFields(7, Type.STObject), - NewFields(8, Type.STObject), - TemplateEntry(9, Type.STObject), - Memo(10, Type.STObject), - SignerEntry(11, Type.STObject), - Signer(16, Type.STObject), - // 17 unused - Majority(18, Type.STObject), - - ArrayEndMarker(1, Type.STArray), -// SigningAccounts(2, Type.STArray), - Signers(3, Type.STArray), - SignerEntries(4, Type.STArray), - Template(5, Type.STArray), - Necessary(6, Type.STArray), - Sufficient(7, Type.STArray), - AffectedNodes(8, Type.STArray), - Memos(9, Type.STArray), - Majorities(16, Type.STArray), - - CloseResolution(1, Type.UInt8), - Method(2, Type.UInt8), - TransactionResult(3, Type.UInt8), - TickSize(16, Type.UInt8), - - TakerPaysCurrency(1, Type.Hash160), - TakerPaysIssuer(2, Type.Hash160), - TakerGetsCurrency(3, Type.Hash160), - TakerGetsIssuer(4, Type.Hash160), - - Paths(1, Type.PathSet), - - Indexes(1, Type.Vector256), - Hashes(2, Type.Vector256), - Amendments(3, Type.Vector256), - - Transaction(1, Type.Transaction), - LedgerEntry(1, Type.LedgerEntry), - Validation(1, Type.Validation); - - final int id; - - // defaults - boolean signingField = true; - boolean isSerialized = true; - boolean isVlEncoded = false; - - public static Field fromString(String key) { - Field f; - try { - f = valueOf(key); - } catch (IllegalArgumentException e) { - f = null; - } - return f; - } - - private static byte[] asBytes(Field field) { - int name = field.getId(), type = field.getType().getId(); - ArrayList header = new ArrayList<>(3); - - if (type < 16) - { - if (name < 16) // common type, common name - header.add((byte)((type << 4) | name)); - else - { - // common type, uncommon name - header.add((byte)(type << 4)); - header.add((byte)(name)); - } - } - else if (name < 16) - { - // uncommon type, common name - header.add((byte)(name)); - header.add((byte)(type)); - } - else - { - // uncommon type, uncommon name - header.add((byte)(0)); - header.add((byte)(type)); - header.add((byte)(name)); - } - - byte[] headerBytes = new byte[header.size()]; - for (int i = 0; i < header.size(); i++) { - headerBytes[i] = header.get(i); - } - - return headerBytes; - } - - public int getId() { - return id; - } - - final int code; - final Type type; - private final byte[] bytes; - public Object tag = null; - - Field(int fid, Type tid) { - id = fid; - type = tid; - code = (type.id << 16) | fid; - isSerialized = isSerialized(this); - - if (isSerialized()) { - bytes = asBytes(this); - } else { - bytes = null; - } - } - - static private Map byCode = new TreeMap<>(); - - static public Field fromCode(Integer integer) { - return byCode.get(integer); - } - - public Type getType() { - return type; - } - - public boolean isSerialized() { - return isSerialized; - } - public boolean isVLEncoded() { - return isVlEncoded; - } - public boolean isSigningField() { - return signingField; - } - private static boolean isSerialized(Field f) { - // This should screen out `hash` and `index` and the like - return ((f.type.id > 0) && (f.type.id < 256) && (f.id > 0) && (f.id < 256)); - } - - static public Comparator comparator = Comparator.comparingInt(o -> o.code); - - static { - for (Field f : Field.values()) { - byCode.put(f.code, f); - f.isSerialized = isSerialized(f); - f.signingField = f.isSerialized; - - switch (f.type) { - case Blob: - case AccountID: - case Vector256: - f.isVlEncoded = true; - break; - default: - break; - } - - } - - TxnSignature.signingField = false; - Signers.signingField = false; - Signature.signingField = false; - MasterSignature.signingField = false; - - ArrayList sortedFields; - Field[] values = Field.values(); - sortedFields = new ArrayList<>(Arrays.asList(values)); - sortedFields.sort(comparator); - - for (int i = 0; i < values.length; i++) { - Field av = values[i]; - Field lv = sortedFields.get(i); - if (av.code != lv.code) { - throw new AssertionError( - "Field enum declaration isn't presorted"); - } - } - } - - public byte[] getBytes() { - return bytes; - } -} \ No newline at end of file diff --git a/ripple-core/src/main/java/com/ripple/core/fields/HasField.java b/ripple-core/src/main/java/com/ripple/core/fields/HasField.java deleted file mode 100644 index edc49029a3..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/fields/HasField.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.ripple.core.fields; - -public interface HasField { - Field getField(); -} diff --git a/ripple-core/src/main/java/com/ripple/core/fields/Hash128Field.java b/ripple-core/src/main/java/com/ripple/core/fields/Hash128Field.java deleted file mode 100644 index b8b78e912e..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/fields/Hash128Field.java +++ /dev/null @@ -1,3 +0,0 @@ -package com.ripple.core.fields; - -public abstract class Hash128Field implements HasField {} diff --git a/ripple-core/src/main/java/com/ripple/core/fields/Hash160Field.java b/ripple-core/src/main/java/com/ripple/core/fields/Hash160Field.java deleted file mode 100644 index f0569b13eb..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/fields/Hash160Field.java +++ /dev/null @@ -1,3 +0,0 @@ -package com.ripple.core.fields; - -public abstract class Hash160Field implements HasField {} diff --git a/ripple-core/src/main/java/com/ripple/core/fields/Hash256Field.java b/ripple-core/src/main/java/com/ripple/core/fields/Hash256Field.java deleted file mode 100644 index e0a83b67ef..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/fields/Hash256Field.java +++ /dev/null @@ -1,3 +0,0 @@ -package com.ripple.core.fields; - -public abstract class Hash256Field implements HasField {} diff --git a/ripple-core/src/main/java/com/ripple/core/fields/PathSetField.java b/ripple-core/src/main/java/com/ripple/core/fields/PathSetField.java deleted file mode 100644 index 5982570eb6..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/fields/PathSetField.java +++ /dev/null @@ -1,3 +0,0 @@ -package com.ripple.core.fields; - -public abstract class PathSetField implements HasField{} diff --git a/ripple-core/src/main/java/com/ripple/core/fields/STArrayField.java b/ripple-core/src/main/java/com/ripple/core/fields/STArrayField.java deleted file mode 100644 index 056a55c861..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/fields/STArrayField.java +++ /dev/null @@ -1,3 +0,0 @@ -package com.ripple.core.fields; - -public abstract class STArrayField implements HasField{} diff --git a/ripple-core/src/main/java/com/ripple/core/fields/STObjectField.java b/ripple-core/src/main/java/com/ripple/core/fields/STObjectField.java deleted file mode 100644 index c802f57a2a..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/fields/STObjectField.java +++ /dev/null @@ -1,3 +0,0 @@ -package com.ripple.core.fields; - -public abstract class STObjectField implements HasField{} diff --git a/ripple-core/src/main/java/com/ripple/core/fields/Type.java b/ripple-core/src/main/java/com/ripple/core/fields/Type.java deleted file mode 100644 index 2384861e88..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/fields/Type.java +++ /dev/null @@ -1,35 +0,0 @@ -/* DO NOT EDIT, AUTO GENERATED */ -package com.ripple.core.fields; - -public enum Type { - Unknown(-2), - Done(-1), - NotPresent(0), - UInt16(1), - UInt32(2), - UInt64(3), - Hash128(4), - Hash256(5), - Amount(6), - Blob(7), - AccountID(8), - STObject(14), - STArray(15), - UInt8(16), - Hash160(17), - PathSet(18), - Vector256(19), - Transaction(10001), - LedgerEntry(10002), - Validation(10003); - - final int id; - - Type(int type) { - this.id = type; - } - - public int getId() { - return id; - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/fields/UInt16Field.java b/ripple-core/src/main/java/com/ripple/core/fields/UInt16Field.java deleted file mode 100644 index fa99de6499..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/fields/UInt16Field.java +++ /dev/null @@ -1,3 +0,0 @@ -package com.ripple.core.fields; - -public abstract class UInt16Field implements HasField {} diff --git a/ripple-core/src/main/java/com/ripple/core/fields/UInt32Field.java b/ripple-core/src/main/java/com/ripple/core/fields/UInt32Field.java deleted file mode 100644 index a2b58902c2..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/fields/UInt32Field.java +++ /dev/null @@ -1,3 +0,0 @@ -package com.ripple.core.fields; - -public abstract class UInt32Field implements HasField {} diff --git a/ripple-core/src/main/java/com/ripple/core/fields/UInt64Field.java b/ripple-core/src/main/java/com/ripple/core/fields/UInt64Field.java deleted file mode 100644 index 3c85f3b312..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/fields/UInt64Field.java +++ /dev/null @@ -1,3 +0,0 @@ -package com.ripple.core.fields; - -public abstract class UInt64Field implements HasField {} diff --git a/ripple-core/src/main/java/com/ripple/core/fields/UInt8Field.java b/ripple-core/src/main/java/com/ripple/core/fields/UInt8Field.java deleted file mode 100644 index 465a1ad6be..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/fields/UInt8Field.java +++ /dev/null @@ -1,3 +0,0 @@ -package com.ripple.core.fields; - -public abstract class UInt8Field implements HasField {} diff --git a/ripple-core/src/main/java/com/ripple/core/fields/Vector256Field.java b/ripple-core/src/main/java/com/ripple/core/fields/Vector256Field.java deleted file mode 100644 index 7cadc88ea8..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/fields/Vector256Field.java +++ /dev/null @@ -1,3 +0,0 @@ -package com.ripple.core.fields; - -public abstract class Vector256Field implements HasField{} diff --git a/ripple-core/src/main/java/com/ripple/core/formats/Format.java b/ripple-core/src/main/java/com/ripple/core/formats/Format.java deleted file mode 100644 index 0061213330..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/formats/Format.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.ripple.core.formats; - -import com.ripple.core.fields.Field; - -import java.util.EnumMap; - -abstract public class Format { - protected Format() { - } - - protected void addCommonFields(){} - - EnumMap requirementEnumMap = new EnumMap<>(Field.class); - EnumMap common = new EnumMap<>(Field.class); - - public EnumMap requirements() { - return requirementEnumMap; - } - - abstract public String name (); - - public Format(Object[] args) { - if ((!(args.length % 2 == 0)) || args.length < 2) { - throw new IllegalArgumentException("Varargs length should be a minimum multiple of 2"); - } - for (int i = 0; i < args.length; i+= 2) { - Field f = (Field) args[i]; - Requirement r = (Requirement) args[i + 1]; - put(f, r); - } - } - - protected void put(Field f, Requirement r) { - requirementEnumMap.put(f, r); - } - - @SuppressWarnings("unchecked") - Subclass required(Field f) { - put(f, Requirement.REQUIRED); - return (Subclass) this; - } - - @SuppressWarnings("unchecked") - Subclass optional(Field f) { - put(f, Requirement.OPTIONAL); - return (Subclass) this; - } - - @SuppressWarnings("unchecked") - Subclass nonDefault(Field f) { - put(f, Requirement.DEFAULT); - return (Subclass) this; - } - - public boolean isCommon(Field field) { - return common.containsKey(field); - } - - public static enum Requirement { - INVALID(-1), - REQUIRED( 0), - OPTIONAL( 1), - DEFAULT( 2); - Requirement(int i) {} - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/formats/LEFormat.java b/ripple-core/src/main/java/com/ripple/core/formats/LEFormat.java deleted file mode 100644 index 2dbd576593..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/formats/LEFormat.java +++ /dev/null @@ -1,230 +0,0 @@ -package com.ripple.core.formats; - -import com.ripple.core.fields.Field; -import com.ripple.core.serialized.enums.LedgerEntryType; - -import java.util.EnumMap; - -public class LEFormat extends Format { - static public EnumMap formats = new EnumMap(LedgerEntryType.class); - { - common.put(Field.LedgerIndex, Requirement.OPTIONAL); - common.put(Field.LedgerEntryType, Requirement.REQUIRED); - common.put(Field.Flags, Requirement.REQUIRED); - } - - static public LEFormat fromString(String name) { - return getLedgerFormat(LedgerEntryType.valueOf(name)); - } - - static public LEFormat fromNumber(Number ord) { - return getLedgerFormat(LedgerEntryType.fromNumber(ord)); - } - - static public LEFormat fromValue(Object o) { - if (o instanceof Number) { - return fromNumber(((Number) o).intValue()); - } else if (o instanceof String){ - return fromString((String) o); - } - else { - return null; - } - } - - public static LEFormat getLedgerFormat(LedgerEntryType key) { - if (key == null) return null; - return formats.get(key); - } - - public final LedgerEntryType ledgerEntryType; - - public LEFormat(LedgerEntryType type, Object... args) { - super(args); - ledgerEntryType = type; - addCommonFields(); - formats.put(type, this); - } - - public LEFormat(LedgerEntryType type) { - super(); - ledgerEntryType = type; - addCommonFields(); - formats.put(type, this); - } - - @Override - protected void addCommonFields() { - requirementEnumMap.putAll(common); - } - - @Override - public String name() { - return ledgerEntryType.toString(); - } - - public static LEFormat AccountRoot = new LEFormat( - LedgerEntryType.AccountRoot, - Field.Account, Requirement.REQUIRED, - Field.Sequence, Requirement.REQUIRED, - Field.Balance, Requirement.REQUIRED, - Field.OwnerCount, Requirement.REQUIRED, - Field.PreviousTxnID, Requirement.REQUIRED, - Field.PreviousTxnLgrSeq, Requirement.REQUIRED, - Field.AccountTxnID, Requirement.OPTIONAL, - Field.RegularKey, Requirement.OPTIONAL, - Field.EmailHash, Requirement.OPTIONAL, - Field.WalletLocator, Requirement.OPTIONAL, - Field.WalletSize, Requirement.OPTIONAL, - Field.MessageKey, Requirement.OPTIONAL, - Field.TransferRate, Requirement.OPTIONAL, - Field.Domain, Requirement.OPTIONAL, - Field.TickSize, Requirement.OPTIONAL - ); - - public static LEFormat DirectoryNode = new LEFormat( - LedgerEntryType.DirectoryNode, - Field.Owner, Requirement.OPTIONAL, // for owner directories - Field.TakerPaysCurrency, Requirement.OPTIONAL, // for order book directories - Field.TakerPaysIssuer, Requirement.OPTIONAL, // for order book directories - Field.TakerGetsCurrency, Requirement.OPTIONAL, // for order book directories - Field.TakerGetsIssuer, Requirement.OPTIONAL, // for order book directories - Field.ExchangeRate, Requirement.OPTIONAL, // for order book directories - Field.Indexes, Requirement.REQUIRED, - Field.RootIndex, Requirement.REQUIRED, - Field.IndexNext, Requirement.OPTIONAL, - Field.IndexPrevious, Requirement.OPTIONAL - ); - - - public static LEFormat Offer = new LEFormat( - LedgerEntryType.Offer, - Field.Account, Requirement.REQUIRED, - Field.Sequence, Requirement.REQUIRED, - Field.TakerPays, Requirement.REQUIRED, - Field.TakerGets, Requirement.REQUIRED, - Field.BookDirectory, Requirement.REQUIRED, - Field.BookNode, Requirement.REQUIRED, - Field.OwnerNode, Requirement.REQUIRED, - Field.PreviousTxnID, Requirement.REQUIRED, - Field.PreviousTxnLgrSeq, Requirement.REQUIRED, - Field.Expiration, Requirement.OPTIONAL - ); - - public static LEFormat Ticket = new LEFormat( - LedgerEntryType.Ticket, - Field.Account, Requirement.REQUIRED, - Field.Sequence, Requirement.REQUIRED, - Field.OwnerNode, Requirement.REQUIRED, - Field.Target, Requirement.OPTIONAL, - Field.Expiration, Requirement.OPTIONAL - ); - - public static LEFormat RippleState = new LEFormat( - LedgerEntryType.RippleState, - Field.Balance, Requirement.REQUIRED, - Field.LowLimit, Requirement.REQUIRED, - Field.HighLimit, Requirement.REQUIRED, - Field.PreviousTxnID, Requirement.REQUIRED, - Field.PreviousTxnLgrSeq, Requirement.REQUIRED, - Field.LowNode, Requirement.OPTIONAL, - Field.LowQualityIn, Requirement.OPTIONAL, - Field.LowQualityOut, Requirement.OPTIONAL, - Field.HighNode, Requirement.OPTIONAL, - Field.HighQualityIn, Requirement.OPTIONAL, - Field.HighQualityOut, Requirement.OPTIONAL - ); - - public static LEFormat Escrow = new LEFormat( - LedgerEntryType.Escrow, - Field.Account, Requirement.REQUIRED, - Field.Destination, Requirement.REQUIRED, - Field.Amount, Requirement.REQUIRED, - - Field.PreviousTxnID, Requirement.REQUIRED, - Field.PreviousTxnLgrSeq, Requirement.REQUIRED, - Field.OwnerNode, Requirement.REQUIRED, - - Field.Condition, Requirement.OPTIONAL, - Field.CancelAfter, Requirement.OPTIONAL, - Field.FinishAfter, Requirement.OPTIONAL, - Field.SourceTag, Requirement.OPTIONAL, - Field.DestinationTag, Requirement.OPTIONAL, - Field.DestinationNode, Requirement.OPTIONAL - ); - - public static LEFormat LedgerHashes = new LEFormat( - LedgerEntryType.LedgerHashes, - Field.FirstLedgerSequence, Requirement.OPTIONAL, // Remove if we do a ledger restart - Field.LastLedgerSequence, Requirement.OPTIONAL, - Field.Hashes, Requirement.REQUIRED - ); - - public static LEFormat Amendments = new LEFormat( - LedgerEntryType.Amendments, - Field.Amendments, Requirement.OPTIONAL, - Field.Majorities, Requirement.OPTIONAL - ); - - public static LEFormat SignerList = new LEFormat( - LedgerEntryType.SignerList, - - Field.PreviousTxnID, Requirement.REQUIRED, - Field.PreviousTxnLgrSeq, Requirement.REQUIRED, - Field.OwnerNode, Requirement.REQUIRED, - - Field.SignerQuorum, Requirement.REQUIRED, - Field.SignerEntries, Requirement.REQUIRED, - Field.SignerListID, Requirement.REQUIRED - ); - - public static LEFormat FeeSettings = new LEFormat( - LedgerEntryType.FeeSettings, - Field.BaseFee, Requirement.REQUIRED, - Field.ReferenceFeeUnits, Requirement.REQUIRED, - Field.ReserveBase, Requirement.REQUIRED, - Field.ReserveIncrement, Requirement.REQUIRED - ); - - public static LEFormat PayChannel = new LEFormat( - LedgerEntryType.PayChannel, - Field.Account, Requirement.REQUIRED, - Field.Destination, Requirement.REQUIRED, - Field.Amount, Requirement.REQUIRED, - Field.Balance, Requirement.REQUIRED, - Field.PublicKey, Requirement.REQUIRED, - Field.SettleDelay, Requirement.REQUIRED, - Field.Expiration, Requirement.OPTIONAL, - Field.CancelAfter, Requirement.OPTIONAL, - Field.SourceTag, Requirement.OPTIONAL, - Field.DestinationTag, Requirement.OPTIONAL, - Field.OwnerNode, Requirement.REQUIRED, - Field.PreviousTxnID, Requirement.REQUIRED, - Field.PreviousTxnLgrSeq, Requirement.REQUIRED - ); - - public static LEFormat Check = new LEFormat(LedgerEntryType.Check) - .required(Field.PreviousTxnID) - .required(Field.PreviousTxnLgrSeq) - .required(Field.Account) - .required(Field.Destination) - .required(Field.SendMax) - .required(Field.Sequence) - .required(Field.OwnerNode) - .required(Field.DestinationNode) - .optional(Field.Expiration) - .optional(Field.InvoiceID) - .optional(Field.SourceTag) - .optional(Field.DestinationTag) - - ; - - public static LEFormat DepositPreauth = new LEFormat(LedgerEntryType.DepositPreauth) - .required(Field.Account) - .required(Field.Authorize) - .required(Field.OwnerNode) - .required(Field.PreviousTxnID) - .required(Field.PreviousTxnLgrSeq) - ; - -} diff --git a/ripple-core/src/main/java/com/ripple/core/formats/TxFormat.java b/ripple-core/src/main/java/com/ripple/core/formats/TxFormat.java deleted file mode 100644 index fa66d27533..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/formats/TxFormat.java +++ /dev/null @@ -1,212 +0,0 @@ -package com.ripple.core.formats; - -import com.ripple.core.fields.Field; -import com.ripple.core.serialized.enums.TransactionType; - -import java.util.EnumMap; - -public class TxFormat extends Format { - static public EnumMap formats = new EnumMap<>(TransactionType.class); - { - common.put(Field.TransactionType, Requirement.REQUIRED); - common.put(Field.Account, Requirement.REQUIRED); - common.put(Field.Sequence, Requirement.REQUIRED); - common.put(Field.Fee, Requirement.REQUIRED); - common.put(Field.SigningPubKey, Requirement.REQUIRED); - - common.put(Field.Flags, Requirement.OPTIONAL); - common.put(Field.SourceTag, Requirement.OPTIONAL); - common.put(Field.PreviousTxnID, Requirement.OPTIONAL); - common.put(Field.OperationLimit, Requirement.OPTIONAL); - common.put(Field.TxnSignature, Requirement.OPTIONAL); - common.put(Field.AccountTxnID, Requirement.OPTIONAL); - common.put(Field.LastLedgerSequence, Requirement.OPTIONAL); - common.put(Field.Memos, Requirement.OPTIONAL); - common.put(Field.Signers, Requirement.OPTIONAL); - - } - public final TransactionType transactionType; - - static public TxFormat fromString(String name) { - return getTxFormat(TransactionType.valueOf(name)); - } - - static public TxFormat fromNumber(Number ord) { - return getTxFormat(TransactionType.fromNumber(ord)); - } - - private static TxFormat getTxFormat(TransactionType key) { - if (key == null) return null; - return formats.get(key); - } - - public TxFormat(TransactionType type, Object... args) { - super(args); - transactionType = type; - addCommonFields(); - formats.put(transactionType, this); - } - - public TxFormat(TransactionType type) { - super(); - transactionType = type; - addCommonFields(); - formats.put(transactionType, this); - } - - @Override - protected void addCommonFields() { - requirementEnumMap.putAll(common); - } - - @Override - public String name() { - return transactionType.toString(); - } - - private static TxFormat makeFormat(TransactionType tt) { - return new TxFormat(tt); - } - - static public TxFormat AccountSet = makeFormat( - TransactionType.AccountSet) - .optional(Field.EmailHash) - .optional(Field.EmailHash) - .optional(Field.WalletLocator) - .optional(Field.WalletSize) - .optional(Field.MessageKey) - .optional(Field.Domain) - .optional(Field.TransferRate) - .optional(Field.SetFlag) - .optional(Field.TickSize) - .optional(Field.ClearFlag); - - static public TxFormat TrustSet = new TxFormat( - TransactionType.TrustSet, - Field.LimitAmount, Requirement.OPTIONAL, - Field.QualityIn, Requirement.OPTIONAL, - Field.QualityOut, Requirement.OPTIONAL); - - static public TxFormat OfferCreate = new TxFormat( - TransactionType.OfferCreate, - Field.TakerPays, Requirement.REQUIRED, - Field.TakerGets, Requirement.REQUIRED, - Field.Expiration, Requirement.OPTIONAL, - Field.OfferSequence, Requirement.OPTIONAL); - - static public TxFormat OfferCancel = new TxFormat( - TransactionType.OfferCancel, - Field.OfferSequence, Requirement.REQUIRED); - - static public TxFormat TicketCreate = new TxFormat( - TransactionType.TicketCreate, - Field.Target, Requirement.OPTIONAL, - Field.Expiration, Requirement.OPTIONAL); - - static public TxFormat TicketCancel = new TxFormat( - TransactionType.TicketCancel, - Field.TicketID, Requirement.REQUIRED); - - static public TxFormat SetRegularKey = new TxFormat( - TransactionType.SetRegularKey, - Field.RegularKey, Requirement.OPTIONAL); - - static public TxFormat Payment = new TxFormat( - TransactionType.Payment, - Field.Destination, Requirement.REQUIRED, - Field.Amount, Requirement.REQUIRED, - Field.SendMax, Requirement.OPTIONAL, - Field.Paths, Requirement.DEFAULT, - Field.InvoiceID, Requirement.OPTIONAL, - Field.DestinationTag, Requirement.OPTIONAL, - Field.DeliverMin, Requirement.OPTIONAL - ); - - - static public TxFormat EscrowCreate = new TxFormat( - TransactionType.EscrowCreate, - Field.Destination, Requirement.REQUIRED, - Field.Amount, Requirement.REQUIRED, - Field.Condition, Requirement.OPTIONAL, - Field.CancelAfter, Requirement.OPTIONAL, - Field.FinishAfter, Requirement.OPTIONAL, - Field.DestinationTag, Requirement.OPTIONAL); - - static public TxFormat EscrowFinish = new TxFormat( - TransactionType.EscrowFinish, - Field.Owner, Requirement.REQUIRED, - Field.OfferSequence, Requirement.REQUIRED, - Field.Fulfillment, Requirement.OPTIONAL, - Field.Condition, Requirement.OPTIONAL); - - static public TxFormat EscrowCancel = new TxFormat( - TransactionType.EscrowCancel, - Field.Owner, Requirement.REQUIRED, - Field.OfferSequence, Requirement.REQUIRED); - - static public TxFormat EnableAmendment = new TxFormat( - TransactionType.EnableAmendment, - Field.LedgerSequence, Requirement.REQUIRED, - Field.Amendment, Requirement.REQUIRED); - - static public TxFormat SetFee = new TxFormat( - TransactionType.SetFee, - Field.BaseFee, Requirement.REQUIRED, - Field.ReferenceFeeUnits, Requirement.REQUIRED, - Field.ReserveBase, Requirement.REQUIRED, - Field.LedgerSequence, Requirement.OPTIONAL, - Field.ReserveIncrement, Requirement.REQUIRED - ); - - static public TxFormat SignerListSet = new TxFormat( - TransactionType.SignerListSet, - Field.SignerQuorum, Requirement.REQUIRED, - Field.SignerEntries, Requirement.OPTIONAL - ); - static public TxFormat PaymentChannelCreate = new TxFormat( - TransactionType.PaymentChannelCreate, - Field.Destination, Requirement.REQUIRED, - Field.Amount, Requirement.REQUIRED, - Field.SettleDelay, Requirement.REQUIRED, - Field.PublicKey, Requirement.REQUIRED, - Field.CancelAfter, Requirement.OPTIONAL, - Field.DestinationTag, Requirement.OPTIONAL - ); - static public TxFormat PaymentChannelFund = new TxFormat( - TransactionType.PaymentChannelFund, - Field.Channel, Requirement.REQUIRED, - Field.Amount, Requirement.REQUIRED, - Field.Expiration, Requirement.OPTIONAL - ); - static public TxFormat PaymentChannelClaim = new TxFormat( - TransactionType.PaymentChannelClaim, - Field.Channel, Requirement.REQUIRED, - Field.Amount, Requirement.OPTIONAL, - Field.Balance, Requirement.OPTIONAL, - Field.Signature, Requirement.OPTIONAL, - Field.PublicKey, Requirement.OPTIONAL - ); - - static public TxFormat CheckCreate = new TxFormat(TransactionType.CheckCreate) - .required(Field.Destination) - .required(Field.SendMax) - .optional(Field.Expiration) - .optional(Field.DestinationTag) - .optional(Field.InvoiceID) - ; - - static public TxFormat CheckCash = new TxFormat(TransactionType.CheckCash) - .required(Field.CheckID) - .optional(Field.Amount) - .optional(Field.DeliverMin) - ; - - static public TxFormat CheckCancel = new TxFormat(TransactionType.CheckCancel) - .required(Field.CheckID) - ; - - static public TxFormat DepositPreauth = new TxFormat(TransactionType.DepositPreauth) - .optional(Field.Authorize) - .optional(Field.Unauthorize) - ; -} diff --git a/ripple-core/src/main/java/com/ripple/core/runtime/Value.java b/ripple-core/src/main/java/com/ripple/core/runtime/Value.java deleted file mode 100644 index 1f69e88c55..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/runtime/Value.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.ripple.core.runtime; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeType; -import org.json.JSONArray; -import org.json.JSONObject; - -import java.util.List; -import java.util.Map; - -public enum Value { - UNKNOWN, - STRING, - JSON_OBJECT, - JSON_ARRAY, - - JACKSON_ARRAY, - JACKSON_BINARY, - JACKSON_BOOLEAN, - JACKSON_MISSING, - JACKSON_NULL, - JACKSON_NUMBER, - JACKSON_OBJECT, - JACKSON_POJO, - JACKSON_STRING, - - LIST, - MAP, - NUMBER, - BYTE, - DOUBLE, - FLOAT, - INTEGER, - LONG, - BYTE_ARRAY, - SHORT, - BOOLEAN; - - static public Value typeOf (Object object) { - if (object instanceof String) { - return STRING; - } - else if (object instanceof Number) { - if (object instanceof Byte) { - return BYTE; - } - else if (object instanceof Double) { - return DOUBLE; - } - else if (object instanceof Float) { - return FLOAT; - } - else if (object instanceof Integer) { - return INTEGER; - } - else if (object instanceof Long) { - return LONG; - } - else if (object instanceof Short) { - return SHORT; - } - return NUMBER; - } - else if (object instanceof JSONObject) { - return JSON_OBJECT; - } - else if (object instanceof JSONArray) { - return JSON_ARRAY; - } - else if (object instanceof JsonNode) { - JsonNode node = (JsonNode) object; - JsonNodeType nodeType = node.getNodeType(); - switch (nodeType) { - case ARRAY: - return JACKSON_ARRAY; - case BINARY: - return JACKSON_BINARY; - case BOOLEAN: - return JACKSON_BOOLEAN; - case MISSING: - return JACKSON_MISSING; - case NULL: - return JACKSON_NULL; - case NUMBER: - return JACKSON_NUMBER; - case OBJECT: - return JACKSON_OBJECT; - case POJO: - return JACKSON_POJO; - case STRING: - return JACKSON_STRING; - } - throw new IllegalStateException("unknown node type"); - } - else if (object instanceof Map) { - return MAP; - } - else if (object instanceof Boolean) { - return BOOLEAN; - } - else if (object instanceof List) { - return LIST; - } - else if (object instanceof byte[]) { - return BYTE_ARRAY; - } - else { - return UNKNOWN; - } - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/serialized/BinaryParser.java b/ripple-core/src/main/java/com/ripple/core/serialized/BinaryParser.java deleted file mode 100644 index 86fa08a7d9..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/serialized/BinaryParser.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.ripple.core.serialized; - -import com.ripple.core.fields.Field; -import com.ripple.encodings.common.B16; - -public class BinaryParser { - protected final int size; - protected byte[] bytes; - protected int cursor = 0; - - public BinaryParser(byte[] bytes) { - this.size = bytes.length; - this.bytes = bytes; - } - - public BinaryParser(int size) { - this.size = size; - } - - public BinaryParser(String hex) { - this(B16.decode(hex)); - } - - public void skip(int n) { - cursor += n; - } - public byte readOne() { - return bytes[cursor++]; - } - public byte[] read(int n) { - byte[] ret = new byte[n]; - System.arraycopy(bytes, cursor, ret, 0, n); - cursor += n; -// } - return ret; - } - - public Field readField() { - int fieldCode = readFieldCode(); - Field field = Field.fromCode(fieldCode); - if (field == null) { - throw new IllegalStateException("Couldn't parse field from " + - Integer.toHexString(fieldCode)); - } - return field; - } - - public int readFieldCode() { - byte tagByte = readOne(); - - int typeBits = (tagByte & 0xFF) >>> 4; - if (typeBits == 0) typeBits = readOne(); - - int fieldBits = tagByte & 0x0F; - if (fieldBits == 0) fieldBits = readOne(); - - return (typeBits << 16 | fieldBits); - } - - public boolean end() { - return cursor >= size; // greater guard against infinite loops - } - - public int pos() { - return cursor; - } - - public int readOneInt() { - return readOne() & 0xFF; - } - - public int readVLLength() { - int b1 = readOneInt(); - int result; - - if (b1 <= 192) { - result = b1; - } else if (b1 <= 240) { - int b2 = readOneInt(); - result = 193 + (b1 - 193) * 256 + b2; - } else if (b1 <= 254) { - int b2 = readOneInt(); - int b3 = readOneInt(); - result = 12481 + (b1 - 241) * 65536 + b2 * 256 + b3; - } else { - throw new RuntimeException("Invalid varint length indicator"); - } - - return result; - } - - public int size() { - return size; - } - - public boolean end(Integer customEnd) { - return cursor >= size || customEnd != null && cursor >= customEnd; - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/serialized/BinarySerializer.java b/ripple-core/src/main/java/com/ripple/core/serialized/BinarySerializer.java deleted file mode 100644 index 1b39a2ac10..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/serialized/BinarySerializer.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.ripple.core.serialized; - -import com.ripple.core.fields.Field; -import com.ripple.core.fields.Type; - -import java.util.Arrays; - -public class BinarySerializer { - private final BytesSink sink; - - public BinarySerializer(BytesSink sink) { - this.sink = sink; - } - - public void add(byte[] n) { - sink.add(n); - } - - public void addLengthEncoded(byte[] n) { - add(encodeVL(n.length)); - add(n); - } - - public static byte[] encodeVL(int length) { - // TODO: bytes - byte[] lenBytes = new byte[4]; - - if (length <= 192) - { - lenBytes[0] = (byte) (length); - return Arrays.copyOf(lenBytes, 1); - } - else if (length <= 12480) - { - length -= 193; - lenBytes[0] = (byte) (193 + (length >>> 8)); - lenBytes[1] = (byte) (length & 0xff); - return Arrays.copyOf(lenBytes, 2); - } - else if (length <= 918744) { - length -= 12481; - lenBytes[0] = (byte) (241 + (length >>> 16)); - lenBytes[1] = (byte) ((length >> 8) & 0xff); - lenBytes[2] = (byte) (length & 0xff); - return Arrays.copyOf(lenBytes, 3); - } else { - throw new RuntimeException("Overflow error"); - } - } - - public void add(BytesList bl) { - for (byte[] bytes : bl.rawList()) { - sink.add(bytes); - } - } - - public int addFieldHeader(Field f) { - if (!f.isSerialized()) { - throw new IllegalStateException(String.format("Field %s is a discardable field", f)); - } - byte[] n = f.getBytes(); - add(n); - return n.length; - } - - public void add(byte type) { - sink.add(type); - } - - public void addLengthEncoded(BytesList bytes) { - add(encodeVL(bytes.bytesLength())); - add(bytes); - } - - public void add(Field field, SerializedType value) { - addFieldHeader(field); - if (field.isVLEncoded()) { - addLengthEncoded(value); - } else { - value.toBytesSink(sink); - if (field.getType() == Type.STObject) { - addFieldHeader(Field.ObjectEndMarker); - } else if (field.getType() == Type.STArray) { - addFieldHeader(Field.ArrayEndMarker); - } - } - } - - public void addLengthEncoded(SerializedType value) { - BytesList bytes = new BytesList(); - value.toBytesSink(bytes); - addLengthEncoded(bytes); - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/serialized/BytesList.java b/ripple-core/src/main/java/com/ripple/core/serialized/BytesList.java deleted file mode 100644 index 69d150aa16..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/serialized/BytesList.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.ripple.core.serialized; - -import java.security.MessageDigest; -import java.util.ArrayList; - -public class BytesList implements BytesSink { - private ArrayList buffer = new ArrayList(); - - private int len = 0; - - public void add(BytesList bl) { - for (byte[] bytes : bl.rawList()) { - add(bytes); - } - } - - @Override - public void add(byte aByte) { - add(new byte[]{aByte}); - } - - @Override - public void add(byte[] bytes) { - len += bytes.length; - buffer.add(bytes); - } - - public byte[] bytes() { - int n = bytesLength(); - byte[] bytes = new byte[n]; - addBytes(bytes, 0); - return bytes; - } - - static public String[] hexLookup = new String[256]; - static { - for (int i = 0; i < 256; i++) { - String s = Integer.toHexString(i).toUpperCase(); - if (s.length() == 1) { - s = "0" + s; - } - hexLookup[i] = s; - } - } - - public String bytesHex() { - StringBuilder builder = new StringBuilder(len * 2); - for (byte[] buf : buffer) { - for (byte aBytes : buf) { - builder.append(hexLookup[aBytes & 0xFF]); - } - } - return builder.toString(); - } - - public int bytesLength() { - return len; - } - - private int addBytes(byte[] bytes, int destPos) { - for (byte[] buf : buffer) { - System.arraycopy(buf, 0, bytes, destPos, buf.length); - destPos += buf.length; - } - return destPos; - } - - public void updateDigest(MessageDigest digest) { - for (byte[] buf : buffer) { - digest.update(buf); - } - } - - public ArrayList rawList() { - return buffer; - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/serialized/BytesSink.java b/ripple-core/src/main/java/com/ripple/core/serialized/BytesSink.java deleted file mode 100644 index 7ec5c6cc5a..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/serialized/BytesSink.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.ripple.core.serialized; - -public interface BytesSink { - default void add(byte aByte) { - add(new byte[] {aByte}); - } - void add(byte[] bytes); -} diff --git a/ripple-core/src/main/java/com/ripple/core/serialized/MultiSink.java b/ripple-core/src/main/java/com/ripple/core/serialized/MultiSink.java deleted file mode 100644 index 02de05e311..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/serialized/MultiSink.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.ripple.core.serialized; - -public class MultiSink implements BytesSink { - final private BytesSink[] sinks; - public MultiSink(BytesSink... sinks) { - this.sinks = sinks; - } - @Override - public void add(byte b) { - for (BytesSink sink : sinks) sink.add(b); - } - @Override - public void add(byte[] b) { - for (BytesSink sink : sinks) sink.add(b); - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/serialized/SerializedType.java b/ripple-core/src/main/java/com/ripple/core/serialized/SerializedType.java deleted file mode 100644 index 1b5263e935..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/serialized/SerializedType.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.ripple.core.serialized; - -import com.ripple.core.fields.Type; - -public interface SerializedType { - Object toJSON(); - byte[] toBytes(); - String toHex(); - void toBytesSink(BytesSink to); - Type type(); -} diff --git a/ripple-core/src/main/java/com/ripple/core/serialized/StreamBinaryParser.java b/ripple-core/src/main/java/com/ripple/core/serialized/StreamBinaryParser.java deleted file mode 100644 index b3f964c31d..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/serialized/StreamBinaryParser.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.ripple.core.serialized; - -import java.io.*; -import java.util.zip.GZIPInputStream; - -public class StreamBinaryParser extends BinaryParser { - final BufferedInputStream stream; - - public StreamBinaryParser(InputStream stream, long size) { - super((int) size); - this.stream = new BufferedInputStream(stream); - } - - private static boolean isGZip(File fio) { - return fio.getName().endsWith("gz"); - } - private static int getUncompressedSize(File fio) { - if (isGZip(fio)) { - int val; - try { - RandomAccessFile raf = new RandomAccessFile(fio, "r"); - raf.seek(raf.length() - 4); - int b4 = raf.read(); - int b3 = raf.read(); - int b2 = raf.read(); - int b1 = raf.read(); - val = (b1 << 24) | (b2 << 16) + (b3 << 8) + b4; - raf.close(); - } catch (IOException e) { - throw new RuntimeException(e); - } - return val; - } else { - return (int) fio.length(); - } - } - - public void skip(int n) { - try { - long skipped = stream.skip(n); - if (skipped != n) { - throw new RuntimeException("Expected to skip more bytes"); - } - - } catch (IOException e) { - throw new RuntimeException(e); - } - } - public byte readOne() { - return read(1)[0]; - } - public byte[] read(int n) { - byte[] ret = new byte[n]; - try { - int read = stream.read(ret); - if (read != n) { - throw new RuntimeException("Expected to read more bytes"); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - cursor += n; - return ret; - } - public static StreamBinaryParser fromFile(String path) { - try { - File f = new File(path); - FileInputStream fstream = new FileInputStream(path); - InputStream stream = fstream; - long s = fstream.getChannel().size(); - - if (isGZip(f)) { - s = getUncompressedSize(f); - stream = new GZIPInputStream(fstream); - } - return new StreamBinaryParser(stream, s); - } catch (IOException e) { - throw new RuntimeException(e); - } - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/serialized/StreamSink.java b/ripple-core/src/main/java/com/ripple/core/serialized/StreamSink.java deleted file mode 100644 index 34fe16d377..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/serialized/StreamSink.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.ripple.core.serialized; - -import java.io.IOException; -import java.io.OutputStream; - -public class StreamSink implements BytesSink { - OutputStream out; - - public StreamSink(OutputStream out) { - this.out = out; - } - - @Override - public void add(byte aByte) { - try { - out.write(aByte); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public void add(byte[] bytes) { - try { - out.write(bytes); - } catch (IOException e) { - throw new RuntimeException(e); - } - } -} - diff --git a/ripple-core/src/main/java/com/ripple/core/serialized/TypeTranslator.java b/ripple-core/src/main/java/com/ripple/core/serialized/TypeTranslator.java deleted file mode 100644 index 4bd988338b..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/serialized/TypeTranslator.java +++ /dev/null @@ -1,151 +0,0 @@ - -package com.ripple.core.serialized; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.ripple.core.runtime.Value; -import com.ripple.encodings.common.B16; -import org.json.JSONArray; -import org.json.JSONObject; - -/** - * @param The SerializedType class - * TODO, this should only really have methods that each class over-rides - * it's currently pretty NASTY - */ -public abstract class TypeTranslator { - - @SuppressWarnings("unchecked") - public T fromValue(Object object) { - switch (Value.typeOf(object)) { - case STRING: - return fromString((String) object); - case JACKSON_ARRAY: - return fromJacksonArray((ArrayNode) object); - case JACKSON_BINARY: - throw new IllegalStateException("cant handle jackson binary"); - case JACKSON_BOOLEAN: - return fromBoolean(((JsonNode) object).asBoolean()); - case JACKSON_MISSING: - throw new IllegalStateException("cant create from missing"); - case JACKSON_NULL: - throw new IllegalStateException("cant create from null"); - case JACKSON_NUMBER: - JsonNode node = (JsonNode) object; - if (node.isLong()) { - return fromLong(node.asLong()); - } else if (node.isInt()) { - return fromInteger(node.asInt()); - } else if (node.isDouble()) { - return fromDouble(node.asDouble()); - } else if (node.isFloat()) { - return fromDouble(node.floatValue()); - } - throw new IllegalStateException("cant create from null"); - case JACKSON_OBJECT: - return fromJacksonObject((ObjectNode) object); - case JACKSON_POJO: - throw new IllegalStateException("cant handle POJO"); - case JACKSON_STRING: - return fromString(((JsonNode) object).asText()); - case DOUBLE: - return fromDouble((Double) object); - case INTEGER: - return fromInteger((Integer) object); - case LONG: - return fromLong((Long) object); - case BOOLEAN: - return fromBoolean((Boolean) object); - case JSON_ARRAY: - return fromJSONArray((JSONArray) object); - case JSON_OBJECT: - return fromJSONObject((JSONObject) object); - case BYTE_ARRAY: - return fromBytes((byte[]) object); - case UNKNOWN: - default: - return (T) object; - } - - } - - protected T fromJacksonObject(ObjectNode object) { - throw new UnsupportedOperationException(); - } - - protected T fromJacksonArray(ArrayNode node) { - throw new UnsupportedOperationException(); - } - - public String toString(T obj) { - return obj.toString(); - } - - protected T fromJSONObject(JSONObject jsonObject) { - throw new UnsupportedOperationException(); - } - - protected T fromJSONArray(JSONArray jsonArray) { - throw new UnsupportedOperationException(); - } - - @SuppressWarnings("WeakerAccess") - protected T fromBoolean(boolean aBoolean) { - throw new UnsupportedOperationException(); - } - - protected T fromLong(long aLong) { - throw new UnsupportedOperationException(); - } - - protected T fromInteger(int integer) { - throw new UnsupportedOperationException(); - } - - @SuppressWarnings("WeakerAccess") - protected T fromDouble(double aDouble) { - throw new UnsupportedOperationException(); - } - - protected T fromString(String value) { - throw new UnsupportedOperationException(); - } - - /** - * @param hint Using a boxed integer, allowing null for no hint - */ - public abstract T fromParser(BinaryParser parser, Integer hint); - - public T fromParser(BinaryParser parser) { - return fromParser(parser, null); - } - - public T fromBytes(byte[] b) { - return fromParser(new BinaryParser(b)); - } - - public T fromHex(String hex) { - return fromBytes(B16.decode(hex)); - } - - public Object toJSON(T obj) { - return obj.toJSON(); - } - - public void toBytesSink(T obj, BytesSink to) { - obj.toBytesSink(to); - } - - public byte[] toBytes(T obj) { - BytesList to = new BytesList(); - toBytesSink(obj, to); - return to.bytes(); - } - - public String toHex(T obj) { - BytesList to = new BytesList(); - toBytesSink(obj, to); - return to.bytesHex(); - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/serialized/enums/EngineResult.java b/ripple-core/src/main/java/com/ripple/core/serialized/enums/EngineResult.java deleted file mode 100644 index dafd5d761a..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/serialized/enums/EngineResult.java +++ /dev/null @@ -1,258 +0,0 @@ -package com.ripple.core.serialized.enums; - -import com.ripple.core.fields.Type; -import com.ripple.core.serialized.BinaryParser; -import com.ripple.core.serialized.BytesSink; -import com.ripple.core.serialized.SerializedType; -import com.ripple.core.serialized.TypeTranslator; -import com.ripple.encodings.common.B16; - -import java.util.TreeMap; - -class Holder { - public static int ords = 0; -} - -public enum EngineResult implements SerializedType { - telLOCAL_ERROR(-399, "Local failure."), - telBAD_DOMAIN("Domain too long."), - telBAD_PATH_COUNT("Malformed: Too many paths."), - telBAD_PUBLIC_KEY("Public key too long."), - telFAILED_PROCESSING("Failed to correctly process transaction."), - telINSUF_FEE_P("Fee insufficient."), - telNO_DST_PARTIAL("Partial payment to create account not allowed."), - - telCAN_NOT_QUEUE("Can not queue at this time."), - telCAN_NOT_QUEUE_BALANCE("Can not queue at this time: insufficient balance to pay all queued fees."), - telCAN_NOT_QUEUE_BLOCKS("Can not queue at this time: would block later queued transaction(s)."), - - telCAN_NOT_QUEUE_BLOCKED("Can not queue at this time: blocking transaction in queue."), - telCAN_NOT_QUEUE_FEE("Can not queue at this time: fee insufficient to replace queued transaction."), - telCAN_NOT_QUEUE_FULL("Can not queue at this time: queue is full."), - - temMALFORMED(-299, "Malformed transaction."), - temBAD_AMOUNT("Can only send positive amounts."), - temBAD_CURRENCY("Malformed: Bad currency."), - temBAD_EXPIRATION("Malformed: Bad expiration."), - temBAD_FEE("Invalid fee, negative or not XRP."), - temBAD_ISSUER("Malformed: Bad issuer."), - temBAD_LIMIT("Limits must be non-negative."), - temBAD_OFFER("Malformed: Bad offer."), - temBAD_PATH("Malformed: Bad path."), - temBAD_PATH_LOOP("Malformed: Loop in path."), - temBAD_SEND_XRP_LIMIT("Malformed: Limit quality is not allowed for XRP to XRP."), - temBAD_SEND_XRP_MAX("Malformed: Send max is not allowed for XRP to XRP."), - temBAD_SEND_XRP_NO_DIRECT("Malformed: No Ripple direct is not allowed for XRP to XRP."), - temBAD_SEND_XRP_PARTIAL("Malformed: Partial payment is not allowed for XRP to XRP."), - temBAD_SEND_XRP_PATHS("Malformed: Paths are not allowed for XRP to XRP."), - temBAD_SEQUENCE("Malformed: Sequence is not in the past."), - temBAD_SIGNATURE("Malformed: Bad signature."), - temBAD_SRC_ACCOUNT("Malformed: Bad source account."), - temBAD_TRANSFER_RATE("Malformed: Transfer rate must be >= 1.0 and <= 2.0"), - temDST_IS_SRC("Destination may not be source."), - temDST_NEEDED("Destination not specified."), - temINVALID("The transaction is ill-formed."), - temINVALID_FLAG("The transaction has an invalid flag."), - temREDUNDANT("Sends same currency to self."), - temRIPPLE_EMPTY("PathSet with no paths."), - temDISABLED("The transaction requires logic that is currently disabled."), - temBAD_SIGNER("Malformed: No signer may duplicate account or other signers."), - temBAD_QUORUM("Malformed: Quorum is unreachable."), - temBAD_WEIGHT("Malformed: Weight must be a positive value."), - temBAD_TICK_SIZE("Malformed: Tick size out of range."), - temINVALID_ACCOUNT_ID("Malformed: A field contains an invalid account ID."), - temCANNOT_PREAUTH_SELF("Malformed: An account may not preauthorize itself."), - temUNCERTAIN("In process of determining result. Never returned."), - temUNKNOWN(-266, "The transaction requires logic that is not implemented yet."), - - tefFAILURE(-199, "Failed to apply."), - tefALREADY("The exact transaction was already in this ledger."), - tefBAD_ADD_AUTH("Not authorized to add account."), - tefBAD_AUTH("Transaction's public key is not authorized."), - tefBAD_LEDGER("Ledger in unexpected state."), - tefCREATED("Can't add an already created account."), - tefEXCEPTION("Unexpected program state."), - tefINTERNAL("Internal error."), - tefNO_AUTH_REQUIRED("Auth is not required."), - tefPAST_SEQ("This sequence number has already passed."), - tefWRONG_PRIOR("This previous transaction does not match."), - tefMASTER_DISABLED("Master key is disabled."), - tefMAX_LEDGER("Ledger sequence too high."), - tefBAD_SIGNATURE("A signature is provided for a non-signer."), - tefBAD_QUORUM("Signatures provided do not meet the quorum."), - tefNOT_MULTI_SIGNING("Account has no appropriate list of multi-signers."), - tefBAD_AUTH_MASTER("Auth for unclaimed account needs correct master key."), - tefINVARIANT_FAILED("Fee claim violated invariants for the transaction."), - - - - - terRETRY(-99, "Retry transaction."), - terFUNDS_SPENT("Can't set password, password set funds already spent."), - terINSUF_FEE_B("Account balance can't pay fee."), - terNO_ACCOUNT("The source account does not exist."), - terNO_AUTH("Not authorized to hold IOUs."), - terNO_LINE("No such line."), - terOWNERS("Non-zero owner count."), - terPRE_SEQ("Missing/inapplicable prior transaction."), - terLAST("Process last."), - terNO_RIPPLE("Path does not permit rippling."), - terQUEUED("Held until escalated fee drops."), - - tesSUCCESS(0, "The transaction was applied. Only final in a validated ledger."), - - tecCLAIM(100, "Fee claimed. Sequence used. No action."), - tecPATH_PARTIAL(101, "Path could not send full amount."), - tecUNFUNDED_ADD(102, "Insufficient XRP balance for WalletAdd."), - tecUNFUNDED_OFFER(103, "Insufficient balance to fund created offer."), - tecUNFUNDED_PAYMENT(104, "Insufficient XRP balance to send."), - tecFAILED_PROCESSING(105, "Failed to correctly process transaction."), - tecDIR_FULL(121, "Can not add entry to full directory."), - tecINSUF_RESERVE_LINE(122, "Insufficient reserve to add trust line."), - tecINSUF_RESERVE_OFFER(123, "Insufficient reserve to create offer."), - tecNO_DST(124, "Destination does not exist. Send XRP to create it."), - tecNO_DST_INSUF_XRP(125, "Destination does not exist. Too little XRP sent to create it."), - tecNO_LINE_INSUF_RESERVE(126, "No such line. Too little reserve to create it."), - tecNO_LINE_REDUNDANT(127, "Can't set non-existent line to default."), - tecPATH_DRY(128, "Path could not send partial amount."), - tecUNFUNDED(129, "One of _ADD, _OFFER, or _SEND. Deprecated."), - tecNO_ALTERNATIVE_KEY(130, "The operation would remove the ability to sign transactions with the account."), - tecNO_REGULAR_KEY(131, "Regular key is not set."), - tecOWNERS(132, "Non-zero owner count."), - tecNO_ISSUER(133, "Issuer account does not exist."), - tecNO_AUTH(134, "Not authorized to hold asset."), - tecNO_LINE(135, "No such line."), - tecINSUFF_FEE(136, "Insufficient balance to pay fee."), - tecFROZEN(137, "Asset is frozen."), - tecNO_TARGET(138, "Target account does not exist."), - tecNO_PERMISSION(139, "No permission to perform requested operation."), - tecNO_ENTRY(140, "No matching entry found."), - tecINSUFFICIENT_RESERVE(141, "Insufficient reserve to complete requested operation."), - tecNEED_MASTER_KEY(142, "The operation requires the use of the Master Key."), - tecDST_TAG_NEEDED(143, "A destination tag is required."), - tecINTERNAL(144, "An internal error has occurred during processing."), - tecOVERSIZE(145, "Object exceeded serialization limits."), - tecCRYPTOCONDITION_ERROR(146, "Malformed, invalid, or mismatched conditional or fulfillment."), - tecINVARIANT_FAILED(147, "One or more invariants for the transaction were not satisfied."), - tecEXPIRED(148, "Expiration time is passed."), - tecDUPLICATE(149, "Ledger object already exists."), - tecKILLED(150, "FillOrKill offer killed."), - ; - - - public int asInteger() { - return ord; - } - - @Override - public Type type() { - return Type.UInt8; - } - - private static int ords = 0; - int ord; - public String human; - EngineResult class_ = null; - - EngineResult(Integer i, String s) { - human = s; - if (i == null) { - i = ++Holder.ords; - } else { - Holder.ords = i; - } - ord = i; - } - - EngineResult(String s) { - this(null, s); - } - - private static TreeMap byCode; - - static { - byCode = new TreeMap<>(); - for (EngineResult ter : EngineResult.values()) { - byCode.put(ter.ord, ter); - } - } - - public static EngineResult fromNumber(Number i) { - return byCode.get(i.intValue()); - } - - - /*Serialized Type implementation*/ - @Override - public byte[] toBytes() { - return new byte[]{(byte) ord}; - } - - @Override - public void toBytesSink(BytesSink to) { - to.add((byte) ord); - } - - @Override - public Object toJSON() { - return toString(); - } - - @Override - public String toHex() { - return B16.encode(toBytes()); - } - - public static class Translator extends TypeTranslator { - @Override - public EngineResult fromParser(BinaryParser parser, Integer hint) { - return fromInteger(parser.readOneInt()); - } - - @Override - public EngineResult fromString(String value) { - return EngineResult.valueOf(value); - } - - @Override - public EngineResult fromInteger(int integer) { - return fromNumber(integer); - } - } - - @SuppressWarnings("unused") - public static Translator translate = new Translator(); - - // Result Classes - public static EngineResult resultClass(EngineResult result) { - if (result.ord >= telLOCAL_ERROR.ord && result.ord < temMALFORMED.ord) { - return telLOCAL_ERROR; - } - if (result.ord >= temMALFORMED.ord && result.ord < tefFAILURE.ord) { - return temMALFORMED; - } - if (result.ord >= tefFAILURE.ord && result.ord < terRETRY.ord) { - return tefFAILURE; - } - if (result.ord >= terRETRY.ord && result.ord < tesSUCCESS.ord) { - return terRETRY; - } - if (result.ord >= tesSUCCESS.ord && result.ord < tecCLAIM.ord) { - return tesSUCCESS; - } - return tecCLAIM; - } - - public EngineResult resultClass() { - return class_; - } - - static { - for (EngineResult engineResult : EngineResult.values()) { - engineResult.class_ = resultClass(engineResult); - } - } - -} - - diff --git a/ripple-core/src/main/java/com/ripple/core/serialized/enums/LedgerEntryType.java b/ripple-core/src/main/java/com/ripple/core/serialized/enums/LedgerEntryType.java deleted file mode 100644 index cba003d2d9..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/serialized/enums/LedgerEntryType.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.ripple.core.serialized.enums; - -import com.ripple.core.fields.Type; -import com.ripple.core.serialized.BinaryParser; -import com.ripple.core.serialized.BytesSink; -import com.ripple.core.serialized.SerializedType; -import com.ripple.core.serialized.TypeTranslator; -import com.ripple.encodings.common.B16; - -import java.util.HashMap; -import java.util.Map; -import java.util.TreeMap; - -public enum LedgerEntryType implements SerializedType { - // Invalid (-1), - AccountRoot('a'), - DirectoryNode('d'), - // GeneratorMap ('g'), - RippleState('r'), - Escrow('u'), - // Nickname ('n'), // deprecated - Offer('o'), - // Contract ('c'), - LedgerHashes('h'), - Amendments('f'), - FeeSettings('s'), - Ticket('T'), - SignerList('S'), - PayChannel('x'), - Check('C'), - DepositPreauth('p'); - - final int ord; - - LedgerEntryType(int i) { - ord = i; - } - - static private Map byCode = new TreeMap<>(); - - static { - for (Object a : LedgerEntryType.values()) { - LedgerEntryType f = (LedgerEntryType) a; - byCode.put(f.ord, f); - } - } - - @Override - public Type type() { - return Type.UInt16; - } - - public static LedgerEntryType fromNumber(Number i) { - return byCode.get(i.intValue()); - } - - public Integer asInteger() { - return ord; - } - - // SeralizedType interface - @Override - public byte[] toBytes() { - return new byte[]{(byte) ((ord >>> 8) & 0xFF), (byte) (ord & 0xFF)}; - } - - @Override - public Object toJSON() { - return toString(); - } - - @Override - public String toHex() { - return B16.encode(toBytes()); - } - - @Override - public void toBytesSink(BytesSink to) { - to.add(toBytes()); - } - - public static class Translator extends TypeTranslator { - @Override - public LedgerEntryType fromParser(BinaryParser parser, Integer hint) { - return fromNumber(parser.readOneInt() << 8 | parser.readOneInt()); - } - - @Override - public LedgerEntryType fromInteger(int integer) { - return fromNumber(integer); - } - - @Override - public LedgerEntryType fromString(String value) { - return LedgerEntryType.valueOf(value); - } - } - - @SuppressWarnings("unused") - public static Translator translate = new Translator(); -} diff --git a/ripple-core/src/main/java/com/ripple/core/serialized/enums/TransactionType.java b/ripple-core/src/main/java/com/ripple/core/serialized/enums/TransactionType.java deleted file mode 100644 index 7c98c3da07..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/serialized/enums/TransactionType.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.ripple.core.serialized.enums; - -import com.ripple.core.fields.Type; -import com.ripple.core.serialized.BinaryParser; -import com.ripple.core.serialized.BytesSink; -import com.ripple.core.serialized.SerializedType; -import com.ripple.core.serialized.TypeTranslator; -import com.ripple.encodings.common.B16; - -import java.util.HashMap; -import java.util.Map; -import java.util.TreeMap; - -public enum TransactionType implements SerializedType { - // Invalid (-1), - Payment (0), - EscrowCreate (1), // open - EscrowFinish (2), - AccountSet (3), // open, - EscrowCancel (4), - SetRegularKey(5), - // unused1 (6), // open - OfferCreate (7), - OfferCancel (8), - // unused2(9), - TicketCreate(10), - TicketCancel(11), - SignerListSet(12), - PaymentChannelCreate(13), - PaymentChannelFund(14), - PaymentChannelClaim(15), - CheckCreate(16), - CheckCash(17), - CheckCancel(18), - DepositPreauth(19), - TrustSet (20), - EnableAmendment(100), - SetFee(101); - - public int asInteger() { - return ord; - } - - final int ord; - TransactionType(int i) { - ord = i; - } - - @Override - public Type type() { - return Type.UInt16; - } - - static private Map byCode = new TreeMap<>(); - static { - for (Object a : TransactionType.values()) { - TransactionType f = (TransactionType) a; - byCode.put(f.ord, f); - } - } - - static public TransactionType fromNumber(Number i) { - return byCode.get(i.intValue()); - } - - // SeralizedType interface - @Override - public byte[] toBytes() { - // TODO: bytes - return new byte[]{(byte) (ord >> 8), (byte) (ord & 0xFF)}; - } - @Override - public Object toJSON() { - return toString(); - } - @Override - public String toHex() { - return B16.encode(toBytes()); - } - @Override - public void toBytesSink(BytesSink to) { - to.add(toBytes()); - } - public static class Translator extends TypeTranslator { - @Override - public TransactionType fromParser(BinaryParser parser, Integer hint) { - return fromNumber(parser.readOneInt() << 8 | parser.readOneInt()); - } - - @Override - public TransactionType fromInteger(int integer) { - return fromNumber(integer); - } - - @Override - public TransactionType fromString(String value) { - return TransactionType.valueOf(value); - } - } - - @SuppressWarnings("unused") - public static Translator translate = new Translator(); -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/generic/Validation.java b/ripple-core/src/main/java/com/ripple/core/types/known/generic/Validation.java deleted file mode 100644 index f7efd08ed2..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/generic/Validation.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.ripple.core.types.known.generic; - -import com.ripple.core.coretypes.Blob; -import com.ripple.core.coretypes.STObject; -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.coretypes.uint.UInt32; - -public class Validation extends STObject { - public static boolean isValidation(STObject source) { - return source.has(UInt32.LedgerSequence) && - source.has(UInt32.SigningTime) && - source.has(Hash256.LedgerHash) && - source.has(Blob.Signature); - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/sle/LedgerEntry.java b/ripple-core/src/main/java/com/ripple/core/types/known/sle/LedgerEntry.java deleted file mode 100644 index c5dc3f7f3d..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/sle/LedgerEntry.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.ripple.core.types.known.sle; - -import com.ripple.core.coretypes.AccountID; -import com.ripple.core.coretypes.Amount; -import com.ripple.core.coretypes.STObject; -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.fields.Field; -import com.ripple.core.formats.LEFormat; -import com.ripple.core.serialized.enums.LedgerEntryType; -import com.ripple.core.types.known.sle.entries.AccountRoot; -import com.ripple.core.types.known.sle.entries.DirectoryNode; -import com.ripple.core.types.known.sle.entries.Offer; -import com.ripple.core.types.known.sle.entries.RippleState; - -import java.util.TreeSet; - -public class LedgerEntry extends STObject { - public LedgerEntry(LedgerEntryType type) { - setFormat(LEFormat.formats.get(type)); - put(Field.LedgerEntryType, type); - } - - public LedgerEntryType ledgerEntryType() {return ledgerEntryType(this);} - public Hash256 index() { return get(Hash256.index); } - public UInt32 flags() {return get(UInt32.Flags);} - public Hash256 ledgerIndex() {return get(Hash256.LedgerIndex);} - - public void flags(UInt32 val) {put(Field.Flags, val);} - public void ledgerIndex(Hash256 val) {put(Field.LedgerIndex, val);} - - public boolean hasLedgerIndex() {return has(Hash256.LedgerIndex);} - - public TreeSet owners() { - TreeSet owners = new TreeSet<>(); - - if (has(Field.LowLimit)) { - owners.add(get(Amount.LowLimit).issuer()); - } - if (has(Field.HighLimit)) { - owners.add(get(Amount.HighLimit).issuer()); - } - if (has(Field.Account)) { - owners.add(get(AccountID.Account)); - } - - return owners; - } - - public void index(Hash256 index) { - put(Hash256.index, index); - } - - public void setDefaults() { - if (flags() == null) { - flags(UInt32.ZERO); - } - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/sle/LedgerHashes.java b/ripple-core/src/main/java/com/ripple/core/types/known/sle/LedgerHashes.java deleted file mode 100644 index 9b9086cd72..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/sle/LedgerHashes.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.ripple.core.types.known.sle; - -import com.ripple.core.coretypes.Vector256; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.serialized.enums.LedgerEntryType; - -public class LedgerHashes extends LedgerEntry { - public LedgerHashes() { - super(LedgerEntryType.LedgerHashes); - } - - public Vector256 hashes() { - return get(Vector256.Hashes); - } - - public void hashes(Vector256 hashes) { - put(Vector256.Hashes, hashes); - } - - public UInt32 lastLedgerSequence() { - return get(UInt32.LastLedgerSequence); - } - - public UInt32 firstLedgerSequence() {return get(UInt32.FirstLedgerSequence);} - - public void firstLedgerSequence(UInt32 val) { put(UInt32.FirstLedgerSequence, val);} - - public void lastLedgerSequence(UInt32 val) { put(UInt32.LastLedgerSequence, val);} - - public boolean hasFirstLedgerSequence() {return has(UInt32.FirstLedgerSequence);} - public boolean hasLastLedgerSequence() {return has(UInt32.LastLedgerSequence);} -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/sle/ThreadedLedgerEntry.java b/ripple-core/src/main/java/com/ripple/core/types/known/sle/ThreadedLedgerEntry.java deleted file mode 100644 index 3739109d97..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/sle/ThreadedLedgerEntry.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.ripple.core.types.known.sle; - - -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.fields.Field; -import com.ripple.core.serialized.enums.LedgerEntryType; - -// this class has a PreviousTxnID and PreviousTxnLgrSeq -abstract public class ThreadedLedgerEntry extends LedgerEntry { - public ThreadedLedgerEntry(LedgerEntryType type) { - super(type); - } - public UInt32 previousTxnLgrSeq() {return get(UInt32.PreviousTxnLgrSeq);} - public Hash256 previousTxnID() {return get(Hash256.PreviousTxnID);} - public void previousTxnLgrSeq(UInt32 val) {put(Field.PreviousTxnLgrSeq, val);} - public void previousTxnID(Hash256 val) {put(Field.PreviousTxnID, val);} -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/AccountRoot.java b/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/AccountRoot.java deleted file mode 100644 index 22f26def99..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/AccountRoot.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.ripple.core.types.known.sle.entries; - -import com.ripple.core.coretypes.AccountID; -import com.ripple.core.coretypes.Amount; -import com.ripple.core.coretypes.Blob; -import com.ripple.core.coretypes.hash.Hash128; -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.coretypes.uint.UInt8; -import com.ripple.core.enums.LedgerFlag; -import com.ripple.core.fields.Field; -import com.ripple.core.serialized.enums.LedgerEntryType; -import com.ripple.core.types.known.sle.ThreadedLedgerEntry; - -public class AccountRoot extends ThreadedLedgerEntry { - public AccountRoot() { - super(LedgerEntryType.AccountRoot); - } - - public UInt32 sequence() {return get(UInt32.Sequence);} - public UInt32 transferRate() {return get(UInt32.TransferRate);} - public UInt32 walletSize() {return get(UInt32.WalletSize);} - public UInt32 ownerCount() {return get(UInt32.OwnerCount);} - public Hash128 emailHash() {return get(Hash128.EmailHash);} - public Hash256 walletLocator() {return get(Hash256.WalletLocator);} - public Amount balance() {return get(Amount.Balance);} - public Blob messageKey() {return get(Blob.MessageKey);} - public Blob domain() {return get(Blob.Domain);} - public AccountID account() {return get(AccountID.Account);} - public AccountID regularKey() {return get(AccountID.RegularKey);} - - public void sequence(UInt32 val) {put(Field.Sequence, val);} - public void transferRate(UInt32 val) {put(Field.TransferRate, val);} - public void walletSize(UInt32 val) {put(Field.WalletSize, val);} - public void ownerCount(UInt32 val) {put(Field.OwnerCount, val);} - public void emailHash(Hash128 val) {put(Field.EmailHash, val);} - public void walletLocator(Hash256 val) {put(Field.WalletLocator, val);} - public void balance(Amount val) {put(Field.Balance, val);} - public void messageKey(Blob val) {put(Field.MessageKey, val);} - public void domain(Blob val) {put(Field.Domain, val);} - public void account(AccountID val) {put(Field.Account, val);} - public void regularKey(AccountID val) {put(Field.RegularKey, val);} - - public boolean requiresAuth() { - return flags().testBit(LedgerFlag.RequireAuth); - } - - public boolean hasAccountTxnID() {return has(Hash256.AccountTxnID);} - public boolean hasDomain() {return has(Blob.Domain);} - public boolean hasEmailHash() {return has(Hash128.EmailHash);} - public boolean hasMessageKey() {return has(Blob.MessageKey);} - public boolean hasRegularKey() {return has(AccountID.RegularKey);} - public boolean hasTickSize() {return has(UInt8.TickSize);} - public boolean hasTransferRate() {return has(UInt32.TransferRate);} - public boolean hasWalletLocator() {return has(Hash256.WalletLocator);} - public boolean hasWalletSize() {return has(UInt32.WalletSize);} - - public Hash256 accountTxnID() {return get(Hash256.AccountTxnID);} - public UInt8 tickSize() {return get(UInt8.TickSize);} - - public void accountTxnID(Hash256 val) { put(Hash256.AccountTxnID, val);} - public void tickSize(UInt8 val) { put(UInt8.TickSize, val);} - - @Override - public void setDefaults() { - super.setDefaults(); - if (ownerCount() == null) { - ownerCount(new UInt32(0)); - } - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/Amendments.java b/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/Amendments.java deleted file mode 100644 index 8b580af8ef..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/Amendments.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.ripple.core.types.known.sle.entries; - -import com.ripple.core.coretypes.STArray; -import com.ripple.core.coretypes.Vector256; -import com.ripple.core.serialized.enums.LedgerEntryType; -import com.ripple.core.types.known.sle.LedgerEntry; - -public class Amendments extends LedgerEntry { - public Amendments() { - super(LedgerEntryType.Amendments); - } - - public STArray majorities() {return get(STArray.Majorities);} - public Vector256 amendments() {return get(Vector256.Amendments);} - - public void amendments(Vector256 val) { put(Vector256.Amendments, val);} - public void majorities(STArray val) { put(STArray.Majorities, val);} - - public boolean hasAmendments() {return has(Vector256.Amendments);} - public boolean hasMajorities() {return has(STArray.Majorities);} - -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/Check.java b/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/Check.java deleted file mode 100644 index 310232b1dd..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/Check.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.ripple.core.types.known.sle.entries; - -import com.ripple.core.coretypes.AccountID; -import com.ripple.core.coretypes.Amount; -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.coretypes.uint.UInt64; -import com.ripple.core.serialized.enums.LedgerEntryType; - -public class Check extends IndexedLedgerEntry { - public Check() { - super(LedgerEntryType.Check); - } - - public boolean hasSourceTag() {return has(UInt32.SourceTag);} - public boolean hasExpiration() {return has(UInt32.Expiration);} - public boolean hasDestinationTag() {return has(UInt32.DestinationTag);} - public boolean hasInvoiceID() {return has(Hash256.InvoiceID);} - - public UInt32 sourceTag() {return get(UInt32.SourceTag);} - public UInt32 sequence() {return get(UInt32.Sequence);} - public UInt32 expiration() {return get(UInt32.Expiration);} - public UInt32 destinationTag() {return get(UInt32.DestinationTag);} - public UInt64 ownerNode() {return get(UInt64.OwnerNode);} - public UInt64 destinationNode() {return get(UInt64.DestinationNode);} - public Hash256 invoiceID() {return get(Hash256.InvoiceID);} - public Amount sendMax() {return get(Amount.SendMax);} - public AccountID account() {return get(AccountID.Account);} - public AccountID destination() {return get(AccountID.Destination);} - - public void sourceTag(UInt32 val) { put(UInt32.SourceTag, val);} - public void sequence(UInt32 val) { put(UInt32.Sequence, val);} - public void expiration(UInt32 val) { put(UInt32.Expiration, val);} - public void destinationTag(UInt32 val) { put(UInt32.DestinationTag, val);} - public void ownerNode(UInt64 val) { put(UInt64.OwnerNode, val);} - public void destinationNode(UInt64 val) { put(UInt64.DestinationNode, val);} - public void invoiceID(Hash256 val) { put(Hash256.InvoiceID, val);} - public void sendMax(Amount val) { put(Amount.SendMax, val);} - public void destination(AccountID val) { put(AccountID.Destination, val);} -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/DepositPreauthLe.java b/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/DepositPreauthLe.java deleted file mode 100644 index 7f995ecc1c..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/DepositPreauthLe.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.ripple.core.types.known.sle.entries; - -import com.ripple.core.coretypes.AccountID; -import com.ripple.core.coretypes.uint.UInt64; -import com.ripple.core.serialized.enums.LedgerEntryType; - -public class DepositPreauthLe extends IndexedLedgerEntry { - public DepositPreauthLe() { - super(LedgerEntryType.DepositPreauth); - } - public UInt64 ownerNode() {return get(UInt64.OwnerNode);} - public void ownerNode(UInt64 val) { put(UInt64.OwnerNode, val);} - - public AccountID account() {return get(AccountID.Account);} - - public AccountID authorize() {return get(AccountID.Authorize);} - public void authorize(AccountID val) { put(AccountID.Authorize, val);} -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/DirectoryNode.java b/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/DirectoryNode.java deleted file mode 100644 index f46a7d7973..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/DirectoryNode.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.ripple.core.types.known.sle.entries; - -import com.ripple.core.coretypes.AccountID; -import com.ripple.core.coretypes.Currency; -import com.ripple.core.coretypes.Vector256; -import com.ripple.core.coretypes.hash.Hash160; -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.coretypes.hash.Index; -import com.ripple.core.coretypes.uint.UInt64; -import com.ripple.core.fields.Field; -import com.ripple.core.serialized.enums.LedgerEntryType; -import com.ripple.core.types.known.sle.LedgerEntry; - -public class DirectoryNode extends LedgerEntry { - public DirectoryNode() { - super(LedgerEntryType.DirectoryNode); - } - - public UInt64 indexNext() {return get(UInt64.IndexNext);} - public UInt64 indexPrevious() {return get(UInt64.IndexPrevious);} - public UInt64 exchangeRate() {return get(UInt64.ExchangeRate);} - public Hash256 rootIndex() {return get(Hash256.RootIndex);} - public AccountID owner() {return get(AccountID.Owner);} - public Hash160 takerPaysCurrency() {return get(Hash160.TakerPaysCurrency);} - public Hash160 takerPaysIssuer() {return get(Hash160.TakerPaysIssuer);} - public Hash160 takerGetsCurrency() {return get(Hash160.TakerGetsCurrency);} - public Hash160 takerGetsIssuer() {return get(Hash160.TakerGetsIssuer);} - public Vector256 indexes() {return get(Vector256.Indexes);} - public void indexNext(UInt64 val) {put(Field.IndexNext, val);} - public void indexPrevious(UInt64 val) {put(Field.IndexPrevious, val);} - public void exchangeRate(UInt64 val) {put(Field.ExchangeRate, val);} - public void rootIndex(Hash256 val) {put(Field.RootIndex, val);} - public void owner(AccountID val) {put(Field.Owner, val);} - public void takerPaysCurrency(Hash160 val) {put(Field.TakerPaysCurrency, val);} - public void takerPaysIssuer(Hash160 val) {put(Field.TakerPaysIssuer, val);} - public void takerGetsCurrency(Hash160 val) {put(Field.TakerGetsCurrency, val);} - public void takerGetsIssuer(Hash160 val) {put(Field.TakerGetsIssuer, val);} - public void indexes(Vector256 val) {put(Field.Indexes, val);} - - public boolean hasIndexNext() {return has(UInt64.IndexNext);} - public boolean hasIndexPrevious() {return has(UInt64.IndexPrevious);} - public boolean hasExchangeRate() {return has(UInt64.ExchangeRate);} - public boolean hasOwner() {return has(AccountID.Owner);} - public boolean hasTakerPaysCurrency() {return has(Hash160.TakerPaysCurrency);} - public boolean hasTakerPaysIssuer() {return has(Hash160.TakerPaysIssuer);} - public boolean hasTakerGetsCurrency() {return has(Hash160.TakerGetsCurrency);} - public boolean hasTakerGetsIssuer() {return has(Hash160.TakerGetsIssuer);} - - public Hash256 nextIndex() { - return Index.directoryNode(rootIndex(), indexNext()); - } - public Hash256 prevIndex() { - return Index.directoryNode(rootIndex(), indexPrevious()); - } - - public boolean hasPreviousIndex() { - return hasIndexPrevious() && !indexPrevious().isZero(); - } - - public boolean hasNextIndex() { - return hasIndexNext() && !indexNext().isZero(); - } - - public boolean isRootIndex() { - return rootIndex().equals(index()); - } - - public void setExchangeDefaults() { - if (takerGetsCurrency() == null) { - takerGetsCurrency(Currency.XRP); - takerGetsIssuer(AccountID.XRP_ISSUER); - } else if (takerPaysCurrency() == null) { - takerPaysCurrency(Currency.XRP); - takerPaysIssuer(AccountID.XRP_ISSUER); - } - } - - @Override - public void setDefaults() { - super.setDefaults(); - if (exchangeRate() != null) { - setExchangeDefaults(); - } - if (indexes() == null) { - indexes(new Vector256()); - } - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/Escrow.java b/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/Escrow.java deleted file mode 100644 index ff822c6757..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/Escrow.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.ripple.core.types.known.sle.entries; - -import com.ripple.core.coretypes.AccountID; -import com.ripple.core.coretypes.Amount; -import com.ripple.core.coretypes.Blob; -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.coretypes.hash.Index; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.coretypes.uint.UInt64; -import com.ripple.core.serialized.enums.LedgerEntryType; -import com.ripple.core.types.known.tx.Transaction; - -import java.util.ArrayList; - -public class Escrow extends IndexedLedgerEntry { - public Escrow() { - super(LedgerEntryType.Escrow); - } - - @Override - public void setDefaults() { - super.setDefaults(); - if (multiParty()) { - if (!has(UInt64.DestinationNode)) { - put(UInt64.DestinationNode, UInt64.ZERO); - } - } - } - - @Override - public ArrayList ownerDirectoryIndexes(Transaction nullableContext) { - ArrayList indexes = super.ownerDirectoryIndexes(nullableContext); - if (multiParty()) { - Hash256 destinationOwnerDir = - Index.ownerDirectory(destination()); - indexes.add(Index.directoryNode( - destinationOwnerDir, destinationNode())); - } - return indexes; - } - - private boolean multiParty() { - return !get(AccountID.Account).equals(destination()); - } - - public AccountID account() {return get(AccountID.Account);} - public AccountID destination() {return get(AccountID.Destination);} - public Amount amount() {return get(Amount.Amount);} - public Blob condition() {return get(Blob.Condition);} - public UInt32 cancelAfter() {return get(UInt32.CancelAfter);} - public UInt32 destinationTag() {return get(UInt32.DestinationTag);} - public UInt32 finishAfter() {return get(UInt32.FinishAfter);} - public UInt32 sourceTag() {return get(UInt32.SourceTag);} - public UInt64 destinationNode() {return get(UInt64.DestinationNode);} - public UInt64 ownerNode() {return get(UInt64.OwnerNode);} - - public void amount(Amount val) { put(Amount.Amount, val);} - public void cancelAfter(UInt32 val) { put(UInt32.CancelAfter, val);} - public void condition(Blob val) { put(Blob.Condition, val);} - public void destination(AccountID val) { put(AccountID.Destination, val);} - public void destinationNode(UInt64 val) { put(UInt64.DestinationNode, val);} - public void destinationTag(UInt32 val) { put(UInt32.DestinationTag, val);} - public void finishAfter(UInt32 val) { put(UInt32.FinishAfter, val);} - public void ownerNode(UInt64 val) { put(UInt64.OwnerNode, val);} - public void sourceTag(UInt32 val) { put(UInt32.SourceTag, val);} - - public boolean hasCancelAfter() {return has(UInt32.CancelAfter);} - public boolean hasCondition() {return has(Blob.Condition);} - public boolean hasDestinationNode() {return has(UInt64.DestinationNode);} - public boolean hasDestinationTag() {return has(UInt32.DestinationTag);} - public boolean hasFinishAfter() {return has(UInt32.FinishAfter);} - public boolean hasSourceTag() {return has(UInt32.SourceTag);} - -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/FeeSettings.java b/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/FeeSettings.java deleted file mode 100644 index ce8fca505d..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/FeeSettings.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.ripple.core.types.known.sle.entries; - -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.coretypes.uint.UInt64; -import com.ripple.core.serialized.enums.LedgerEntryType; -import com.ripple.core.types.known.sle.LedgerEntry; - -public class FeeSettings extends LedgerEntry { - public FeeSettings() { - super(LedgerEntryType.Amendments); - } - public UInt32 referenceFeeUnits() {return get(UInt32.ReferenceFeeUnits);} - public UInt32 reserveBase() {return get(UInt32.ReserveBase);} - public UInt32 reserveIncrement() {return get(UInt32.ReserveIncrement);} - public UInt64 baseFee() {return get(UInt64.BaseFee);} - - public void baseFee(UInt64 val) { put(UInt64.BaseFee, val);} - public void referenceFeeUnits(UInt32 val) { put(UInt32.ReferenceFeeUnits, val);} - public void reserveBase(UInt32 val) { put(UInt32.ReserveBase, val);} - public void reserveIncrement(UInt32 val) { put(UInt32.ReserveIncrement, val);} - -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/IHasOwners.java b/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/IHasOwners.java deleted file mode 100644 index 93c15e2f80..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/IHasOwners.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.ripple.core.types.known.sle.entries; - -import com.ripple.core.coretypes.AccountID; -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.types.known.tx.Transaction; - -import java.util.ArrayList; - -public interface IHasOwners { - ArrayList ownerDirectoryIndexes(Transaction nullableContext); - AccountID account(Transaction nullableContext); -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/IndexedLedgerEntry.java b/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/IndexedLedgerEntry.java deleted file mode 100644 index 37ff656961..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/IndexedLedgerEntry.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.ripple.core.types.known.sle.entries; - -import com.ripple.core.coretypes.AccountID; -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.coretypes.hash.Index; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.coretypes.uint.UInt64; -import com.ripple.core.fields.Field; -import com.ripple.core.serialized.enums.LedgerEntryType; -import com.ripple.core.types.known.sle.ThreadedLedgerEntry; -import com.ripple.core.types.known.tx.Transaction; - -import java.util.ArrayList; - -public abstract class IndexedLedgerEntry extends ThreadedLedgerEntry implements IHasOwners { - public IndexedLedgerEntry(LedgerEntryType type) { - super(type); - } - - @Override - public void setDefaults() { - super.setDefaults(); - if (!has(Field.OwnerNode)) { - put(UInt64.OwnerNode, UInt64.ZERO); - } - } - - @Override - public AccountID account(Transaction nullableContext) { - AccountID account = account(); - if (account == null) { - if (nullableContext != null) { - account = nullableContext.account(); - } else { - throw new IllegalStateException("Cant determine account for: " + prettyJSON()); - } - } - return account; - } - - @Override - public ArrayList ownerDirectoryIndexes(Transaction nullableContext) { - Hash256 ownerDir = Index.ownerDirectory(account(nullableContext)); - ArrayList indexes = new ArrayList<>(); - indexes.add(Index.directoryNode(ownerDir, ownerNode())); - return indexes; - } - - private UInt64 ownerNode() { - return get(UInt64.OwnerNode); - } - - private AccountID account() { - return get(AccountID.Account); - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/Offer.java b/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/Offer.java deleted file mode 100644 index ceaa7a6732..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/Offer.java +++ /dev/null @@ -1,219 +0,0 @@ -package com.ripple.core.types.known.sle.entries; - -import com.ripple.core.coretypes.*; -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.coretypes.hash.Index; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.coretypes.uint.UInt64; -import com.ripple.core.fields.Field; -import com.ripple.core.serialized.enums.LedgerEntryType; -import com.ripple.core.types.known.sle.ThreadedLedgerEntry; - -import java.math.BigDecimal; -import java.util.Collection; -import java.util.Comparator; -import java.util.Iterator; - -public class Offer extends ThreadedLedgerEntry { - public Offer() { - super(LedgerEntryType.Offer); - } - - /** - * Use the BookDirectory field - * - * @return how much must `pay` to `get` one. - * - */ - public BigDecimal directoryAskQuality() { - return Quality.fromBookDirectory(bookDirectory(), - takerPays().isNative(), - takerGets().isNative()); - } - - /** - * @return how much must `pay` to `get` one. - */ - public BigDecimal askQuality() { - return takerPays().computeQuality(takerGets()); - } - - /** - * @return how much `get` if `pay` one. - */ - public BigDecimal bidQuality() { - return takerGets().computeQuality(takerPays()); - } - - /** - * - * @return One of TakerGets issue, eg 1/USD/BITSTAMP or 1/EUR/SNAPSWAP - */ - public Amount getsOne() { - return takerGets().one(); - } - /** - * - * @return One of TakerPays issue, eg 1/USD/BITSTAMP or 1/EUR/SNAPSWAP - */ - public Amount paysOne() { - return takerPays().one(); - } - - public String getPayCurrencyPair() { - return takerGets().currencyString() + "/" + - takerPays().currencyString(); - } - - // TODO: create an OfferExecution object for this - public STObject executed(STObject finalFields) { - // where `this` is an AffectedNode nodeAsPrevious - STObject executed = new STObject(); - executed.put(Amount.TakerPays, finalFields.get(Amount.TakerPays).subtract(takerPays())); - executed.put(Amount.TakerGets, finalFields.get(Amount.TakerGets).subtract(takerGets())); - return executed; - } - - public Hash256 lineIndex(Amount amt) { - return account().lineIndex(amt.issue()); - } - - public Hash256 fundingSource() { - Amount takerGets = takerGets(); - if (account().equals(takerGets.issuer())) { - return null; - } - else if (takerGets.isNative()) { - return Index.accountRoot(account()); - } else { - return lineIndex(takerGets); - } - } - - public Vector256 lineIndexes() { - Vector256 ret = new Vector256(); - - Amount takerGets = takerGets(); - for (Amount amt : new Amount[]{takerGets, takerPays()}) { - - // Actually want to compare by reference here :) - if (amt == takerGets()) { - // selling own funds - continue; - } - if (!amt.isNative()) { - ret.add(lineIndex(amt)); - } - } - return ret; - } - - public Hash256 bookBase() { - return Index.bookStart(takerPays().issue(), takerGets().issue()); - } - - public boolean belongsToBook(Hash256 bookBase) { - byte[] baseBytes = bookBase.bytes(); - byte[] directoryBytes = bookDirectory().bytes(); - - for (int i = 0; i < 24; i++) { - if (baseBytes[i] != directoryBytes[i]) { - return false; - } - } - return true; - } - - public boolean sellingOwnFunds() { - return account().equals(takerGets().issuer()); - } - - public Amount takerGetsFunded() { - return has(Field.taker_gets_funded) ? get(Amount.taker_gets_funded) : takerGets(); - } - public Amount takerPaysFunded() { - return has(Field.taker_pays_funded) ? get(Amount.taker_pays_funded) : takerPays(); - } - - public static Comparator qualityAscending = Comparator.comparing(Offer::directoryAskQuality); - - public static Iterator iterateCollection(Collection offers) { - final Iterator iterator = offers.iterator(); - - return new Iterator() { - @Override - public boolean hasNext() { - return iterator.hasNext(); - } - - @Override - public Offer next() { - return (Offer) iterator.next(); - } - - @Override - public void remove() { - iterator.remove(); - - } - }; - } - - public Hash256 bookNodeDirectoryIndex() { - return Index.directoryNode(bookDirectory(), bookNode()); - } - - public Hash256 ownerNodeDirectoryIndex() { - Hash256 ownerDir = Index.ownerDirectory(account()); - return Index.directoryNode(ownerDir, ownerNode()); - } - - - public UInt32 sequence() {return get(UInt32.Sequence);} - public UInt32 expiration() {return get(UInt32.Expiration);} - public UInt64 bookNode() {return get(UInt64.BookNode);} - public UInt64 ownerNode() {return get(UInt64.OwnerNode);} - public Hash256 bookDirectory() {return get(Hash256.BookDirectory);} - public Amount takerPays() {return get(Amount.TakerPays);} - public Amount takerGets() {return get(Amount.TakerGets);} - public AccountID account() {return get(AccountID.Account);} - public void sequence(UInt32 val) {put(Field.Sequence, val);} - public void expiration(UInt32 val) {put(Field.Expiration, val);} - public void bookNode(UInt64 val) {put(Field.BookNode, val);} - public void ownerNode(UInt64 val) {put(Field.OwnerNode, val);} - public void bookDirectory(Hash256 val) {put(Field.BookDirectory, val);} - public void takerPays(Amount val) {put(Field.TakerPays, val);} - public void takerGets(Amount val) {put(Field.TakerGets, val);} - public void account(AccountID val) {put(Field.Account, val);} - - public boolean hasExpiration() {return has(UInt32.Expiration);} - - public Hash256[] directoryIndexes() { - return new Hash256[]{bookNodeDirectoryIndex(), ownerNodeDirectoryIndex()}; - } - - @Override - public void setDefaults() { - super.setDefaults(); - setOfferDefaults(); - } - - public void setOfferDefaults() { - if (bookNode() == null) { - bookNode(UInt64.ZERO); - } - if (ownerNode() == null) { - ownerNode(UInt64.ZERO); - } - } - - public IssuePair issuePair() { - return new IssuePair(takerPays().issue(), takerGets().issue()); - } - - public Amount payToGet(Amount funded) { - BigDecimal quality = directoryAskQuality(); - // Multiply by one as that will do the rounding operation we want - return paysOne().multiply(funded.multiply(quality)); - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/OfferDirectory.java b/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/OfferDirectory.java deleted file mode 100644 index fddb7126fd..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/OfferDirectory.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.ripple.core.types.known.sle.entries; - -import com.ripple.core.coretypes.Issue; -import com.ripple.core.coretypes.IssuePair; - -public class OfferDirectory extends DirectoryNode { - public IssuePair issuePair() { - return new IssuePair(takerPaysIssue(), takerGetsIssue()); - } - - public Issue takerGetsIssue() { - // TODO: remove wrapper - return Issue.from160s(takerGetsCurrency(), takerGetsIssuer()); - } - public Issue takerPaysIssue() { - // TODO: remove wrapper - return Issue.from160s(takerPaysCurrency(), takerPaysIssuer()); - } - -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/OwnerDirectory.java b/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/OwnerDirectory.java deleted file mode 100644 index b6f784e4b8..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/OwnerDirectory.java +++ /dev/null @@ -1,3 +0,0 @@ -package com.ripple.core.types.known.sle.entries; - -public class OwnerDirectory extends DirectoryNode { } diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/PayChannel.java b/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/PayChannel.java deleted file mode 100644 index 97a2786b2a..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/PayChannel.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.ripple.core.types.known.sle.entries; - -import com.ripple.core.coretypes.AccountID; -import com.ripple.core.coretypes.Amount; -import com.ripple.core.coretypes.Blob; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.coretypes.uint.UInt64; -import com.ripple.core.serialized.enums.LedgerEntryType; - -public class PayChannel extends IndexedLedgerEntry { - public PayChannel() { - super(LedgerEntryType.PayChannel); - } - - public AccountID account() {return get(AccountID.Account);} - public AccountID destination() {return get(AccountID.Destination);} - public Amount amount() {return get(Amount.Amount);} - public Amount balance() {return get(Amount.Balance);} - public Blob publicKey() {return get(Blob.PublicKey);} - public UInt32 cancelAfter() {return get(UInt32.CancelAfter);} - public UInt32 destinationTag() {return get(UInt32.DestinationTag);} - public UInt32 expiration() {return get(UInt32.Expiration);} - public UInt32 settleDelay() {return get(UInt32.SettleDelay);} - public UInt32 sourceTag() {return get(UInt32.SourceTag);} - public UInt64 ownerNode() {return get(UInt64.OwnerNode);} - - public void amount(Amount val) { put(Amount.Amount, val);} - public void balance(Amount val) { put(Amount.Balance, val);} - public void cancelAfter(UInt32 val) { put(UInt32.CancelAfter, val);} - public void destination(AccountID val) { put(AccountID.Destination, val);} - public void destinationTag(UInt32 val) { put(UInt32.DestinationTag, val);} - public void expiration(UInt32 val) { put(UInt32.Expiration, val);} - public void ownerNode(UInt64 val) { put(UInt64.OwnerNode, val);} - public void publicKey(Blob val) { put(Blob.PublicKey, val);} - public void settleDelay(UInt32 val) { put(UInt32.SettleDelay, val);} - public void sourceTag(UInt32 val) { put(UInt32.SourceTag, val);} - - public boolean hasCancelAfter() {return has(UInt32.CancelAfter);} - public boolean hasDestinationTag() {return has(UInt32.DestinationTag);} - public boolean hasExpiration() {return has(UInt32.Expiration);} - public boolean hasSourceTag() {return has(UInt32.SourceTag);} -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/RippleState.java b/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/RippleState.java deleted file mode 100644 index 02f9f2ad2e..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/RippleState.java +++ /dev/null @@ -1,224 +0,0 @@ -package com.ripple.core.types.known.sle.entries; - -import com.ripple.core.coretypes.AccountID; -import com.ripple.core.coretypes.Amount; -import com.ripple.core.coretypes.Currency; -import com.ripple.core.coretypes.Issue; -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.coretypes.hash.Index; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.coretypes.uint.UInt64; -import com.ripple.core.enums.LedgerFlag; -import com.ripple.core.fields.AmountField; -import com.ripple.core.fields.Field; -import com.ripple.core.serialized.enums.LedgerEntryType; -import com.ripple.core.types.known.sle.ThreadedLedgerEntry; - -import java.util.Arrays; -import java.util.List; - -public class RippleState extends ThreadedLedgerEntry { - /** - The RippleState is a ledger entry which roughly speaking defines the balance and - trust limits between two accounts. - - Like all current ledger entries, it has a canonical form for hashing that - doesn't necessarily communicate the information in a way that is clear or - obvious to a human. The current json format for some ledger entries is very - close to the hashing format, and isn't any better. - - The two accounts on the link are categorized into a low account, and a high - account by comparing the 160bits of their account id as a big endian unsigned - integer. - - There is one and only one `Balance` stored, using an amount struct with a - neutral `issuer`. ( A uint160 with the numerical value of `1` was chosen as a - placeholder, as the canonical way to represent a null account ) - - The Balance can be negative, zero, or positive and is in terms of the Low - account, such that when it's positive, it defines how much credit the High - account has issued. - - Between any account, there can be two types of balance changes, issuance and - redemption. A redemption is the transferal of previously issued IOUs back to the - owner. - - This implies that for any account, that can they can make a transferal using - funds from two distinct balances. After making this distinction it becomes - nonsensical to say that an account holds negative IOUs from the opposite line. - - Thus, the one Balance in a ripple state actually implies 4 distinct balances. - - ``` - { - ... - "Balance" : { - "currency" : "USD", - "issuer" : "rrrrrrrrrrrrrrrrrrrrBZbvji", - "value" : "100" - }, - "HighLimit" : { - "currency" : "USD", - "issuer" : "rPMh7Pi9ct699iZUTWaytJUoHcJ7cgyziK", - "value" : "500" - }, - "LowLimit" : { - "currency" : "USD", - "issuer" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "value" : "500" - }, - } - ``` - - lowAccount = LowLimit.issuer - hiAccount = HighLimit.issuer - - Balances: - lowAccount has 100/USD/highAccount - lowAccount has 0/USD/lowAccount on the line - - highAccount has 0/USD/lowAccount - highAccount has -100/USD/highAccount on the line - - - * */ - - public RippleState() { - super(LedgerEntryType.RippleState); - } - - public UInt32 highQualityIn() {return get(UInt32.HighQualityIn);} - public UInt32 highQualityOut() {return get(UInt32.HighQualityOut);} - public UInt32 lowQualityIn() {return get(UInt32.LowQualityIn);} - public UInt32 lowQualityOut() {return get(UInt32.LowQualityOut);} - public UInt64 lowNode() {return get(UInt64.LowNode);} - public UInt64 highNode() {return get(UInt64.HighNode);} - public Amount balance() {return get(Amount.Balance);} - public Amount lowLimit() {return get(Amount.LowLimit);} - public Amount highLimit() {return get(Amount.HighLimit);} - public void highQualityIn(UInt32 val) {put(Field.HighQualityIn, val);} - public void highQualityOut(UInt32 val) {put(Field.HighQualityOut, val);} - public void lowQualityIn(UInt32 val) {put(Field.LowQualityIn, val);} - public void lowQualityOut(UInt32 val) {put(Field.LowQualityOut, val);} - public void lowNode(UInt64 val) {put(Field.LowNode, val);} - public void highNode(UInt64 val) {put(Field.HighNode, val);} - public void balance(Amount val) {put(Field.Balance, val);} - public void lowLimit(Amount val) {put(Field.LowLimit, val);} - public void highLimit(Amount val) {put(Field.HighLimit, val);} - - public boolean hasHighQualityIn() {return has(UInt32.HighQualityIn);} - public boolean hasHighQualityOut() {return has(UInt32.HighQualityOut);} - public boolean hasLowQualityIn() {return has(UInt32.LowQualityIn);} - public boolean hasLowQualityOut() {return has(UInt32.LowQualityOut);} - public boolean hasLowNode() {return has(UInt64.LowNode);} - public boolean hasHighNode() {return has(UInt64.HighNode);} - - public AccountID lowAccount() { - return lowLimit().issuer(); - } - - public AccountID highAccount() { - return highLimit().issuer(); - } - - public List sortedAccounts() { - return Arrays.asList(lowAccount(), highAccount()); - } - - public AmountField limitFieldFor(AccountID source) { - if (lowAccount().equals(source)) { - return Amount.LowLimit; - } - if (highAccount().equals(source)) { - return Amount.HighLimit; - } else { - return null; - } - } - - public boolean isFor(AccountID source) { - return lowAccount().equals(source) || highAccount().equals(source); - } - - public boolean isFor(Issue issue) { - return isFor(issue.issuer()) && balance().currency().equals(issue.currency()); - } - - // TODO, can optimize this - public boolean isFor(AccountID s1, AccountID s2, Currency currency) { - return currency.equals(balance().currency()) && isFor(s1) && isFor(s2); - } - - public Currency currency() { - return balance().currency(); - } - - private Amount issuedBy(boolean hi) { - Amount balance; - - if (hi) { - balance = balance().newIssuer(highAccount()); - } else { - balance = balance().negate().newIssuer(lowAccount()); - } - - if (!balance.isPositive()) { - balance = balance.issue().amount(0); - } - return balance; - } - - public Amount issuedByHigh() { - return issuedBy(true); - } - public Amount issuedByLow() { - return issuedBy(false); - } - - public Amount issuedTo(AccountID accountID) { - return issuedBy(isLowAccount(accountID)); - } - - @Deprecated() // "not deprecated but needs fixing" - public boolean authorizedBy(AccountID account) { - UInt32 flags = flags(); - return flags == null || flags.testBit(isHighAccount(account) ? LedgerFlag.HighAuth : LedgerFlag.LowAuth); - } - - private boolean isBitSet(int flags, int flag) { - return (flags & flag) != 0; - } - - private boolean isHighAccount(AccountID account) { - return highAccount().equals(account); - } - private boolean isLowAccount(AccountID account) { - return lowAccount().equals(account); - } - - - public Hash256 lowNodeOwnerDirectory() { - Hash256 ownerDir = Index.ownerDirectory(lowAccount()); - return Index.directoryNode(ownerDir, lowNode()); - } - public Hash256 highNodeOwnerDirectory() { - Hash256 ownerDir = Index.ownerDirectory(highAccount()); - return Index.directoryNode(ownerDir, highNode()); - } - - public Hash256[] directoryIndexes() { - return new Hash256[]{lowNodeOwnerDirectory(), highNodeOwnerDirectory()}; - } - - @Override - public void setDefaults() { - super.setDefaults(); - - if (lowNode() == null) { - lowNode(UInt64.ZERO); - } - if (highNode() == null) { - highNode(UInt64.ZERO); - } - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/SignerList.java b/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/SignerList.java deleted file mode 100644 index 68af847605..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/SignerList.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.ripple.core.types.known.sle.entries; - -import com.ripple.core.coretypes.STArray; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.coretypes.uint.UInt64; -import com.ripple.core.fields.Field; -import com.ripple.core.serialized.enums.LedgerEntryType; - -public class SignerList extends IndexedLedgerEntry { - public SignerList() { - super(LedgerEntryType.SignerList); - } - - @Override - public void setDefaults() { - super.setDefaults(); - if (!has(Field.SignerListID)) { - put(UInt32.SignerListID, UInt32.ZERO); - } - } - - public STArray signerEntries() {return get(STArray.SignerEntries);} - public UInt32 signerListID() {return get(UInt32.SignerListID);} - public UInt32 signerQuorum() {return get(UInt32.SignerQuorum);} - public UInt64 ownerNode() {return get(UInt64.OwnerNode);} - - public void ownerNode(UInt64 val) { put(UInt64.OwnerNode, val);} - public void signerEntries(STArray val) { put(STArray.SignerEntries, val);} - public void signerListID(UInt32 val) { put(UInt32.SignerListID, val);} - public void signerQuorum(UInt32 val) { put(UInt32.SignerQuorum, val);} - -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/Ticket.java b/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/Ticket.java deleted file mode 100644 index 5d48e3f462..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/sle/entries/Ticket.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.ripple.core.types.known.sle.entries; - -import com.ripple.core.coretypes.AccountID; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.coretypes.uint.UInt64; -import com.ripple.core.serialized.enums.LedgerEntryType; - -public class Ticket extends IndexedLedgerEntry { - public Ticket() { - super(LedgerEntryType.Ticket); - } - - public AccountID account() {return get(AccountID.Account);} - public AccountID target() {return get(AccountID.Target);} - public UInt32 expiration() {return get(UInt32.Expiration);} - public UInt32 sequence() {return get(UInt32.Sequence);} - public UInt64 ownerNode() {return get(UInt64.OwnerNode);} - - public void expiration(UInt32 val) { put(UInt32.Expiration, val);} - public void ownerNode(UInt64 val) { put(UInt64.OwnerNode, val);} - public void sequence(UInt32 val) { put(UInt32.Sequence, val);} - public void target(AccountID val) { put(AccountID.Target, val);} - - public boolean hasExpiration() {return has(UInt32.Expiration);} - public boolean hasTarget() {return has(AccountID.Target);} - -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/tx/Transaction.java b/ripple-core/src/main/java/com/ripple/core/types/known/tx/Transaction.java deleted file mode 100644 index 8f174968aa..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/tx/Transaction.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.ripple.core.types.known.tx; - -import com.ripple.core.coretypes.*; -import com.ripple.core.coretypes.hash.HalfSha512; -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.coretypes.hash.prefixes.HashPrefix; -import com.ripple.core.coretypes.uint.UInt16; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.enums.TransactionFlag; -import com.ripple.core.fields.Field; -import com.ripple.core.formats.TxFormat; -import com.ripple.core.serialized.enums.TransactionType; -import com.ripple.core.types.known.tx.signed.SignedTransaction; -import com.ripple.crypto.keys.IVerifyingKey; -import com.ripple.utils.HashUtils; - -public class Transaction extends STObject { - public static final boolean CANONICAL_FLAG_DEPLOYED = true; - public static final UInt32 CANONICAL_SIGNATURE = new UInt32(TransactionFlag.FullyCanonicalSig); - - public Transaction(TransactionType type) { - setFormat(TxFormat.formats.get(type)); - put(Field.TransactionType, type); - } - - public SignedTransaction prepare(byte[] pubKeyBytes) { - SignedTransaction tx = SignedTransaction.fromTx(this); - tx.prepare(pubKeyBytes); - return tx; - } - - public TransactionType transactionType() { - return transactionType(this); - } - - public Hash256 signingHash() { - return signingHash(HashPrefix.txSign); - } - - public byte[] signingData() { - return signingData(HashPrefix.txSign); - } - - public boolean verifySignature(AccountID key) { - Blob pubKey = signingPubKey(); - return IVerifyingKey.from(pubKey.toBytes()) - .verify(signingData(), - txnSignature().toBytes()) && - signingKey().equals(key); - } - - public boolean verifyMasterKeySignature() { - return verifySignature(account()); - } - - public void setCanonicalSignatureFlag() { - UInt32 flags = get(UInt32.Flags); - if (flags == null) { - flags = CANONICAL_SIGNATURE; - } else { - flags = flags.or(CANONICAL_SIGNATURE); - } - put(UInt32.Flags, flags); - } - - public UInt32 flags() {return get(UInt32.Flags);} - public UInt32 sourceTag() {return get(UInt32.SourceTag);} - public UInt32 sequence() {return get(UInt32.Sequence);} - public UInt32 lastLedgerSequence() {return get(UInt32.LastLedgerSequence);} - public UInt32 operationLimit() {return get(UInt32.OperationLimit);} - public Hash256 previousTxnID() {return get(Hash256.PreviousTxnID);} - public Hash256 accountTxnID() {return get(Hash256.AccountTxnID);} - public Amount fee() {return get(Amount.Fee);} - public Blob signingPubKey() {return get(Blob.SigningPubKey);} - public Blob txnSignature() {return get(Blob.TxnSignature);} - public AccountID account() {return get(AccountID.Account);} - - public void transactionType(UInt16 val) {put(Field.TransactionType, val);} - public void flags(UInt32 val) {put(Field.Flags, val);} - public void sourceTag(UInt32 val) {put(Field.SourceTag, val);} - public void sequence(UInt32 val) {put(Field.Sequence, val);} - public void lastLedgerSequence(UInt32 val) {put(Field.LastLedgerSequence, val);} - public void operationLimit(UInt32 val) {put(Field.OperationLimit, val);} - public void previousTxnID(Hash256 val) {put(Field.PreviousTxnID, val);} - public void accountTxnID(Hash256 val) {put(Field.AccountTxnID, val);} - public void fee(Amount val) {put(Field.Fee, val);} - public void signingPubKey(Blob val) {put(Field.SigningPubKey, val);} - public void txnSignature(Blob val) {put(Field.TxnSignature, val);} - public void account(AccountID val) {put(Field.Account, val);} - - public boolean hasFlags() {return has(UInt32.Flags);} - public boolean hasSourceTag() {return has(UInt32.SourceTag);} - public boolean hasLastLedgerSequence() {return has(UInt32.LastLedgerSequence);} - public boolean hasOperationLimit() {return has(UInt32.OperationLimit);} - public boolean hasPreviousTxnID() {return has(Hash256.PreviousTxnID);} - public boolean hasAccountTxnID() {return has(Hash256.AccountTxnID);} - public boolean hasTxnSignature() {return has(Blob.TxnSignature);} - public boolean hasSigners() {return has(STArray.Signers);} - public boolean hasMemos() {return has(STArray.Memos);} - - public Hash256 hash() { - return get(Hash256.hash); - } - - public Hash256 createHash() { - HalfSha512 id = HalfSha512.prefixed256(HashPrefix.transactionID); - toBytesSink(id); - return id.finish(); - } - - public AccountID signingKey() { - // May be a regular Key - byte[] pubKey = HashUtils.SHA256_RIPEMD160(signingPubKey().toBytes()); - return AccountID.fromBytes(pubKey); - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/tx/result/AffectedNode.java b/ripple-core/src/main/java/com/ripple/core/types/known/tx/result/AffectedNode.java deleted file mode 100644 index 9c399b73a0..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/tx/result/AffectedNode.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.ripple.core.types.known.tx.result; - -import com.ripple.core.coretypes.STObject; -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.coretypes.uint.UInt16; -import com.ripple.core.fields.Field; -import com.ripple.core.serialized.SerializedType; -import com.ripple.core.serialized.enums.LedgerEntryType; -import com.ripple.core.types.known.sle.LedgerEntry; - -// TODO: fix up this nonsense -public class AffectedNode extends STObject { - public final Field field; - public final STObject nested; - - public AffectedNode(STObject source) { - fields = source.getFields(); - field = getField(); - nested = nestedObject(); - } - - public boolean isOffer() { - return ledgerEntryType() == LedgerEntryType.Offer; - } - - public boolean isAccountRoot() { - return ledgerEntryType() == LedgerEntryType.AccountRoot; - } - - public boolean isRippleState() { - return ledgerEntryType() == LedgerEntryType.RippleState; - } - - public boolean isDirectoryNode() { - return ledgerEntryType() == LedgerEntryType.DirectoryNode; - } - - public boolean wasPreviousNode() { - return isDeletedNode() || isModifiedNode(); - } - - public boolean isFinalNode() { - return true; - } - - public boolean isCreatedNode() { - return field == Field.CreatedNode; - } - - public boolean isDeletedNode() { - return field == Field.DeletedNode; - } - - public boolean isModifiedNode() { - return field == Field.ModifiedNode; - } - - public Field getField() { -// return iterator().next(); - return fields.firstKey(); - } - - public Hash256 ledgerIndex() { - return nested.get(Hash256.LedgerIndex); - } - - public LedgerEntryType ledgerEntryType() { - return ledgerEntryType(nested); - } - - private STObject nestedObject() { - return (STObject) get(getField()); - } - - /** - * @return - LedgerEntry before the transaction (or after in the case of - * a CreatedNode) - */ - public LedgerEntry nodeAsPrevious() { - return (LedgerEntry) rebuildFromMeta(true); - } - - public LedgerEntry nodeAsFinal() { - return (LedgerEntry) rebuildFromMeta(false); - } - - private STObject rebuildFromMeta(boolean asPrevious) { - boolean created = isCreatedNode(); - STObject mixed = new STObject(); - - // The first object has only a single key - Field wrapperField = created ? Field.CreatedNode : - isDeletedNode() ? Field.DeletedNode : - Field.ModifiedNode; - - STObject wrapped = (STObject) get(wrapperField); - - Field finalFields = created ? Field.NewFields : - Field.FinalFields; - - // You may get some AccountRoot objects like this - if (!wrapped.has(finalFields)) { - STObject source = new STObject(wrapped.getFields()); - source.put(Hash256.index, wrapped.get(Hash256.LedgerIndex)); - source.remove(Field.LedgerIndex); - return STObject.formatted(source); - } - - // Get all the final fields - STObject finals = (STObject) wrapped.get(finalFields); - for (Field field : finals) { - mixed.put(field, finals.get(field)); - } - - // Then layer over the previous fields if desired as previous - // DirectoryNode LedgerEntryType won't have `PreviousFields` - if (asPrevious && wrapped.has(Field.PreviousFields)) { - STObject previous = wrapped.get(STObject.PreviousFields); - for (Field field : previous) { - mixed.put(field, previous.get(field)); - } - } - - // Keep the inner most fields - for (Field field : wrapped) { - switch (field) { - case NewFields: - case PreviousFields: - case FinalFields: - continue; - default: - SerializedType value = wrapped.get(field); - if (field == Field.LedgerIndex) { - field = Field.index; - } - mixed.put(field, value); - - } - } - return STObject.formatted(mixed); - } - - public static boolean isAffectedNode(STObject source) { - return (source.size() == 1 && ( - source.has(DeletedNode) || - source.has(CreatedNode) || - source.has(ModifiedNode))); - } - - public boolean removedField(Field field) { - return nested.has(Field.PreviousFields) && - nested.get(STObject.PreviousFields).has(field) && - nested.has(Field.FinalFields) && - !nested.get(STObject.FinalFields).has(field); - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/tx/result/TransactionMeta.java b/ripple-core/src/main/java/com/ripple/core/types/known/tx/result/TransactionMeta.java deleted file mode 100644 index c25183436a..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/tx/result/TransactionMeta.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.ripple.core.types.known.tx.result; - -import com.ripple.core.coretypes.STArray; -import com.ripple.core.coretypes.STObject; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.coretypes.uint.UInt8; -import com.ripple.core.serialized.enums.EngineResult; -import com.ripple.core.types.known.sle.LedgerEntry; - -import java.util.Iterator; - -public class TransactionMeta extends STObject { - public static boolean isTransactionMeta(STObject source) { - return source.has(UInt8.TransactionResult) && - source.has(STArray.AffectedNodes); - } - - public EngineResult engineResult() { - return engineResult(this); - } - - public Iterable affectedNodes() { - STArray nodes = get(STArray.AffectedNodes); - final Iterator iterator = nodes.iterator(); - return () -> iterateAffectedNodes(iterator); - } - - private static Iterator iterateAffectedNodes(final Iterator iterator) { - return new Iterator() { - @Override - public boolean hasNext() { - return iterator.hasNext(); - } - - @Override - public AffectedNode next() { - return (AffectedNode) iterator.next(); - } - - @Override - public void remove() { - iterator.remove(); - } - }; - } - - public UInt32 transactionIndex() { - return get(UInt32.TransactionIndex); - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/tx/result/TransactionResult.java b/ripple-core/src/main/java/com/ripple/core/types/known/tx/result/TransactionResult.java deleted file mode 100644 index 2e4467bf14..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/tx/result/TransactionResult.java +++ /dev/null @@ -1,299 +0,0 @@ -package com.ripple.core.types.known.tx.result; - -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.ripple.core.coretypes.AccountID; -import com.ripple.core.coretypes.STArray; -import com.ripple.core.coretypes.STObject; -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.coretypes.hash.Index; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.fields.Field; -import com.ripple.core.serialized.enums.EngineResult; -import com.ripple.core.serialized.enums.LedgerEntryType; -import com.ripple.core.serialized.enums.TransactionType; -import com.ripple.core.types.known.sle.entries.AccountRoot; -import com.ripple.core.types.known.tx.Transaction; -import com.ripple.encodings.common.B16; -import org.json.JSONObject; - -import java.util.Map; -import java.util.TreeMap; - -public class TransactionResult implements Comparable { - // The json formatting of transaction results is a MESS - public enum Source { - request_tx_result, - request_account_tx, - request_account_tx_binary, - request_tx_binary, - ledger_transactions_expanded_with_ledger_index_injected, - transaction_subscription_notification - } - - public EngineResult engineResult; - public UInt32 ledgerIndex; - public Hash256 hash; - - // TODO: in practice this class is GENERALLY only for validated results. - // NOT strictly true as you can get results from closed but not validated - // ledgers! Though you would want to beyond testing ... - public boolean validated; - - public TransactionResult(long ledgerIndex, Hash256 hash, Transaction txn, TransactionMeta meta) { - this.ledgerIndex = new UInt32(ledgerIndex); - this.hash = hash; - this.txn = txn; - this.meta = meta; - this.engineResult = meta.engineResult(); - this.validated = true; - } - - public Transaction txn; - public TransactionMeta meta; - - public TransactionType transactionType() { - return txn.transactionType(); - } - - public AccountID createdAccount() { - AccountID destination = null; - Hash256 destinationIndex = null; - - if (transactionType() == TransactionType.Payment && meta.has(Field.AffectedNodes)) { - STArray affected = meta.get(STArray.AffectedNodes); - for (STObject node : affected) { - if (node.has(STObject.CreatedNode)) { - STObject created = node.get(STObject.CreatedNode); - if (STObject.ledgerEntryType(created) == LedgerEntryType.AccountRoot) { - if (destination == null) { - destination = txn.get(AccountID.Destination); - destinationIndex = Index.accountRoot(destination); - } - if (destinationIndex.equals(created.get(Hash256.LedgerIndex))) { - return destination; - } - } - } - } - } - return null; - } - - public Map modifiedRoots() { - TreeMap accounts = null; - - if (meta.has(Field.AffectedNodes)) { - accounts = new TreeMap<>(); - for (AffectedNode fields : meta.affectedNodes()) { - if (fields.isModifiedNode() && fields.isAccountRoot()) { - AccountRoot root = (AccountRoot) fields.nodeAsFinal(); - //noinspection StatementWithEmptyBody - if (root.account() != null) { - accounts.put(root.account(), root); - } else { - // TODO: Remember why these modified nodes have no - // FinalFields or NewFields - /* - {"ModifiedNode": { - "LedgerIndex": "2C6F7594FB7471F4983C2BC691AAC2F25F8DB88D455985B4181E053D7AB23006", - "PreviousTxnLgrSeq": 35561097, - "LedgerEntryType": "AccountRoot", - "index": "2C6F7594FB7471F4983C2BC691AAC2F25F8DB88D455985B4181E053D7AB23006", - "PreviousTxnID": "67EE84E892FBEDF5FD52D511FF1E833870A2B8104CA5FF9BA89867A528A5D3ED" - }} - * */ - } - } - } - } - return accounts; - } - - public AccountID initiatingAccount() { - return txn.get(AccountID.Account); - } - - public int compareTo(TransactionResult o2) { - TransactionResult o1 = this; - int i = o1.ledgerIndex.compareTo(o2.ledgerIndex); - if (i != 0) { - return i; - } else { - return o1.meta.transactionIndex() - .compareTo(o2.meta.transactionIndex()); - } - } - - public static TransactionResult fromJSON(ObjectNode json) { - // TODO: obviously ... - return fromJSON(new JSONObject(json.toString())); - } - - public static TransactionResult fromJSON(JSONObject json) { - boolean binary; - - String metaKey = json.has("meta") ? "meta" : "metaData"; - - String txKey = json.has("transaction") ? "transaction" : - json.has("tx") ? "tx" : - json.has("tx_blob") ? "tx_blob" : null; - - if (txKey == null && !json.has("TransactionType")) { - throw new IllegalArgumentException("This json isn't a transaction " + json); - } - - binary = txKey != null && json.get(txKey) instanceof String; - - Transaction txn; - if (txKey == null) { - // This should parse the `hash` field - txn = (Transaction) STObject.fromJSONObject(json); - } else { - txn = (Transaction) parseObject(json, txKey, binary); - if (json.has("hash")) { - txn.put(Hash256.hash, Hash256.fromHex(json.getString("hash"))); - } else if (binary) { - byte[] decode = B16.decode(json.getString(txKey)); - txn.put(Hash256.hash, Index.transactionID(decode)); - } - } - - TransactionMeta meta = (TransactionMeta) parseObject(json, metaKey, binary); - long ledger_index = json.optLong("ledger_index", 0); - if (ledger_index == 0 && !binary) { - ledger_index = json.getJSONObject(txKey).getLong("ledger_index"); - } - - TransactionResult tr = new TransactionResult(ledger_index, txn.get(Hash256.hash), txn, meta); -// if (json.has("ledger_hash")) { -// tr.ledgerHash = Hash256.fromHex(json.getString("ledger_hash")); -// } - return tr; - } - - private static STObject parseObject(JSONObject json, String key, boolean binary) { - if (binary) { - return STObject.fromHex(json.getString(key)); - } else { - JSONObject tx_json = json.getJSONObject(key); - return STObject.fromJSONObject(tx_json); - } - } - - public TransactionResult(JSONObject json, Source resultMessageSource) { - if (resultMessageSource == Source.transaction_subscription_notification) { - - engineResult = EngineResult.valueOf(json.getString("engine_result")); - validated = json.getBoolean("validated"); -// ledgerHash = Hash256.fromHex(json.getString("ledger_hash")); - ledgerIndex = new UInt32(json.getLong("ledger_index")); - - if (json.has("transaction")) { - txn = (Transaction) STObject.fromJSONObject(json.getJSONObject("transaction")); - hash = txn.get(Hash256.hash); - } - - if (json.has("meta")) { - meta = (TransactionMeta) STObject.fromJSONObject(json.getJSONObject("meta")); - } - } - else if (resultMessageSource == Source.ledger_transactions_expanded_with_ledger_index_injected) { - validated = true; - meta = (TransactionMeta) STObject.fromJSONObject(json.getJSONObject("metaData")); - txn = (Transaction) STObject.fromJSONObject(json); - hash = txn.get(Hash256.hash); - engineResult = meta.engineResult(); - ledgerIndex = new UInt32(json.getLong("ledger_index")); - - } else if (resultMessageSource == Source.request_tx_result) { - validated = json.optBoolean("validated", false); - if (validated && !json.has("meta")) { - throw new IllegalStateException("It's validated, why doesn't it have meta??"); - } - if (validated) { - meta = (TransactionMeta) STObject.fromJSONObject(json.getJSONObject("meta")); - engineResult = meta.engineResult(); - txn = (Transaction) STObject.fromJSONObject(json); - hash = txn.get(Hash256.hash); - ledgerIndex = new UInt32(json.getLong("ledger_index")); - - } - } else if (resultMessageSource == Source.request_account_tx) { - validated = json.optBoolean("validated", false); - if (validated && !json.has("meta")) { - throw new IllegalStateException("It's validated, why doesn't it have meta??"); - } - if (validated) { - JSONObject tx = json.getJSONObject("tx"); - meta = (TransactionMeta) STObject.fromJSONObject(json.getJSONObject("meta")); - engineResult = meta.engineResult(); - this.txn = (Transaction) STObject.fromJSONObject(tx); - hash = this.txn.get(Hash256.hash); - ledgerIndex = new UInt32(tx.getLong("ledger_index")); - } - } else if (resultMessageSource == Source.request_account_tx_binary || resultMessageSource == Source.request_tx_binary) { - validated = json.optBoolean("validated", false); - if (validated && !json.has("meta")) { - throw new IllegalStateException("It's validated, why doesn't it have meta??"); - } - if (validated) { - /* - { - "ledger_index": 3378767, - "meta": "201 ...", - "tx_blob": "120 ...", - "validated": true - }, - */ - boolean account_tx = resultMessageSource == Source.request_account_tx_binary; - - String tx = json.getString(account_tx ? "tx_blob" : "tx"); - byte[] decodedTx = B16.decode(tx); - meta = (TransactionMeta) STObject.fromHex(json.getString("meta")); - this.txn = (Transaction) STObject.fromBytes(decodedTx); - - if (account_tx) { - hash = Index.transactionID(decodedTx); - } else { - hash = Hash256.fromHex(json.getString("hash")); - } - this.txn.put(Field.hash, hash); - - engineResult = meta.engineResult(); - ledgerIndex = new UInt32(json.getLong("ledger_index")); - } - } - } - - @Override - public String toString() { - JSONObject object = toJSON(); - return object.toString(); - } - - public JSONObject toJSON() { - JSONObject o = new JSONObject(); - o.put("tx", txn.toJSON()); - o.put("meta", meta.toJSON()); - o.put("ledger_index", ledgerIndex); - o.put("hash", hash.toHex()); - return o; - } - - public TransactionResult copy() { - TransactionMeta metaCopy = (TransactionMeta) STObject.fromBytes(meta.toBytes()); - Transaction txnCopy = (Transaction) STObject.fromBytes(txn.toBytes()); - return new TransactionResult(ledgerIndex.longValue(), hash, txnCopy, metaCopy); - } - - public JSONObject toJSONBinary() { - JSONObject o = new JSONObject(); - - o.put("hash", hash.toHex()); - o.put("meta", meta.toHex()); - o.put("tx", txn.toHex()); - o.put("ledger_index", ledgerIndex); - - return o; - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/AccountSet.java b/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/AccountSet.java deleted file mode 100644 index 0e8a1c9672..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/AccountSet.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.ripple.core.types.known.tx.txns; - -import com.ripple.core.coretypes.Blob; -import com.ripple.core.coretypes.hash.Hash128; -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.coretypes.uint.UInt8; -import com.ripple.core.fields.Field; -import com.ripple.core.serialized.enums.TransactionType; -import com.ripple.core.types.known.tx.Transaction; - -public class AccountSet extends Transaction{ - public AccountSet() { - super(TransactionType.AccountSet); - } - public UInt32 transferRate() {return get(UInt32.TransferRate);} - public UInt32 walletSize() {return get(UInt32.WalletSize);} - public UInt32 setFlag() {return get(UInt32.SetFlag);} - public UInt32 clearFlag() {return get(UInt32.ClearFlag);} - public Hash128 emailHash() {return get(Hash128.EmailHash);} - public Hash256 walletLocator() {return get(Hash256.WalletLocator);} - public Blob messageKey() {return get(Blob.MessageKey);} - public Blob domain() {return get(Blob.Domain);} - public UInt8 tickSize() {return get(UInt8.TickSize);} - - public void transferRate(UInt32 val) {put(Field.TransferRate, val);} - public void walletSize(UInt32 val) {put(Field.WalletSize, val);} - public void setFlag(UInt32 val) {put(Field.SetFlag, val);} - public void clearFlag(UInt32 val) {put(Field.ClearFlag, val);} - public void emailHash(Hash128 val) {put(Field.EmailHash, val);} - public void walletLocator(Hash256 val) {put(Field.WalletLocator, val);} - public void messageKey(Blob val) {put(Field.MessageKey, val);} - public void domain(Blob val) {put(Field.Domain, val);} - public void tickSize(UInt8 val) { put(UInt8.TickSize, val);} - - public boolean hasTransferRate() {return has(UInt32.TransferRate);} - public boolean hasWalletSize() {return has(UInt32.WalletSize);} - public boolean hasSetFlag() {return has(UInt32.SetFlag);} - public boolean hasClearFlag() {return has(UInt32.ClearFlag);} - public boolean hasEmailHash() {return has(Hash128.EmailHash);} - public boolean hasWalletLocator() {return has(Hash256.WalletLocator);} - public boolean hasMessageKey() {return has(Blob.MessageKey);} - public boolean hasDomain() {return has(Blob.Domain);} - public boolean hasTickSize() {return has(UInt8.TickSize);} - -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/CheckCancel.java b/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/CheckCancel.java deleted file mode 100644 index f5b961f514..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/CheckCancel.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.ripple.core.types.known.tx.txns; - -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.serialized.enums.TransactionType; -import com.ripple.core.types.known.tx.Transaction; - -public class CheckCancel extends Transaction { - public CheckCancel() { - super(TransactionType.CheckCancel); - } - - public Hash256 checkID() {return get(Hash256.CheckID);} - public void checkID(Hash256 val) { put(Hash256.CheckID, val);} -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/CheckCash.java b/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/CheckCash.java deleted file mode 100644 index 8eba2458e9..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/CheckCash.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.ripple.core.types.known.tx.txns; - -import com.ripple.core.coretypes.Amount; -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.serialized.enums.TransactionType; -import com.ripple.core.types.known.tx.Transaction; - -public class CheckCash extends Transaction { - public CheckCash() { - super(TransactionType.CheckCash); - } - - public boolean hasAmount() {return has(Amount.Amount);} - public boolean hasDeliverMin() {return has(Amount.DeliverMin);} - - public Hash256 checkID() {return get(Hash256.CheckID);} - public Amount amount() {return get(Amount.Amount);} - public Amount deliverMin() {return get(Amount.DeliverMin);} - - public void checkID(Hash256 val) { put(Hash256.CheckID, val);} - public void amount(Amount val) { put(Amount.Amount, val);} - public void deliverMin(Amount val) { put(Amount.DeliverMin, val);} -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/CheckCreate.java b/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/CheckCreate.java deleted file mode 100644 index b8e75a9b0f..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/CheckCreate.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.ripple.core.types.known.tx.txns; - -import com.ripple.core.coretypes.AccountID; -import com.ripple.core.coretypes.Amount; -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.serialized.enums.TransactionType; -import com.ripple.core.types.known.tx.Transaction; - -public class CheckCreate extends Transaction { - public CheckCreate() { - super(TransactionType.CheckCreate); - } - - public boolean hasExpiration() {return has(UInt32.Expiration);} - public boolean hasDestinationTag() {return has(UInt32.DestinationTag);} - public boolean hasInvoiceID() {return has(Hash256.InvoiceID);} - - public void expiration(UInt32 val) { put(UInt32.Expiration, val);} - public void destinationTag(UInt32 val) { put(UInt32.DestinationTag, val);} - public void invoiceID(Hash256 val) { put(Hash256.InvoiceID, val);} - public void sendMax(Amount val) { put(Amount.SendMax, val);} - public void destination(AccountID val) { put(AccountID.Destination, val); } - - public AccountID destination() {return get(AccountID.Destination);} - public UInt32 expiration() {return get(UInt32.Expiration);} - public UInt32 destinationTag() {return get(UInt32.DestinationTag);} - public Hash256 invoiceID() {return get(Hash256.InvoiceID);} - public Amount sendMax() {return get(Amount.SendMax);} -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/DepositPreauth.java b/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/DepositPreauth.java deleted file mode 100644 index 68f08cde32..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/DepositPreauth.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.ripple.core.types.known.tx.txns; - -import com.ripple.core.coretypes.AccountID; -import com.ripple.core.serialized.enums.TransactionType; -import com.ripple.core.types.known.tx.Transaction; - -public class DepositPreauth extends Transaction { - public DepositPreauth() { - super(TransactionType.DepositPreauth); - } - public boolean hasAuthorize() {return has(AccountID.Authorize);} - public AccountID authorize() {return get(AccountID.Authorize);} - public void authorize(AccountID val) { put(AccountID.Authorize, val);} - - public boolean hasUnauthorize() {return has(AccountID.Unauthorize);} - public AccountID unauthorize() {return get(AccountID.Unauthorize);} - public void unauthorize(AccountID val) { put(AccountID.Unauthorize, val);} - -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/EscrowCancel.java b/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/EscrowCancel.java deleted file mode 100644 index ab435bacda..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/EscrowCancel.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.ripple.core.types.known.tx.txns; - -import com.ripple.core.coretypes.AccountID; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.serialized.enums.TransactionType; -import com.ripple.core.types.known.tx.Transaction; - -public class EscrowCancel extends Transaction { - public EscrowCancel() { - super(TransactionType.EscrowCancel); - } - - public UInt32 offerSequence() {return get(UInt32.OfferSequence);} - public void offerSequence(UInt32 val) { put(UInt32.OfferSequence, val);} - public AccountID owner() {return get(AccountID.Owner);} - public void owner(AccountID val) { put(AccountID.Owner, val);} - -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/EscrowCreate.java b/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/EscrowCreate.java deleted file mode 100644 index 3587a6c191..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/EscrowCreate.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.ripple.core.types.known.tx.txns; - -import com.ripple.core.coretypes.AccountID; -import com.ripple.core.coretypes.Amount; -import com.ripple.core.coretypes.Blob; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.serialized.enums.TransactionType; -import com.ripple.core.types.known.tx.Transaction; - -public class EscrowCreate extends Transaction { - public EscrowCreate() { - super(TransactionType.EscrowCreate); - } - public boolean hasDestinationTag() {return has(UInt32.DestinationTag);} - public boolean hasCancelAfter() {return has(UInt32.CancelAfter);} - public boolean hasFinishAfter() {return has(UInt32.FinishAfter);} - public boolean hasCondition() {return has(Blob.Condition);} - - public Amount amount() {return get(Amount.Amount);} - public AccountID destination() {return get(AccountID.Destination);} - public UInt32 destinationTag() {return get(UInt32.DestinationTag);} - public UInt32 cancelAfter() {return get(UInt32.CancelAfter);} - public UInt32 finishAfter() {return get(UInt32.FinishAfter);} - public Blob condition() {return get(Blob.Condition);} - - public void destinationTag(UInt32 val) { put(UInt32.DestinationTag, val);} - public void cancelAfter(UInt32 val) { put(UInt32.CancelAfter, val);} - public void finishAfter(UInt32 val) { put(UInt32.FinishAfter, val);} - public void amount(Amount val) { put(Amount.Amount, val);} - public void condition(Blob val) { put(Blob.Condition, val);} - public void destination(AccountID val) { put(AccountID.Destination, val);} - -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/EscrowFinish.java b/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/EscrowFinish.java deleted file mode 100644 index 7b552e768d..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/EscrowFinish.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.ripple.core.types.known.tx.txns; - -import com.ripple.core.coretypes.AccountID; -import com.ripple.core.coretypes.Blob; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.serialized.enums.TransactionType; -import com.ripple.core.types.known.tx.Transaction; - -public class EscrowFinish extends Transaction { - public EscrowFinish() { - super(TransactionType.EscrowFinish); - } - - public boolean hasFulfillment() {return has(Blob.Fulfillment);} - public boolean hasCondition() {return has(Blob.Condition);} - - public UInt32 offerSequence() {return get(UInt32.OfferSequence);} - public Blob fulfillment() {return get(Blob.Fulfillment);} - public Blob condition() {return get(Blob.Condition);} - public AccountID owner() {return get(AccountID.Owner);} - - public void offerSequence(UInt32 val) { put(UInt32.OfferSequence, val);} - public void fulfillment(Blob val) { put(Blob.Fulfillment, val);} - public void condition(Blob val) { put(Blob.Condition, val);} - public void owner(AccountID val) { put(AccountID.Owner, val);} - -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/OfferCancel.java b/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/OfferCancel.java deleted file mode 100644 index 461d6cac09..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/OfferCancel.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.ripple.core.types.known.tx.txns; - -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.serialized.enums.TransactionType; -import com.ripple.core.types.known.tx.Transaction; - -public class OfferCancel extends Transaction { - public OfferCancel() { - super(TransactionType.OfferCancel); - } - public UInt32 offerSequence() {return get(UInt32.OfferSequence);} - public void offerSequence(UInt32 val) { put(UInt32.OfferSequence, val);} -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/OfferCreate.java b/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/OfferCreate.java deleted file mode 100644 index dbb783479d..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/OfferCreate.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.ripple.core.types.known.tx.txns; - -import com.ripple.core.coretypes.Amount; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.fields.Field; -import com.ripple.core.serialized.enums.TransactionType; -import com.ripple.core.types.known.tx.Transaction; - -public class OfferCreate extends Transaction { - public OfferCreate() { - super(TransactionType.OfferCreate); - } - public UInt32 expiration() {return get(UInt32.Expiration);} - public UInt32 offerSequence() {return get(UInt32.OfferSequence);} - public Amount takerPays() {return get(Amount.TakerPays);} - public Amount takerGets() {return get(Amount.TakerGets);} - public void expiration(UInt32 val) {put(Field.Expiration, val);} - public void offerSequence(UInt32 val) {put(Field.OfferSequence, val);} - public void takerPays(Amount val) {put(Field.TakerPays, val);} - public void takerGets(Amount val) {put(Field.TakerGets, val);} - - public boolean hasExpiration() {return has(UInt32.Expiration);} - public boolean hasOfferSequence() {return has(UInt32.OfferSequence);} - -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/Payment.java b/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/Payment.java deleted file mode 100644 index 10da726d71..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/Payment.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.ripple.core.types.known.tx.txns; - -import com.ripple.core.coretypes.AccountID; -import com.ripple.core.coretypes.Amount; -import com.ripple.core.coretypes.PathSet; -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.fields.Field; -import com.ripple.core.serialized.enums.TransactionType; -import com.ripple.core.types.known.tx.Transaction; - -public class Payment extends Transaction { - public Payment() { - super(TransactionType.Payment); - } - - public UInt32 destinationTag() {return get(UInt32.DestinationTag);} - public Hash256 invoiceID() {return get(Hash256.InvoiceID);} - public Amount amount() {return get(Amount.Amount);} - public Amount sendMax() {return get(Amount.SendMax);} - public AccountID destination() {return get(AccountID.Destination);} - - public PathSet paths() {return get(PathSet.Paths);} - public Amount deliverMin() {return get(Amount.DeliverMin);} - - public void destinationTag(UInt32 val) {put(Field.DestinationTag, val);} - public void invoiceID(Hash256 val) {put(Field.InvoiceID, val);} - public void deliverMin(Amount val) { put(Amount.DeliverMin, val);} - public void amount(Amount val) {put(Field.Amount, val);} - public void sendMax(Amount val) {put(Field.SendMax, val);} - public void destination(AccountID val) {put(Field.Destination, val);} - public void paths(PathSet val) {put(Field.Paths, val);} - - public boolean hasDestinationTag() {return has(UInt32.DestinationTag);} - public boolean hasInvoiceID() {return has(Hash256.InvoiceID);} - public boolean hasSendMax() {return has(Amount.SendMax);} - public boolean hasDeliverMin() {return has(Amount.DeliverMin);} - -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/PaymentChannelClaim.java b/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/PaymentChannelClaim.java deleted file mode 100644 index 8632dbd8b3..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/PaymentChannelClaim.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.ripple.core.types.known.tx.txns; - -import com.ripple.core.coretypes.Amount; -import com.ripple.core.coretypes.Blob; -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.serialized.enums.TransactionType; -import com.ripple.core.types.known.tx.Transaction; - -public class PaymentChannelClaim extends Transaction { - public PaymentChannelClaim() { - super(TransactionType.PaymentChannelClaim); - } - - public boolean hasAmount() {return has(Amount.Amount);} - public boolean hasBalance() {return has(Amount.Balance);} - public boolean hasPublicKey() {return has(Blob.PublicKey);} - public boolean hasSignature() {return has(Blob.Signature);} - - public void channel(Hash256 val) { put(Hash256.Channel, val);} - public void amount(Amount val) { put(Amount.Amount, val);} - public void balance(Amount val) { put(Amount.Balance, val);} - public void publicKey(Blob val) { put(Blob.PublicKey, val);} - public void signature(Blob val) { put(Blob.Signature, val);} - - public Hash256 channel() {return get(Hash256.Channel);} - public Amount amount() {return get(Amount.Amount);} - public Amount balance() {return get(Amount.Balance);} - public Blob publicKey() {return get(Blob.PublicKey);} - public Blob signature() {return get(Blob.Signature);} - -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/PaymentChannelCreate.java b/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/PaymentChannelCreate.java deleted file mode 100644 index 2475c637e5..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/PaymentChannelCreate.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.ripple.core.types.known.tx.txns; - -import com.ripple.core.coretypes.AccountID; -import com.ripple.core.coretypes.Amount; -import com.ripple.core.coretypes.Blob; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.serialized.enums.TransactionType; -import com.ripple.core.types.known.tx.Transaction; - -public class PaymentChannelCreate extends Transaction { - public PaymentChannelCreate() { - super(TransactionType.PaymentChannelCreate); - } - - public boolean hasDestinationTag() {return has(UInt32.DestinationTag);} - public boolean hasCancelAfter() {return has(UInt32.CancelAfter);} - - public void destinationTag(UInt32 val) { put(UInt32.DestinationTag, val);} - public void cancelAfter(UInt32 val) { put(UInt32.CancelAfter, val);} - public void settleDelay(UInt32 val) { put(UInt32.SettleDelay, val);} - public void amount(Amount val) { put(Amount.Amount, val);} - public void publicKey(Blob val) { put(Blob.PublicKey, val);} - public void destination(AccountID val) { put(AccountID.Destination, val);} - - public UInt32 destinationTag() {return get(UInt32.DestinationTag);} - public UInt32 cancelAfter() {return get(UInt32.CancelAfter);} - public UInt32 settleDelay() {return get(UInt32.SettleDelay);} - public Amount amount() {return get(Amount.Amount);} - public Blob publicKey() {return get(Blob.PublicKey);} - public AccountID destination() {return get(AccountID.Destination);} - -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/PaymentChannelFund.java b/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/PaymentChannelFund.java deleted file mode 100644 index 85ccff90f4..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/PaymentChannelFund.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.ripple.core.types.known.tx.txns; - -import com.ripple.core.coretypes.Amount; -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.serialized.enums.TransactionType; -import com.ripple.core.types.known.tx.Transaction; - -public class PaymentChannelFund extends Transaction { - public PaymentChannelFund() { - super(TransactionType.PaymentChannelFund); - } - public boolean hasExpiration() {return has(UInt32.Expiration);} - - public UInt32 expiration() {return get(UInt32.Expiration);} - public Hash256 channel() {return get(Hash256.Channel);} - public Amount amount() {return get(Amount.Amount);} - - public void expiration(UInt32 val) { put(UInt32.Expiration, val);} - public void channel(Hash256 val) { put(Hash256.Channel, val);} - public void amount(Amount val) { put(Amount.Amount, val);} - -} - diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/SetRegularKey.java b/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/SetRegularKey.java deleted file mode 100644 index 5d139c75f9..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/SetRegularKey.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.ripple.core.types.known.tx.txns; - -import com.ripple.core.coretypes.AccountID; -import com.ripple.core.serialized.enums.TransactionType; -import com.ripple.core.types.known.tx.Transaction; - -public class SetRegularKey extends Transaction { - public SetRegularKey() { - super(TransactionType.SetRegularKey); - } - public boolean hasRegularKey() {return has(AccountID.RegularKey);} - public AccountID regularKey() {return get(AccountID.RegularKey);} - public void regularKey(AccountID val) { put(AccountID.RegularKey, val);} -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/SignerListSet.java b/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/SignerListSet.java deleted file mode 100644 index 830381f8ff..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/SignerListSet.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.ripple.core.types.known.tx.txns; - -import com.ripple.core.coretypes.STArray; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.serialized.enums.TransactionType; -import com.ripple.core.types.known.tx.Transaction; - -public class SignerListSet extends Transaction { - public SignerListSet() { - super(TransactionType.SignerListSet); - } - public boolean hasSignerEntries() {return has(STArray.SignerEntries);} - - public UInt32 signerQuorum() {return get(UInt32.SignerQuorum);} - public STArray signerEntries() {return get(STArray.SignerEntries);} - - public void signerQuorum(UInt32 val) { put(UInt32.SignerQuorum, val);} - public void signerEntries(STArray val) { put(STArray.SignerEntries, val);} - -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/TicketCancel.java b/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/TicketCancel.java deleted file mode 100644 index a75f525e52..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/TicketCancel.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.ripple.core.types.known.tx.txns; - -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.serialized.enums.TransactionType; -import com.ripple.core.types.known.tx.Transaction; - -public class TicketCancel extends Transaction { - public TicketCancel() { - super(TransactionType.TicketCancel); - } - public Hash256 ticketID() { - return get(Hash256.TicketID); - } - public void ticketID(Hash256 id) { - put(Hash256.TicketID, id); - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/TicketCreate.java b/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/TicketCreate.java deleted file mode 100644 index 4e8ac5fb3f..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/TicketCreate.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.ripple.core.types.known.tx.txns; - -import com.ripple.core.coretypes.AccountID; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.serialized.enums.TransactionType; -import com.ripple.core.types.known.tx.Transaction; - -public class TicketCreate extends Transaction { - public TicketCreate() { - super(TransactionType.TicketCreate); - } - - public boolean hasExpiration() {return has(UInt32.Expiration);} - public boolean hasTarget() {return has(AccountID.Target);} - - public UInt32 expiration() {return get(UInt32.Expiration);} - public AccountID target() {return get(AccountID.Target);} - - public void expiration(UInt32 val) { put(UInt32.Expiration, val);} - public void target(AccountID val) { put(AccountID.Target, val);} - -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/TrustSet.java b/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/TrustSet.java deleted file mode 100644 index ba5702c2e4..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/TrustSet.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.ripple.core.types.known.tx.txns; - -import com.ripple.core.coretypes.Amount; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.fields.Field; -import com.ripple.core.serialized.enums.TransactionType; -import com.ripple.core.types.known.tx.Transaction; - -public class TrustSet extends Transaction { - public TrustSet() { - super(TransactionType.TrustSet); - } - - public UInt32 qualityIn() {return get(UInt32.QualityIn);} - public UInt32 qualityOut() {return get(UInt32.QualityOut);} - public Amount limitAmount() {return get(Amount.LimitAmount);} - public void qualityIn(UInt32 val) {put(Field.QualityIn, val);} - public void qualityOut(UInt32 val) {put(Field.QualityOut, val);} - public void limitAmount(Amount val) {put(Field.LimitAmount, val);} - - public boolean hasQualityIn() {return has(UInt32.QualityIn);} - public boolean hasQualityOut() {return has(UInt32.QualityOut);} - public boolean hasLimitAmount() {return has(Amount.LimitAmount);} - -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/pseudo/EnableAmendment.java b/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/pseudo/EnableAmendment.java deleted file mode 100644 index b65fc929e6..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/pseudo/EnableAmendment.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.ripple.core.types.known.tx.txns.pseudo; - -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.serialized.enums.TransactionType; -import com.ripple.core.types.known.tx.Transaction; - -public class EnableAmendment extends Transaction { - public EnableAmendment() { - super(TransactionType.EnableAmendment); - } - - public UInt32 ledgerSequence() {return get(UInt32.LedgerSequence);} - public void ledgerSequence(UInt32 val) { put(UInt32.LedgerSequence, val);} - public Hash256 amendment() {return get(Hash256.Amendment);} - public void amendment(Hash256 val) { put(Hash256.Amendment, val);} -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/pseudo/SetFee.java b/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/pseudo/SetFee.java deleted file mode 100644 index 800f13e35f..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/known/tx/txns/pseudo/SetFee.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.ripple.core.types.known.tx.txns.pseudo; - -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.coretypes.uint.UInt64; -import com.ripple.core.serialized.enums.TransactionType; -import com.ripple.core.types.known.tx.Transaction; - -public class SetFee extends Transaction { - public SetFee() { - super(TransactionType.SetFee); - } - public boolean hasLedgerSequence() {return has(UInt32.LedgerSequence);} - - public void ledgerSequence(UInt32 val) { put(UInt32.LedgerSequence, val);} - public void referenceFeeUnits(UInt32 val) { put(UInt32.ReferenceFeeUnits, val);} - public void reserveBase(UInt32 val) { put(UInt32.ReserveBase, val);} - public void reserveIncrement(UInt32 val) { put(UInt32.ReserveIncrement, val);} - public void baseFee(UInt64 val) { put(UInt64.BaseFee, val);} - - public UInt32 ledgerSequence() {return get(UInt32.LedgerSequence);} - public UInt32 referenceFeeUnits() {return get(UInt32.ReferenceFeeUnits);} - public UInt32 reserveBase() {return get(UInt32.ReserveBase);} - public UInt32 reserveIncrement() {return get(UInt32.ReserveIncrement);} - public UInt64 baseFee() {return get(UInt64.BaseFee);} -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/ledger/LedgerHeader.java b/ripple-core/src/main/java/com/ripple/core/types/ledger/LedgerHeader.java deleted file mode 100644 index 240b0f6da8..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/ledger/LedgerHeader.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.ripple.core.types.ledger; - -import com.ripple.core.binary.STReader; -import com.ripple.core.coretypes.RippleDate; -import com.ripple.core.coretypes.hash.HalfSha512; -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.coretypes.hash.prefixes.HashPrefix; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.coretypes.uint.UInt64; -import com.ripple.core.coretypes.uint.UInt8; -import com.ripple.core.serialized.BinaryParser; -import com.ripple.core.serialized.BytesSink; -import org.json.JSONObject; -import org.json.JSONWriter; - -import java.util.Date; - -public class LedgerHeader { - // Always 0x4C475200 (LWR) (Secures signed objects) - public UInt32 version = HashPrefix.ledgerMaster.uInt32(); - - public UInt32 sequence; // Ledger Sequence (0 for genesis ledger) - public UInt64 totalXRP; // - public Hash256 previousLedger; // The hash of the previous ledger (0 for genesis ledger) - public Hash256 transactionHash; // The hash of the transaction tree's root node. - public Hash256 stateHash; // The hash of the state tree's root node. - public UInt32 parentCloseTime; // The time the previous ledger closed - public UInt32 closeTime; // UTC minute ledger closed encoded as seconds since 1/1/2000 (or 0 for genesis ledger) - public UInt8 closeResolution; // The resolution (in seconds) of the close time - public UInt8 closeFlags; // Flags - - public Date closeDate; - - public static LedgerHeader fromParser(BinaryParser parser) { - return fromReader(new STReader(parser)); - } - public static LedgerHeader fromHex(String ledger_data) { - return LedgerHeader.fromParser(new BinaryParser(ledger_data)); - } - - public static LedgerHeader fromReader(STReader reader) { - LedgerHeader ledger = new LedgerHeader(); - - ledger.sequence = reader.uInt32(); - ledger.totalXRP = reader.uInt64(); - ledger.previousLedger = reader.hash256(); - ledger.transactionHash= reader.hash256(); - ledger.stateHash = reader.hash256(); - ledger.parentCloseTime = reader.uInt32(); - ledger.closeTime = reader.uInt32(); - ledger.closeResolution = reader.uInt8(); - ledger.closeFlags = reader.uInt8(); - - ledger.closeDate = RippleDate.fromSecondsSinceRippleEpoch(ledger.closeTime); - - return ledger; - } - - public void toBytesSink(BytesSink sink) { - sequence.toBytesSink(sink); - totalXRP.toBytesSink(sink); - previousLedger.toBytesSink(sink); - transactionHash.toBytesSink(sink); - stateHash.toBytesSink(sink); - parentCloseTime.toBytesSink(sink); - closeTime.toBytesSink(sink); - closeResolution.toBytesSink(sink); - closeFlags.toBytesSink(sink); - } - - public Hash256 hash() { - HalfSha512 half = HalfSha512.prefixed256(HashPrefix.ledgerMaster); - toBytesSink(half); - return half.finish(); - } - - public void toJSONWriter(JSONWriter writer) { - writer.key("ledger_index"); - writer.value(sequence.toJSON()); - writer.key("total_coins"); - writer.value(totalXRP.toString(10)); - writer.key("parent_hash"); - writer.value(previousLedger.toJSON()); - writer.key("transaction_hash"); - writer.value(transactionHash.toJSON()); - writer.key("account_hash"); - writer.value(stateHash.toJSON()); - writer.key("close_time"); - writer.value(closeTime.toJSON()); - writer.key("close_time_human"); - // TODO - writer.value(RippleDate.gmtString(RippleDate.fromSecondsSinceRippleEpoch(closeTime))); - writer.key("parent_close_time"); - writer.value(parentCloseTime.toJSON()); - writer.key("close_time_resolution"); - writer.value(closeResolution.toJSON()); - writer.key("close_flags"); - writer.value(closeFlags.toJSON()); - } - - public JSONObject toJSON() { - StringBuilder builder = new StringBuilder(); - JSONWriter jsonWriter = new JSONWriter(builder); - jsonWriter.object(); - toJSONWriter(jsonWriter); - jsonWriter.endObject(); - return new JSONObject(builder.toString()); - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/shamap/AccountState.java b/ripple-core/src/main/java/com/ripple/core/types/shamap/AccountState.java deleted file mode 100644 index c6eaadd3fa..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/shamap/AccountState.java +++ /dev/null @@ -1,341 +0,0 @@ -package com.ripple.core.types.shamap; - -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonToken; -import com.fasterxml.jackson.core.TreeNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.ripple.core.coretypes.STObject; -import com.ripple.core.coretypes.Vector256; -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.coretypes.hash.Index; -import com.ripple.core.coretypes.uint.UInt32; -import com.ripple.core.serialized.enums.LedgerEntryType; -import com.ripple.core.types.known.sle.LedgerEntry; -import com.ripple.core.types.known.sle.LedgerHashes; -import com.ripple.core.types.known.sle.entries.DirectoryNode; -import com.ripple.core.types.known.sle.entries.OfferDirectory; -import org.json.JSONArray; -import org.json.JSONObject; -import org.json.JSONTokener; -import org.json.JSONWriter; - -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.io.Reader; -import java.util.Iterator; - -public class AccountState extends ShaMap { - public AccountState() { - super(); - } - public AccountState(boolean isCopy, int depth) { - super(isCopy, depth); - } - - @Override - protected ShaMapInner makeInnerOfSameClass(int depth) { - return new AccountState(true, depth); - } - - private static LedgerHashes newSkipList(Hash256 skipIndex) { - LedgerHashes skip; - skip = new LedgerHashes(); - skip.put(UInt32.Flags, new UInt32(0)); - skip.hashes(new Vector256()); - skip.index(skipIndex); - return skip; - } - - public void updateSkipLists(long currentIndex, Hash256 parentHash) { - long prev = currentIndex - 1; - - if ((prev & 0xFF) == 0) { - Hash256 skipIndex = Index.ledgerHashes(prev); - LedgerHashes skip = createOrUpdateSkipList(skipIndex); - Vector256 hashes = skip.hashes(); - assert hashes.size() <= 256; - hashes.add(parentHash); - skip.put(UInt32.LastLedgerSequence, new UInt32(prev)); - } - - Hash256 skipIndex = Index.ledgerHashes(); - LedgerHashes skip = createOrUpdateSkipList(skipIndex); - Vector256 hashes = skip.hashes(); - - if (hashes.size() > 256) throw new AssertionError(); - if (hashes.size() == 256) { - hashes.remove(0); - } - - hashes.add(parentHash); - skip.put(UInt32.LastLedgerSequence, new UInt32(prev)); - } - - private LedgerHashes createOrUpdateSkipList(Hash256 skipIndex) { - PathToIndex path = pathToIndex(skipIndex); - ShaMapInner top = path.dirtyOrCopyInners(); - LedgerEntryItem item; - - if (path.hasMatchedLeaf()) { - ShaMapLeaf leaf = path.invalidatedPossiblyCopiedLeafForUpdating(); - item = (LedgerEntryItem) leaf.item; - } else { - item = new LedgerEntryItem(newSkipList(skipIndex)); - top.addLeafToTerminalInner(new ShaMapLeaf(skipIndex, item)); - } - return (LedgerHashes) item.entry; - } - - public boolean addLE(LedgerEntry entry) { - LedgerEntryItem item = new LedgerEntryItem(entry); - return addItem(entry.index(), item); - } - - public boolean updateLE(LedgerEntry entry) { - LedgerEntryItem item = new LedgerEntryItem(entry); - return updateItem(entry.index(), item); - } - - public LedgerEntry getLE(Hash256 index) { - LedgerEntryItem item = (LedgerEntryItem) getItem(index); - return item == null ? null : item.value(); - } - - public DirectoryNode getDirectoryNode(Hash256 index) { - return (DirectoryNode) getLE(index); - } - - public Iterable offerDirectories(Hash256 bookBase) { - final QualityIterator iter = qualityIterator(bookBase); - - return new Iterable() { - @Override - public Iterator iterator() { - return new Iterator() { - @Override - public boolean hasNext() { - boolean hasNext = iter.hasNext(); - // In case we need to skip some entries - if (hasNext && !(iter.next() instanceof OfferDirectory)) { - return this.hasNext(); - } - return hasNext; - } - - @Override - public OfferDirectory next() { - return (OfferDirectory) iter.next(); - } - - @Override - public void remove() { - throw new UnsupportedOperationException(); - } - }; - } - }; - } - - public void writeEntriesArray(final JSONWriter writer) { - writer.array(); - walkEntries(entry -> writer.value(entry.toJSON())); - writer.endArray(); - } - - // Assumes shamap won't be modified during iteration, not unusual for an - // iterator. - public class QualityIterator implements Iterator { - ShaMapInner[] inners = new ShaMapInner[64]; - Hash256 base; - Hash256 end; - int[] selections = new int[64]; - int commonNibblets; - int depth; - ShaMapLeaf next; - private boolean finished = false; - - public QualityIterator(Hash256 start) { - base = start; - depth=0; - end = Index.bookEnd(start); - ShaMapInner inner = AccountState.this; - setInner(inner); - setSelected(start.nibblet(depth)); - findCommonNibblets(); - } - - private void findCommonNibblets() { - for (int i = 0; i < 64; i++) { - if (base.nibblet(i) == end.nibblet(i)) { - commonNibblets = i; - } else { - break; - } - } - } - - private void setInner(ShaMapInner inner) { - inners[depth] = inner; - } - - private void findNext() { - next = null; - - while (true) { - while (selected() > 15) { - depth--; - incrementSelection(); - } - if (depth < commonNibblets && selected() > end.nibblet(depth)) { - finished = true; - break; - } - ShaMapInner current = currentInner(); - ShaMapNode branch = current.getBranch(selected()); - if (branch == null) { - incrementSelection(); - } else if (branch.isInner()) { - depth++; - setInner(branch.asInner()); - setSelected(base.nibblet(depth)); - } else if (branch.isLeaf()) { - ShaMapLeaf leaf = branch.asLeaf(); - Hash256 leafIndex = leaf.index; - boolean leafIsOnPathToBase = depth < commonNibblets; - if ( leafIsOnPathToBase || leafIndex.compareTo(base) > 0 && - leafIndex.compareTo(end) < 0) { - next = leaf; - incrementSelection(); - } else { - finished = true; - } - break; - } - } - } - - private ShaMapInner currentInner() { - return inners[depth]; - } - private int selected() { - return selections[depth]; - } - private void setSelected(int nibblet) { - selections[depth] = nibblet; - } - private void incrementSelection() { - selections[depth]++; - } - - @Override - public boolean hasNext() { - findNext(); - return !finished && next != null; - } - @Override - public LedgerEntry next() { - // Just assume hasNext has been called - LedgerEntryItem item = (LedgerEntryItem) next.item; - return item.entry; - } - @Override - public void remove() { - throw new UnsupportedOperationException(); - } - } - - public QualityIterator qualityIterator(final Hash256 bookBase) { - return new QualityIterator(bookBase); - } - - public Iterable directoryIterator(OfferDirectory forQuality) { - // TODO: create an actual iterator - Vector256 indexes = new Vector256(); - OfferDirectory cursor = forQuality; - - while (cursor != null) { - indexes.addAll(cursor.indexes()); - if (cursor.hasNextIndex()) { - LedgerEntry le = getLE(cursor.nextIndex()); - if (le instanceof OfferDirectory) { - cursor = (OfferDirectory) le; - } - else { - break; - } - } - else { - break; - } - } - return indexes; - } - - public void walkEntries(final LedgerEntryVisitor walker) { - walkLeaves(leaf -> { - LedgerEntryItem item = (LedgerEntryItem) leaf.item; - walker.onEntry(item.entry); - }); - } - - // TODO - public Hash256 getNextIndex(Hash256 nextIndex, Hash256 bookEnd) { - return null; - } - - @Override - public AccountState copy() { - return (AccountState) super.copy(); - } - - public static AccountState loadFromLedgerDump(String filePath) { - try { - FileReader reader = new FileReader(filePath); - return loadFromLedgerDump(reader); - } catch (FileNotFoundException e) { - throw new RuntimeException(e); - } - } - - public static AccountState loadFromLedgerDump(Reader reader) { - try { - JsonFactory jsonFactory = new JsonFactory(); - JsonParser parser = jsonFactory.createParser(reader); - JsonToken jsonToken = parser.nextToken(); - if (jsonToken != JsonToken.START_OBJECT) { - throw new AssertionError(); - } - - String accountState = "accountState"; - - // TODO: - while (parser.nextToken() != null) { - String currentName = parser.getCurrentName(); - if (currentName.equals(accountState)) { - break; - } - } - - if (!parser.getCurrentName().equals("accountState")) { - throw new IllegalStateException("No `accountState` field found!"); - } - - AccountState state = new AccountState(); - ObjectMapper mapper = new ObjectMapper(); - if (parser.nextToken() != JsonToken.START_ARRAY) { - throw new AssertionError(); - } - - while (parser.nextToken() != JsonToken.END_ARRAY) { - TreeNode treeNode = mapper.readTree(parser); - state.addLE((LedgerEntry) STObject.fromJacksonObject((ObjectNode) treeNode)); - } - return state; - } catch (IOException e) { - throw new RuntimeException(e); - } - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/shamap/AccountStateBuilder.java b/ripple-core/src/main/java/com/ripple/core/types/shamap/AccountStateBuilder.java deleted file mode 100644 index 1b43203db7..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/shamap/AccountStateBuilder.java +++ /dev/null @@ -1,320 +0,0 @@ -package com.ripple.core.types.shamap; - -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.fields.Field; -import com.ripple.core.types.known.sle.LedgerEntry; -import com.ripple.core.types.known.sle.ThreadedLedgerEntry; -import com.ripple.core.types.known.sle.entries.*; -import com.ripple.core.types.known.tx.result.AffectedNode; -import com.ripple.core.types.known.tx.result.TransactionResult; - -import java.util.*; - -public class AccountStateBuilder { - private AccountState state; - private AccountState previousState = null; - private long targetLedgerIndex; - public long nextTransactionIndex = 0; - private Hash256 targetAccountHash; - public long totalTransactions = 0; - - private TreeSet directoriesModifiedMoreThanOnceByTransaction = new TreeSet<>(); - private TreeSet directoriesModifiedByTransaction = new TreeSet<>(); - public TreeSet ledgerModifiedEntries = new TreeSet<>(); - public TreeSet ledgerDeletedEntries = new TreeSet<>(); - - public boolean sortedDirectories = true; - - public void resetModified() { - ledgerModifiedEntries.clear(); - ledgerDeletedEntries.clear(); - directoriesModifiedMoreThanOnceByTransaction.clear(); - } - - public AccountStateBuilder(AccountState state, long targetLedgerIndex) { - this.state = state; - setStateCheckPoint(); - this.targetLedgerIndex = targetLedgerIndex; - } - - public void onLedgerClose(long ledgerIndex, Hash256 accountHash, Hash256 parentHash) { - state.updateSkipLists(ledgerIndex, parentHash); - targetLedgerIndex = ledgerIndex; - targetAccountHash = accountHash; - nextTransactionIndex = 0; - } - - public void setStateCheckPoint() { - previousState = state.copy(); - } - - public void onTransaction(TransactionResult tr) { - System.out.println("adding tx: " + tr.hash); - if (tr.meta.transactionIndex().longValue() != nextTransactionIndex) throw new AssertionError(); - if (tr.ledgerIndex.longValue() != targetLedgerIndex + 1) throw new AssertionError(String.format("%d != %d", tr.ledgerIndex.longValue(), targetLedgerIndex + 1)); - nextTransactionIndex++; - totalTransactions++; - directoriesModifiedByTransaction = new TreeSet<>(); - - for (AffectedNode an : sortedAffectedNodes(tr)) { - Hash256 id = an.ledgerIndex(); - LedgerEntry le = an.nodeAsFinal(); - - if (an.isCreatedNode()) { - ledgerModifiedEntries.add(id); - ledgerDeletedEntries.remove(id); - le.setDefaults(); - state.addLE(le); - - if (le instanceof Offer) { - Offer offer = (Offer) le; - offer.setOfferDefaults(); // TODO / TODO - - for (Hash256 directory : offer.directoryIndexes()) { - DirectoryNode dn = getDirectoryForUpdating(directory); - Hash256 index = offer.index(); - addToDirectoryNode(dn, index); - } - } else if (le instanceof RippleState) { - RippleState state = (RippleState) le; - - for (Hash256 directory : state.directoryIndexes()) { - DirectoryNode dn = getDirectoryForUpdating(directory); - addToDirectoryNode(dn, state.index()); - } - } - - if (le instanceof IndexedLedgerEntry) { - IndexedLedgerEntry owned = (IndexedLedgerEntry) le; - for (Hash256 directory : owned.ownerDirectoryIndexes(tr.txn)) { - DirectoryNode dn = getDirectoryForUpdating(directory); - addToDirectoryNode(dn, owned.index()); - } - } - - if (le instanceof ThreadedLedgerEntry) { - ThreadedLedgerEntry tle = (ThreadedLedgerEntry) le; - tle.previousTxnID(tr.hash); - tle.previousTxnLgrSeq(tr.ledgerIndex); - } - } else if (an.isDeletedNode()) { - ledgerModifiedEntries.remove(id); - ledgerDeletedEntries.add(id); - directoriesModifiedMoreThanOnceByTransaction.remove(id); - state.removeLeaf(id); - if (le instanceof Offer) { - Offer offer = (Offer) le; - for (Hash256 directory : offer.directoryIndexes()) { - DirectoryNode dn = getDirectoryForUpdating(directory); - if (dn != null) { -// Hash256 index = offer.index(); - if (dn.owner() != null) { - deleteFromDirectoryUnstable(offer, dn); - } else { - deleteFromDirectoryStable(offer, dn); - } - } - } - } else if (le instanceof RippleState) { - RippleState state = (RippleState) le; - for (Hash256 directory : state.directoryIndexes()) { - DirectoryNode dn = getDirectoryForUpdating(directory); - if (dn != null) { - deleteFromDirectoryUnstable(le, dn); - } - } - } else if (le instanceof IndexedLedgerEntry) { - IndexedLedgerEntry owned = (IndexedLedgerEntry) le; - for (Hash256 directory : owned.ownerDirectoryIndexes(tr.txn)) { - DirectoryNode dn = getDirectoryForUpdating(directory); - deleteFromDirectoryUnstable(le, dn); - } - } - } else if (an.isModifiedNode()) { - ledgerModifiedEntries.add(id); - ShaMapLeaf leaf = state.getLeafForUpdating(id); - LedgerEntryItem item = (LedgerEntryItem) leaf.item; - LedgerEntry leModded = item.entry; - - if (le instanceof ThreadedLedgerEntry) { - ThreadedLedgerEntry tle = (ThreadedLedgerEntry) le; - tle.previousTxnID(tr.hash); - tle.previousTxnLgrSeq(tr.ledgerIndex); - } - for (Field field : le) { - // Already have the `index` - if (field == Field.LedgerIndex) { - continue; - } - leModded.put(field, le.get(field)); - } - // Find all removed fields - ArrayList removed = new ArrayList<>(); - for (Field field : leModded) { - if (an.removedField(field)) { - removed.add(field); - } - } - removed.forEach(leModded::remove); - } - } - } - - private void deleteFromDirectoryUnstable(LedgerEntry b4, DirectoryNode dn) { - boolean b = directoryRemoveUnstable(dn, b4.index()); - DirectoryNode cursor = dn; - - if (!b) { - while (cursor.indexNext() != null) { - cursor = getDirectoryForUpdating(cursor.nextIndex()); - b = directoryRemoveUnstable(cursor, b4.index()); - if (b) { - break; - } - } - } -// - if (!b) { - cursor = dn; - while (cursor.indexPrevious() != null) { - cursor = getDirectoryForUpdating(cursor.prevIndex()); - b = directoryRemoveUnstable(cursor, b4.index()); - if (b) { - break; - } - } - } - } - private void deleteFromDirectoryStable(LedgerEntry b4, DirectoryNode dn) { - boolean b = directoryRemoveStable(dn, b4.index()); - DirectoryNode cursor = dn; - - if (!b) { - while (cursor.hasIndexPrevious()) { - cursor = getDirectoryForUpdating(cursor.prevIndex()); - b = directoryRemoveStable(cursor, b4.index()); - if (b) { - break; - } - } - } - if (!b) { - while (cursor.indexNext() != null) { - cursor = getDirectoryForUpdating(cursor.nextIndex()); - b = directoryRemoveStable(cursor, b4.index()); - if (b) { - break; - } - } - } - } - - public static Collection makeCollection(Iterable iter) { - Collection list = new ArrayList<>(); - for (E item : iter) { - list.add(item); - } - return list; - } - private ArrayList sortedAffectedNodes(TransactionResult tr) { - ArrayList sorted = new ArrayList<>(makeCollection(tr.meta.affectedNodes())); - sorted.sort(Comparator.comparingInt(this::getOrdinal)); - return sorted; - } - - private int getOrdinal(AffectedNode o1) { - switch (o1.ledgerEntryType()) { - case DirectoryNode: - return 10; - case RippleState: - return 20; - case Offer: - return 30; - case Escrow: - case SignerList: - case PayChannel: - return 21; - default: - return 40; - } - } - - private void onDirectoryModified(DirectoryNode dn) { - Hash256 index = dn.index(); - if (directoriesModifiedByTransaction.contains(index)) { - directoriesModifiedMoreThanOnceByTransaction.add(index); - } - else { - directoriesModifiedByTransaction.add(index); - } - } - private boolean directoryRemoveStable(DirectoryNode dn, Hash256 index) { - onDirectoryModified(dn); - return dn.indexes().remove(index); - } - private boolean directoryRemoveUnstable(DirectoryNode dn, Hash256 index) { - onDirectoryModified(dn); - if (sortedDirectories) { - return dn.indexes().remove(index); - } else { - return dn.indexes().removeUnstable(index); - } - } - private void addToDirectoryNode(DirectoryNode dn, Hash256 index) { - onDirectoryModified(dn); - if (dn.exchangeRate() != null) { - dn.indexes().add(index); - } else { - dn.indexes().add(index); - if (sortedDirectories) { - Collections.sort(dn.indexes()); - } - } - } - private DirectoryNode getDirectoryForUpdating(Hash256 directoryIndex) { - ShaMapLeaf leaf = state.getLeafForUpdating(directoryIndex); - if (leaf == null) { - return null; - } - LedgerEntryItem lei = (LedgerEntryItem) leaf.item; - return (DirectoryNode) lei.entry; - } - - public AccountState state() { - return state; - } - - public long currentLedgerIndex() { - return targetLedgerIndex; - } - - public String targetAccountHashHex() { - return targetAccountHash.toHex(); - } - public Hash256 targetAccountHash() { - return targetAccountHash; - } - - public TreeSet directoriesWithIndexesOutOfOrder() { - TreeSet ret = new TreeSet<>(); - for (Hash256 hash256 : directoriesModifiedMoreThanOnceByTransaction) { - DirectoryNode dn = state.getDirectoryNode(hash256); - if (dn.owner() != null) { - ret.add(hash256); - } - } - return ret; - } - - public boolean bad() { - return !state.hash().equals(targetAccountHash); - } - - public AccountState previousState() { - return previousState; - } - - public void setState(AccountState map) { - state = map; - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/shamap/BytesItem.java b/ripple-core/src/main/java/com/ripple/core/types/shamap/BytesItem.java deleted file mode 100644 index 11365302b5..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/shamap/BytesItem.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.ripple.core.types.shamap; - -import com.ripple.core.coretypes.hash.prefixes.Prefix; -import com.ripple.core.serialized.BytesSink; - -public class BytesItem extends ShaMapItem { - private byte[] item; - - public BytesItem(byte[] item) { - this.item = item; - } - - @Override - void toBytesSink(BytesSink sink) { - sink.add(item); - } - - @Override - public ShaMapItem copy() { - return this; - } - - @Override - public byte[] value() { - return item; - } - - @Override - public Prefix hashPrefix() { - return new Prefix() { - @Override - public byte[] bytes() { - return new byte[0]; - } - }; - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/shamap/HashedTreeWalker.java b/ripple-core/src/main/java/com/ripple/core/types/shamap/HashedTreeWalker.java deleted file mode 100644 index a565baf19b..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/shamap/HashedTreeWalker.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.ripple.core.types.shamap; - -import com.ripple.core.coretypes.hash.Hash256; - -public interface HashedTreeWalker { - public void onLeaf(Hash256 h, ShaMapLeaf le); - public void onInner(Hash256 h, ShaMapInner inner); -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/shamap/LeafWalker.java b/ripple-core/src/main/java/com/ripple/core/types/shamap/LeafWalker.java deleted file mode 100644 index 71f371cebe..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/shamap/LeafWalker.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.ripple.core.types.shamap; - -public interface LeafWalker { - void onLeaf(ShaMapLeaf shaMapLeaf); -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/shamap/LedgerEntryItem.java b/ripple-core/src/main/java/com/ripple/core/types/shamap/LedgerEntryItem.java deleted file mode 100644 index ea67d4bf0b..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/shamap/LedgerEntryItem.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.ripple.core.types.shamap; - -import com.ripple.core.coretypes.STObject; -import com.ripple.core.coretypes.hash.prefixes.HashPrefix; -import com.ripple.core.coretypes.hash.prefixes.Prefix; -import com.ripple.core.fields.Field; -import com.ripple.core.serialized.BytesSink; -import com.ripple.core.types.known.sle.LedgerEntry; - -public class LedgerEntryItem extends ShaMapItem { - public LedgerEntryItem(LedgerEntry entry) { - this.entry = entry; - } - - public LedgerEntry entry; - - @Override - void toBytesSink(BytesSink sink) { - entry.toBytesSink(sink); - } - - @Override - public String toString() { - return entry.prettyJSON(); - } - - @Override - public ShaMapItem copy() { - STObject object = STObject.fromBytes(entry.toBytes()); - LedgerEntry le = (LedgerEntry) object; - // TODO: what about other auxiliary (non serialized) fields - le.index(entry.index()); - return new LedgerEntryItem(le); - } - - @Override - public LedgerEntry value() { - return entry; - } - - @Override - public Prefix hashPrefix() { - return HashPrefix.leafNode; - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/shamap/LedgerEntryVisitor.java b/ripple-core/src/main/java/com/ripple/core/types/shamap/LedgerEntryVisitor.java deleted file mode 100644 index 6ce639b552..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/shamap/LedgerEntryVisitor.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.ripple.core.types.shamap; - -import com.ripple.core.types.known.sle.LedgerEntry; - -public interface LedgerEntryVisitor { - public void onEntry(LedgerEntry entry); -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/shamap/NodeStore.java b/ripple-core/src/main/java/com/ripple/core/types/shamap/NodeStore.java deleted file mode 100644 index 8d1bd98eee..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/shamap/NodeStore.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.ripple.core.types.shamap; - -import com.ripple.core.coretypes.hash.HalfSha512; -import com.ripple.core.coretypes.hash.Hash256; - -/** - - * This is a toy implementation for illustrative purposes. - */ -public class NodeStore { - /** - * In ripple, all data is stored in a simple binary key/value database. - * The keys are 256 bit binary strings and the values are binary strings of - * arbitrary length. - */ - public static interface KeyValueBackend { - void put(Hash256 key, byte[] content); - byte[] get(Hash256 key); - } - - KeyValueBackend backend; - public NodeStore(KeyValueBackend backend) { - this.backend = backend; - } - /** - * All data stored is keyed by the hash of it's contents. - * Ripple uses the first 256 bits of a sha512 as it's 33 percent - * faster than using sha256. - * - * @return `key` used to store the content - */ - private Hash256 storeContent(byte[] content) { - HalfSha512 hasher = new HalfSha512(); - hasher.update(content); - Hash256 key = hasher.finish(); - storeHashKeyedContent(key, content); - return key; - } - - /** - * @param hash As ripple uses the `hash` of the contents as the - * NodeStore key, `hash` is pervasively used in lieu of - * the term `key`. - */ - private void storeHashKeyedContent(Hash256 hash, byte[] content) { - // Note: The real nodestore actually prepends some metadata, which doesn't - // contribute to the hash. - backend.put(hash, content); // metadata + content - } - - /** - * The complement to `set` api, which together form a simple public interface. - */ - public byte[] get(Hash256 hash) { - return backend.get(hash); - - } - /** - * The complement to `get` api, which together form a simple public interface. - */ - public Hash256 set(byte[] content) { - return storeContent(content); - } -} \ No newline at end of file diff --git a/ripple-core/src/main/java/com/ripple/core/types/shamap/PathToIndex.java b/ripple-core/src/main/java/com/ripple/core/types/shamap/PathToIndex.java deleted file mode 100644 index dcc0dfd56e..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/shamap/PathToIndex.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.ripple.core.types.shamap; - -import com.ripple.core.coretypes.hash.Hash256; - -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.Iterator; - -public class PathToIndex { - public Hash256 index; - public ShaMapLeaf leaf; - - private ArrayDeque inners; - private ShaMapInner[] dirtied; - private boolean matched = false; - - public boolean hasLeaf() { - return leaf != null; - } - public boolean leafMatchedIndex() { - return matched; - } - public boolean copyLeafOnUpdate() { - return leaf.version != dirtied[0].version; - } - - int size() { - return inners.size(); - } - - public ShaMapInner top() { - return dirtied[dirtied.length - 1]; - } - - // returns the - public ShaMapInner dirtyOrCopyInners() { - if (maybeCopyOnWrite()) { - int ix = 0; - // We want to make a uniformly accessed array of the inners - dirtied = new ShaMapInner[inners.size()]; - // from depth 0 to 1, to 2, to 3, don't be fooled by the api - Iterator it = inners.descendingIterator(); - - // This is actually the root which COULD be the top of the stack - // Think about it ;) - ShaMapInner top = it.next(); - dirtied[ix++] = top; - top.invalidate(); - - while (it.hasNext()) { - ShaMapInner next = it.next(); - boolean doCopies = next.version != top.version; - - if (doCopies) { - ShaMapInner copy = next.copy(top.version); - copy.invalidate(); - top.setBranch(index, copy); - next = copy; - } else { - next.invalidate(); - } - top = next; - dirtied[ix++] = top; - } - return top; - } else { - copyInnersToDirtiedArray(); - return inners.peekFirst(); - } - } - - public boolean hasMatchedLeaf() { - return hasLeaf() && leafMatchedIndex(); - } - - public void collapseOnlyLeafChildInners() { - assert dirtied != null; - - ShaMapInner next; - ShaMapLeaf onlyChild = null; - - for (int i = dirtied.length - 1; i >= 0; i--) { - next = dirtied[i]; - if (onlyChild != null) { - next.setLeaf(onlyChild); - } - onlyChild = next.onlyChildLeaf(); - if (onlyChild == null) { - break; - } - } - } - - private void copyInnersToDirtiedArray() { - int ix = 0; - dirtied = new ShaMapInner[inners.size()]; - Iterator descending = inners.descendingIterator(); - while (descending.hasNext()) { - ShaMapInner next = descending.next(); - dirtied[ix++] = next; - next.invalidate(); - } - } - - private boolean maybeCopyOnWrite() { - return inners.peekLast().doCoW; - } - - public PathToIndex(ShaMapInner root, Hash256 index) { - this.index = index; - makeStack(root, index); - } - - private void makeStack(ShaMapInner root, Hash256 index) { - inners = new ArrayDeque<>(); - ShaMapInner top = root; - - while (true) { - inners.push(top); - ShaMapNode existing = top.getBranch(index); - if (existing == null) { - break; - } else if (existing.isLeaf()) { - leaf = existing.asLeaf(); - matched = leaf.index.equals(index); - break; - } - else if (existing.isInner()) { - top = existing.asInner(); - } - } - } - - public ShaMapLeaf invalidatedPossiblyCopiedLeafForUpdating() { - assert matched; - if (dirtied == null) { - dirtyOrCopyInners(); - } - ShaMapLeaf theLeaf = leaf; - - if (copyLeafOnUpdate()) { - theLeaf = leaf.copy(); - top().setLeaf(theLeaf); - } - theLeaf.invalidate(); - return theLeaf; - } - - public ArrayList topDownList() { - ArrayList path = new ArrayList<>(); - Iterator shaMapInnerIterator = inners.descendingIterator(); - shaMapInnerIterator.forEachRemaining(path::add); - path.add(leaf); - return path; - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/shamap/README.md b/ripple-core/src/main/java/com/ripple/core/types/shamap/README.md deleted file mode 100644 index a78bc3ad73..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/shamap/README.md +++ /dev/null @@ -1,319 +0,0 @@ -Rippled NodeStore ------------------ - -To understand a ShaMap first you must know about the NodeStore. - -```java -/** - - * This is a toy implementation for illustrative purposes. - */ -public class NodeStore { - /** - * In ripple, all data is stored in a simple binary key/value database. - * The keys are 256 bit binary strings and the values are binary strings of - * arbitrary length. - */ - public interface KeyValueBackend { - void put(Hash256 key, byte[] content); - byte[] get(Hash256 key); - } - - KeyValueBackend backend; - public NodeStore(KeyValueBackend backend) { - this.backend = backend; - } - /** - * All data stored is keyed by the hash of it's contents. - * Ripple uses the first 256 bits of a sha512 as it's 33 percent - * faster than using sha256. - * - * @return `key` used to store the content - */ - private Hash256 storeContent(byte[] content) { - Hash256.HalfSha512 hasher = new Hash256.HalfSha512(); - hasher.update(content); - Hash256 key = hasher.finish(); - storeHashKeyedContent(key, content); - return key; - } - - /** - * @param hash As ripple uses the `hash` of the contents as the - * NodeStore key, `hash` is pervasively used in lieu of - * the term `key`. - */ - private void storeHashKeyedContent(Hash256 hash, byte[] content) { - // Note: The real NodeStore actually prepends some metadata, which doesn't - // contribute to the hash. - backend.put(hash, content); // metadata + content - } - - /** - * The complement to `set` api, which together form a simple public interface. - */ - public byte[] get(Hash256 hash) { - return backend.get(hash); - - } - /** - * The complement to `get` api, which together form a simple public interface. - */ - public Hash256 set(byte[] content) { - return storeContent(content); - } -} -``` - -See also: -* [Serialized Types](../../../../../../../../README.md) -* [BinaryFormats.txt (historical)](https://github.com/ripple/rippled/blob/07df5f1f81b0ee1ab641d134ba8e940a90f5297e/BinaryFormats.txt#L2-L6) - -Excerpt from BinaryFormats.txt (historical): - -
- All signed or hashed objects must have well-defined binary formats at the - byte level. These formats do not have to be the same as the network wire - formats or the forms used for efficient storage or human display. However, - it must always be possible to precisely re-create, byte for byte, any signed - or hashed object. Otherwise, the signatures or hashes cannot be validated. -
- -Note that currently (26/Jan/2018) the NodeStore stores it in the hashing form. - -What is a ShaMap? ------------------ - -A ShaMap is a special type of tree, used as a way to index values stored in a -`NodeStore` - -Recall that values in the NodeStore are keyed by the hash of their contents. - -But what about identities that change over time? How can you retrieve a certain -version of something? What could be used as an enduring identifier? The value -must have some component[s] that are static over time. These are fed into a -hashing function to create a 256 bit identifier. - -But how is this used? You can only query values by `hash` in the NodeStore. The -hash, as a function of a value would obviously change along with it. - -The identifier is used as an `index` into a ShaMap tree, which in ripple, is -representative of a point in time. In fact a ShaMap can be hashed -deterministically, thus a point in time can be identified by a `hash`. Where is -a ShaMap actually stored? In the NodeStore, of course. - -But the NodeStore only stores binary content you protest! But the ShaMap has a -binary representation! So what are the `contents` of a ShaMap, to be hashed to -be stored in the NodeStore? - -Glad you asked. A tree, has a root, and many children, either more branches, or -terminal leaves. The root, and any of its children that have children -themselves, are classed as `inner nodes`. - -In a ShaMap these `inner nodes` each have 16 `slots` for children. The binary -representation of these is simply 16 `hash`es, used to retrieve child nodes from -the NodeStore. - -An example of an inner node's `contents` - - Empty slots are represented as 32 0 bytes - - ``` - 022CC592F5D4ABC3A63DA2A036CDDC0825B30717C78EF287BEF200056133FDA2 - 0000000000000000000000000000000000000000000000000000000000000000 - BEE626551799DDFE65BD2D9A0F0EA24D72C93CFD8E083176718D2B079EC60214 - E1B34F1D9209CB668A50CCEE71C8109D140A6D715D923AEE98E6D53015D8B66B - 4C27A856094CFDE37CD2A0EA93DADB595B10CFEC55F816C987A6AC48D13AF5C0 - 2F770714A9EF92792F44AA1537C18F68AFE3FFF157FB9088FFE2BDA695C19B71 - C915CA982310CF41CF1266AA43C3B31ACBF4304D05ADB54A352D942C890763A3 - F29FAD442CE204513BEA555A4192E324407444D946449CEA510C37A9BB982134 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 44B3BE10744EA2DA010D530C6AE64E3C3984DA7701EE79A66EA429EC11B87D1D - 0C7BE8569E9F08BADDEB91EBE79E5B98BBF245B067B7B83B4A95430CFEC9F7E8 - BB38EA169DB6A020EA820BD1242DDB6250B397A26015507BA3C7F3C041EA683C - 0000000000000000000000000000000000000000000000000000000000000000 - 15B98934D22B5CB7233C42CE8DC8DD0D2328AB91CC574332C45D7160BD31D4AD - 1894E389AE4A63BA99C2D0546A58A976ECDAB14C09B98F532999B464696E29E5 - ``` - -What about those `index` thingies again? Remember, the `index` can't be used to -query something directly in the NodeStore. - -First you need a known point in time, which we learned could be defined by a -`hash` of a ShaMap. - -* shamap hash: 2F049AEE51C7C96AB911AF86E3278F4F90A38D196422A832617FF0C6F29C3704 -* value index: FEEE5CC92B64375C8FEE56D54A82B9965E44FE0DCF673DBF27D0AA93F8AFF4FB - -Imagine we have those above. First we query the NodeStore with `2F049A...` - -What do we expect back? A ShaMap hash is the hash of the binary representation -of the root node (which is an `inner node`) of the tree, so we'd expect -something in the form shown earlier, with 16 256 bit hashes. - -From the NodeStore we retrieve: - - ``` - 4D494E00 - 3C926652404076CA35EA1D89580975C50DCD0B29EC16079F168BE63BB1D6F237 - F0D3F178C56C438C597D53FF5E3D44EE3865C17A0D25DCC2460F20BE4BEB4B7E - D65D6CA291E451E6D6566A5431D755A749D9B0450E83B376148A6F93349ACD46 - 309B18093008055BE23E118DA4243DFC9AEF66E3260E2008BD6E6E6806F06725 - 0000000000000000000000000000000000000000000000000000000000000000 - D7D5A7C89DAE6D7517EDCB0601829CB339376EECD1DE8CA0216B6C18FFD77C32 - 7C33AEB525B09A7BC013C01015D59A88129A8A6C18B45E6D7D0CA1F13E6FCB44 - AB35119A7529D4BA57C41D7020833A0E9600895F61E9E9DEABBFDF82A877CBB2 - 3BE7A48570263034E6DCBEFA6ED57B63C0592AE145341A79DAF57C3BDF7C5793 - 17006AD967A1536E0441517990AD5B42890A3168AC9E045EAF9AC5A06F672561 - 94B12B8BB76D525DD9320AF51893A6D69FF730C1E647181E7A7B51FE1FBF369E - 0579A72B3209AE66840F6E8317F422F43937E6AE1A14C8B30243DE016551643F - B873AA4EF1CDF0332C59BE423256610C4C6A1D32E2A1F8DE748390E29E8FC2D3 - EB03A93BBC95ED56FB73E6FBDAB8F6916BBD1BD358336CBA4DA673558F5B068C - E64A78A07CF33C3B74AEA9862B5758513677324D4C9D72C69D14B4EB64D4EB02 - 4E8C0CE75693B85A4CAC5516B77702E660A55281CF17DBE09552941F3078D81C - ``` - -We see the hashes for 16 nodes clear as day, but what is this `4D494E00` -prefixed to the front? Converted to `ascii` letters the hex `4D494E00` is -`MIN\x00`, meaning sham)ap i)nner n)ode. - -The prefix `namespaces` the content, so different classes of objects which -would otherwise have the same binary representation, will have a different -`hash`. These `hash prefixes` serve another useful purpose, as we'll see later. -(Similarly, there are namespacing prefixes for an `index` (created by - feeding static components of an identity into a hashing function)) - -Is our value `index` hash amongst those enumerated? No !!! So what do we do with -it? An index, usually means an ordinal, defining a place in an array. The -`index` is actually an index into 64 arrays. Each nibble in the `index` is an -index into the 16 slots in each inner node. - -Consider again the value `index`: - - `FEEE5CC92B64375C8FEE56D54A82B9965E44FE0DCF673DBF27D0AA93F8AFF4FB` - -To use the `index` we take the first nibble, `F` (yes, we go left to right) - -The letter `F` in hex has the ordinal value 15, so we take the 16th branch (0 -based indexing) - -We select the 16th hash - - `4E8C0CE75693B85A4CAC5516B77702E660A55281CF17DBE09552941F3078D81C` - -From the NodeStore we retrieve: - - ``` - 4D494E00 - 0000000000000000000000000000000000000000000000000000000000000000 - 286BC64A4A369857E4B0B5834C54CED797110D06E64F7759FBA2C87D3630D418 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 60631B91674954D21314B89CEE3B7F740B4FB1374610498EA1A7A3B79BA6706D - 3B1C36A6311256FE1E72BEDBA2042D67D86F561E51B387CFA680BCE9982CD6DB - 5568E7032EE018CA484C181CD68411B623229D0666AE0038708500C59402A282 - 0000000000000000000000000000000000000000000000000000000000000000 - ``` - -There's that 'MIN\x00` hash prefix again. - -In fact, this prefix is how we can deterministically say that this is an -`inner node` and that we can interpret the following bytes as 16 more -`hash`es. - -We have descended deeper into the tree, but it seems we need to go deeper. We -are currently at a depth of 2, so to go deeper we need the 2nd nibble. - -value index: - ``` - FEEE5CC92B64375C8FEE56D54A82B9965E44FE0DCF673DBF27D0AA93F8AFF4FB` - | - \ - 2nd nibble - ``` - -The letter `E` in hex has the ordinal value 14, so we take the 15th branch (0 -based indexing) - -We select the 15th hash: - - `5568E7032EE018CA484C181CD68411B623229D0666AE0038708500C59402A282` - -From the NodeStore we retrieve: - - ``` - 534E4400 - C11C12000722800000002400AA7BFF201900AA7BFC201B0226FF9464D4461B5C - A191A906000000000000000000000000455448000000000006CC4A6D023E68AA - 3499C6DE3E9F2DC52B8BA25465400000000861014A6840000000000000C17321 - 03CF1DFB34A96363FF2B91638FCE51E6D7B88419729E9A81ABC99A9512FFB9C7 - 3374463044022005ED4635AE246A4060378D9396CAA0E42F7E9129D309B2E98B - DF5CE2352520A002207D4494019EA4327F4087EA34B05CE9E5CD0AE3082BAD77 - CC3698CE5A59C21BD581140BEC53D0830ADCE9E372086E570809916C440E83C3 - F4201C00000033F8E311006F561BF352EEDB9072286286A4BBC8C419C995A171 - 0AA0CFA8B0D2B843F07D294F60E82400AA7BFF501090B86A84C7F7843673BCF8 - 2E565E69498CAEF463F8055ABA4C04581E76C9270064D4461B5CA191A9060000 - 00000000000000000000455448000000000006CC4A6D023E68AA3499C6DE3E9F - 2DC52B8BA25465400000000861014A81140BEC53D0830ADCE9E372086E570809 - 916C440E83E1E1E31100645690B86A84C7F7843673BCF82E565E69498CAEF463 - F8055ABA4C04581E76C92700E8364C04581E76C927005890B86A84C7F7843673 - BCF82E565E69498CAEF463F8055ABA4C04581E76C92700011100000000000000 - 00000000004554480000000000021106CC4A6D023E68AA3499C6DE3E9F2DC52B - 8BA254E1E1E41100645690B86A84C7F7843673BCF82E565E69498CAEF463F805 - 5ABA4C045835BF30CCBFE72200000000364C045835BF30CCBF5890B86A84C7F7 - 843673BCF82E565E69498CAEF463F8055ABA4C045835BF30CCBF011100000000 - 00000000000000004554480000000000021106CC4A6D023E68AA3499C6DE3E9F - 2DC52B8BA2540311000000000000000000000000000000000000000004110000 - 000000000000000000000000000000000000E1E1E411006F56AE4B62A73DC540 - 40E523FCE863981AB601B6D6BCD3CFCE303B43A430FC6D4DB1E7220000000024 - 00AA7BFC250226FF9133000000000000000034000000000000000055B61A418E - 421021CFBA22B02F4934B4F79B1091F91CF910AEB21DA0975CEC52AB501090B8 - 6A84C7F7843673BCF82E565E69498CAEF463F8055ABA4C045835BF30CCBF64D4 - 461B7D5C693EDF000000000000000000000000455448000000000006CC4A6D02 - 3E68AA3499C6DE3E9F2DC52B8BA25465400000000861014A81140BEC53D0830A - DCE9E372086E570809916C440E83E1E1E511006456B937CC88FCAF18886CC8D4 - B19A5326F56B0B84E06AE511407B072DE348E05376E722000000003100000000 - 0000000032000000000000000058B937CC88FCAF18886CC8D4B19A5326F56B0B - 84E06AE511407B072DE348E0537682140BEC53D0830ADCE9E372086E57080991 - 6C440E83E1E1E5110061250226FF915558E2CDAB1D8D5477D8FED6EA5EFD9F9F - D8FAC56EA907E94197900C6C6175CE9556E9293AF964F2B20467530673C8F327 - 41ED03DEF52F6B6625B4D837C155856C26E62400AA7BFF6240000000B60EBC57 - E1E722000000002400AA7C002D000000186240000000B60EBB9681140BEC53D0 - 830ADCE9E372086E570809916C440E83E1E1F1031000 - FEEE5CC92B64375C8FEE56D54A82B9965E44FE0DCF673DBF27D0AA93F8AFF4FB - ``` - -Well, here's something new. The `hash prefix` is different. This time the -hex decodes as `MLN\x00`, meaning sham)ap l)eaf n)ode. - -And what's that at the end? Is that our index? It is!! - -Why does it need to be stored? We have only used `FE` to traverse to this -node. Without storing the `index` identifier in the leaf node contents, -there would be no way to be certain that this leaf held the item you wanted. -More importantly, it acts as further name-spacing, to prevent collisions. -(Technically, you could synthesize the index, by parsing the contents of -the object and recreating it) - -Takeaways ---------- - -* A `hash` keys the NodeStore -* An `index` is a path to an item in a ShaMap -* For communication purposes - - Always use `hash` when referring to a key for the NodeStore - - Always use `index` when referring to a key for a ShaMap - -Links ------ - -* [Rippled Hash Prefix declarations](../../coretypes/hash/prefixes/HashPrefix.java) \ No newline at end of file diff --git a/ripple-core/src/main/java/com/ripple/core/types/shamap/ShaMap.java b/ripple-core/src/main/java/com/ripple/core/types/shamap/ShaMap.java deleted file mode 100644 index 0129eb7c4a..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/shamap/ShaMap.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.ripple.core.types.shamap; - -import java.util.concurrent.atomic.AtomicInteger; - -public class ShaMap extends ShaMapInner { - private AtomicInteger copies; - - public ShaMap() { - super(0); - // This way we can copy the first to the second, - // copy the second, then copy the first again ;) - copies = new AtomicInteger(); - } - public ShaMap(boolean isCopy, int depth) { - super(isCopy, depth, 0); - } - - @Override - protected ShaMapInner makeInnerOfSameClass(int depth) { - return new ShaMap(true, depth); - } - - public ShaMap copy() { - version = copies.incrementAndGet(); - ShaMap copy = (ShaMap) copy(copies.incrementAndGet()); - copy.copies = copies; - return copy; - } - -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/shamap/ShaMapDiff.java b/ripple-core/src/main/java/com/ripple/core/types/shamap/ShaMapDiff.java deleted file mode 100644 index 41e23d50e1..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/shamap/ShaMapDiff.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.ripple.core.types.shamap; - -import com.ripple.core.coretypes.hash.Hash256; - -import java.util.TreeSet; - -public class ShaMapDiff { - public ShaMap one, two; - - public TreeSet modified = new TreeSet<>(); - public TreeSet deleted = new TreeSet<>(); - public TreeSet added = new TreeSet<>(); - - public ShaMapDiff(ShaMap one, ShaMap two) { - this.one = one; - this.two = two; - } - - // Find what's added, modified and deleted in `two` - public ShaMapDiff find() { - one.hash(); - two.hash(); - compare(one, two); - return this; - } - - public ShaMapDiff inverted() { - ShaMapDiff shaMapDiff = new ShaMapDiff(two, one); - - shaMapDiff.added = deleted; - shaMapDiff.modified = modified; - shaMapDiff.deleted = added; - - return shaMapDiff; - } - - public void apply(ShaMap sa) { - for (Hash256 mod : modified) { - boolean modded = sa.updateItem(mod, two.getItem(mod).copy()); - if (!modded) throw new AssertionError(); - } - - for (Hash256 add : added) { - boolean added = sa.addItem(add, two.getItem(add).copy()); - if (!added) throw new AssertionError(); - } - for (Hash256 delete : deleted) { - boolean removed = sa.removeLeaf(delete); - if (!removed) throw new AssertionError(); - } - } - private void compare(ShaMapInner a, ShaMapInner b) { - for (int i = 0; i < 16; i++) { - ShaMapNode aChild = a.getBranch(i); - ShaMapNode bChild = b.getBranch(i); - - if (aChild == null && bChild != null) { - trackAdded(bChild); - // added in B - } else if (aChild != null && bChild == null) { - trackRemoved(aChild); - // removed from B - } else if (aChild != null && !aChild.hash().equals(bChild.hash())) { - boolean aleaf = aChild.isLeaf(), - bLeaf = bChild.isLeaf(); - - if (aleaf && bLeaf) { - ShaMapLeaf la = (ShaMapLeaf) aChild; - ShaMapLeaf lb = (ShaMapLeaf) bChild; - if (la.index.equals(lb.index)) { - modified.add(la.index); - } else { - deleted.add(la.index); - added.add(lb.index); - } - } else if (aleaf /*&& bInner*/) { - ShaMapLeaf la = (ShaMapLeaf) aChild; - ShaMapInner ib = (ShaMapInner) bChild; - trackAdded(ib); - - //noinspection Duplicates - if (ib.hasLeaf(la.index)) { - // because trackAdded would have added it - added.remove(la.index); - ShaMapLeaf leaf = ib.getLeaf(la.index); - if (!leaf.hash().equals(la.hash())) { - modified.add(la.index); - } - } else { - deleted.add(la.index); - } - } else if (bLeaf /*&& aInner*/) { - ShaMapLeaf lb = (ShaMapLeaf) bChild; - ShaMapInner ia = (ShaMapInner) aChild; - trackRemoved(ia); - - //noinspection Duplicates - if (ia.hasLeaf(lb.index)) { - // because trackRemoved would have deleted it - deleted.remove(lb.index); - ShaMapLeaf leaf = ia.getLeaf(lb.index); - if (!leaf.hash().equals(lb.hash())) { - modified.add(lb.index); - } - } else { - added.add(lb.index); - } - } else /*if (aInner && bInner)*/ { - compare((ShaMapInner) aChild, (ShaMapInner) bChild); - } - } - } - } - - private void trackRemoved(ShaMapNode child) { - child.walkAnyLeaves(leaf -> deleted.add(leaf.index)); - } - - private void trackAdded(ShaMapNode child) { - child.walkAnyLeaves(leaf -> added.add(leaf.index)); - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/shamap/ShaMapInner.java b/ripple-core/src/main/java/com/ripple/core/types/shamap/ShaMapInner.java deleted file mode 100644 index f7d73dae65..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/shamap/ShaMapInner.java +++ /dev/null @@ -1,331 +0,0 @@ -package com.ripple.core.types.shamap; - -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.coretypes.hash.prefixes.HashPrefix; -import com.ripple.core.coretypes.hash.prefixes.Prefix; -import com.ripple.core.serialized.BytesSink; - -import java.util.Iterator; - -public class ShaMapInner extends ShaMapNode implements Iterable { - public int depth; - int slotBits = 0; - int version = 0; - boolean doCoW; - protected ShaMapNode[] branches = new ShaMapNode[16]; - - public ShaMapInner(int depth) { - this(false, depth, 0); - } - - public ShaMapInner(boolean isCopy, int depth, int version) { - this.doCoW = isCopy; - this.depth = depth; - this.version = version; - } - - protected ShaMapInner copy(int version) { - ShaMapInner copy = makeInnerOfSameClass(depth); - System.arraycopy(branches, 0, copy.branches, 0, branches.length); - copy.slotBits = slotBits; - copy.hash = hash; - copy.version = version; - doCoW = true; - - return copy; - } - - protected ShaMapInner makeInnerOfSameClass(int depth) { - return new ShaMapInner(true, depth, version); - } - - protected ShaMapInner makeInnerChild() { - int childDepth = depth + 1; - if (childDepth >= 64) throw new AssertionError(); - return new ShaMapInner(doCoW, childDepth, version); - } - - // Descend into the tree, find the leaf matching this index - // and if the tree has it. - protected void setLeaf(ShaMapLeaf leaf) { - if (leaf.version == -1) { - leaf.version = version; - } - setBranch(leaf.index, leaf); - } - - private void removeBranch(Hash256 index) { - removeBranch(selectBranch(index)); - } - - public void walkLeaves(LeafWalker leafWalker) { - for (ShaMapNode branch : branches) { - if (branch != null) { - if (branch.isInner()) { - branch.asInner().walkLeaves(leafWalker); - } else if (branch.isLeaf()) { - leafWalker.onLeaf(branch.asLeaf()); - } - } - } - } - - public void walkTree(TreeWalker treeWalker) { - treeWalker.onInner(this); - for (ShaMapNode branch : branches) { - if (branch != null) { - if (branch.isLeaf()) { - ShaMapLeaf ln = branch.asLeaf(); - treeWalker.onLeaf(ln); - } else if (branch.isInner()) { - ShaMapInner childInner = branch.asInner(); - childInner.walkTree(treeWalker); - } - } - } - - } - - public void walkHashedTree(HashedTreeWalker walker) { - walker.onInner(hash(), this); - - for (ShaMapNode branch : branches) { - if (branch != null) { - if (branch.isLeaf()) { - ShaMapLeaf ln = branch.asLeaf(); - walker.onLeaf(branch.hash(), ln); - } else if (branch.isInner()) { - ShaMapInner childInner = branch.asInner(); - childInner.walkHashedTree(walker); - } - } - } - } - - /** - * @return the `only child` leaf or null if other children - */ - public ShaMapLeaf onlyChildLeaf() { - ShaMapLeaf leaf = null; - int leaves = 0; - - for (ShaMapNode branch : branches) { - if (branch != null) { - if (branch.isInner()) { - leaf = null; - break; - } else if (++leaves == 1) { - leaf = branch.asLeaf(); - } else { - leaf = null; - break; - } - } - } - return leaf; - } - - public boolean removeLeaf(Hash256 index) { - PathToIndex path = pathToIndex(index); - if (path.hasMatchedLeaf()) { - ShaMapInner top = path.dirtyOrCopyInners(); - top.removeBranch(index); - path.collapseOnlyLeafChildInners(); - return true; - } else { - return false; - } - } - - public ShaMapItem getItem(Hash256 index) { - ShaMapLeaf leaf = getLeaf(index); - - @SuppressWarnings("unchecked") - ShaMapItem shaMapItem = leaf == null ? null : leaf.item; - return shaMapItem; - } - - public boolean addItem(Hash256 index, ShaMapItem item) { - return addLeaf(new ShaMapLeaf(index, item)); - } - - public boolean updateItem(Hash256 index, ShaMapItem item) { - return updateLeaf(new ShaMapLeaf(index, item)); - } - - public boolean hasLeaf(Hash256 index) { - return pathToIndex(index).hasMatchedLeaf(); - } - - public ShaMapLeaf getLeaf(Hash256 index) { - PathToIndex stack = pathToIndex(index); - if (stack.hasMatchedLeaf()) { - return stack.leaf; - } else { - return null; - } - } - - public boolean addLeaf(ShaMapLeaf leaf) { - PathToIndex stack = pathToIndex(leaf.index); - if (stack.hasMatchedLeaf()) { - return false; - } else { - ShaMapInner top = stack.dirtyOrCopyInners(); - top.addLeafToTerminalInner(leaf); - return true; - } - } - - public boolean updateLeaf(ShaMapLeaf leaf) { - PathToIndex stack = pathToIndex(leaf.index); - if (stack.hasMatchedLeaf()) { - ShaMapInner top = stack.dirtyOrCopyInners(); - // Why not update in place? Because of structural sharing - top.setLeaf(leaf); - return true; - } else { - return false; - } - } - - public PathToIndex pathToIndex(Hash256 index) { - return new PathToIndex(this, index); - } - - /** - * This should only be called on the deepest inners, as it - * does not do any dirtying. - * @param leaf to add to inner - */ - void addLeafToTerminalInner(ShaMapLeaf leaf) { - ShaMapNode branch = getBranch(leaf.index); - if (branch == null) { - setLeaf(leaf); - } else if (branch.isInner()) { - // This should never be called - throw new AssertionError(); - } else if (branch.isLeaf()) { - ShaMapInner inner = makeInnerChild(); - setBranch(leaf.index, inner); - inner.addLeafToTerminalInner(leaf); - inner.addLeafToTerminalInner(branch.asLeaf()); - } - } - - protected void setBranch(Hash256 index, ShaMapNode node) { - setBranch(selectBranch(index), node); - } - - protected ShaMapNode getBranch(Hash256 index) { - return getBranch(index.nibblet(depth)); - } - - public ShaMapNode getBranch(int i) { - return branches[i]; - } - - public ShaMapNode branch(int i) { - return branches[i]; - } - - protected int selectBranch(Hash256 index) { - return index.nibblet(depth); - } - - public boolean hasLeaf(int i) { - return branches[i].isLeaf(); - } - public boolean hasInner(int i) { - return branches[i].isInner(); - } - public boolean hasNone(int i) {return branches[i] == null;} - - private void setBranch(int slot, ShaMapNode node) { - slotBits = slotBits | (1 << slot); - branches[slot] = node; - invalidate(); - } - - private void removeBranch(int slot) { - branches[slot] = null; - slotBits = slotBits & ~(1 << slot); - } - public boolean empty() { - return slotBits == 0; - } - - @Override public boolean isLeaf() { return false; } - @Override public boolean isInner() { return true; } - - @Override - Prefix hashPrefix() { - return HashPrefix.innerNode; - } - - @Override - public void toBytesSink(BytesSink sink) { - for (ShaMapNode branch : branches) { - if (branch != null) { - branch.hash().toBytesSink(sink); - } else { - Hash256.ZERO_256.toBytesSink(sink); - } - } - } - - @Override - public Hash256 hash() { - if (empty()) { - // empty inners have a hash of all ZERO - // it's only valid for a root node to be empty - // any other inner node, must contain at least a - // single leaf - assert depth == 0; - return Hash256.ZERO_256; - } else { - // hash the hashPrefix() and toBytesSink - return super.hash(); - } - } - - public ShaMapLeaf getLeafForUpdating(Hash256 leaf) { - PathToIndex path = pathToIndex(leaf); - if (path.hasMatchedLeaf()) { - return path.invalidatedPossiblyCopiedLeafForUpdating(); - } - return null; - } - - @Override - public Iterator iterator() { - return new Iterator() { - int ix = 0; - - @Override - public boolean hasNext() { - return ix != 16; - } - - @Override - public ShaMapNode next() { - return branch(ix++); - } - - @Override - public void remove() { - throw new UnsupportedOperationException(); - } - }; - } - - public int branchCount() { - int populated = 0; - for (ShaMapNode branch : branches) { - if (branch != null) { - populated ++; - } - } - return populated; - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/shamap/ShaMapItem.java b/ripple-core/src/main/java/com/ripple/core/types/shamap/ShaMapItem.java deleted file mode 100644 index a8ec303dbb..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/shamap/ShaMapItem.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.ripple.core.types.shamap; - -import com.ripple.core.coretypes.hash.prefixes.Prefix; -import com.ripple.core.serialized.BytesSink; - -abstract public class ShaMapItem { - abstract void toBytesSink(BytesSink sink); - public abstract ShaMapItem copy(); - public abstract T value(); - public abstract Prefix hashPrefix(); -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/shamap/ShaMapLeaf.java b/ripple-core/src/main/java/com/ripple/core/types/shamap/ShaMapLeaf.java deleted file mode 100644 index 3a79dacb94..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/shamap/ShaMapLeaf.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.ripple.core.types.shamap; - -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.coretypes.hash.prefixes.Prefix; -import com.ripple.core.serialized.BytesSink; - -public class ShaMapLeaf extends ShaMapNode { - public Hash256 index; - public ShaMapItem item; - public long version = -1; - - protected ShaMapLeaf(Hash256 index, ShaMapItem item) { - this.index = index; - this.item = item; - } - - @Override public boolean isLeaf() {return true;} - @Override public boolean isInner() {return false;} - - @Override - Prefix hashPrefix() { - return item.hashPrefix(); - } - - @Override - public void toBytesSink(BytesSink sink) { - item.toBytesSink(sink); - index.toBytesSink(sink); - } - - public ShaMapLeaf copy() { - return new ShaMapLeaf(index, item.copy()); - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/shamap/ShaMapNode.java b/ripple-core/src/main/java/com/ripple/core/types/shamap/ShaMapNode.java deleted file mode 100644 index c5e6d00aca..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/shamap/ShaMapNode.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.ripple.core.types.shamap; - -import com.ripple.core.coretypes.hash.HalfSha512; -import com.ripple.core.coretypes.hash.Hash256; -import com.ripple.core.coretypes.hash.prefixes.Prefix; -import com.ripple.core.serialized.BytesSink; - -abstract public class ShaMapNode { - protected Hash256 hash; - - // This saves a lot of instanceof checks - public abstract boolean isLeaf(); - public abstract boolean isInner(); - - public ShaMapLeaf asLeaf() { - return (ShaMapLeaf) this; - } - public ShaMapInner asInner() { - return (ShaMapInner) this; - } - - abstract Prefix hashPrefix(); - abstract public void toBytesSink(BytesSink sink); - - public void invalidate() {hash = null;} - public Hash256 hash() { - if (hash == null) { - hash = createHash(); - } - return hash; - } - private Hash256 createHash() { - HalfSha512 half = HalfSha512.prefixed256(hashPrefix()); - toBytesSink(half); - return half.finish(); - } - /** - * Walk any leaves, possibly this node itself, if it's terminal. - */ - public void walkAnyLeaves(LeafWalker leafWalker) { - if (isLeaf()) { - leafWalker.onLeaf(asLeaf()); - } else { - asInner().walkLeaves(leafWalker); - } - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/shamap/TransactionResultItem.java b/ripple-core/src/main/java/com/ripple/core/types/shamap/TransactionResultItem.java deleted file mode 100644 index 9e4d34a39d..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/shamap/TransactionResultItem.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.ripple.core.types.shamap; - -import com.ripple.core.coretypes.hash.prefixes.HashPrefix; -import com.ripple.core.coretypes.hash.prefixes.Prefix; -import com.ripple.core.serialized.BinarySerializer; -import com.ripple.core.serialized.BytesSink; -import com.ripple.core.types.known.tx.result.TransactionResult; - -public class TransactionResultItem extends ShaMapItem { - public TransactionResult result; - - public TransactionResultItem(TransactionResult result) { - this.result = result; - } - - @Override - void toBytesSink(BytesSink sink) { - BinarySerializer write = new BinarySerializer(sink); - write.addLengthEncoded(result.txn); - write.addLengthEncoded(result.meta); - } - - @Override - public ShaMapItem copy() { - // that's ok right ;) these bad boys are immutable anyway - return this; - } - - @Override - public TransactionResult value() { - return result; - } - - @Override - public Prefix hashPrefix() { - return HashPrefix.txNode; - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/shamap/TransactionResultVisitor.java b/ripple-core/src/main/java/com/ripple/core/types/shamap/TransactionResultVisitor.java deleted file mode 100644 index 3993b3795d..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/shamap/TransactionResultVisitor.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.ripple.core.types.shamap; -import com.ripple.core.types.known.tx.result.TransactionResult; - -public interface TransactionResultVisitor { - public void onTransaction(TransactionResult tx); -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/shamap/TransactionTree.java b/ripple-core/src/main/java/com/ripple/core/types/shamap/TransactionTree.java deleted file mode 100644 index 72c4ac4ddc..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/shamap/TransactionTree.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.ripple.core.types.shamap; - -import com.ripple.core.types.known.tx.result.TransactionResult; - -import java.util.TreeSet; - -public class TransactionTree extends ShaMap { - public TransactionTree() { - super(); - } - - public TransactionTree(boolean isCopy, int depth) { - super(isCopy, depth); - } - - @Override - protected ShaMapInner makeInnerOfSameClass(int depth) { - return new TransactionTree(true, depth); - } - - public void addTransactionResult(TransactionResult tr) { - TransactionResultItem item = new TransactionResultItem(tr); - addItem(tr.hash, item); - } - - @Override - public TransactionTree copy() { - return (TransactionTree) super.copy(); - } - - public void walkTransactions(final TransactionResultVisitor walker) { - walkLeaves(leaf -> { - TransactionResultItem item = (TransactionResultItem) leaf.item; - walker.onTransaction(item.result); - }); - } - - public TreeSet toTreeSet() { - TreeSet result = new TreeSet<>(); - walkTransactions(result::add); - return result; - } -} diff --git a/ripple-core/src/main/java/com/ripple/core/types/shamap/TreeWalker.java b/ripple-core/src/main/java/com/ripple/core/types/shamap/TreeWalker.java deleted file mode 100644 index de225e9eaf..0000000000 --- a/ripple-core/src/main/java/com/ripple/core/types/shamap/TreeWalker.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.ripple.core.types.shamap; - -public interface TreeWalker { - public void onLeaf(ShaMapLeaf leaf); - public void onInner(ShaMapInner inner); -} diff --git a/ripple-core/src/main/java/com/ripple/crypto/Seed.java b/ripple-core/src/main/java/com/ripple/crypto/Seed.java deleted file mode 100644 index 5c0231828f..0000000000 --- a/ripple-core/src/main/java/com/ripple/crypto/Seed.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.ripple.crypto; - -import com.ripple.crypto.ecdsa.K256; -import com.ripple.crypto.ed25519.EDKeyPair; -import com.ripple.crypto.keys.IKeyPair; -import com.ripple.encodings.addresses.Addresses; -import com.ripple.encodings.base58.B58; -import com.ripple.utils.Sha512; - -import java.io.UnsupportedEncodingException; -import java.util.Arrays; - -public class Seed { - private final byte[] seedBytes; - private B58.Version version; - - public Seed(byte[] seedBytes) { - this(Addresses.SEED_K256, seedBytes); - } - - public Seed(B58.Version version, byte[] seedBytes) { - this.seedBytes = seedBytes; - this.version = version; - } - - @Override - public String toString() { - return Addresses.encode(seedBytes, version); - } - - public byte[] bytes() { - return seedBytes; - } - - public B58.Version version() { - return version; - } - - public Seed setEd25519() { - this.version = Addresses.SEED_ED25519; - return this; - } - - public IKeyPair keyPair() { - return keyPair(0); - } - - public IKeyPair rootKeyPair() { - return keyPair(-1); - } - - public IKeyPair keyPair(int account) { - if (version == Addresses.SEED_ED25519 || - Arrays.equals(version.bytes, Addresses.SEED_ED25519.bytes)) { - if (account != 0) throw new IllegalStateException(); - return EDKeyPair.from128Seed(seedBytes); - } else { - return K256.createKeyPair(seedBytes, account); - } - - } - - public static Seed fromBase58(String b58) { - B58.Decoded decoded = Addresses.decodeSeed(b58); - return new Seed(decoded.version, decoded.payload); - } - - public static Seed fromPassPhrase(String passPhrase) { - return new Seed(passPhraseToSeedBytes(passPhrase)); - } - - public static byte[] passPhraseToSeedBytes(String phrase) { - try { - return new Sha512(phrase.getBytes("utf-8")).finish128(); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); - } - } - - public static IKeyPair getKeyPair(String b58) { - return fromBase58(b58).keyPair(); - } -} - - diff --git a/ripple-core/src/main/java/com/ripple/crypto/ecdsa/ECDSASignature.java b/ripple-core/src/main/java/com/ripple/crypto/ecdsa/ECDSASignature.java deleted file mode 100644 index ab61bfec30..0000000000 --- a/ripple-core/src/main/java/com/ripple/crypto/ecdsa/ECDSASignature.java +++ /dev/null @@ -1,155 +0,0 @@ -package com.ripple.crypto.ecdsa; - -import org.bouncycastle.asn1.ASN1InputStream; -import org.bouncycastle.asn1.ASN1Integer; -import org.bouncycastle.asn1.DERSequenceGenerator; -import org.bouncycastle.asn1.DLSequence; -import org.bouncycastle.crypto.signers.ECDSASigner; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.math.BigInteger; - -public class ECDSASignature { - /** The two components of the signature. */ - public BigInteger r, s; - - /** Constructs a signature with the given components. */ - public ECDSASignature(BigInteger r, BigInteger s) { - this.r = r; - this.s = s; - } - - public static boolean isStrictlyCanonical(byte[] sig) { - return checkIsCanonical(sig, true); - } - - public static boolean checkIsCanonical(byte[] sig, boolean strict) { - // Make sure signature is canonical - // To protect against signature morphing attacks - - // Signature should be: - // <30> [ <02> ] [ <02> ] - // where - // 6 <= len <= 70 - // 1 <= lenR <= 33 - // 1 <= lenS <= 33 - - int sigLen = sig.length; - - if ((sigLen < 8) || (sigLen > 72)) - return false; - - if ((sig[0] != 0x30) || (sig[1] != (sigLen - 2))) - return false; - - // Find R and check its length - int rPos = 4, rLen = sig[rPos - 1]; - - if ((rLen < 1) || (rLen > 33) || ((rLen + 7) > sigLen)) - return false; - - // Find S and check its length - int sPos = rLen + 6, sLen = sig[sPos - 1]; - if ((sLen < 1) || (sLen > 33) || ((rLen + sLen + 6) != sigLen)) - return false; - - if ((sig[rPos - 2] != 0x02) || (sig[sPos - 2] != 0x02)) - return false; // R or S have wrong type - - if ((sig[rPos] & 0x80) != 0) - return false; // R is negative - - if ((sig[rPos] == 0) && rLen == 1) - return false; // R is zero - - if ((sig[rPos] == 0) && ((sig[rPos + 1] & 0x80) == 0)) - return false; // R is padded - - if ((sig[sPos] & 0x80) != 0) - return false; // S is negative - - if ((sig[sPos] == 0) && sLen == 1) - return false; // S is zero - - if ((sig[sPos] == 0) && ((sig[sPos + 1] & 0x80) == 0)) - return false; // S is padded - - - byte[] rBytes = new byte[rLen]; - byte[] sBytes = new byte[sLen]; - - System.arraycopy(sig, rPos, rBytes, 0, rLen); - System.arraycopy(sig, sPos, sBytes, 0, sLen); - - BigInteger r = new BigInteger(1, rBytes), s = new BigInteger(1, sBytes); - - BigInteger order = SECP256K1.order(); - - if (r.compareTo(order) != -1 || s.compareTo(order) != -1) { - return false; // R or S greater than modulus - } - if (strict) { - return order.subtract(s).compareTo(s) != -1; - } else { - return true; - } - - } - - public static ECDSASignature createSignature(byte[] hash, ECDSASigner signer) { - BigInteger[] sigs = signer.generateSignature(hash); - BigInteger r = sigs[0], s = sigs[1]; - - BigInteger otherS = SECP256K1.order().subtract(s); - if (s.compareTo(otherS) > 0) { - s = otherS; - } - - return new ECDSASignature(r, s); - } - - /** - * DER is an international standard for serializing data structures which is widely used in cryptography. - * It's somewhat like protocol buffers but less convenient. This method returns a standard DER encoding - * of the signature, as recognized by OpenSSL and other libraries. - */ - public byte[] encodeToDER() { - try { - return derByteStream().toByteArray(); - } catch (IOException e) { - throw new RuntimeException(e); // Cannot happen. - } - } - - public static ECDSASignature decodeFromDER(byte[] bytes) { - try { - ASN1InputStream decoder = new ASN1InputStream(bytes); - DLSequence seq = (DLSequence) decoder.readObject(); - ASN1Integer r, s; - try { - r = (ASN1Integer) seq.getObjectAt(0); - s = (ASN1Integer) seq.getObjectAt(1); - } catch (ClassCastException e) { - return null; - } finally { - decoder.close(); - } - // OpenSSL deviates from the DER spec by interpreting these values as unsigned, though they should not be - // Thus, we always use the positive versions. See: http://r6.ca/blog/20111119T211504Z.html - return new ECDSASignature(r.getPositiveValue(), s.getPositiveValue()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - protected ByteArrayOutputStream derByteStream() throws IOException { - // Usually 70-72 bytes. - ByteArrayOutputStream bos = new ByteArrayOutputStream(72); - DERSequenceGenerator seq = new DERSequenceGenerator(bos); - seq.addObject(new ASN1Integer(r)); - seq.addObject(new ASN1Integer(s)); - seq.close(); - return bos; - } -} diff --git a/ripple-core/src/main/java/com/ripple/crypto/ecdsa/K256.java b/ripple-core/src/main/java/com/ripple/crypto/ecdsa/K256.java deleted file mode 100644 index 1f93f23465..0000000000 --- a/ripple-core/src/main/java/com/ripple/crypto/ecdsa/K256.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.ripple.crypto.ecdsa; - -import com.ripple.utils.Sha512; -import com.ripple.utils.Utils; -import org.bouncycastle.crypto.signers.ECDSASigner; -import org.bouncycastle.math.ec.ECPoint; - -import java.math.BigInteger; - -public class K256 { - - /** - * @param secretKey secret point on the curve as BigInteger - * @return corresponding public point - */ - public static byte[] getPublic(BigInteger secretKey) { - return SECP256K1.basePointMultipliedBy(secretKey); - } - - /** - * @param secretKey secret point on the curve as BigInteger - * @return corresponding public point - */ - private static ECPoint computePublic(BigInteger secretKey) { - return SECP256K1.basePoint().multiply(secretKey); - } - - /** - * @param privateGen secret point on the curve as BigInteger - * @return the corresponding public key is the public generator - * (aka public root key, master public key). - * return as byte[] for convenience. - */ - private static ECPoint computePublicGenerator(BigInteger privateGen) { - return computePublic(privateGen); - } - - private static BigInteger computePrivateGen(byte[] seedBytes) { - return generateKey(seedBytes, null); - } - - public static byte[] computePublicKey(byte[] publicGenBytes, - int accountNumber) { - ECPoint rootPubPoint = SECP256K1.curve().decodePoint(publicGenBytes); - BigInteger scalar = generateKey(publicGenBytes, accountNumber); - ECPoint point = SECP256K1.basePoint().multiply(scalar); - ECPoint offset = rootPubPoint.add(point); - return offset.getEncoded(true); - } - - private static BigInteger computeSecretKey(BigInteger privateGen, - byte[] publicGenBytes, - int accountNumber) { - return generateKey(publicGenBytes, accountNumber) - .add(privateGen).mod(SECP256K1.order()); - } - - /** - * @param seedBytes - a bytes sequence of arbitrary length which will be hashed - * @param discriminator - nullable optional uint32 to hash - * @return a number between [1, order -1] suitable as a private key - */ - private static BigInteger generateKey(byte[] seedBytes, Integer discriminator) { - BigInteger key = null; - for (long i = 0; i <= 0xFFFFFFFFL; i++) { - Sha512 sha512 = new Sha512().add(seedBytes); - if (discriminator != null) { - sha512.addU32(discriminator); - } - sha512.addU32((int) i); - byte[] keyBytes = sha512.finish256(); - key = Utils.uBigInt(keyBytes); - if (key.compareTo(BigInteger.ZERO) > 0 && - key.compareTo(SECP256K1.order()) < 0) { - break; - } - } - return key; - } - - static ECDSASignature createECDSASignature(byte[] hash, ECDSASigner signer) { - return ECDSASignature.createSignature(hash, signer); - } - - public static K256KeyPair createKeyPair(byte[] seedBytes, int accountNumber) { - @SuppressWarnings("SpellCheckingInspection") - BigInteger priv; - BigInteger privateGen; - // The private generator (aka root private key, master private key) - privateGen = computePrivateGen(seedBytes); - ECPoint publicGen = computePublicGenerator(privateGen); - byte[] pubGenBytes = publicGen.getEncoded(true); - - if (accountNumber == -1) { - // The root keyPair - return new K256KeyPair(privateGen, publicGen, pubGenBytes); - } else { - priv = computeSecretKey(privateGen, pubGenBytes, accountNumber); - ECPoint pub = computePublic(priv); - return new K256KeyPair(priv, pub, null); - } - } -} diff --git a/ripple-core/src/main/java/com/ripple/crypto/ecdsa/K256KeyPair.java b/ripple-core/src/main/java/com/ripple/crypto/ecdsa/K256KeyPair.java deleted file mode 100644 index e417c9d85c..0000000000 --- a/ripple-core/src/main/java/com/ripple/crypto/ecdsa/K256KeyPair.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.ripple.crypto.ecdsa; - -import com.ripple.crypto.keys.IKeyPair; -import com.ripple.utils.HashUtils; -import com.ripple.utils.Utils; -import org.bouncycastle.crypto.digests.SHA256Digest; -import org.bouncycastle.crypto.params.ECPrivateKeyParameters; -import org.bouncycastle.crypto.signers.ECDSASigner; -import org.bouncycastle.crypto.signers.HMacDSAKCalculator; -import org.bouncycastle.math.ec.ECPoint; - -import java.math.BigInteger; - -public class K256KeyPair extends K256VerifyingKey implements IKeyPair { - private byte[] privateKey; - private ECPrivateKeyParameters privateKeyParameters; - - K256KeyPair(BigInteger privateKey, ECPoint pub, byte[] pubEncoded) { - super(pub, pubEncoded); - this.privateKey = Utils.padTo256(privateKey.toByteArray()); - privateKeyParameters = new ECPrivateKeyParameters(privateKey, - SECP256K1.params()); - } - - @Override - public byte[] privateKey() { - return privateKey; - } - - @Override - public byte[] signMessage(byte[] message) { - byte[] hash = HashUtils.halfSha512(message); - return signHash(hash); - } - - public byte[] signHash(byte[] bytes) { - ECDSASigner signer = newSigner(); - - ECDSASignature sig = K256.createECDSASignature(bytes, signer); - byte[] der = sig.encodeToDER(); - if (!ECDSASignature.isStrictlyCanonical(der)) { - throw new IllegalStateException("Signature is not strictly canonical"); - } - return der; - } - - private ECDSASigner newSigner() { - ECDSASigner signer = new ECDSASigner( - new HMacDSAKCalculator(new SHA256Digest())); - signer.init(true, privateKeyParameters); - return signer; - } - -} diff --git a/ripple-core/src/main/java/com/ripple/crypto/ecdsa/K256VerifyingKey.java b/ripple-core/src/main/java/com/ripple/crypto/ecdsa/K256VerifyingKey.java deleted file mode 100644 index 7681c12ef6..0000000000 --- a/ripple-core/src/main/java/com/ripple/crypto/ecdsa/K256VerifyingKey.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.ripple.crypto.ecdsa; - -import com.ripple.crypto.keys.IVerifyingKey; -import com.ripple.encodings.addresses.Addresses; -import com.ripple.utils.HashUtils; -import org.bouncycastle.crypto.params.ECPublicKeyParameters; -import org.bouncycastle.crypto.signers.ECDSASigner; -import org.bouncycastle.math.ec.ECPoint; - -public class K256VerifyingKey implements IVerifyingKey { - private final ECPublicKeyParameters keyParameters; - private final byte[] canonicalPublicKey; - - K256VerifyingKey(ECPoint publicKey, byte[] publicKeyBytes) { - if (publicKeyBytes == null) { - publicKeyBytes = publicKey.getEncoded(true); - } else if (publicKey == null) { - publicKey = SECP256K1.curve().decodePoint(publicKeyBytes); - } - canonicalPublicKey = publicKeyBytes; - keyParameters = new ECPublicKeyParameters( - publicKey, SECP256K1.params()); - } - - private K256VerifyingKey(byte[] pubKeyBytes) { - this(null, pubKeyBytes); - } - - @Override - public byte[] canonicalPubBytes() { - return canonicalPublicKey; - } - - @Override - public boolean verify(byte[] message, byte[] signature) { - byte[] bytes = HashUtils.halfSha512(message); - return verifyHash(bytes, signature); - } - - public boolean verifyHash(byte[] hash, byte[] signature) { - ECDSASigner signer = new ECDSASigner(); - signer.init(false, keyParameters); - ECDSASignature sig = ECDSASignature.decodeFromDER(signature); - return sig != null && signer.verifySignature(hash, sig.r, sig.s); - } - - public static K256VerifyingKey fromNodePublicKey(String node) { - byte[] pub = Addresses.decodeNodePublic(node); - return new K256VerifyingKey(pub); - } - - public static K256VerifyingKey fromCanonicalPubBytes(byte[] bytes) { - return new K256VerifyingKey(bytes); - } -} diff --git a/ripple-core/src/main/java/com/ripple/crypto/ecdsa/SECP256K1.java b/ripple-core/src/main/java/com/ripple/crypto/ecdsa/SECP256K1.java deleted file mode 100644 index 5350a27f75..0000000000 --- a/ripple-core/src/main/java/com/ripple/crypto/ecdsa/SECP256K1.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.ripple.crypto.ecdsa; - -import org.bouncycastle.asn1.sec.SECNamedCurves; -import org.bouncycastle.asn1.x9.X9ECParameters; -import org.bouncycastle.crypto.params.ECDomainParameters; -import org.bouncycastle.math.ec.ECCurve; -import org.bouncycastle.math.ec.ECPoint; - -import java.math.BigInteger; - -public class SECP256K1 { - private static final ECDomainParameters ecParams; - private static final X9ECParameters params; - - static { - - params = SECNamedCurves.getByName("secp256k1"); - ecParams = new ECDomainParameters(params.getCurve(), params.getG(), params.getN(), params.getH()); - } - - public static ECDomainParameters params() { - return ecParams; - } - - public static BigInteger order() { - return ecParams.getN(); - } - - - public static ECCurve curve() { - return ecParams.getCurve(); - } - - public static ECPoint basePoint() { - return ecParams.getG(); - } - - static byte[] basePointMultipliedBy(BigInteger secret) { - return basePoint().multiply(secret).getEncoded(true); - } - -} diff --git a/ripple-core/src/main/java/com/ripple/crypto/ed25519/ED25519.java b/ripple-core/src/main/java/com/ripple/crypto/ed25519/ED25519.java deleted file mode 100644 index 71da658b0c..0000000000 --- a/ripple-core/src/main/java/com/ripple/crypto/ed25519/ED25519.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.ripple.crypto.ed25519; - -import net.i2p.crypto.eddsa.spec.EdDSANamedCurveSpec; -import net.i2p.crypto.eddsa.spec.EdDSANamedCurveTable; - -public class ED25519 { - static final EdDSANamedCurveSpec ed25519 = EdDSANamedCurveTable - .getByName("Ed25519"); -} diff --git a/ripple-core/src/main/java/com/ripple/crypto/ed25519/EDKeyPair.java b/ripple-core/src/main/java/com/ripple/crypto/ed25519/EDKeyPair.java deleted file mode 100644 index 5d638617c3..0000000000 --- a/ripple-core/src/main/java/com/ripple/crypto/ed25519/EDKeyPair.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.ripple.crypto.ed25519; - -import com.ripple.crypto.keys.IKeyPair; -import com.ripple.utils.HashUtils; -import com.ripple.utils.Utils; -import net.i2p.crypto.eddsa.EdDSAEngine; -import net.i2p.crypto.eddsa.EdDSAPrivateKey; -import net.i2p.crypto.eddsa.spec.EdDSAPrivateKeySpec; -import net.i2p.crypto.eddsa.spec.EdDSAPublicKeySpec; - -import java.math.BigInteger; -import java.security.PrivateKey; - -public class EDKeyPair extends EDVerifyingKey implements IKeyPair { - - private final EdDSAPrivateKeySpec keySpec; - - private EDKeyPair(EdDSAPrivateKeySpec keySpec) { - super(new EdDSAPublicKeySpec(keySpec.getA(), ED25519.ed25519), null); - this.keySpec = keySpec; - } - - public static EDKeyPair from256Seed(byte[] seedBytes) { - EdDSAPrivateKeySpec keySpec = new EdDSAPrivateKeySpec(seedBytes, - ED25519.ed25519); - return new EDKeyPair(keySpec); - } - - public static EDKeyPair from128Seed(byte[] seedBytes) { - assert seedBytes.length == 16; - return from256Seed(HashUtils.halfSha512(seedBytes)); - } - - @Override - public byte[] privateKey() { - return keySpec.geta(); - } - - @Override - public byte[] signMessage(byte[] message) { - try { - EdDSAEngine sgr = new EdDSAEngine(sha512digest()); - PrivateKey sKey = new EdDSAPrivateKey(keySpec); - sgr.initSign(sKey); - sgr.update(message); - return sgr.sign(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - -} diff --git a/ripple-core/src/main/java/com/ripple/crypto/ed25519/EDVerifyingKey.java b/ripple-core/src/main/java/com/ripple/crypto/ed25519/EDVerifyingKey.java deleted file mode 100644 index e0c9da8d07..0000000000 --- a/ripple-core/src/main/java/com/ripple/crypto/ed25519/EDVerifyingKey.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.ripple.crypto.ed25519; - -import com.ripple.crypto.keys.IVerifyingKey; -import net.i2p.crypto.eddsa.EdDSAEngine; -import net.i2p.crypto.eddsa.EdDSAPublicKey; -import net.i2p.crypto.eddsa.spec.EdDSAPublicKeySpec; -import org.bouncycastle.util.Arrays; - -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -public class EDVerifyingKey implements IVerifyingKey { - private final EdDSAPublicKey publicKey; - private final byte[] canonicalPubBytes; - @SuppressWarnings("FieldCanBeLocal") - private final byte[] ED_PREFIX = {(byte) 0xED}; - - EDVerifyingKey(EdDSAPublicKeySpec spec, byte[] pubBytes) { - if (pubBytes == null) { - pubBytes = spec.getA().toByteArray(); - } else if (spec == null) { - spec = new EdDSAPublicKeySpec(pubBytes, ED25519.ed25519); - } - publicKey = new EdDSAPublicKey(spec); - canonicalPubBytes = Arrays.concatenate(ED_PREFIX, pubBytes); - } - - MessageDigest sha512digest() { - try { - return MessageDigest.getInstance("SHA-512"); - } catch (NoSuchAlgorithmException e) { - throw new RuntimeException(e); - } - } - - @Override - public byte[] canonicalPubBytes() { - return canonicalPubBytes; - } - - @Override - public boolean verify(byte[] message, byte[] sigBytes) { - try { - EdDSAEngine sgr = new EdDSAEngine(sha512digest()); - sgr.initVerify(publicKey); - sgr.update(message); - return sgr.verify(sigBytes); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - public static EDVerifyingKey fromCanonicalPubBytes(byte[] bytes) { - // Strip the 0xED prefix from the key - byte[] pubBytes = Arrays.copyOfRange(bytes, 1, bytes.length); - return new EDVerifyingKey(null, pubBytes); - } -} diff --git a/ripple-core/src/main/java/com/ripple/crypto/keys/IKeyPair.java b/ripple-core/src/main/java/com/ripple/crypto/keys/IKeyPair.java deleted file mode 100644 index ab76848154..0000000000 --- a/ripple-core/src/main/java/com/ripple/crypto/keys/IKeyPair.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.ripple.crypto.keys; - -public interface IKeyPair extends IVerifyingKey { - byte[] privateKey(); - byte[] signMessage(byte[] message); -} diff --git a/ripple-core/src/main/java/com/ripple/crypto/keys/IVerifyingKey.java b/ripple-core/src/main/java/com/ripple/crypto/keys/IVerifyingKey.java deleted file mode 100644 index 1b1c6ed7d0..0000000000 --- a/ripple-core/src/main/java/com/ripple/crypto/keys/IVerifyingKey.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.ripple.crypto.keys; - - -import com.ripple.crypto.ecdsa.K256VerifyingKey; -import com.ripple.crypto.ed25519.EDVerifyingKey; -import com.ripple.encodings.common.B16; -import com.ripple.utils.HashUtils; - -public interface IVerifyingKey { - default String canonicalPubHex() { - return B16.encode(canonicalPubBytes()); - } - - default byte[] id() { - return HashUtils.SHA256_RIPEMD160(canonicalPubBytes()); - } - - byte[] canonicalPubBytes(); - - boolean verify(byte[] message, byte[] sigBytes); - - static IVerifyingKey from(byte[] bytes) { - if (bytes[0] == (byte) 0xED) { - return EDVerifyingKey.fromCanonicalPubBytes(bytes); - } else { - return K256VerifyingKey.fromCanonicalPubBytes(bytes); - } - } -} \ No newline at end of file diff --git a/ripple-core/src/main/java/com/ripple/encodings/addresses/Addresses.java b/ripple-core/src/main/java/com/ripple/encodings/addresses/Addresses.java deleted file mode 100644 index 5d8022a9b6..0000000000 --- a/ripple-core/src/main/java/com/ripple/encodings/addresses/Addresses.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.ripple.encodings.addresses; - - -import com.ripple.encodings.base58.B58; -import com.ripple.encodings.basex.EncodingFormatException; -import com.ripple.encodings.basex.IBaseX; -import org.omg.IOP.Encoding; - -public class Addresses { - public static final B58 codec = new B58("rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz"); - - // Otherwise known as `family seed` - public static final B58.Version SEED_K256 = new B58.Version( - 33, "seedK256", 16); - - public static final B58.Version SEED_ED25519 = new B58.Version( - "01E14B", "seedEd25519", 16); - - public static final B58.Version ACCOUNT_ID = new B58.Version( - 0, "accountId", 20); - - public static final B58.Version NODE_PUBLIC_KEY = new B58.Version( - 28, "nodePublicKey", 33); - - public static final B58.Version NODE_PRIVATE_KEY = new B58.Version( - 33, "nodePrivateKey", 32); - - public static byte[] decode(String encoded, B58.Version version) { - return codec.decodeVersioned(encoded, version).payload; - } - - public static String encode(byte[] bytes, B58.Version version) { - return codec.encodeVersioned(bytes, version); - } - - public static byte[] decodeSeedToBytes(String seed) { - return codec.decodeVersioned(seed, SEED_K256, SEED_ED25519) - .payload; - } - - public static B58.Decoded decodeSeed(String seed) { - return codec.decodeVersioned(seed, SEED_K256, SEED_ED25519); - } - - public static String encodeSeedK256(byte[] bytes) { - return encode(bytes, SEED_K256); - } - - public static String encodeAccountID(byte[] bytes) { - return encode(bytes, ACCOUNT_ID); - } - - public static byte[] decodeAccountID(String id) { - return decode(id, ACCOUNT_ID); - } - - public static String encodeNodePublic(byte[] bytes) { - return encode(bytes, NODE_PUBLIC_KEY); - } - - public static byte[] decodeNodePublic(String base58) { - return decode(base58, NODE_PUBLIC_KEY); - } - - public static boolean isValid(String encoded, B58.Version... versions) { - try { - codec.decodeVersioned(encoded, versions); - return true; - } catch (EncodingFormatException e) { - return false; - } - } - - public static boolean isValidAccountID(String encoded) { - return isValid(encoded, ACCOUNT_ID); - } -} diff --git a/ripple-core/src/main/java/com/ripple/encodings/base58/B58.java b/ripple-core/src/main/java/com/ripple/encodings/base58/B58.java deleted file mode 100644 index a6b928824e..0000000000 --- a/ripple-core/src/main/java/com/ripple/encodings/base58/B58.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.ripple.encodings.base58; - -import com.ripple.encodings.basex.BaseX; - -public class B58 extends BaseX { - public B58(String alphabet) { - super(alphabet); - } -} diff --git a/ripple-core/src/main/java/com/ripple/encodings/basex/BaseX.java b/ripple-core/src/main/java/com/ripple/encodings/basex/BaseX.java deleted file mode 100644 index 4ebbfc871a..0000000000 --- a/ripple-core/src/main/java/com/ripple/encodings/basex/BaseX.java +++ /dev/null @@ -1,231 +0,0 @@ -package com.ripple.encodings.basex; - -import com.ripple.utils.HashUtils; - -import java.util.Arrays; - -public class BaseX implements IBaseX { - private char[] alphabet; - private final char encodedZero; - protected final int[] indexes; - - public BaseX(String alphabet_) { - if (alphabet_.length() > 256) { - throw new IllegalArgumentException(); - } - alphabet = alphabet_.toCharArray(); - indexes = new int[128]; - encodedZero = alphabet[0]; - Arrays.fill(indexes, -1); - for (int i = 0; i < alphabet.length; i++) { - indexes[alphabet[i]] = i; - } - } - - private static String repeat(int times, char repeated) { - char[] chars = new char[times]; - Arrays.fill(chars, repeated); - return new String(chars); - } - - /** - * Encodes the given bytes as a base58 string (no checksum is appended). - * - * @param input the bytes to encode - * @return the base58-encoded string - */ - @Override - public String encode(byte[] input) { - if (input.length == 0) { - return ""; - } - // Count leading zeros. - int zeros = 0; - while (zeros < input.length && input[zeros] == 0) { - ++zeros; - } - // Convert base-256 digits to base-58 digits (plus conversion to ASCII characters) - input = Arrays.copyOf(input, input.length); // since we modify it in-place - char[] encoded = new char[input.length * 2]; // upper bound - int outputStart = encoded.length; - for (int inputStart = zeros; inputStart < input.length; ) { - encoded[--outputStart] = alphabet[divmod(input, inputStart, 256, 58)]; - if (input[inputStart] == 0) { - ++inputStart; // optimization - skip leading zeros - } - } - // Preserve exactly as many leading encoded zeros in output as there were leading zeros in input. - while (outputStart < encoded.length && encoded[outputStart] == encodedZero) { - ++outputStart; - } - while (--zeros >= 0) { - encoded[--outputStart] = encodedZero; - } - // Return encoded string (including encoded leading zeros). - return new String(encoded, outputStart, encoded.length - outputStart); - } - - /** - * Decodes the given base58 string into the original data bytes. - * - * @param input the base58-encoded string to decode - * @return the decoded data bytes - * @throws EncodingFormatException if the given string is not a valid base58 string - */ - @Override - public byte[] decode(String input) throws EncodingFormatException { - if (input.length() == 0) { - return new byte[0]; - } - // Convert the base58-encoded ASCII chars to a base58 byte sequence (base58 digits). - byte[] input58 = new byte[input.length()]; - for (int i = 0; i < input.length(); ++i) { - char c = input.charAt(i); - int digit = c < 128 ? indexes[c] : -1; - if (digit < 0) { - throw new EncodingFormatException("Illegal character " + c + " at position " + i); - } - input58[i] = (byte) digit; - } - // Count leading zeros. - int zeros = 0; - while (zeros < input58.length && input58[zeros] == 0) { - ++zeros; - } - // Convert base-58 digits to base-256 digits. - byte[] decoded = new byte[input.length()]; - int outputStart = decoded.length; - for (int inputStart = zeros; inputStart < input58.length; ) { - decoded[--outputStart] = divmod(input58, inputStart, 58, 256); - if (input58[inputStart] == 0) { - ++inputStart; // optimization - skip leading zeros - } - } - // Ignore extra leading zeroes that were added during the calculation. - while (outputStart < decoded.length && decoded[outputStart] == 0) { - ++outputStart; - } - // Return decoded data (including original number of leading zeros). - return Arrays.copyOfRange(decoded, outputStart - zeros, decoded.length); - } - - /** - * Decodes the given base58 string into the original data bytes, using the checksum in the - * last 4 bytes of the decoded data to verify that the rest are correct. The checksum is - * removed from the returned data. - * - * @param input the base58-encoded string to decode (which should include the checksum) - * @throws EncodingFormatException if the input is not base 58 or the checksum does not validate. - */ - public byte[] decodeChecked(String input) throws EncodingFormatException { - byte[] decoded = decode(input); - if (decoded.length < 4) - throw new EncodingFormatException("Input too short"); - byte[] data = Arrays.copyOfRange(decoded, 0, decoded.length - 4); - byte[] checksum = Arrays.copyOfRange(decoded, decoded.length - 4, decoded.length); - byte[] actualChecksum = Arrays.copyOfRange(HashUtils.doubleDigest(data), 0, 4); - if (!Arrays.equals(checksum, actualChecksum)) - throw new EncodingFormatException("Checksum does not validate"); - return data; - } - - /** - * Divides a number, represented as an array of bytes each containing a single digit - * in the specified base, by the given divisor. The given number is modified in-place - * to contain the quotient, and the return value is the remainder. - * - * @param number the number to divide - * @param firstDigit the index within the array of the first non-zero digit - * (this is used for optimization by skipping the leading zeros) - * @param base the base in which the number's digits are represented (up to 256) - * @param divisor the number to divide by (up to 256) - * @return the remainder of the division operation - */ - private byte divmod(byte[] number, int firstDigit, int base, int divisor) { - // this is just long division which accounts for the base of the input digits - int remainder = 0; - for (int i = firstDigit; i < number.length; i++) { - int digit = (int) number[i] & 0xFF; - int temp = remainder * base + digit; - number[i] = (byte) (temp / divisor); - remainder = temp % divisor; - } - return (byte) remainder; - } - - @Override - public byte[] findPrefix(int payLoadLength, String desiredPrefix) { - if (alphabet.length != 58) { - throw new IllegalStateException("Must be base58"); - } - int totalLength = payLoadLength + 4; // for the checksum - double chars = Math.log(Math.pow(256, totalLength)) / Math.log(58); - int requiredChars = (int) Math.ceil(chars + 0.2D); - // Mess with this to see stability tests fail - int charPos = (alphabet.length / 2) - 1; - char padding = alphabet[(charPos)]; - String template = desiredPrefix + repeat(requiredChars, padding); - byte[] decoded = decode(template); - return copyOfRange(decoded, 0, decoded.length - totalLength); - } - - @Override - public String encodeVersioned(byte[] input, Version version) { - if (input.length != version.expectedLength) { - throw new IllegalArgumentException( - "input length=" + input.length + - ", expected=" + version.expectedLength); - } - return encode(concatVersionAndAddChecksum(input, version.bytes)); - } - - private byte[] concatVersionAndAddChecksum(byte[] input, byte[] version) { - byte[] buffer = new byte[input.length + version.length]; - System.arraycopy(version, 0, buffer, 0, version.length); - System.arraycopy(input, 0, buffer, version.length, input.length); - byte[] checkSum = copyOfRange(HashUtils.doubleDigest(buffer), 0, 4); - byte[] output = new byte[buffer.length + checkSum.length]; - System.arraycopy(buffer, 0, output, 0, buffer.length); - System.arraycopy(checkSum, 0, output, buffer.length, checkSum.length); - return output; - } - - public Decoded decodeVersioned(String input, - Version... possibleVersions) throws EncodingFormatException { - - byte[] buffer = decodeChecked(input); - - Version foundVersion = null; - int expectedLength = possibleVersions[0].expectedLength; - int versionLength = buffer.length - expectedLength; - byte[] versionBytes = copyOfRange(buffer, 0, versionLength); - - for (Version possible : possibleVersions) { - if (possible.expectedLength != expectedLength) { - throw new IllegalStateException(); - } - - if (Arrays.equals(possible.bytes, versionBytes)) { - foundVersion = possible; - break; - } - } - if (foundVersion == null) { - throw new EncodingFormatException("Incorrect version"); - } - - byte[] bytes = copyOfRange(buffer, versionLength, buffer.length); - if (bytes.length != expectedLength) { - throw new EncodingFormatException("Incorrect length"); - } - - return new Decoded(foundVersion, bytes); - } - - private byte[] copyOfRange(byte[] source, int from, int to) { - byte[] range = new byte[to - from]; - System.arraycopy(source, from, range, 0, range.length); - return range; - } - -} \ No newline at end of file diff --git a/ripple-core/src/main/java/com/ripple/encodings/basex/EncodingFormatException.java b/ripple-core/src/main/java/com/ripple/encodings/basex/EncodingFormatException.java deleted file mode 100644 index 4c56ffa1e9..0000000000 --- a/ripple-core/src/main/java/com/ripple/encodings/basex/EncodingFormatException.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.ripple.encodings.basex; - -public class EncodingFormatException extends RuntimeException{ - public EncodingFormatException(String message) { - super(message); - } -} diff --git a/ripple-core/src/main/java/com/ripple/encodings/basex/IBaseX.java b/ripple-core/src/main/java/com/ripple/encodings/basex/IBaseX.java deleted file mode 100644 index 84d98aa51b..0000000000 --- a/ripple-core/src/main/java/com/ripple/encodings/basex/IBaseX.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.ripple.encodings.basex; - -import com.ripple.encodings.common.B16; - -public interface IBaseX { - String encode(byte[] input); - byte[] decode(String input); - - byte[] findPrefix(int payLoadLength, String desiredPrefix); - - String encodeVersioned(byte[] input, Version version); - Decoded decodeVersioned(String input, Version... possibleVersions); - - class Decoded { - public final Version version; - public final byte[] payload; - - Decoded(Version version, byte[] payload) { - this.version = version; - this.payload = payload; - } - } - - class Version { - public final byte[] bytes; - public final String name; - public final int expectedLength; - - public Version(byte[] bytes, String name, int length) { - this.bytes = bytes; - this.name = name; - this.expectedLength = length; - } - public Version(int aByte, String name, int length) { - this(new byte[]{(byte) aByte}, name, length); - } - public Version(String hex, String name, int length) { - this(B16.decode(hex), name, length); - } - } -} diff --git a/ripple-core/src/main/java/com/ripple/encodings/common/B16.java b/ripple-core/src/main/java/com/ripple/encodings/common/B16.java deleted file mode 100644 index 9ab895721c..0000000000 --- a/ripple-core/src/main/java/com/ripple/encodings/common/B16.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.ripple.encodings.common; - - -import static org.bouncycastle.util.encoders.Hex.toHexString; - -public class B16 { - public static String toStringTrimmed(byte[] bytes) { - int offset = 0; - if (bytes[0] == 0) { - offset = 1; - } - return toHexString(bytes, offset, bytes.length - offset).toUpperCase(); - } - public static String encode(byte[] bytes) { - return toHexString(bytes).toUpperCase(); - } - public static byte[] decode(String hex) { - return org.bouncycastle.util.encoders.Hex.decode(hex); - } -} diff --git a/ripple-core/src/main/java/com/ripple/encodings/common/B64.java b/ripple-core/src/main/java/com/ripple/encodings/common/B64.java deleted file mode 100644 index e48b7d1a70..0000000000 --- a/ripple-core/src/main/java/com/ripple/encodings/common/B64.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.ripple.encodings.common; - -import org.bouncycastle.util.encoders.Base64; - -public class B64 { - public static String toString(byte[] bytes) { - return Base64.toBase64String(bytes); - } - public static byte[] decode(String string) { - return Base64.decode(string); - } -} diff --git a/ripple-core/src/main/java/com/ripple/utils/HashUtils.java b/ripple-core/src/main/java/com/ripple/utils/HashUtils.java deleted file mode 100644 index 2d79986957..0000000000 --- a/ripple-core/src/main/java/com/ripple/utils/HashUtils.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.ripple.utils; - -import org.bouncycastle.crypto.digests.RIPEMD160Digest; - -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -public class HashUtils { - private static final MessageDigest digest; - static { - try { - digest = MessageDigest.getInstance("SHA-256"); - } catch (NoSuchAlgorithmException e) { - throw new RuntimeException(e); // Can't happen. - } - } - - /** - * See {@link HashUtils#doubleDigest(byte[], int, int)}. - */ - public static byte[] doubleDigest(byte[] input) { - return doubleDigest(input, 0, input.length); - } - - /** - * Calculates the SHA-256 hash of the given byte range, and then hashes the resulting hash again. This is - * standard procedure in Bitcoin. The resulting hash is in big endian form. - */ - public static byte[] doubleDigest(byte[] input, int offset, int length) { - synchronized (digest) { - digest.reset(); - digest.update(input, offset, length); - byte[] first = digest.digest(); - return digest.digest(first); - } - } - - public static byte[] halfSha512(byte[] bytes) { - return new Sha512(bytes).finish256(); - } - - public static byte[] quarterSha512(byte[] bytes) { - return new Sha512(bytes).finish128(); - } - - public static byte[] sha512(byte[] bytes) { - return new Sha512(bytes).finish(); - } - - public static byte[] SHA256_RIPEMD160(byte[] input) { - try { - byte[] sha256 = MessageDigest.getInstance("SHA-256").digest(input); - RIPEMD160Digest digest = new RIPEMD160Digest(); - digest.update(sha256, 0, sha256.length); - byte[] out = new byte[20]; - digest.doFinal(out, 0); - return out; - } catch (NoSuchAlgorithmException e) { - throw new RuntimeException(e); // Cannot happen. - } - } -} diff --git a/ripple-core/src/main/java/com/ripple/utils/Sha512.java b/ripple-core/src/main/java/com/ripple/utils/Sha512.java deleted file mode 100644 index bafd20b134..0000000000 --- a/ripple-core/src/main/java/com/ripple/utils/Sha512.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.ripple.utils; - -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.security.NoSuchProviderException; - -public class Sha512 { - private MessageDigest messageDigest; - - public Sha512() { - try { - messageDigest = MessageDigest.getInstance("SHA-512"); - } catch (NoSuchAlgorithmException e) { - throw new RuntimeException(e); - } - } - - public Sha512(byte[] start) { - this(); - add(start); - } - - public Sha512 add(byte[] bytes) { - messageDigest.update(bytes); - return this; - } - - public Sha512 addU32(int i) { - messageDigest.update((byte) ((i >>> 24) & 0xFF)); - messageDigest.update((byte) ((i >>> 16) & 0xFF)); - messageDigest.update((byte) ((i >>> 8) & 0xFF)); - messageDigest.update((byte) ((i) & 0xFF)); - return this; - } - - private byte[] finishTaking(int size) { - byte[] hash = new byte[size]; - System.arraycopy(messageDigest.digest(), 0, hash, 0, size); - return hash; - } - - public byte[] finish128() { - return finishTaking(16); - } - - public byte[] finish256() { - return finishTaking(32); - } - - public byte[] finish() { - return messageDigest.digest(); - } -} diff --git a/ripple-core/src/main/java/com/ripple/utils/Utils.java b/ripple-core/src/main/java/com/ripple/utils/Utils.java deleted file mode 100644 index 8376f1637f..0000000000 --- a/ripple-core/src/main/java/com/ripple/utils/Utils.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.ripple.utils; - -import com.ripple.encodings.common.B16; - -import java.math.BigInteger; -import java.util.Arrays; - -public class Utils { - public static String bigHex(BigInteger bn) { - return B16.toStringTrimmed(bn.toByteArray()); - } - - public static BigInteger uBigInt(byte[] bytes) { - return new BigInteger(1, bytes); - } - - public static byte[] leadingZeroesTrimmedOrPaddedTo(int size, byte[] bytes) { - if (bytes.length == size) { - return bytes; - } - if (bytes.length > size) { - int length = bytes.length; - int offset = 0; - while (length > size && bytes[offset++] == 0) { - length--; - } - if (length > size) { - throw new IllegalArgumentException( - "bytes.length: " + bytes.length + " > " + - size); - } - return copyFrom(bytes, offset, size); - } - - return padTo(bytes, size); - } - - public static byte[] padTo256(byte[] bytes) { - return leadingZeroesTrimmedOrPaddedTo(32, bytes); - } - - public static byte[] padTo160(byte[] bytes) { - return leadingZeroesTrimmedOrPaddedTo(20, bytes); - } - - private static byte[] copyFrom(byte[] bytes, int offset, int size) { - byte[] result = new byte[size]; - System.arraycopy(bytes, offset, result, 0, size); - return result; - } - - private static byte[] padTo(byte[] bytes, int size) { - byte[] result = new byte[size]; - int offset = result.length - bytes.length; - System.arraycopy(bytes, 0, result, offset, bytes.length); - return result; - } -} diff --git a/settings.gradle b/settings.gradle index 7c7add5bef..27d8397e5d 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':app', ':card-android', ':server-android', ':card-common', ':ripple-core' +include ':app', ':card-android', ':server-android', ':card-common', ':ripple-core-0.0.1'