From a41ec3f0fdcb87128d7b4191dcacb432e78ac356 Mon Sep 17 00:00:00 2001 From: Henry Varona Date: Tue, 3 Oct 2017 16:10:03 -0400 Subject: [PATCH] Change graphenej import --- app/build.gradle | 1 + .../activities/ImportSeedActivity.java | 6 +- .../viewmodels/AccountSeedViewModel.java | 3 +- .../cy/agorise/graphenej/AccountOptions.java | 166 -------- .../java/cy/agorise/graphenej/Address.java | 64 --- .../main/java/cy/agorise/graphenej/Asset.java | 187 --------- .../cy/agorise/graphenej/AssetAmount.java | 198 --------- .../cy/agorise/graphenej/AssetOptions.java | 84 ---- .../java/cy/agorise/graphenej/Authority.java | 236 ----------- .../cy/agorise/graphenej/AuthorityType.java | 13 - .../main/java/cy/agorise/graphenej/BIP39.java | 78 ---- .../cy/agorise/graphenej/BaseOperation.java | 35 -- .../java/cy/agorise/graphenej/BlockData.java | 126 ------ .../java/cy/agorise/graphenej/BrainKey.java | 138 ------- .../java/cy/agorise/graphenej/Chains.java | 16 - .../java/cy/agorise/graphenej/Converter.java | 160 -------- .../java/cy/agorise/graphenej/Extensions.java | 43 -- .../java/cy/agorise/graphenej/FileBin.java | 239 ----------- .../cy/agorise/graphenej/GrapheneObject.java | 116 ------ .../java/cy/agorise/graphenej/Invoice.java | 111 ------ .../java/cy/agorise/graphenej/LimitOrder.java | 136 ------- .../java/cy/agorise/graphenej/LineItem.java | 40 -- .../cy/agorise/graphenej/MarketTrade.java | 12 - .../java/cy/agorise/graphenej/ObjectType.java | 182 --------- .../cy/agorise/graphenej/OperationType.java | 55 --- .../java/cy/agorise/graphenej/Optional.java | 46 --- .../java/cy/agorise/graphenej/OrderBook.java | 98 ----- .../main/java/cy/agorise/graphenej/Price.java | 28 -- .../java/cy/agorise/graphenej/PublicKey.java | 56 --- .../main/java/cy/agorise/graphenej/RPC.java | 32 -- .../cy/agorise/graphenej/Transaction.java | 377 ------------------ .../cy/agorise/graphenej/UserAccount.java | 329 --------------- .../main/java/cy/agorise/graphenej/Util.java | 347 ---------------- .../java/cy/agorise/graphenej/Varint.java | 224 ----------- .../main/java/cy/agorise/graphenej/Vote.java | 33 -- .../graphenej/api/BaseGrapheneHandler.java | 84 ---- .../graphenej/api/GetAccountBalances.java | 106 ----- .../graphenej/api/GetAccountByName.java | 102 ----- .../graphenej/api/GetAccountHistory.java | 8 - .../cy/agorise/graphenej/api/GetAccounts.java | 139 ------- .../graphenej/api/GetAllAssetHolders.java | 115 ------ .../agorise/graphenej/api/GetBlockHeader.java | 129 ------ .../graphenej/api/GetKeyReferences.java | 129 ------ .../agorise/graphenej/api/GetLimitOrders.java | 137 ------- .../graphenej/api/GetMarketHistory.java | 243 ----------- .../cy/agorise/graphenej/api/GetObjects.java | 139 ------- .../api/GetRelativeAccountHistory.java | 214 ---------- .../graphenej/api/GetRequiredFees.java | 113 ------ .../graphenej/api/GetTradeHistory.java | 127 ------ .../cy/agorise/graphenej/api/ListAssets.java | 146 ------- .../agorise/graphenej/api/LookupAccounts.java | 134 ------- .../graphenej/api/LookupAssetSymbols.java | 95 ----- .../api/SubscriptionMessagesHub.java | 284 ------------- .../api/TransactionBroadcastSequence.java | 197 --------- .../graphenej/api/android/NodeConnection.java | 143 ------- .../api/android/WebsocketWorkerThread.java | 110 ----- .../cy/agorise/graphenej/brainkeydict.txt | 1 - .../graphenej/crypto/AndroidRandomSource.java | 71 ---- .../graphenej/crypto/EntropySource.java | 19 - .../graphenej/crypto/RandomSource.java | 26 -- .../crypto/SecureRandomGenerator.java | 15 - .../crypto/SecureRandomStrengthener.java | 162 -------- .../graphenej/errors/ChecksumException.java | 10 - .../errors/IncompatibleOperation.java | 11 - .../errors/IncompleteAssetError.java | 15 - .../errors/MalformedAddressException.java | 10 - .../errors/MalformedOperationException.java | 11 - .../errors/MalformedTransactionException.java | 11 - .../errors/RepeatedRequestIdException.java | 12 - .../interfaces/ByteSerializable.java | 9 - .../interfaces/GrapheneSerializable.java | 7 - .../interfaces/JsonSerializable.java | 16 - .../interfaces/NodeErrorListener.java | 10 - .../graphenej/interfaces/SubscriptionHub.java | 30 -- .../interfaces/SubscriptionListener.java | 30 -- .../interfaces/WitnessResponseListener.java | 14 - .../models/AccountBalanceUpdate.java | 23 -- .../graphenej/models/AccountProperties.java | 30 -- .../cy/agorise/graphenej/models/ApiCall.java | 110 ----- .../agorise/graphenej/models/AssetFeed.java | 13 - .../graphenej/models/AssetHolderCount.java | 29 -- .../graphenej/models/BaseResponse.java | 29 -- .../graphenej/models/BitAssetData.java | 25 -- .../agorise/graphenej/models/BlockHeader.java | 12 - .../models/BroadcastedTransaction.java | 42 -- .../graphenej/models/BucketObject.java | 84 ---- .../models/DynamicGlobalProperties.java | 99 ----- .../graphenej/models/HistoricalTransfer.java | 69 ---- .../models/SubscriptionResponse.java | 201 ---------- .../graphenej/models/WitnessResponse.java | 11 - .../models/backup/LinkedAccount.java | 31 -- .../models/backup/PrivateKeyBackup.java | 38 -- .../graphenej/models/backup/Wallet.java | 202 ---------- .../graphenej/models/backup/WalletBackup.java | 49 --- .../cy/agorise/graphenej/objects/Memo.java | 306 -------------- .../operations/AccountUpdateOperation.java | 102 ----- .../AccountUpdateOperationBuilder.java | 59 --- .../operations/BaseOperationBuilder.java | 17 - .../operations/LimitOrderCancelOperation.java | 61 --- .../operations/LimitOrderCreateOperation.java | 233 ----------- .../operations/TransferOperation.java | 205 ---------- .../operations/TransferOperationBuilder.java | 63 --- .../graphenej/test/NaiveSSLContext.java | 126 ------ 103 files changed, 6 insertions(+), 9662 deletions(-) delete mode 100644 app/src/main/java/cy/agorise/graphenej/AccountOptions.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/Address.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/Asset.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/AssetAmount.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/AssetOptions.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/Authority.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/AuthorityType.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/BIP39.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/BaseOperation.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/BlockData.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/BrainKey.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/Chains.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/Converter.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/Extensions.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/FileBin.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/GrapheneObject.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/Invoice.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/LimitOrder.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/LineItem.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/MarketTrade.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/ObjectType.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/OperationType.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/Optional.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/OrderBook.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/Price.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/PublicKey.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/RPC.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/Transaction.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/UserAccount.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/Util.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/Varint.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/Vote.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/api/BaseGrapheneHandler.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/api/GetAccountBalances.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/api/GetAccountByName.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/api/GetAccountHistory.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/api/GetAccounts.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/api/GetAllAssetHolders.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/api/GetBlockHeader.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/api/GetKeyReferences.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/api/GetLimitOrders.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/api/GetMarketHistory.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/api/GetObjects.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/api/GetRelativeAccountHistory.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/api/GetRequiredFees.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/api/GetTradeHistory.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/api/ListAssets.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/api/LookupAccounts.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/api/LookupAssetSymbols.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/api/SubscriptionMessagesHub.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/api/TransactionBroadcastSequence.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/api/android/NodeConnection.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/api/android/WebsocketWorkerThread.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/brainkeydict.txt delete mode 100644 app/src/main/java/cy/agorise/graphenej/crypto/AndroidRandomSource.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/crypto/EntropySource.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/crypto/RandomSource.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/crypto/SecureRandomGenerator.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/crypto/SecureRandomStrengthener.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/errors/ChecksumException.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/errors/IncompatibleOperation.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/errors/IncompleteAssetError.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/errors/MalformedAddressException.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/errors/MalformedOperationException.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/errors/MalformedTransactionException.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/errors/RepeatedRequestIdException.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/interfaces/ByteSerializable.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/interfaces/GrapheneSerializable.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/interfaces/JsonSerializable.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/interfaces/NodeErrorListener.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/interfaces/SubscriptionHub.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/interfaces/SubscriptionListener.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/interfaces/WitnessResponseListener.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/models/AccountBalanceUpdate.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/models/AccountProperties.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/models/ApiCall.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/models/AssetFeed.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/models/AssetHolderCount.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/models/BaseResponse.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/models/BitAssetData.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/models/BlockHeader.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/models/BroadcastedTransaction.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/models/BucketObject.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/models/DynamicGlobalProperties.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/models/HistoricalTransfer.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/models/SubscriptionResponse.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/models/WitnessResponse.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/models/backup/LinkedAccount.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/models/backup/PrivateKeyBackup.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/models/backup/Wallet.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/models/backup/WalletBackup.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/objects/Memo.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/operations/AccountUpdateOperation.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/operations/AccountUpdateOperationBuilder.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/operations/BaseOperationBuilder.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/operations/LimitOrderCancelOperation.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/operations/LimitOrderCreateOperation.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/operations/TransferOperation.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/operations/TransferOperationBuilder.java delete mode 100644 app/src/main/java/cy/agorise/graphenej/test/NaiveSSLContext.java diff --git a/app/build.gradle b/app/build.gradle index 199a7e6..d2d1aca 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -55,5 +55,6 @@ dependencies { compile 'org.tukaani:xz:1.6' compile 'com.jakewharton:butterknife:8.8.1' apt 'com.jakewharton:butterknife-compiler:8.8.1' + compile 'com.github.bilthon:graphenej:0.4.5' } diff --git a/app/src/main/java/cy/agorise/crystalwallet/activities/ImportSeedActivity.java b/app/src/main/java/cy/agorise/crystalwallet/activities/ImportSeedActivity.java index 6fc947a..521ebf4 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/activities/ImportSeedActivity.java +++ b/app/src/main/java/cy/agorise/crystalwallet/activities/ImportSeedActivity.java @@ -61,12 +61,12 @@ public class ImportSeedActivity extends AppCompatActivity implements ImportSeedV @OnTextChanged(value = R.id.etAccountName, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED) void afterAccountNameChanged(Editable editable) { - this.validator.validateAccountName(editable.getT); + //this.validator.validateAccountName(editable.getT); } @OnClick(R.id.btnImport) public void importSeed(){ - if (this.validator) + /*if (this.validator) AccountSeed seed = new AccountSeed(); //TODO verify if PIN and PIN confirmation are not null and are the same @@ -75,7 +75,7 @@ public class ImportSeedActivity extends AppCompatActivity implements ImportSeedV seed.setMasterSeed(etSeedWords.getText().toString()); seed.setName(etAccountName.getText().toString()); - accountSeedViewModel.addSeed(seed); + accountSeedViewModel.addSeed(seed);*/ } @Override diff --git a/app/src/main/java/cy/agorise/crystalwallet/viewmodels/AccountSeedViewModel.java b/app/src/main/java/cy/agorise/crystalwallet/viewmodels/AccountSeedViewModel.java index 01d69de..91b6eeb 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/viewmodels/AccountSeedViewModel.java +++ b/app/src/main/java/cy/agorise/crystalwallet/viewmodels/AccountSeedViewModel.java @@ -34,9 +34,10 @@ public class AccountSeedViewModel extends AndroidViewModel { public ImportSeedValidator getValidator(){ if (this.importSeedValidator == null){ - this.importSeedValidator = new ImportSeedValidator(); + //this.importSeedValidator = new ImportSeedValidator(); } + return null; } public void addSeed(AccountSeed seed){ diff --git a/app/src/main/java/cy/agorise/graphenej/AccountOptions.java b/app/src/main/java/cy/agorise/graphenej/AccountOptions.java deleted file mode 100644 index 3a58cab..0000000 --- a/app/src/main/java/cy/agorise/graphenej/AccountOptions.java +++ /dev/null @@ -1,166 +0,0 @@ -package cy.agorise.graphenej; - -import com.google.common.primitives.Bytes; -import com.google.gson.JsonArray; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; - -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; - -import cy.agorise.graphenej.errors.MalformedAddressException; -import cy.agorise.graphenej.interfaces.GrapheneSerializable; - -/** - * Created by nelson on 12/5/16. - */ -public class AccountOptions implements GrapheneSerializable { - public static final String KEY_MEMO_KEY = "memo_key"; - public static final String KEY_NUM_COMMITTEE = "num_committee"; - public static final String KEY_NUM_WITNESS = "num_witness"; - public static final String KEY_VOTES = "votes"; - public static final String KEY_VOTING_ACCOUNT = "voting_account"; - public static final String KEY_EXTENSIONS = Extensions.KEY_EXTENSIONS; - - private PublicKey memo_key; - private UserAccount voting_account; - private int num_witness; - private int num_comittee; - private Vote[] votes; - private Extensions extensions; - - public AccountOptions(){ - voting_account = new UserAccount(UserAccount.PROXY_TO_SELF); - this.votes = new Vote[0]; - this.extensions = new Extensions(); - } - - public AccountOptions(PublicKey memoKey){ - this(); - this.memo_key = memoKey; - } - - //TODO: Implement constructor that takes a Vote array. - - public PublicKey getMemoKey() { - return memo_key; - } - - public void setMemoKey(PublicKey memo_key) { - this.memo_key = memo_key; - } - - public UserAccount getVotingAccount() { - return voting_account; - } - - public void setVotingAccount(UserAccount voting_account) { - this.voting_account = voting_account; - } - - public int getNumWitness() { - return num_witness; - } - - public void setNumWitness(int num_witness) { - this.num_witness = num_witness; - } - - public int getNumComittee() { - return num_comittee; - } - - public void setNum_comittee(int num_comittee) { - this.num_comittee = num_comittee; - } - - public Vote[] getVotes() { - return votes; - } - - public void setVotes(Vote[] votes) { - this.votes = votes; - } - - @Override - public byte[] toBytes() { - List byteArray = new ArrayList(); - - if(memo_key != null){ - // Adding byte to indicate that there is memo data - byteArray.add((byte) 1); - - // Adding memo key - byteArray.addAll(Bytes.asList(memo_key.toBytes())); - - // Adding voting account - byteArray.addAll(Bytes.asList(voting_account.toBytes())); - - // Adding num_witness - byteArray.addAll(Bytes.asList(Util.revertShort(Short.valueOf((short) num_witness)))); - - // Adding num_committee - byteArray.addAll(Bytes.asList(Util.revertShort(Short.valueOf((short) num_comittee)))); - - // Vote's array length - byteArray.add((byte) votes.length); - - for(Vote vote : votes){ - //TODO: Check this serialization - byteArray.addAll(Bytes.asList(vote.toBytes())); - } - - // Account options's extensions - byteArray.addAll(Bytes.asList(extensions.toBytes())); - }else{ - byteArray.add((byte) 0); - } - return Bytes.toArray(byteArray); - } - - @Override - public String toJsonString() { - return null; - } - - @Override - public JsonElement toJsonObject() { - JsonObject options = new JsonObject(); - options.addProperty(KEY_MEMO_KEY, new Address(memo_key.getKey()).toString()); - options.addProperty(KEY_NUM_COMMITTEE, num_comittee); - options.addProperty(KEY_NUM_WITNESS, num_witness); - options.addProperty(KEY_VOTING_ACCOUNT, voting_account.getObjectId()); - JsonArray votesArray = new JsonArray(); - for(Vote vote : votes){ - //TODO: Add votes representation - } - options.add(KEY_VOTES, votesArray); - options.add(KEY_EXTENSIONS, extensions.toJsonObject()); - return options; - } - - /** - * Custom deserializer used while parsing the 'get_account_by_name' API call response. - * TODO: Implement all other details besides the key - */ - public static class AccountOptionsDeserializer implements JsonDeserializer { - - @Override - public AccountOptions deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - JsonObject baseObject = json.getAsJsonObject(); - AccountOptions options; - try { - Address address = new Address(baseObject.get(KEY_MEMO_KEY).getAsString()); - options = new AccountOptions(address.getPublicKey()); - } catch (MalformedAddressException e) { - System.out.println("MalformedAddressException. Msg: "+e.getMessage()); - options = new AccountOptions(); - } - return options; - } - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/Address.java b/app/src/main/java/cy/agorise/graphenej/Address.java deleted file mode 100644 index 0a60048..0000000 --- a/app/src/main/java/cy/agorise/graphenej/Address.java +++ /dev/null @@ -1,64 +0,0 @@ -package cy.agorise.graphenej; - -import com.google.common.primitives.Bytes; -import cy.agorise.graphenej.errors.MalformedAddressException; -import org.bitcoinj.core.Base58; -import org.bitcoinj.core.ECKey; -import org.spongycastle.crypto.digests.RIPEMD160Digest; - -import java.util.Arrays; - -/** - * Class used to encapsulate address-related operations. - */ -public class Address { - - public final static String BITSHARES_PREFIX = "BTS"; - - private PublicKey publicKey; - private String prefix; - - public Address(ECKey key) { - this.publicKey = new PublicKey(key); - this.prefix = BITSHARES_PREFIX; - } - - public Address(ECKey key, String prefix) { - this.publicKey = new PublicKey(key); - this.prefix = prefix; - } - - public Address(String address) throws MalformedAddressException { - this.prefix = address.substring(0, 3); - byte[] decoded = Base58.decode(address.substring(3, address.length())); - byte[] pubKey = Arrays.copyOfRange(decoded, 0, decoded.length - 4); - byte[] checksum = Arrays.copyOfRange(decoded, decoded.length - 4, decoded.length); - publicKey = new PublicKey(ECKey.fromPublicOnly(pubKey)); - byte[] calculatedChecksum = calculateChecksum(pubKey); - for(int i = 0; i < calculatedChecksum.length; i++){ - if(checksum[i] != calculatedChecksum[i]){ - throw new MalformedAddressException("Checksum error"); - } - } - } - - public PublicKey getPublicKey(){ - return this.publicKey; - } - - @Override - public String toString() { - byte[] pubKey = this.publicKey.toBytes(); - byte[] checksum = calculateChecksum(pubKey); - byte[] pubKeyChecksummed = Bytes.concat(pubKey, checksum); - return this.prefix + Base58.encode(pubKeyChecksummed); - } - - private byte[] calculateChecksum(byte[] data){ - byte[] checksum = new byte[160 / 8]; - RIPEMD160Digest ripemd160Digest = new RIPEMD160Digest(); - ripemd160Digest.update(data, 0, data.length); - ripemd160Digest.doFinal(checksum, 0); - return Arrays.copyOfRange(checksum, 0, 4); - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/Asset.java b/app/src/main/java/cy/agorise/graphenej/Asset.java deleted file mode 100644 index 8c2ec5c..0000000 --- a/app/src/main/java/cy/agorise/graphenej/Asset.java +++ /dev/null @@ -1,187 +0,0 @@ -package cy.agorise.graphenej; - -import com.google.common.primitives.UnsignedLong; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; - -import java.lang.reflect.Type; - -/** - * Created by nelson on 11/9/16. - */ -public class Asset extends GrapheneObject { - public final static String TAG = "Asset"; - - public static final String KEY_ID = "id"; - public static final String KEY_SYMBOL = "symbol"; - public static final String KEY_PRECISION = "precision"; - public static final String KEY_ISSUER = "issuer"; - public static final String KEY_OPTIONS = "options"; - public static final String KEY_MAX_SUPPLY = "max_supply"; - public static final String KEY_MARKET_FEE_PERCENT = "market_fee_percent"; - public static final String KEY_MARKET_FEE = "max_market_fee"; - public static final String KEY_ISSUER_PERMISSIONS = "issuer_permissions"; - public static final String KEY_FLAGS = "flags"; - public static final String KEY_CORE_EXCHANGE_RATE = "core_exchange_rate"; - public static final String KEY_DESCRIPTION = "description"; - public static final String KEY_DYNAMIC_ASSET_DATA_ID = "dynamic_asset_data_id"; - public static final String KEY_BITASSET_DATA_ID = "bitasset_data_id"; - - /** - * Enum type used to represent the possible types an asset can be classified into. - */ - public enum AssetType { - CORE_ASSET, - UIA, - SMART_COIN, - PREDICTION_MARKET - } - - private String symbol; - private int precision = -1; - private String issuer; - private String description; - private String dynamic_asset_data_id; - private AssetOptions options; - private String bitasset_data_id; - private AssetType mAssetType; - - /** - * Simple constructor - * @param id - */ - public Asset(String id) { - super(id); - } - - /** - * Constructor - * @param id: The graphene object id. - * @param symbol: The asset symbol. - * @param precision: The asset precision. - */ - public Asset(String id, String symbol, int precision){ - super(id); - this.symbol = symbol; - this.precision = precision; - } - - /** - * Constructor - * @param id: The graphene object id. - * @param symbol: The asset symbol. - * @param precision: The asset precision. - * @param issuer: Graphene object id of the issuer. - */ - public Asset(String id, String symbol, int precision, String issuer){ - super(id); - this.symbol = symbol; - this.precision = precision; - this.issuer = issuer; - } - - public String getSymbol(){ - return this.symbol; - } - - public void setSymbol(String symbol){ - this.symbol = symbol; - } - - public void setPrecision(int precision){ - this.precision = precision; - } - - public int getPrecision(){ - return this.precision; - } - - public void setIssuer(String issuer){ this.issuer = issuer; } - - public String getIssuer() { return this.issuer; } - - public void setDescription(String description) { - this.description = description; - } - - public String getDescription() { - return description; - } - - public void setAssetOptions(AssetOptions options){ - this.options = options; - } - - public AssetOptions getAssetOptions(){ - return this.options; - } - - public String getBitassetId(){ - return this.bitasset_data_id; - } - - public void setBitassetDataId(String id){ - this.bitasset_data_id = id; - } - - public AssetType getAssetType() { - return mAssetType; - } - - public void setAssetType(AssetType mAssetType) { - this.mAssetType = mAssetType; - } - - @Override - public int hashCode() { - return this.getObjectId() == null ? 0 : this.getObjectId().hashCode(); - } - - @Override - public boolean equals(Object other) { - if(other instanceof Asset){ - return this.getObjectId().equals(((Asset)other).getObjectId()); - }else{ - return false; - } - } - - /** - * Custom deserializer used to instantiate a simple version of the Asset class from the response of the - * 'lookup_asset_symbols' API call. - */ - public static class AssetDeserializer implements JsonDeserializer { - - @Override - public Asset deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - JsonObject object = json.getAsJsonObject(); - String id = object.get(KEY_ID).getAsString(); - String symbol = object.get(KEY_SYMBOL).getAsString(); - int precision = object.get(KEY_PRECISION).getAsInt(); - String issuer = object.get(KEY_ISSUER).getAsString(); - JsonObject optionsJson = object.get(KEY_OPTIONS).getAsJsonObject(); - JsonElement bitassetDataId = object.get(KEY_BITASSET_DATA_ID); - - // Deserializing asset options - AssetOptions options = new AssetOptions(); - options.setMaxSupply(UnsignedLong.valueOf(optionsJson.get(KEY_MAX_SUPPLY).getAsString())); - options.setMarketFeePercent(optionsJson.get(KEY_MARKET_FEE_PERCENT).getAsInt()); - options.setMaxMarketFee(UnsignedLong.valueOf(optionsJson.get(KEY_MARKET_FEE).getAsString())); - options.setIssuerPermissions(optionsJson.get(KEY_ISSUER_PERMISSIONS).getAsLong()); - options.setFlags(optionsJson.get(KEY_FLAGS).getAsInt()); - if(optionsJson.has(KEY_DESCRIPTION)) - options.setDescription(optionsJson.get(KEY_DESCRIPTION).getAsString()); - //TODO: Deserialize core_exchange_rate field - - Asset asset = new Asset(id, symbol, precision, issuer); - asset.setAssetOptions(options); - if(bitassetDataId != null){ - asset.setBitassetDataId(bitassetDataId.getAsString()); - } - return asset; - } - } -} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/graphenej/AssetAmount.java b/app/src/main/java/cy/agorise/graphenej/AssetAmount.java deleted file mode 100644 index 312662e..0000000 --- a/app/src/main/java/cy/agorise/graphenej/AssetAmount.java +++ /dev/null @@ -1,198 +0,0 @@ -package cy.agorise.graphenej; - -import com.google.common.math.DoubleMath; -import com.google.common.primitives.Bytes; -import com.google.common.primitives.UnsignedLong; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.JsonSerializationContext; -import com.google.gson.JsonSerializer; - -import java.io.ByteArrayOutputStream; -import java.io.DataOutput; -import java.io.DataOutputStream; -import java.io.IOException; -import java.lang.reflect.Type; -import java.math.RoundingMode; - -import cy.agorise.graphenej.errors.IncompatibleOperation; -import cy.agorise.graphenej.interfaces.ByteSerializable; -import cy.agorise.graphenej.interfaces.JsonSerializable; - -/** - * Created by nelson on 11/7/16. - */ -public class AssetAmount implements ByteSerializable, JsonSerializable { - /** - * Constants used in the JSON serialization procedure. - */ - public static final String KEY_AMOUNT = "amount"; - public static final String KEY_ASSET_ID = "asset_id"; - - private UnsignedLong amount; - private Asset asset; - - public AssetAmount(UnsignedLong amount, Asset asset){ - this.amount = amount; - this.asset = asset; - } - - /** - * Adds two asset amounts. They must refer to the same Asset type. - * @param other: The other AssetAmount to add to this. - * @return: A new instance of the AssetAmount class with the combined amount. - */ - public AssetAmount add(AssetAmount other){ - if(!this.getAsset().getObjectId().equals(other.getAsset().getObjectId())){ - throw new IncompatibleOperation("Cannot add two AssetAmount instances that refer to different assets"); - } - UnsignedLong combined = this.amount.plus(other.getAmount()); - return new AssetAmount(combined, asset); - } - - /** - * Adds an aditional amount of base units to this AssetAmount. - * @param additional: The amount to add. - * @return: A new instance of the AssetAmount class with the added aditional. - */ - public AssetAmount add(long additional){ - UnsignedLong combined = this.amount.plus(UnsignedLong.valueOf(additional)); - return new AssetAmount(combined, asset); - } - - /** - * Subtracts another instance of AssetAmount from this one. This method will always - * return absolute values. - * @param other: The other asset amount to subtract from this. - * @return: The absolute value of the subtraction of the other minus this asset amount. - */ - public AssetAmount subtract(AssetAmount other){ - if(!this.getAsset().getObjectId().equals(other.getAsset().getObjectId())){ - throw new IncompatibleOperation("Cannot subtract two AssetAmount instances that refer to different assets"); - } - UnsignedLong result = null; - if(this.amount.compareTo(other.getAmount()) < 0){ - result = other.getAmount().minus(this.amount); - }else{ - result = this.amount.minus(other.getAmount()); - } - return new AssetAmount(result, asset); - } - - /** - * Multiplies the current amount by a factor provided as the first parameter. The second parameter - * specifies the rounding method to be used. - * @param factor: The multiplying factor - * @param roundingMode: The rounding mode as an instance of the {@link RoundingMode} class - * @return The same AssetAmount instance, but with the changed amount value. - */ - public AssetAmount multiplyBy(double factor, RoundingMode roundingMode){ - this.amount = UnsignedLong.valueOf(DoubleMath.roundToLong(this.amount.longValue() * factor, roundingMode)); - return this; - } - - /** - * Multiplies the current amount by a factor, using the {@link RoundingMode#HALF_DOWN} constant. - * @param factor: The multiplying factor - * @return The same AssetAmount instance, but with the changed amount value. - */ - public AssetAmount multiplyBy(double factor){ - return this.multiplyBy(factor, RoundingMode.HALF_DOWN); - } - - /** - * Divides the current amount by a divisor provided as the first parameter. The second parameter - * specifies the rounding method to be used. - * @param divisor: The divisor - * @return: The same AssetAMount instance, but with the divided amount value - */ - public AssetAmount dividedBy(double divisor, RoundingMode roundingMode){ - this.amount = UnsignedLong.valueOf(DoubleMath.roundToLong(this.amount.longValue() / divisor, roundingMode)); - return this; - } - - - /** - * Divides the current amount by a divisor provided as the first parameter, using - * the {@link RoundingMode#HALF_DOWN} constant - * @param divisor: The divisor - * @return: The same AssetAMount instance, but with the divided amount value - */ - public AssetAmount dividedBy(double divisor){ - return this.dividedBy(divisor, RoundingMode.HALF_DOWN); - } - - public void setAmount(UnsignedLong amount){ - this.amount = amount; - } - - public UnsignedLong getAmount(){ - return this.amount; - } - - public Asset getAsset(){ return this.asset; } - - @Override - public byte[] toBytes() { - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - DataOutput out = new DataOutputStream(byteArrayOutputStream); - try { - Varint.writeUnsignedVarLong(asset.instance, out); - } catch (IOException e) { - e.printStackTrace(); - } - // Getting asset id - byte[] assetId = byteArrayOutputStream.toByteArray(); - byte[] value = Util.revertLong(this.amount.longValue()); - - // Concatenating and returning value + asset id - return Bytes.concat(value, assetId); - } - - @Override - public String toJsonString() { - GsonBuilder gsonBuilder = new GsonBuilder(); - gsonBuilder.registerTypeAdapter(AssetAmount.class, new AssetAmountSerializer()); - return gsonBuilder.create().toJson(this); - } - - @Override - public JsonObject toJsonObject() { - JsonObject jsonAmount = new JsonObject(); - jsonAmount.addProperty(KEY_AMOUNT, amount); - jsonAmount.addProperty(KEY_ASSET_ID, asset.getObjectId()); - return jsonAmount; - } - - /** - * Custom serializer used to translate this object into the JSON-formatted entry we need for a transaction. - */ - public static class AssetAmountSerializer implements JsonSerializer { - - @Override - public JsonElement serialize(AssetAmount assetAmount, Type type, JsonSerializationContext jsonSerializationContext) { - JsonObject obj = new JsonObject(); - obj.addProperty(KEY_AMOUNT, assetAmount.amount); - obj.addProperty(KEY_ASSET_ID, assetAmount.asset.getObjectId()); - return obj; - } - } - - /** - * Custom deserializer used for this class - */ - public static class AssetAmountDeserializer implements JsonDeserializer { - - @Override - public AssetAmount deserialize(JsonElement json, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { - Long amount = json.getAsJsonObject().get(KEY_AMOUNT).getAsLong(); - String assetId = json.getAsJsonObject().get(KEY_ASSET_ID).getAsString(); - AssetAmount assetAmount = new AssetAmount(UnsignedLong.valueOf(amount), new Asset(assetId)); - return assetAmount; - } - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/AssetOptions.java b/app/src/main/java/cy/agorise/graphenej/AssetOptions.java deleted file mode 100644 index 8ed4205..0000000 --- a/app/src/main/java/cy/agorise/graphenej/AssetOptions.java +++ /dev/null @@ -1,84 +0,0 @@ -package cy.agorise.graphenej; - -import com.google.common.primitives.UnsignedLong; - -/** - * Created by nelson on 12/13/16. - */ -public class AssetOptions { - // TODO: Use these constants instead of using cryptic constants like 128 and 511 - public static final int CHARGE_MARKET_FEE = 0x01; - public static final int WHITE_LIST = 0x02; - public static final int OVERRIDE_AUTHORITY = 0x04; - public static final int TRANSFER_RESTRICTED = 0x08; - public static final int DISABLE_FORCE_SETTLE = 0x10; - public static final int GLOBAL_SETTLE = 0x20; - public static final int DISABLE_CONFIDENTIAL = 0x40; - public static final int WITNESS_FED_ASSET = 0x80; - public static final int COMITEE_FED_ASSET = 0x100; - - private UnsignedLong max_supply; - private float market_fee_percent; - private UnsignedLong max_market_fee; - private long issuer_permissions; - private int flags; - private Price core_exchange_rate; - //TODO: Implement whitelist_authorities, blacklist_authorities, whitelist_markets, blacklist_markets and extensions - private String description; - - public UnsignedLong getMaxSupply() { - return max_supply; - } - - public void setMaxSupply(UnsignedLong max_supply) { - this.max_supply = max_supply; - } - - public float getMarketFeePercent() { - return market_fee_percent; - } - - public void setMarketFeePercent(float market_fee_percent) { - this.market_fee_percent = market_fee_percent; - } - - public UnsignedLong getMaxMarketFee() { - return max_market_fee; - } - - public void setMaxMarketFee(UnsignedLong max_market_fee) { - this.max_market_fee = max_market_fee; - } - - public long getIssuerPermissions() { - return issuer_permissions; - } - - public void setIssuerPermissions(long issuer_permissions) { - this.issuer_permissions = issuer_permissions; - } - - public int getFlags() { - return flags; - } - - public void setFlags(int flags) { - this.flags = flags; - } - - public Price getCoreExchangeRate() { - return core_exchange_rate; - } - - public void setCoreExchangeRate(Price core_exchange_rate) { - this.core_exchange_rate = core_exchange_rate; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } -} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/graphenej/Authority.java b/app/src/main/java/cy/agorise/graphenej/Authority.java deleted file mode 100644 index 7c2f02e..0000000 --- a/app/src/main/java/cy/agorise/graphenej/Authority.java +++ /dev/null @@ -1,236 +0,0 @@ -package cy.agorise.graphenej; - -import com.google.common.primitives.Bytes; -import com.google.gson.JsonArray; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; - -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -import cy.agorise.graphenej.errors.MalformedAddressException; -import cy.agorise.graphenej.interfaces.GrapheneSerializable; - -/** - * Class used to represent the weighted set of keys and accounts that must approve operations. - * - * {@see Authority} - */ -public class Authority implements GrapheneSerializable { - public static final String KEY_ACCOUNT_AUTHS = "account_auths"; - public static final String KEY_KEY_AUTHS = "key_auths"; - public static final String KEY_WEIGHT_THRESHOLD = "weight_threshold"; - public static final String KEY_EXTENSIONS = "extensions"; - - private long weight_threshold; - private HashMap account_auths; - private HashMap key_auths; - private Extensions extensions; - - public Authority(){ - this.weight_threshold = 1; - this.account_auths = new HashMap(); - this.key_auths = new HashMap(); - extensions = new Extensions(); - } - - /** - * Constructor for the authority class that takes every possible detail. - * @param weight_threshold: The total weight threshold - * @param keyAuths: Map of key to weights relationships. Can be null. - * @param accountAuths: Map of account to weights relationships. Can be null. - * @throws MalformedAddressException - */ - public Authority(long weight_threshold, HashMap keyAuths, HashMap accountAuths) { - this(); - this.weight_threshold = weight_threshold; - if(keyAuths != null) - this.key_auths = keyAuths; - else - this.key_auths = new HashMap<>(); - if(accountAuths != null) - this.account_auths = accountAuths; - else - this.account_auths = new HashMap<>(); - } - - public long getWeightThreshold() { - return weight_threshold; - } - - public void setWeightThreshold(long weight_threshold) { - this.weight_threshold = weight_threshold; - } - - public void setKeyAuthorities(HashMap keyAuths){ - if(keyAuths != null){ - for(Address address : keyAuths.keySet()){ - key_auths.put(address.getPublicKey(), keyAuths.get(address)); - } - } - } - - public void setAccountAuthorities(HashMap accountAuthorities){ - this.account_auths = accountAuthorities; - } - - /** - * @return: Returns a list of public keys linked to this authority - */ - public List getKeyAuthList(){ - ArrayList keys = new ArrayList<>(); - for(PublicKey pk : key_auths.keySet()){ - keys.add(pk); - } - return keys; - } - - /** - * @return: Returns a list of accounts linked to this authority - */ - public List getAccountAuthList(){ - ArrayList accounts = new ArrayList<>(); - for(UserAccount account : account_auths.keySet()){ - accounts.add(account); - } - return accounts; - } - - public HashMap getKeyAuths(){ - return this.key_auths; - } - - public HashMap getAccountAuths(){ - return this.account_auths; - } - - @Override - public String toJsonString() { - return null; - } - - @Override - public JsonElement toJsonObject() { - JsonObject authority = new JsonObject(); - authority.addProperty(KEY_WEIGHT_THRESHOLD, weight_threshold); - JsonArray keyAuthArray = new JsonArray(); - JsonArray accountAuthArray = new JsonArray(); - - for(PublicKey publicKey : key_auths.keySet()){ - JsonArray subArray = new JsonArray(); - Address address = new Address(publicKey.getKey()); - subArray.add(address.toString()); - subArray.add(key_auths.get(publicKey)); - keyAuthArray.add(subArray); - } - - for(UserAccount key : account_auths.keySet()){ - JsonArray subArray = new JsonArray(); - subArray.add(key.toString()); - subArray.add(key_auths.get(key)); - accountAuthArray.add(subArray); - } - authority.add(KEY_KEY_AUTHS, keyAuthArray); - authority.add(KEY_ACCOUNT_AUTHS, accountAuthArray); - authority.add(KEY_EXTENSIONS, extensions.toJsonObject()); - return authority; - } - - @Override - public byte[] toBytes() { - List byteArray = new ArrayList(); - // Adding number of authorities - byteArray.add(Byte.valueOf((byte) (account_auths.size() + key_auths.size()))); - - // If the authority is not empty of references, we serialize its contents - // otherwise its only contribution will be a zero byte - if(account_auths.size() + key_auths.size() > 0){ - // Weight threshold - byteArray.addAll(Bytes.asList(Util.revertInteger(new Integer((int) weight_threshold)))); - - // Number of account authorities - byteArray.add((byte) account_auths.size()); - - //TODO: Check the account authorities serialization - // Serializing individual accounts and their corresponding weights - for(UserAccount account : account_auths.keySet()){ - byteArray.addAll(Bytes.asList(account.toBytes())); - byteArray.addAll(Bytes.asList(Util.revertShort(account_auths.get(account).shortValue()))); - } - - // Number of key authorities - byteArray.add((byte) key_auths.size()); - - // Serializing individual keys and their corresponding weights - for(PublicKey publicKey : key_auths.keySet()){ - byteArray.addAll(Bytes.asList(publicKey.toBytes())); - byteArray.addAll(Bytes.asList(Util.revertShort(key_auths.get(publicKey).shortValue()))); - } - - // Adding number of extensions - byteArray.add((byte) extensions.size()); - } - return Bytes.toArray(byteArray); - } - - @Override - public boolean equals(Object obj) { - Authority authority = (Authority) obj; - HashMap keyAuths = authority.getKeyAuths(); - HashMap accountAuths = authority.getAccountAuths(); - System.out.println("key auths match: "+this.key_auths.equals(keyAuths)); - System.out.println("account auths match: "+this.account_auths.equals(accountAuths)); - System.out.println("weight threshold matches: "+(this.weight_threshold == authority.weight_threshold)); - return this.key_auths.equals(keyAuths) && - this.account_auths.equals(accountAuths) && - this.weight_threshold == authority.weight_threshold; - } - - /** - * Custom deserializer used while parsing the 'get_account_by_name' API call response. - * - * This will deserialize an account authority in the form: - * - * { - * "weight_threshold": 1, - * "account_auths": [], - * "key_auths": [["BTS6yoiaoC4p23n31AV4GnMy5QDh5yUQEUmU4PmNxRQPGg7jjPkBq",1]], - * "address_auths": [] - * } - */ - public static class AuthorityDeserializer implements JsonDeserializer { - - @Override - public Authority deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - JsonObject baseObject = json.getAsJsonObject(); - long weightThreshold = baseObject.get(KEY_WEIGHT_THRESHOLD).getAsLong(); - JsonArray keyAuthArray = baseObject.getAsJsonArray(KEY_KEY_AUTHS); - JsonArray accountAuthArray = baseObject.getAsJsonArray(KEY_ACCOUNT_AUTHS); - HashMap keyAuthMap = new HashMap<>(); - HashMap accountAuthMap = new HashMap<>(); - for(int i = 0; i < keyAuthArray.size(); i++){ - JsonArray subArray = keyAuthArray.get(i).getAsJsonArray(); - String addr = subArray.get(0).getAsString(); - long weight = subArray.get(1).getAsLong(); - try { - keyAuthMap.put(new Address(addr).getPublicKey(), weight); - } catch (MalformedAddressException e) { - System.out.println("MalformedAddressException. Msg: "+e.getMessage()); - } - } - for(int i = 0; i < accountAuthArray.size(); i++){ - JsonArray subArray = accountAuthArray.get(i).getAsJsonArray(); - String userId = subArray.get(0).getAsString(); - long weight = subArray.get(1).getAsLong(); - UserAccount userAccount = new UserAccount(userId); - accountAuthMap.put(userAccount, weight); - } - return new Authority(weightThreshold, keyAuthMap, accountAuthMap); - } - } -} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/graphenej/AuthorityType.java b/app/src/main/java/cy/agorise/graphenej/AuthorityType.java deleted file mode 100644 index 2fb52b8..0000000 --- a/app/src/main/java/cy/agorise/graphenej/AuthorityType.java +++ /dev/null @@ -1,13 +0,0 @@ -package cy.agorise.graphenej; - -/** - * Enum-type used to specify the different roles of an authority. - * - * @see Authority - */ - -public enum AuthorityType { - OWNER, - ACTIVE, - MEMO -} diff --git a/app/src/main/java/cy/agorise/graphenej/BIP39.java b/app/src/main/java/cy/agorise/graphenej/BIP39.java deleted file mode 100644 index fa882be..0000000 --- a/app/src/main/java/cy/agorise/graphenej/BIP39.java +++ /dev/null @@ -1,78 +0,0 @@ -package cy.agorise.graphenej; - -import java.util.Arrays; -import org.bitcoinj.core.Base58; -import org.bitcoinj.core.ECKey; -import org.bitcoinj.crypto.HDKeyDerivation; -import org.bitcoinj.crypto.MnemonicCode; -import org.spongycastle.crypto.digests.RIPEMD160Digest; -import org.spongycastle.crypto.digests.SHA512Digest; - -/** - * - * @author hvarona - */ -public class BIP39 { - - private final ECKey mPrivateKey; - - public BIP39(String words, String passphrase) { - - byte[] seed = MnemonicCode.toSeed(Arrays.asList(words.split(" ")), passphrase); - mPrivateKey = HDKeyDerivation.createMasterPrivateKey(seed); - - } - - public String getUncompressedAddress() { - RIPEMD160Digest ripemd160Digest = new RIPEMD160Digest(); - SHA512Digest sha512Digest = new SHA512Digest(); - sha512Digest.update(mPrivateKey.decompress().getPubKey(), 0, mPrivateKey.decompress().getPubKey().length); - byte[] intermediate = new byte[512 / 8]; - sha512Digest.doFinal(intermediate, 0); - ripemd160Digest.update(intermediate, 0, intermediate.length); - byte[] output = new byte[160 / 8]; - ripemd160Digest.doFinal(output, 0); - String encoded = Base58.encode(output); - byte[] checksum = new byte[(160 / 8) + 4]; - System.arraycopy(calculateChecksum(output), 0, checksum, checksum.length - 4, 4); - System.arraycopy(output, 0, checksum, 0, output.length); - - return ("BTS" + Base58.encode(checksum)); - } - - public String getAddress() { - RIPEMD160Digest ripemd160Digest = new RIPEMD160Digest(); - SHA512Digest sha512Digest = new SHA512Digest(); - sha512Digest.update(mPrivateKey.getPubKey(), 0, mPrivateKey.getPubKey().length); - byte[] intermediate = new byte[512 / 8]; - sha512Digest.doFinal(intermediate, 0); - ripemd160Digest.update(intermediate, 0, intermediate.length); - byte[] output = new byte[160 / 8]; - ripemd160Digest.doFinal(output, 0); - String encoded = Base58.encode(output); - byte[] checksum = new byte[(160 / 8) + 4]; - System.arraycopy(calculateChecksum(output), 0, checksum, checksum.length - 4, 4); - System.arraycopy(output, 0, checksum, 0, output.length); - - return ("BTS" + Base58.encode(checksum)); - } - - public byte[] calculateChecksum(byte[] input) { - byte[] answer = new byte[4]; - RIPEMD160Digest ripemd160Digest = new RIPEMD160Digest(); - ripemd160Digest.update(input, 0, input.length); - byte[] output = new byte[160 / 8]; - ripemd160Digest.doFinal(output, 0); - System.arraycopy(output, 0, answer, 0, 4); - return answer; - } - - public byte[] getPublicKey() { - return mPrivateKey.getPubKey(); - } - - public ECKey getPrivateKey() { - return mPrivateKey; - } - -} diff --git a/app/src/main/java/cy/agorise/graphenej/BaseOperation.java b/app/src/main/java/cy/agorise/graphenej/BaseOperation.java deleted file mode 100644 index bafbea9..0000000 --- a/app/src/main/java/cy/agorise/graphenej/BaseOperation.java +++ /dev/null @@ -1,35 +0,0 @@ -package cy.agorise.graphenej; - -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import cy.agorise.graphenej.interfaces.ByteSerializable; -import cy.agorise.graphenej.interfaces.JsonSerializable; - -/** - * Created by nelson on 11/5/16. - */ -public abstract class BaseOperation implements ByteSerializable, JsonSerializable { - - public static final String KEY_FEE = "fee"; - public static final String KEY_EXTENSIONS = "extensions"; - - protected OperationType type; - protected Extensions extensions; - - public BaseOperation(OperationType type){ - this.type = type; - this.extensions = new Extensions(); - } - - public byte getId() { - return (byte) this.type.ordinal(); - } - - public abstract void setFee(AssetAmount assetAmount); - - public JsonElement toJsonObject(){ - JsonArray array = new JsonArray(); - array.add(this.getId()); - return array; - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/BlockData.java b/app/src/main/java/cy/agorise/graphenej/BlockData.java deleted file mode 100644 index d8457f5..0000000 --- a/app/src/main/java/cy/agorise/graphenej/BlockData.java +++ /dev/null @@ -1,126 +0,0 @@ -package cy.agorise.graphenej; - -import cy.agorise.graphenej.interfaces.ByteSerializable; - -/** - * This class encapsulates all block-related information needed in order to build a valid transaction. - */ -public class BlockData implements ByteSerializable { - private final int REF_BLOCK_NUM_BYTES = 2; - private final int REF_BLOCK_PREFIX_BYTES = 4; - private final int REF_BLOCK_EXPIRATION_BYTES = 4; - - private int refBlockNum; - private long refBlockPrefix; - private long expiration; - - /** - * Block data constructor - * @param ref_block_num: Least significant 16 bits from the reference block number. - * If "relative_expiration" is zero, this field must be zero as well. - * @param ref_block_prefix: The first non-block-number 32-bits of the reference block ID. - * Recall that block IDs have 32 bits of block number followed by the - * actual block hash, so this field should be set using the second 32 bits - * in the block_id_type - * @param relative_expiration: Expiration time specified as a POSIX or - * Unix time - */ - public BlockData(int ref_block_num, long ref_block_prefix, long relative_expiration){ - this.refBlockNum = ref_block_num; - this.refBlockPrefix = ref_block_prefix; - this.expiration = relative_expiration; - } - - /** - * Block data constructor that takes in raw blockchain information. - * @param head_block_number: The last block number. - * @param head_block_id: The last block apiId. - * @param relative_expiration: The expiration time. - */ - public BlockData(long head_block_number, String head_block_id, long relative_expiration){ - String hashData = head_block_id.substring(8, 16); - StringBuilder builder = new StringBuilder(); - for(int i = 0; i < 8; i = i + 2){ - builder.append(hashData.substring(6 - i, 8 - i)); - } - this.setRefBlockNum(head_block_number); - this.setRefBlockPrefix(head_block_id); - this.expiration = relative_expiration; - } - - /** - * Plain setter for the ref_block_num field, assuming its value is exactly the one passed in the argument. - * @param refBlockNum: The 'ref_block_num' field. - */ - public void setRefBlockNum(int refBlockNum) { - this.refBlockNum = refBlockNum; - } - - /** - * Setter that receives the block number, and takes the 16 lower bits of it to obtain the - * 'ref_block_num' value. - * @param blockNumber: The block number. - */ - public void setRefBlockNum(long blockNumber){ - this.refBlockNum = ((int) blockNumber ) & 0xFFFF; - } - - /** - * Plain setter fot the 'ref_block_prefix' field, assumint its value is exactly the one passed in the argument. - * @param refBlockPrefix - */ - public void setRefBlockPrefix(long refBlockPrefix) { - this.refBlockPrefix = refBlockPrefix; - } - - /** - * Setter that receives the head block id, and turns it into the little format required for the - * 'ref_block_prefix' field. - * @param headBlockId: The head block id as obtained from the network updates. - */ - public void setRefBlockPrefix(String headBlockId){ - String hashData = headBlockId.substring(8, 16); - StringBuilder builder = new StringBuilder(); - for(int i = 0; i < 8; i = i + 2){ - builder.append(hashData.substring(6 - i, 8 - i)); - } - this.refBlockPrefix = Long.parseLong(builder.toString(), 16); - } - - public int getRefBlockNum() { - return refBlockNum; - } - - public long getRefBlockPrefix() { - return refBlockPrefix; - } - - public long getExpiration() { - return expiration; - } - - public void setExpiration(long expiration) { - this.expiration = expiration; - } - - - @Override - public byte[] toBytes() { - // Allocating a fixed length byte array, since we will always need - // 2 bytes for the ref_block_num value - // 4 bytes for the ref_block_prefix value - // 4 bytes for the relative_expiration - - byte[] result = new byte[REF_BLOCK_NUM_BYTES + REF_BLOCK_PREFIX_BYTES + REF_BLOCK_EXPIRATION_BYTES]; - for(int i = 0; i < result.length; i++){ - if(i < REF_BLOCK_NUM_BYTES){ - result[i] = (byte) (this.refBlockNum >> 8 * i); - }else if(i >= REF_BLOCK_NUM_BYTES && i < REF_BLOCK_NUM_BYTES + REF_BLOCK_PREFIX_BYTES){ - result[i] = (byte) (this.refBlockPrefix >> 8 * (i - REF_BLOCK_NUM_BYTES)); - }else{ - result[i] = (byte) (this.expiration >> 8 * (i - REF_BLOCK_NUM_BYTES + REF_BLOCK_PREFIX_BYTES)); - } - } - return result; - } -} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/graphenej/BrainKey.java b/app/src/main/java/cy/agorise/graphenej/BrainKey.java deleted file mode 100644 index e54e3b7..0000000 --- a/app/src/main/java/cy/agorise/graphenej/BrainKey.java +++ /dev/null @@ -1,138 +0,0 @@ -package cy.agorise.graphenej; - -import org.bitcoinj.core.DumpedPrivateKey; -import org.bitcoinj.core.ECKey; -import org.bitcoinj.core.NetworkParameters; - -import java.io.UnsupportedEncodingException; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.security.SecureRandom; -import java.util.ArrayList; - -import cy.agorise.graphenej.crypto.SecureRandomGenerator; - -/** - * Class used to encapsulate all BrainKey-related operations. - */ -public class BrainKey { - - // The size of the word dictionary - public static final int DICT_WORD_COUNT = 49744; - - /* The required number of words */ - public static final int BRAINKEY_WORD_COUNT = 12; - - /* The default sequence number is zero */ - public static final int DEFAULT_SEQUENCE_NUMBER = 0; - - /* The corresponding private key derivated from the brain key */ - private ECKey mPrivateKey; - - /* The actual words from this brain key + the sequence number */ - private String mBrainKey; - - /* The sequence number */ - private int sequenceNumber; - - /** - * Method that will generate a random brain key - * - * @param words The list of words from the graphene specification - * dictionary. - * @return A random sequence of words - */ - public static String suggest(String words) { - String[] wordArray = words.split(","); - ArrayList suggestedBrainKey = new ArrayList(); - assert (wordArray.length == DICT_WORD_COUNT); - SecureRandom secureRandom = SecureRandomGenerator.getSecureRandom(); - int index; - for (int i = 0; i < BRAINKEY_WORD_COUNT; i++) { - index = secureRandom.nextInt(DICT_WORD_COUNT - 1); - suggestedBrainKey.add(wordArray[index].toUpperCase()); - } - StringBuilder stringBuilder = new StringBuilder(); - for(String word : suggestedBrainKey){ - stringBuilder.append(word); - stringBuilder.append(" "); - } - return stringBuilder.toString().trim(); - } - /** - * BrainKey constructor that takes as argument a specific brain key word - * sequence and generates the private key and address from that. - * - * @param words The brain key specifying the private key - * @param sequence Sequence number - */ - public BrainKey(String words, int sequence) { - this.mBrainKey = words; - this.sequenceNumber = sequence; - String encoded = String.format("%s %d", words, sequence); - try { - MessageDigest md = MessageDigest.getInstance("SHA-512"); - byte[] bytes = md.digest(encoded.getBytes("UTF-8")); - MessageDigest sha256 = MessageDigest.getInstance("SHA-256"); - byte[] result = sha256.digest(bytes); - mPrivateKey = ECKey.fromPrivate(result); - - } catch (NoSuchAlgorithmException e) { - System.out.println("NoSuchAlgotithmException. Msg: " + e.getMessage()); - } catch (UnsupportedEncodingException e) { - System.out.println("UnsupportedEncodingException. Msg: " + e.getMessage()); - } - } - - /** - * Gets the array of bytes representing the public key. - * @return - */ - public byte[] getPublicKey() { - return mPrivateKey.getPubKey(); - } - - /** - * Returns the private key as an instance of the ECKey class. - * @return - */ - public ECKey getPrivateKey() { - return mPrivateKey; - } - - /** - * Returns the private key in the Wallet Import Format for the uncompressed private key. - * @see WIF - * @return - */ - public String getWalletImportFormat(){ - DumpedPrivateKey wif = this.mPrivateKey.decompress().getPrivateKeyEncoded(NetworkParameters.fromID(NetworkParameters.ID_MAINNET)); - return wif.toString(); - } - - /** - * Returns the public address derived from this brain key - * @param prefix: The prefix to use in this address. - * @return An instance of the {@link Address} class - */ - public Address getPublicAddress(String prefix){ - return new Address(ECKey.fromPublicOnly(getPublicKey()), prefix); - } - - /** - * Brain key words getter - * @return: The word sequence that comprises this brain key - */ - public String getBrainKey(){ - return mBrainKey; - } - - /** - * Sequence number getter - * @return: The sequence number used alongside with the brain key words in order - * to derive the private key - */ - public int getSequenceNumber(){ - return sequenceNumber; - } -} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/graphenej/Chains.java b/app/src/main/java/cy/agorise/graphenej/Chains.java deleted file mode 100644 index c26a7e1..0000000 --- a/app/src/main/java/cy/agorise/graphenej/Chains.java +++ /dev/null @@ -1,16 +0,0 @@ -package cy.agorise.graphenej; - -/** - * Created by nelson on 11/8/16. - */ -public class Chains { - public static class BITSHARES { - public static final String CHAIN_ID = "4018d7844c78f6a6c41c6a552b898022310fc5dec06da467ee7905a8dad512c8"; - } - public static class GRAPHENE { - public static final String CHAIN_ID = "b8d1603965b3eb1acba27e62ff59f74efa3154d43a4188d381088ac7cdf35539"; - } - public static class TEST { - public static final String CHAIN_ID = "39f5e2ede1f8bc1a3a54a7914414e3779e33193f1f5693510e73cb7a87617447"; - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/Converter.java b/app/src/main/java/cy/agorise/graphenej/Converter.java deleted file mode 100644 index f0706f6..0000000 --- a/app/src/main/java/cy/agorise/graphenej/Converter.java +++ /dev/null @@ -1,160 +0,0 @@ -package cy.agorise.graphenej; - -import java.math.BigDecimal; -import java.math.MathContext; - -import cy.agorise.graphenej.errors.IncompleteAssetError; -import cy.agorise.graphenej.models.BucketObject; - -/** - * Generic converter class used to translate the market information contained in a BucketObject and/or Price instances. - * - * Created by nelson on 12/23/16. - */ -public class Converter { - private final String TAG = this.getClass().getName(); - public static final int OPEN_VALUE = 0; - public static final int CLOSE_VALUE = 1; - public static final int HIGH_VALUE = 2; - public static final int LOW_VALUE = 3; - - public static final int BASE_TO_QUOTE = 100; - public static final int QUOTE_TO_BASE = 101; - - private Asset base; - private Asset quote; - private BucketObject bucket; - - /** - * Constructor meant to be used trying to perform a conversion and in possession of a Price object. - */ - public Converter(){} - - /** - * Constructor meant to be used when trying to perform a conversion and in possession of - * a BucketObject, typically resulting from a 'get_market_history' API call. - * @param base - * @param quote - * @param bucket - */ - public Converter(Asset base, Asset quote, BucketObject bucket){ - this.base = base; - this.quote = quote; - this.bucket = bucket; - } - - /** - * Method used to obtain the equivalence between two assets considering their precisions - * and given the specific time bucket passed in the constructor. - * - * The resulting double value will tell us how much of a given asset, a unit of - * its pair is worth. - * - * The second argument is used to specify which of the assets should - * be taken as a unit reference. - * - * For instance if used with the BASE_TO_QUOTE constant, this method will tell us how - * many of the quote asset will make up for a unit of the base asset. And the opposite - * is true for the QUOTE_TO_BASE contant. - * - * @param bucketAttribute: The desired bucket attribute to take in consideration. Can - * be any of the following: OPEN_VALUE, CLOSE_VALUE, HIGH_VALUE or - * LOW_VALUE. - * @param direction: One of two constants 'BASE_TO_QUOTE' or 'QUOTE_TO_BASE' used to specify - * which of the two assets is the one used as a unitary reference. - * @return: double value representing how much of one asset, a unit of the paired asset - * was worth at the point in time specified by the time bucket and the bucket parameter. - */ - public double getConversionRate(int bucketAttribute, int direction){ - if(this.base.getPrecision() == -1 || this.quote.getPrecision() == -1){ - throw new IncompleteAssetError(); - } - BigDecimal baseValue; - BigDecimal quoteValue; - switch (bucketAttribute){ - case OPEN_VALUE: - baseValue = bucket.open_base; - quoteValue = bucket.open_quote; - break; - case CLOSE_VALUE: - baseValue = bucket.close_base; - quoteValue = bucket.close_quote; - break; - case HIGH_VALUE: - baseValue = bucket.high_base; - quoteValue = bucket.high_quote; - break; - case LOW_VALUE: - baseValue = bucket.low_base; - quoteValue = bucket.low_quote; - break; - default: - baseValue = bucket.close_base; - quoteValue = bucket.close_quote; - } - double basePrecisionAdjusted = baseValue.divide(BigDecimal.valueOf((long) Math.pow(10, base.getPrecision()))).doubleValue(); - double quotePrecisionAdjusted = quoteValue.divide(BigDecimal.valueOf((long) Math.pow(10, quote.getPrecision()))).doubleValue(); - if(direction == QUOTE_TO_BASE){ - return basePrecisionAdjusted / quotePrecisionAdjusted; - }else{ - return quotePrecisionAdjusted / basePrecisionAdjusted; - } - } - - /** - * Converts a given asset amount to the corresponding pair used when creating this class. - * @param assetAmount: The asset to convert from. - * @param bucketAttribute: The bucket attribute to use as a reference. Possible values are OPEN_VALUE, - * CLOSE_VALUE, HIGH_VALUE or LOW_VALUE. - * @return: The converted value in base units, that is the number of a unit x 10^precision - */ - public long convert(AssetAmount assetAmount, int bucketAttribute) { - double conversionRate = 0; - double precisionFactor = 0.0; - if(assetAmount.getAsset().equals(this.base)){ - conversionRate = this.getConversionRate(bucketAttribute, BASE_TO_QUOTE); - precisionFactor = Math.pow(10, this.quote.getPrecision()) / Math.pow(10, this.base.getPrecision()); - }else if(assetAmount.getAsset().equals(this.quote)){ - conversionRate = this.getConversionRate(bucketAttribute, QUOTE_TO_BASE); - precisionFactor = Math.pow(10, this.base.getPrecision()) / Math.pow(10, this.quote.getPrecision()); - } - long assetAmountValue = assetAmount.getAmount().longValue(); - long convertedBaseValue = (long) (assetAmountValue * conversionRate * precisionFactor); - return convertedBaseValue; - } - - /** - * Method used to obtain the conversion rate between two assets given in a Price instance as recovered by the - * 'get_limit_orders' API call. - * - * The same rules that apply for the {@link #getConversionRate(int bucketAttribute, int direction) getConversionRate} - * are valid for the 'direction' argument. - * - * @param price: The Price object instance - * @param direction: The direction from which to perform the conversion, can be only one of BASE_TO_QUOTE or - * QUOTE_TO_BASE. - * @return: A double representing the exchange rate. - */ - public double getConversionRate(Price price, int direction){ - Asset base = price.base.getAsset(); - Asset quote = price.quote.getAsset(); - if(base.getPrecision() == -1 || quote.getPrecision() == -1){ - throw new IncompleteAssetError("The given asset instance must provide precision information"); - } - double conversionRate = 0; - double precisionFactor = 0.0; - MathContext mathContext = new MathContext(Math.max(base.getPrecision(), quote.getPrecision())); - BigDecimal baseValue = BigDecimal.valueOf(price.base.getAmount().longValue()); - BigDecimal quoteValue = BigDecimal.valueOf(price.quote.getAmount().doubleValue()); -// System.out.println(String.format("base: %d, quote: %d", baseValue.longValue(), quoteValue.longValue())); - if(direction == BASE_TO_QUOTE){ - conversionRate = quoteValue.divide(baseValue, mathContext).doubleValue(); - precisionFactor = Math.pow(10, base.getPrecision()) / Math.pow(10, quote.getPrecision()); - }else{ - conversionRate = baseValue.divide(quoteValue, mathContext).doubleValue(); - precisionFactor = Math.pow(10, quote.getPrecision()) / Math.pow(10, base.getPrecision()); - } -// System.out.println(String.format("conversion rate: %.4f, precision factor: %.2f", conversionRate, precisionFactor)); - return conversionRate * precisionFactor; - } -} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/graphenej/Extensions.java b/app/src/main/java/cy/agorise/graphenej/Extensions.java deleted file mode 100644 index ada71a3..0000000 --- a/app/src/main/java/cy/agorise/graphenej/Extensions.java +++ /dev/null @@ -1,43 +0,0 @@ -package cy.agorise.graphenej; - -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import cy.agorise.graphenej.interfaces.ByteSerializable; -import cy.agorise.graphenej.interfaces.JsonSerializable; - -import java.util.ArrayList; - -/** - * Created by nelson on 11/9/16. - */ -public class Extensions implements JsonSerializable, ByteSerializable { - public static final String KEY_EXTENSIONS = "extensions"; - - private ArrayList extensions; - - public Extensions(){ - extensions = new ArrayList<>(); - } - - @Override - public String toJsonString() { - return null; - } - - @Override - public JsonElement toJsonObject() { - JsonArray array = new JsonArray(); - for(JsonSerializable o : extensions) - array.add(o.toJsonObject()); - return array; - } - - @Override - public byte[] toBytes() { - return new byte[1]; - } - - public int size(){ - return extensions.size(); - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/FileBin.java b/app/src/main/java/cy/agorise/graphenej/FileBin.java deleted file mode 100644 index 0eb0711..0000000 --- a/app/src/main/java/cy/agorise/graphenej/FileBin.java +++ /dev/null @@ -1,239 +0,0 @@ -package cy.agorise.graphenej; - -import com.google.gson.GsonBuilder; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -import org.bitcoinj.core.ECKey; - -import java.io.UnsupportedEncodingException; -import java.math.BigInteger; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.security.SecureRandom; - -import cy.agorise.graphenej.crypto.SecureRandomStrengthener; -import cy.agorise.graphenej.models.backup.WalletBackup; - -/** - * Class to manage the backup files - * - * @author Henry Varona - * @author Nelson R. Pérez - */ -public abstract class FileBin { - - public static final int PUBLIC_KEY_LENGTH = 33; - - /** - * Method that receives as input both the bytes from the bin backup and the string used to encrypt the - * data contained in it. - * - * The procedure of deserializing the wallet backup involves first decrypting the data and then decompressing - * it using the LZMA algorithm. Once this two steps are performed, the resulting byte sequence represents - * a JSON-formatted object with one or more wallet and private keys information. - * - * @param input: Input bytes - * @param password: Password used to derive the encryption key - * @return: An instance of the WalletBackup class. - */ - public static WalletBackup deserializeWalletBackup(byte[] input, String password){ - try{ - byte[] publicKey = new byte[PUBLIC_KEY_LENGTH]; - byte[] rawDataEncripted = new byte[input.length - PUBLIC_KEY_LENGTH]; - - System.arraycopy(input, 0, publicKey, 0, PUBLIC_KEY_LENGTH); - System.arraycopy(input, PUBLIC_KEY_LENGTH, rawDataEncripted, 0, rawDataEncripted.length); - - MessageDigest md = MessageDigest.getInstance("SHA-256"); - - ECKey randomECKey = ECKey.fromPublicOnly(publicKey); - byte[] finalKey = randomECKey.getPubKeyPoint().multiply(ECKey.fromPrivate(md.digest(password.getBytes("UTF-8"))).getPrivKey()).normalize().getXCoord().getEncoded(); - MessageDigest md1 = MessageDigest.getInstance("SHA-512"); - finalKey = md1.digest(finalKey); - byte[] decryptedData = Util.decryptAES(rawDataEncripted, Util.bytesToHex(finalKey).getBytes()); - - byte[] checksum = new byte[4]; - System.arraycopy(decryptedData, 0, checksum, 0, 4); - byte[] compressedData = new byte[decryptedData.length - 4]; - System.arraycopy(decryptedData, 4, compressedData, 0, compressedData.length); - - byte[] decompressedData = Util.decompress(compressedData, Util.LZMA); - String walletString = new String(decompressedData, "UTF-8"); - System.out.println("Wallet str: "+walletString); - return new GsonBuilder().create().fromJson(walletString, WalletBackup.class); - }catch(NoSuchAlgorithmException e){ - System.out.println("NoSuchAlgorithmException. Msg: "+e.getMessage()); - } catch (UnsupportedEncodingException e) { - System.out.println("UnsupportedEncodingException. Msg: "+e.getMessage()); - } - return null; - } - - public static byte[] serializeWalletBackup(WalletBackup walletBackup, String password){ - SecureRandomStrengthener randomStrengthener = SecureRandomStrengthener.getInstance(); - //randomStrengthener.addEntropySource(new AndroidRandomSource()); - SecureRandom secureRandom = randomStrengthener.generateAndSeedRandomNumberGenerator(); - - try{ - String json = new GsonBuilder().create().toJson(walletBackup, WalletBackup.class); - byte[] compressed = Util.compress(json.getBytes(), Util.LZMA); - System.out.println("json: "+json); - MessageDigest md = MessageDigest.getInstance("SHA-256"); - byte[] checksum = md.digest(compressed); - byte[] checksummed = new byte[compressed.length + 4]; - - System.arraycopy(checksum, 0, checksummed, 0, 4); - System.arraycopy(compressed, 0, checksummed, 4, compressed.length); - byte[] randomKey = new byte[32]; - secureRandom.nextBytes(randomKey); - ECKey randomECKey = ECKey.fromPrivate(md.digest(randomKey)); - byte[] randPubKey = randomECKey.getPubKey(); - byte[] sharedSecret = randomECKey.getPubKeyPoint().multiply(ECKey.fromPrivate(md.digest(password.getBytes("UTF-8"))).getPrivKey()).normalize().getXCoord().getEncoded(); - MessageDigest md1 = MessageDigest.getInstance("SHA-512"); - byte[] finalKey = md1.digest(sharedSecret); - checksummed = Util.encryptAES(checksummed, Util.byteToString(finalKey).getBytes()); - - byte[] finalPayload = new byte[checksummed.length + randPubKey.length]; - System.arraycopy(randPubKey, 0, finalPayload, 0, randPubKey.length); - System.arraycopy(checksummed, 0, finalPayload, randPubKey.length, checksummed.length); - - return finalPayload; - } catch (NoSuchAlgorithmException e) { - System.out.println("NoSuchAlgorithmException. Msg: "+e.getMessage()); - } catch (UnsupportedEncodingException e) { - System.out.println("UnsupportedEncodingException. Msg: "+e.getMessage()); - } - return null; - } - - /** - * Method to get the brainkey fron an input of bytes - * - * @param input Array of bytes of the file to be processed - * @param password the pin code - * @return the brainkey file, or null if the file or the password are - * incorrect - * - * @deprecated use {@link #deserializeWalletBackup(byte[], String)} instead, as it is a more complete method - * that will return a WalletBackup class instance. - */ - @Deprecated - public static String getBrainkeyFromByte(byte[] input, String password) { - try { - byte[] publicKey = new byte[33]; - byte[] rawDataEncripted = new byte[input.length - 33]; - - System.arraycopy(input, 0, publicKey, 0, publicKey.length); - System.arraycopy(input, 33, rawDataEncripted, 0, rawDataEncripted.length); - - MessageDigest md = MessageDigest.getInstance("SHA-256"); - - ECKey randomECKey = ECKey.fromPublicOnly(publicKey); - byte[] finalKey = randomECKey.getPubKeyPoint().multiply(ECKey.fromPrivate(md.digest(password.getBytes("UTF-8"))).getPrivKey()).normalize().getXCoord().getEncoded(); - MessageDigest md1 = MessageDigest.getInstance("SHA-512"); - finalKey = md1.digest(finalKey); - byte[] rawData = Util.decryptAES(rawDataEncripted, Util.byteToString(finalKey).getBytes()); - if(rawData == null) return null; - - byte[] checksum = new byte[4]; - System.arraycopy(rawData, 0, checksum, 0, 4); - byte[] compressedData = new byte[rawData.length - 4]; - System.arraycopy(rawData, 4, compressedData, 0, compressedData.length); - - byte[] wallet_object_bytes = Util.decompress(compressedData, Util.XZ); - if(wallet_object_bytes == null) return null; - String wallet_string = new String(wallet_object_bytes, "UTF-8"); - JsonObject wallet = new JsonParser().parse(wallet_string).getAsJsonObject(); - if (wallet.get("wallet").isJsonArray()) { - wallet = wallet.get("wallet").getAsJsonArray().get(0).getAsJsonObject(); - } else { - wallet = wallet.get("wallet").getAsJsonObject(); - } - - byte[] encKey_enc = new BigInteger(wallet.get("encryption_key").getAsString(), 16).toByteArray(); - byte[] temp = new byte[encKey_enc.length - (encKey_enc[0] == 0 ? 1 : 0)]; - System.arraycopy(encKey_enc, (encKey_enc[0] == 0 ? 1 : 0), temp, 0, temp.length); - byte[] encKey = Util.decryptAES(temp, password.getBytes("UTF-8")); - temp = new byte[encKey.length]; - System.arraycopy(encKey, 0, temp, 0, temp.length); - - byte[] encBrain = new BigInteger(wallet.get("encrypted_brainkey").getAsString(), 16).toByteArray(); - while (encBrain[0] == 0) { - byte[] temp2 = new byte[encBrain.length - 1]; - System.arraycopy(encBrain, 1, temp2, 0, temp2.length); - encBrain = temp2; - } - String BrainKey = new String((Util.decryptAES(encBrain, temp)), "UTF-8"); - - return BrainKey; - - } catch (UnsupportedEncodingException | NoSuchAlgorithmException ex) { - - } - return null; - } - - /** - * Method to generate the file form a brainkey - * - * @param BrainKey The input brainkey - * @param password The pin code - * @param accountName The Account Name - * @return The array byte of the file, or null if an error happens - * - * @deprecated use {@link #serializeWalletBackup(WalletBackup, String)} instead. - */ - @Deprecated - public static byte[] getBytesFromBrainKey(String BrainKey, String password, String accountName) { - - try { - byte[] encKey = new byte[32]; - SecureRandomStrengthener randomStrengthener = SecureRandomStrengthener.getInstance(); - //randomStrengthener.addEntropySource(new AndroidRandomSource()); - SecureRandom secureRandom = randomStrengthener.generateAndSeedRandomNumberGenerator(); - secureRandom.nextBytes(encKey); - byte[] encKey_enc = Util.encryptAES(encKey, password.getBytes("UTF-8")); - byte[] encBrain = Util.encryptAES(BrainKey.getBytes("ASCII"), encKey); - - /** - * Data to Store - */ - JsonObject wallet = new JsonObject(); - wallet.add("encryption_key", new JsonParser().parse(Util.byteToString(encKey_enc))); - wallet.add("encrypted_brainkey", new JsonParser().parse(Util.byteToString(encBrain))); - JsonObject wallet_object = new JsonObject(); - wallet_object.add("wallet", wallet); - JsonArray accountNames = new JsonArray(); - JsonObject jsonAccountName = new JsonObject(); - jsonAccountName.add("name", new JsonParser().parse(accountName)); - accountNames.add(jsonAccountName); - wallet_object.add("linked_accounts", accountNames); - byte[] compressedData = Util.compress(wallet_object.toString().getBytes("UTF-8"), Util.XZ); - MessageDigest md = MessageDigest.getInstance("SHA-256"); - byte[] checksum = md.digest(compressedData); - byte[] rawData = new byte[compressedData.length + 4]; - System.arraycopy(checksum, 0, rawData, 0, 4); - System.arraycopy(compressedData, 0, rawData, 4, compressedData.length); - byte[] randomKey = new byte[32]; - secureRandom.nextBytes(randomKey); - ECKey randomECKey = ECKey.fromPrivate(md.digest(randomKey)); - byte[] randPubKey = randomECKey.getPubKey(); - byte[] finalKey = randomECKey.getPubKeyPoint().multiply(ECKey.fromPrivate(md.digest(password.getBytes("UTF-8"))).getPrivKey()).normalize().getXCoord().getEncoded(); - MessageDigest md1 = MessageDigest.getInstance("SHA-512"); - finalKey = md1.digest(finalKey); - rawData = Util.encryptAES(rawData, Util.byteToString(finalKey).getBytes()); - - byte[] result = new byte[rawData.length + randPubKey.length]; - System.arraycopy(randPubKey, 0, result, 0, randPubKey.length); - System.arraycopy(rawData, 0, result, randPubKey.length, rawData.length); - - return result; - - } catch (UnsupportedEncodingException | NoSuchAlgorithmException ex) { - - } - return null; - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/GrapheneObject.java b/app/src/main/java/cy/agorise/graphenej/GrapheneObject.java deleted file mode 100644 index 072355b..0000000 --- a/app/src/main/java/cy/agorise/graphenej/GrapheneObject.java +++ /dev/null @@ -1,116 +0,0 @@ -package cy.agorise.graphenej; - -import com.google.gson.annotations.Expose; - -/** - *

- * Generic class used to represent a graphene object as defined in - * - *

- * Created by nelson on 11/8/16. - */ -public class GrapheneObject { - public static final String KEY_ID = "id"; - - public static final int PROTOCOL_SPACE = 1; - public static final int IMPLEMENTATION_SPACE = 2; - - @Expose - protected String id; - - protected int space; - protected int type; - protected long instance; - - public GrapheneObject(String id){ - this.id = id; - String[] parts = id.split("\\."); - if(parts.length == 3){ - this.space = Integer.parseInt(parts[0]); - this.type = Integer.parseInt(parts[1]); - this.instance = Long.parseLong(parts[2]); - } - } - - /** - * - * @return: A String containing the full object apiId in the form {space}.{type}.{instance} - */ - public String getObjectId(){ - return String.format("%d.%d.%d", space, type, instance); - } - - /** - * Returns the type of this object. - * @return: Instance of the ObjectType enum. - */ - public ObjectType getObjectType(){ - switch(space){ - case PROTOCOL_SPACE: - switch(type){ - case 1: - return ObjectType.BASE_OBJECT; - case 2: - return ObjectType.ACCOUNT_OBJECT; - case 3: - return ObjectType.ASSET_OBJECT; - case 4: - return ObjectType.FORCE_SETTLEMENT_OBJECT; - case 5: - return ObjectType.COMMITTEE_MEMBER_OBJECT; - case 6: - return ObjectType.WITNESS_OBJECT; - case 7: - return ObjectType.LIMIT_ORDER_OBJECT; - case 8: - return ObjectType.CALL_ORDER_OBJECT; - case 9: - return ObjectType.CUSTOM_OBJECT; - case 10: - return ObjectType.PROPOSAL_OBJECT; - case 11: - return ObjectType.OPERATION_HISTORY_OBJECT; - case 12: - return ObjectType.WITHDRAW_PERMISSION_OBJECT; - case 13: - return ObjectType.VESTING_BALANCE_OBJECT; - case 14: - return ObjectType.WORKER_OBJECT; - case 15: - return ObjectType.BALANCE_OBJECT; - } - case IMPLEMENTATION_SPACE: - switch(type){ - case 0: - return ObjectType.GLOBAL_PROPERTY_OBJECT; - case 1: - return ObjectType.DYNAMIC_GLOBAL_PROPERTY_OBJECT; - case 3: - return ObjectType.ASSET_DYNAMIC_DATA; - case 4: - return ObjectType.ASSET_BITASSET_DATA; - case 5: - return ObjectType.ACCOUNT_BALANCE_OBJECT; - case 6: - return ObjectType.ACCOUNT_STATISTICS_OBJECT; - case 7: - return ObjectType.TRANSACTION_OBJECT; - case 8: - return ObjectType.BLOCK_SUMMARY_OBJECT; - case 9: - return ObjectType.ACCOUNT_TRANSACTION_HISTORY_OBJECT; - case 10: - return ObjectType.BLINDED_BALANCE_OBJECT; - case 11: - return ObjectType.CHAIN_PROPERTY_OBJECT; - case 12: - return ObjectType.WITNESS_SCHEDULE_OBJECT; - case 13: - return ObjectType.BUDGET_RECORD_OBJECT; - case 14: - return ObjectType.SPECIAL_AUTHORITY_OBJECT; - } - } - return null; - } -} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/graphenej/Invoice.java b/app/src/main/java/cy/agorise/graphenej/Invoice.java deleted file mode 100644 index 7b1dc37..0000000 --- a/app/src/main/java/cy/agorise/graphenej/Invoice.java +++ /dev/null @@ -1,111 +0,0 @@ -package cy.agorise.graphenej; - -import com.google.gson.Gson; -import com.google.gson.JsonElement; - -import org.bitcoinj.core.Base58; - -import cy.agorise.graphenej.interfaces.JsonSerializable; - -/** - * Class used to handle invoice generation, compression and QR-Code data derivation, - * as detailed in this link. - * @author Nelson R. Pérez - */ -public class Invoice implements JsonSerializable { - private String to; - private String to_label; - private String memo; - private String currency; - private LineItem[] line_items; - private String note; - private String callback; - - public Invoice(String to, String to_label, String memo, String currency, LineItem[] items, String note, String callback){ - this.to = to; - this.to_label = to_label; - this.memo = memo; - this.currency = currency; - this.line_items = items; - this.note = note; - this.callback = callback; - } - - public String getToLabel() { - return to_label; - } - - public void setToLabel(String to_label) { - this.to_label = to_label; - } - - public String getNote() { - return note; - } - - public void setNote(String note) { - this.note = note; - } - - public String getTo() { - return to; - } - - public void setTo(String to) { - this.to = to; - } - - public String getMemo() { - return memo; - } - - public void setMemo(String memo) { - this.memo = memo; - } - - public String getCurrency() { - return currency; - } - - public void setCurrency(String currency) { - this.currency = currency; - } - - public LineItem[] getLineItems() { - return line_items; - } - - public void setLineItems(LineItem[] line_items) { - this.line_items = line_items; - } - - public String getCallback() { - return callback; - } - - public void setCallback(String callback) { - this.callback = callback; - } - - @Override - public String toJsonString() { - Gson gson = new Gson(); - return gson.toJson(this); - } - - @Override - public JsonElement toJsonObject() { - return null; - } - - public static String toQrCode(Invoice invoice){ - String json = invoice.toJsonString(); - return Base58.encode(Util.compress(json.getBytes(), Util.LZMA)); - } - - public static Invoice fromQrCode(String encoded){ - String json = new String(Util.decompress(Base58.decode(encoded), Util.LZMA)); - Gson gson = new Gson(); - return gson.fromJson(json, Invoice.class); - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/LimitOrder.java b/app/src/main/java/cy/agorise/graphenej/LimitOrder.java deleted file mode 100644 index 8d26d76..0000000 --- a/app/src/main/java/cy/agorise/graphenej/LimitOrder.java +++ /dev/null @@ -1,136 +0,0 @@ -package cy.agorise.graphenej; - -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; - -import java.io.ByteArrayOutputStream; -import java.io.DataOutput; -import java.io.DataOutputStream; -import java.io.IOException; -import java.lang.reflect.Type; - -import cy.agorise.graphenej.interfaces.ByteSerializable; - -/** - * - * @author henry - */ -public class LimitOrder extends GrapheneObject implements ByteSerializable { - - public static final String KEY_EXPIRATION = "expiration"; - public static final String KEY_SELLER = "seller"; - public static final String KEY_FOR_SALE = "for_sale"; - public static final String KEY_DEFERRED_FEE = "deferred_fee"; - public static final String KEY_PRICE = "sell_price"; - - private String expiration; - private UserAccount seller; - private long forSale; - private long deferredFee; - private Price sellPrice; - - public LimitOrder(String id) { - super(id); - } - - public String getExpiration() { - return expiration; - } - - public void setExpiration(String expiration) { - this.expiration = expiration; - } - - public UserAccount getSeller() { - return seller; - } - - public void setSeller(UserAccount seller) { - this.seller = seller; - } - - public long getForSale() { - return forSale; - } - - public void setForSale(long forSale) { - this.forSale = forSale; - } - - public long getDeferredFee() { - return deferredFee; - } - - public void setDeferredFee(long deferredFee) { - this.deferredFee = deferredFee; - } - - public Price getSellPrice() { - return sellPrice; - } - - public void setSellPrice(Price sellPrice) { - this.sellPrice = sellPrice; - } - - @Override - public byte[] toBytes() { - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - DataOutput out = new DataOutputStream(byteArrayOutputStream); - byte[] serialized = null; - try { - Varint.writeUnsignedVarLong(this.instance, out); - serialized = byteArrayOutputStream.toByteArray(); - } catch (IOException e) { - e.printStackTrace(); - } - return serialized; - } - - /** - * Custom deserializer for the LimitOrder class, used to deserialize a json-formatted string in - * the following format: - * - * { - * "id": "1.7.2389233", - * "expiration": "2017-04-21T15:40:04", - * "seller": "1.2.114363", - * "forSale": "10564959415", - * "sell_price": { - * "base": { - * "amount": "10565237932", - * "asset_id": "1.3.0" - * }, - * "quote": { - * "amount": 5803878, - * "asset_id": "1.3.121" - * } - * }, - * "deferredFee": 0 - * } - */ - public static class LimitOrderDeserializer implements JsonDeserializer { - - @Override - public LimitOrder deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - JsonObject object = json.getAsJsonObject(); - String id = object.get(KEY_ID).getAsString(); - String expiration = object.get(KEY_EXPIRATION).getAsString(); - UserAccount seller = context.deserialize(object.get(KEY_SELLER), UserAccount.class); - String forSale = object.get(KEY_FOR_SALE).getAsString(); - Price price = context.deserialize(object.get(KEY_PRICE), Price.class); - long deferredFee = object.get(KEY_DEFERRED_FEE).getAsLong(); - - LimitOrder limitOrder = new LimitOrder(id); - limitOrder.setExpiration(expiration); - limitOrder.setSeller(seller); - limitOrder.setForSale(Long.parseLong(forSale)); - limitOrder.setSellPrice(price); - limitOrder.setDeferredFee(deferredFee); - return limitOrder; - } - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/LineItem.java b/app/src/main/java/cy/agorise/graphenej/LineItem.java deleted file mode 100644 index 7442ca9..0000000 --- a/app/src/main/java/cy/agorise/graphenej/LineItem.java +++ /dev/null @@ -1,40 +0,0 @@ -package cy.agorise.graphenej; - -/** - * Created by nelson on 1/11/17. - */ -public class LineItem { - private String label; - private int quantity; - private double price; - - public LineItem(String label, int quantity, double price){ - this.label = label; - this.quantity = quantity; - this.price = price; - } - - public int getQuantity() { - return quantity; - } - - public void setQuantity(int quantity) { - this.quantity = quantity; - } - - public double getPrice() { - return price; - } - - public void setPrice(double price) { - this.price = price; - } - - public String getLabel(){ - return label; - } - - public void setLabel(String label) { - this.label = label; - } -} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/graphenej/MarketTrade.java b/app/src/main/java/cy/agorise/graphenej/MarketTrade.java deleted file mode 100644 index a97220e..0000000 --- a/app/src/main/java/cy/agorise/graphenej/MarketTrade.java +++ /dev/null @@ -1,12 +0,0 @@ -package cy.agorise.graphenej; - -/** - * - * @author henry - */ -public class MarketTrade { - public String date; - public double price; - public double amount; - public double value; -} diff --git a/app/src/main/java/cy/agorise/graphenej/ObjectType.java b/app/src/main/java/cy/agorise/graphenej/ObjectType.java deleted file mode 100644 index ee1ce37..0000000 --- a/app/src/main/java/cy/agorise/graphenej/ObjectType.java +++ /dev/null @@ -1,182 +0,0 @@ -package cy.agorise.graphenej; - -/** - * Enum type used to list all possible object types and obtain their space + type id - */ - -public enum ObjectType { - BASE_OBJECT, - ACCOUNT_OBJECT, - ASSET_OBJECT, - FORCE_SETTLEMENT_OBJECT, - COMMITTEE_MEMBER_OBJECT, - WITNESS_OBJECT, - LIMIT_ORDER_OBJECT, - CALL_ORDER_OBJECT, - CUSTOM_OBJECT, - PROPOSAL_OBJECT, - OPERATION_HISTORY_OBJECT, - WITHDRAW_PERMISSION_OBJECT, - VESTING_BALANCE_OBJECT, - WORKER_OBJECT, - BALANCE_OBJECT, - GLOBAL_PROPERTY_OBJECT, - DYNAMIC_GLOBAL_PROPERTY_OBJECT, - ASSET_DYNAMIC_DATA, - ASSET_BITASSET_DATA, - ACCOUNT_BALANCE_OBJECT, - ACCOUNT_STATISTICS_OBJECT, - TRANSACTION_OBJECT, - BLOCK_SUMMARY_OBJECT, - ACCOUNT_TRANSACTION_HISTORY_OBJECT, - BLINDED_BALANCE_OBJECT, - CHAIN_PROPERTY_OBJECT, - WITNESS_SCHEDULE_OBJECT, - BUDGET_RECORD_OBJECT, - SPECIAL_AUTHORITY_OBJECT; - - private int getSpace(){ - int space = 1; - switch(this){ - case BASE_OBJECT: - case ACCOUNT_OBJECT: - case ASSET_OBJECT: - case FORCE_SETTLEMENT_OBJECT: - case COMMITTEE_MEMBER_OBJECT: - case WITNESS_OBJECT: - case LIMIT_ORDER_OBJECT: - case CALL_ORDER_OBJECT: - case CUSTOM_OBJECT: - case PROPOSAL_OBJECT: - case OPERATION_HISTORY_OBJECT: - case WITHDRAW_PERMISSION_OBJECT: - case VESTING_BALANCE_OBJECT: - case WORKER_OBJECT: - case BALANCE_OBJECT: - space = 1; - break; - case GLOBAL_PROPERTY_OBJECT: - case DYNAMIC_GLOBAL_PROPERTY_OBJECT: - case ASSET_DYNAMIC_DATA: - case ASSET_BITASSET_DATA: - case ACCOUNT_BALANCE_OBJECT: - case ACCOUNT_STATISTICS_OBJECT: - case TRANSACTION_OBJECT: - case BLOCK_SUMMARY_OBJECT: - case ACCOUNT_TRANSACTION_HISTORY_OBJECT: - case BLINDED_BALANCE_OBJECT: - case CHAIN_PROPERTY_OBJECT: - case WITNESS_SCHEDULE_OBJECT: - case BUDGET_RECORD_OBJECT: - case SPECIAL_AUTHORITY_OBJECT: - space = 2; - break; - } - return space; - } - - private int getType(){ - int type = 0; - switch(this){ - case BASE_OBJECT: - type = 1; - break; - case ACCOUNT_OBJECT: - type = 2; - break; - case ASSET_OBJECT: - type = 3; - break; - case FORCE_SETTLEMENT_OBJECT: - type = 4; - break; - case COMMITTEE_MEMBER_OBJECT: - type = 5; - break; - case WITNESS_OBJECT: - type = 6; - break; - case LIMIT_ORDER_OBJECT: - type = 7; - break; - case CALL_ORDER_OBJECT: - type = 8; - break; - case CUSTOM_OBJECT: - type = 9; - break; - case PROPOSAL_OBJECT: - type = 10; - break; - case OPERATION_HISTORY_OBJECT: - type = 11; - break; - case WITHDRAW_PERMISSION_OBJECT: - type = 12; - break; - case VESTING_BALANCE_OBJECT: - type = 13; - break; - case WORKER_OBJECT: - type = 14; - break; - case BALANCE_OBJECT: - type = 15; - break; - case GLOBAL_PROPERTY_OBJECT: - type = 0; - break; - case DYNAMIC_GLOBAL_PROPERTY_OBJECT: - type = 1; - break; - case ASSET_DYNAMIC_DATA: - type = 3; - break; - case ASSET_BITASSET_DATA: - type = 4; - break; - case ACCOUNT_BALANCE_OBJECT: - type = 5; - break; - case ACCOUNT_STATISTICS_OBJECT: - type = 6; - break; - case TRANSACTION_OBJECT: - type = 7; - break; - case BLOCK_SUMMARY_OBJECT: - type = 8; - break; - case ACCOUNT_TRANSACTION_HISTORY_OBJECT: - type = 9; - break; - case BLINDED_BALANCE_OBJECT: - type = 10; - break; - case CHAIN_PROPERTY_OBJECT: - type = 11; - break; - case WITNESS_SCHEDULE_OBJECT: - type = 12; - break; - case BUDGET_RECORD_OBJECT: - type = 13; - break; - case SPECIAL_AUTHORITY_OBJECT: - type = 14; - } - return type; - } - - /** - * This method is used to return the generic object type in the form space.type.0. - * - * Not to be confused with {@link GrapheneObject#getObjectId()}, which will return - * the full object id in the form space.type.id. - * - * @return: The generic object type - */ - public String getGenericObjectId(){ - return String.format("%d.%d.0", getSpace(), getType()); - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/OperationType.java b/app/src/main/java/cy/agorise/graphenej/OperationType.java deleted file mode 100644 index 9ea093d..0000000 --- a/app/src/main/java/cy/agorise/graphenej/OperationType.java +++ /dev/null @@ -1,55 +0,0 @@ -package cy.agorise.graphenej; - -/** - * Enum type used to keep track of all the operation types and their corresponding ids. - * - * Source - * - * Created by nelson on 11/6/16. - */ -public enum OperationType { - TRANSFER_OPERATION, - LIMIT_ORDER_CREATE_OPERATION, - LIMIT_ORDER_CANCEL_OPERATION, - CALL_ORDER_UPDATE_OPERATION, - FILL_ORDER_OPERATION, // VIRTUAL - ACCOUNT_CREATE_OPERATION, - ACCOUNT_UPDATE_OPERATION, - ACCOUNT_WHITELIST_OPERATION, - ACCOUNT_UPGRADE_OPERATION, - ACCOUNT_TRANSFER_OPERATION, - ASSET_CREATE_OPERATION, - ASSET_UPDATE_OPERATION, - ASSET_UPDATE_BITASSET_OPERATION, - ASSET_UPDATE_FEED_PRODUCERS_OPERATION, - ASSET_ISSUE_OPERATION, - ASSET_RESERVE_OPERATION, - ASSET_FUND_FEE_POOL_OPERATION, - ASSET_SETTLE_OPERATION, - ASSET_GLOBAL_SETTLE_OPERATION, - ASSET_PUBLISH_FEED_OPERATION, - WITNESS_CREATE_OPERATION, - WITNESS_UPDATE_OPERATION, - PROPOSAL_CREATE_OPERATION, - PROPOSAL_UPDATE_OPERATION, - PROPOSAL_DELETE_OPERATION, - WITHDRAW_PERMISSION_CREATE_OPERATION, - WITHDRAW_PERMISSION_UPDATE_OPERATION, - WITHDRAW_PERMISSION_CLAIM_OPERATION, - WITHDRAW_PERMISSION_DELETE_OPERATION, - COMMITTEE_MEMBER_CREATE_OPERATION, - COMMITTEE_MEMBER_UPDATE_OPERATION, - COMMITTEE_MEMBER_UPDATE_GLOBAL_PARAMETERS_OPERATION, - VESTING_BALANCE_CREATE_OPERATION, - VESTING_BALANCE_WITHDRAW_OPERATION, - WORKER_CREATE_OPERATION, - CUSTOM_OPERATION, - ASSERT_OPERATION, - BALANCE_CLAIM_OPERATION, - OVERRIDE_TRANSFER_OPERATION, - TRANSFER_TO_BLIND_OPERATION, - BLIND_TRANSFER_OPERATION, - TRANSFER_FROM_BLIND_OPERATION, - ASSET_SETTLE_CANCEL_OPERATION, // VIRTUAL - ASSET_CLAIM_FEES_OPERATION -} diff --git a/app/src/main/java/cy/agorise/graphenej/Optional.java b/app/src/main/java/cy/agorise/graphenej/Optional.java deleted file mode 100644 index c32c83a..0000000 --- a/app/src/main/java/cy/agorise/graphenej/Optional.java +++ /dev/null @@ -1,46 +0,0 @@ -package cy.agorise.graphenej; - -import com.google.gson.JsonElement; - -import cy.agorise.graphenej.interfaces.ByteSerializable; -import cy.agorise.graphenej.interfaces.GrapheneSerializable; - -/** - * Container template class used whenever we have an optional field. - * - * The idea here is that the binary serialization of this field should be performed - * in a specific way determined by the field implementing the {@link ByteSerializable} - * interface, more specifically using the {@link ByteSerializable#toBytes()} method. - * - * However, if the field is missing, the Optional class should be able to know how - * to serialize it, as this is always done by placing an zero byte. - */ -public class Optional implements GrapheneSerializable { - private T optionalField; - - public Optional(T field){ - optionalField = field; - } - - @Override - public byte[] toBytes() { - if(optionalField == null) - return new byte[] { (byte) 0 }; - else - return optionalField.toBytes(); - } - - public boolean isSet(){ - return this.optionalField != null; - } - - @Override - public String toJsonString() { - return optionalField.toJsonString(); - } - - @Override - public JsonElement toJsonObject() { - return optionalField.toJsonObject(); - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/OrderBook.java b/app/src/main/java/cy/agorise/graphenej/OrderBook.java deleted file mode 100644 index 61b5729..0000000 --- a/app/src/main/java/cy/agorise/graphenej/OrderBook.java +++ /dev/null @@ -1,98 +0,0 @@ -package cy.agorise.graphenej; - -import com.google.common.math.DoubleMath; -import com.google.common.primitives.UnsignedLong; - -import java.math.RoundingMode; -import java.util.List; - -import cy.agorise.graphenej.operations.LimitOrderCreateOperation; - -/** - * This class will maintain a snapshot of the order book between two assets. - * - * It also provides a handy method that should return the appropriate LimitOrderCreateOperation - * object needed in case the user wants to perform market-priced operations. - * - * It is important to keep the order book updated, ideally by listening to blockchain events, and calling the 'update' method. - * - * Created by nelson on 3/25/17. - */ -public class OrderBook { - private List limitOrders; - - public OrderBook(List limitOrders){ - this.limitOrders = limitOrders; - } - - /** - * Replaces the current limit order by the list provided as parameter. - * @param limitOrders: New list of orders - */ - public void update(List limitOrders){ - this.limitOrders = limitOrders; - } - - public void update(LimitOrder limitOrder){ - //TODO: Implement the method that will update a single limit order from the order book - } - - /** - * High level method used to exchange a specific amount of an asset (The base) for another - * one (The quote) at market value. - * - * It should analyze the order book and figure out the optimal amount of the base asset to give - * away in order to obtain the desired amount of the quote asset. - * - * @param seller: User account of the seller, used to build the limit order create operation - * @param myBaseAsset: The asset the user is willing to give away - * @param myQuoteAmount: The amount of a given asset the user wants - * @param expiration: The expiration time of the limit order - * - * @return An instance of the LimitOrderCreateOperation class, which is ready to be broadcasted. - */ - public LimitOrderCreateOperation exchange(UserAccount seller, Asset myBaseAsset, AssetAmount myQuoteAmount, int expiration){ - AssetAmount toSell = new AssetAmount(UnsignedLong.valueOf(calculateRequiredBase(myQuoteAmount)), myBaseAsset); - AssetAmount toReceive = myQuoteAmount; - LimitOrderCreateOperation buyOrder = new LimitOrderCreateOperation(seller, toSell, toReceive, expiration, true); - - return buyOrder; - } - - /** - * Given a specific amount of a desired asset, this method will calculate how much of the corresponding - * asset we need to offer to perform a successful transaction with the current order book. - * @param quoteAmount: The amount of the desired asset. - * @return: The minimum amount of the base asset that we need to give away - */ - public long calculateRequiredBase(AssetAmount quoteAmount){ - long totalBought = 0; - long totalSold = 0; - for(int i = 0; i < this.limitOrders.size() && totalBought < quoteAmount.getAmount().longValue(); i++){ - LimitOrder order = this.limitOrders.get(i); - - // If the base asset is the same as our quote asset, we have a match - if(order.getSellPrice().base.getAsset().getObjectId().equals(quoteAmount.getAsset().getObjectId())){ - // My quote amount, is the order's base amount - long orderAmount = order.getForSale(); - - // The amount of the quote asset we still need - long stillNeed = quoteAmount.getAmount().longValue() - totalBought; - - // If the offered amount is greater than what we still need, we exchange just what we need - if(orderAmount >= stillNeed) { - totalBought += stillNeed; - double additionalRatio = (double) stillNeed / (double) order.getSellPrice().base.getAmount().longValue(); - double additionalAmount = order.getSellPrice().quote.getAmount().longValue() * additionalRatio; - long longAdditional = DoubleMath.roundToLong(additionalAmount, RoundingMode.HALF_UP); - totalSold += longAdditional; - }else{ - // If the offered amount is less than what we need, we exchange the whole order - totalBought += orderAmount; - totalSold += order.getSellPrice().quote.getAmount().longValue(); - } - } - } - return totalSold; - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/Price.java b/app/src/main/java/cy/agorise/graphenej/Price.java deleted file mode 100644 index dd0803c..0000000 --- a/app/src/main/java/cy/agorise/graphenej/Price.java +++ /dev/null @@ -1,28 +0,0 @@ -package cy.agorise.graphenej; - -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonParseException; - -import java.lang.reflect.Type; - -/** - * The price struct stores asset prices in the Graphene system. - * - * A price is defined as a ratio between two assets, and represents a possible exchange rate - * between those two assets. prices are generally not stored in any simplified form, i.e. a price - * of (1000 CORE)/(20 USD) is perfectly normal. - - * The assets within a price are labeled base and quote. Throughout the Graphene code base, - * the convention used is that the base asset is the asset being sold, and the quote asset is - * the asset being purchased, where the price is represented as base/quote, so in the example - * price above the seller is looking to sell CORE asset and get USD in return. - * - * Note: Taken from the Graphene doxygen. - * Created by nelson on 12/16/16. - */ -public class Price { - public AssetAmount base; - public AssetAmount quote; -} diff --git a/app/src/main/java/cy/agorise/graphenej/PublicKey.java b/app/src/main/java/cy/agorise/graphenej/PublicKey.java deleted file mode 100644 index f20f648..0000000 --- a/app/src/main/java/cy/agorise/graphenej/PublicKey.java +++ /dev/null @@ -1,56 +0,0 @@ -package cy.agorise.graphenej; - -import org.bitcoinj.core.ECKey; -import org.spongycastle.math.ec.ECPoint; - -import java.io.Serializable; - -import cy.agorise.graphenej.interfaces.ByteSerializable; - -/** - * Created by nelson on 11/30/16. - */ -public class PublicKey implements ByteSerializable, Serializable { - private ECKey publicKey; - - public PublicKey(ECKey key) { - if(key.hasPrivKey()){ - throw new IllegalStateException("Passing a private key to PublicKey constructor"); - } - this.publicKey = key; - } - - public ECKey getKey(){ - return publicKey; - } - - @Override - public byte[] toBytes() { - if(publicKey.isCompressed()) { - return publicKey.getPubKey(); - }else{ - publicKey = ECKey.fromPublicOnly(ECKey.compressPoint(publicKey.getPubKeyPoint())); - return publicKey.getPubKey(); - } - } - - public String getAddress(){ - ECKey pk = ECKey.fromPublicOnly(publicKey.getPubKey()); - if(!pk.isCompressed()){ - ECPoint point = ECKey.compressPoint(pk.getPubKeyPoint()); - pk = ECKey.fromPublicOnly(point); - } - return new Address(pk).toString(); - } - - @Override - public int hashCode() { - return publicKey.hashCode(); - } - - @Override - public boolean equals(Object obj) { - PublicKey other = (PublicKey) obj; - return this.publicKey.equals(other.getKey()); - } -} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/graphenej/RPC.java b/app/src/main/java/cy/agorise/graphenej/RPC.java deleted file mode 100644 index e1f42c0..0000000 --- a/app/src/main/java/cy/agorise/graphenej/RPC.java +++ /dev/null @@ -1,32 +0,0 @@ -package cy.agorise.graphenej; - -/** - * Created by nelson on 11/16/16. - */ -public class RPC { - public static final String VERSION = "2.0"; - public static final String CALL_LOGIN = "login"; - public static final String CALL_NETWORK_BROADCAST = "network_broadcast"; - public static final String CALL_HISTORY = "history"; - public static final String CALL_DATABASE = "database"; - public static final String CALL_ASSET = "asset"; - public static final String CALL_SET_SUBSCRIBE_CALLBACK = "set_subscribe_callback"; - public static final String CALL_CANCEL_ALL_SUBSCRIPTIONS = "cancel_all_subscriptions"; - public static final String CALL_GET_ACCOUNT_BY_NAME = "get_account_by_name"; - public static final String CALL_GET_ACCOUNTS = "get_accounts"; - public static final String CALL_GET_DYNAMIC_GLOBAL_PROPERTIES = "get_dynamic_global_properties"; - public static final String CALL_BROADCAST_TRANSACTION = "broadcast_transaction"; - public static final String CALL_GET_REQUIRED_FEES = "get_required_fees"; - public static final String CALL_GET_KEY_REFERENCES = "get_key_references"; - public static final String CALL_GET_RELATIVE_ACCOUNT_HISTORY = "get_relative_account_history"; - public static final String CALL_LOOKUP_ACCOUNTS = "lookup_accounts"; - public static final String CALL_LIST_ASSETS = "list_assets"; - public static final String GET_OBJECTS = "get_objects"; - public static final String GET_ACCOUNT_BALANCES = "get_account_balances"; - public static final String CALL_LOOKUP_ASSET_SYMBOLS = "lookup_asset_symbols"; - public static final String CALL_GET_BLOCK_HEADER = "get_block_header"; - public static final String CALL_GET_LIMIT_ORDERS = "get_limit_orders"; - public static final String CALL_GET_TRADE_HISTORY = "get_trade_history"; - public static final String CALL_GET_MARKET_HISTORY = "get_market_history"; - public static final String CALL_GET_ALL_ASSET_HOLDERS = "get_all_asset_holders"; -} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/graphenej/Transaction.java b/app/src/main/java/cy/agorise/graphenej/Transaction.java deleted file mode 100644 index 68fd11c..0000000 --- a/app/src/main/java/cy/agorise/graphenej/Transaction.java +++ /dev/null @@ -1,377 +0,0 @@ -package cy.agorise.graphenej; - -import com.google.common.primitives.Bytes; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonArray; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.JsonSerializationContext; -import com.google.gson.JsonSerializer; - -import org.bitcoinj.core.DumpedPrivateKey; -import org.bitcoinj.core.ECKey; -import org.bitcoinj.core.Sha256Hash; -import org.bitcoinj.core.Utils; - -import java.lang.reflect.Type; -import java.text.ParsePosition; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.TimeZone; - -import cy.agorise.graphenej.interfaces.ByteSerializable; -import cy.agorise.graphenej.interfaces.JsonSerializable; -import cy.agorise.graphenej.operations.LimitOrderCreateOperation; -import cy.agorise.graphenej.operations.TransferOperation; - -/** - * Class used to represent a generic Graphene transaction. - */ -public class Transaction implements ByteSerializable, JsonSerializable { - - /* Default expiration time */ - public static final int DEFAULT_EXPIRATION_TIME = 30; - - /* Constant field names used for serialization/deserialization purposes */ - public static final String KEY_EXPIRATION = "expiration"; - public static final String KEY_SIGNATURES = "signatures"; - public static final String KEY_OPERATIONS = "operations"; - public static final String KEY_EXTENSIONS = "extensions"; - public static final String KEY_REF_BLOCK_NUM = "ref_block_num"; - public static final String KEY_REF_BLOCK_PREFIX = "ref_block_prefix"; - - private ECKey privateKey; - private BlockData blockData; - private List operations; - private Extensions extensions; - - /** - * Transaction constructor. - * @param privateKey : Instance of a ECKey containing the private key that will be used to sign this transaction. - * @param blockData : Block data containing important information used to sign a transaction. - * @param operationList : List of operations to include in the transaction. - */ - public Transaction(ECKey privateKey, BlockData blockData, List operationList){ - this.privateKey = privateKey; - this.blockData = blockData; - this.operations = operationList; - this.extensions = new Extensions(); - } - - /** - * Transaction constructor. - * @param wif: The user's private key in the base58 format. - * @param block_data: Block data containing important information used to sign a transaction. - * @param operation_list: List of operations to include in the transaction. - */ - public Transaction(String wif, BlockData block_data, List operation_list){ - this(DumpedPrivateKey.fromBase58(null, wif).getKey(), block_data, operation_list); - } - - /** - * Constructor used to build a Transaction object without a private key. This kind of object - * is used to represent a transaction data that we don't intend to serialize and sign. - * @param blockData: Block data instance, containing information about the location of this transaction in the blockchain. - * @param operationList: The list of operations included in this transaction. - */ - public Transaction(BlockData blockData, List operationList){ - this.blockData = blockData; - this.operations = operationList; - } - - /** - * Updates the block data - * @param blockData: New block data - */ - public void setBlockData(BlockData blockData){ - this.blockData = blockData; - } - - /** - * Updates the fees for all operations in this transaction. - * @param fees: New fees to apply - */ - public void setFees(List fees){ - for(int i = 0; i < operations.size(); i++) - operations.get(i).setFee(fees.get(i)); - } - - public ECKey getPrivateKey(){ - return this.privateKey; - } - - public List getOperations(){ return this.operations; } - - /** - * This method is used to query whether the instance has a private key. - * @return - */ - public boolean hasPrivateKey(){ - return this.privateKey != null; - } - - /** - * Obtains a signature of this transaction. Please note that due to the current reliance on - * bitcoinj to generate the signatures, and due to the fact that it uses deterministic - * ecdsa signatures, we are slightly modifying the expiration time of the transaction while - * we look for a signature that will be accepted by the graphene network. - * - * This should then be called before any other serialization method. - * @return: A valid signature of the current transaction. - */ - public byte[] getGrapheneSignature(){ - boolean isGrapheneCanonical = false; - byte[] sigData = null; - - while(!isGrapheneCanonical) { - byte[] serializedTransaction = this.toBytes(); - Sha256Hash hash = Sha256Hash.wrap(Sha256Hash.hash(serializedTransaction)); - int recId = -1; - ECKey.ECDSASignature sig = privateKey.sign(hash); - - // Now we have to work backwards to figure out the recId needed to recover the signature. - for (int i = 0; i < 4; i++) { - ECKey k = ECKey.recoverFromSignature(i, sig, hash, privateKey.isCompressed()); - if (k != null && k.getPubKeyPoint().equals(privateKey.getPubKeyPoint())) { - recId = i; - break; - } - } - - sigData = new byte[65]; // 1 header + 32 bytes for R + 32 bytes for S - int headerByte = recId + 27 + (privateKey.isCompressed() ? 4 : 0); - sigData[0] = (byte) headerByte; - System.arraycopy(Utils.bigIntegerToBytes(sig.r, 32), 0, sigData, 1, 32); - System.arraycopy(Utils.bigIntegerToBytes(sig.s, 32), 0, sigData, 33, 32); - - // Further "canonicality" tests - if(((sigData[0] & 0x80) != 0) || (sigData[0] == 0) || - ((sigData[1] & 0x80) != 0) || ((sigData[32] & 0x80) != 0) || - (sigData[32] == 0) || ((sigData[33] & 0x80) != 0)){ - this.blockData.setExpiration(this.blockData.getExpiration() + 1); - }else{ - isGrapheneCanonical = true; - } - } - return sigData; - } - - /** - * Method that creates a serialized byte array with compact information about this transaction - * that is needed for the creation of a signature. - * @return: byte array with serialized information about this transaction. - */ - public byte[] toBytes(){ - // Creating a List of Bytes and adding the first bytes from the chain apiId - List byteArray = new ArrayList(); - byteArray.addAll(Bytes.asList(Util.hexToBytes(Chains.BITSHARES.CHAIN_ID))); - - // Adding the block data - byteArray.addAll(Bytes.asList(this.blockData.toBytes())); - - // Adding the number of operations - byteArray.add((byte) this.operations.size()); - - // Adding all the operations - for(BaseOperation operation : operations){ - byteArray.add(operation.getId()); - byteArray.addAll(Bytes.asList(operation.toBytes())); - } - - // Adding extensions byte - byteArray.addAll(Bytes.asList(this.extensions.toBytes())); - - return Bytes.toArray(byteArray); - } - - @Override - public String toJsonString() { - GsonBuilder gsonBuilder = new GsonBuilder(); - gsonBuilder.registerTypeAdapter(Transaction.class, new TransactionSerializer()); - return gsonBuilder.create().toJson(this); - } - - @Override - public JsonObject toJsonObject() { - JsonObject obj = new JsonObject(); - - // Getting the signature before anything else, - // since this might change the transaction expiration data slightly - byte[] signature = getGrapheneSignature(); - - // Formatting expiration time - Date expirationTime = new Date(blockData.getExpiration() * 1000); - SimpleDateFormat dateFormat = new SimpleDateFormat(Util.TIME_DATE_FORMAT); - dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); - - // Adding expiration - obj.addProperty(KEY_EXPIRATION, dateFormat.format(expirationTime)); - - // Adding signatures - JsonArray signatureArray = new JsonArray(); - signatureArray.add(Util.bytesToHex(signature)); - obj.add(KEY_SIGNATURES, signatureArray); - - JsonArray operationsArray = new JsonArray(); - for(BaseOperation operation : operations){ - operationsArray.add(operation.toJsonObject()); - } - // Adding operations - obj.add(KEY_OPERATIONS, operationsArray); - - // Adding extensions - obj.add(KEY_EXTENSIONS, new JsonArray()); - - // Adding block data - obj.addProperty(KEY_REF_BLOCK_NUM, blockData.getRefBlockNum()); - obj.addProperty(KEY_REF_BLOCK_PREFIX, blockData.getRefBlockPrefix()); - - return obj; - - } - - /** - * Class used to encapsulate the procedure to be followed when converting a transaction from a - * java object to its JSON string format representation. - */ - public static class TransactionSerializer implements JsonSerializer { - - @Override - public JsonElement serialize(Transaction transaction, Type type, JsonSerializationContext jsonSerializationContext) { - return transaction.toJsonObject(); - } - } - - /** - * Static inner class used to encapsulate the procedure to be followed when converting a transaction from its - * JSON string format representation into a java object instance. - */ - public static class TransactionDeserializer implements JsonDeserializer { - - @Override - public Transaction deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - JsonObject jsonObject = json.getAsJsonObject(); - - // Parsing block data information - int refBlockNum = jsonObject.get(KEY_REF_BLOCK_NUM).getAsInt(); - long refBlockPrefix = jsonObject.get(KEY_REF_BLOCK_PREFIX).getAsLong(); - String expiration = jsonObject.get(KEY_EXPIRATION).getAsString(); - SimpleDateFormat dateFormat = new SimpleDateFormat(Util.TIME_DATE_FORMAT); - dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); - Date expirationDate = dateFormat.parse(expiration, new ParsePosition(0)); - BlockData blockData = new BlockData(refBlockNum, refBlockPrefix, expirationDate.getTime()); - - // Parsing operation list - BaseOperation operation = null; - ArrayList operationList = new ArrayList<>(); - try { - for (JsonElement jsonOperation : jsonObject.get(KEY_OPERATIONS).getAsJsonArray()) { - int operationId = jsonOperation.getAsJsonArray().get(0).getAsInt(); - if (operationId == OperationType.TRANSFER_OPERATION.ordinal()) { - operation = context.deserialize(jsonOperation, TransferOperation.class); - } else if (operationId == OperationType.LIMIT_ORDER_CREATE_OPERATION.ordinal()) { - operation = context.deserialize(jsonOperation, LimitOrderCreateOperation.class); - } else if (operationId == OperationType.LIMIT_ORDER_CANCEL_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.CALL_ORDER_UPDATE_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.FILL_ORDER_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.ACCOUNT_CREATE_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.ACCOUNT_UPDATE_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.ACCOUNT_WHITELIST_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.ACCOUNT_UPGRADE_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.ACCOUNT_TRANSFER_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.ASSET_CREATE_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.ASSET_UPDATE_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.ASSET_UPDATE_BITASSET_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.ASSET_UPDATE_FEED_PRODUCERS_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.ASSET_ISSUE_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.ASSET_RESERVE_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.ASSET_FUND_FEE_POOL_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.ASSET_SETTLE_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.ASSET_GLOBAL_SETTLE_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.ASSET_PUBLISH_FEED_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.WITNESS_CREATE_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.WITNESS_UPDATE_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.PROPOSAL_CREATE_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.PROPOSAL_UPDATE_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.PROPOSAL_DELETE_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.WITHDRAW_PERMISSION_CREATE_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.WITHDRAW_PERMISSION_UPDATE_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.WITHDRAW_PERMISSION_CLAIM_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.WITHDRAW_PERMISSION_DELETE_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.COMMITTEE_MEMBER_CREATE_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.COMMITTEE_MEMBER_UPDATE_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.COMMITTEE_MEMBER_UPDATE_GLOBAL_PARAMETERS_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.VESTING_BALANCE_CREATE_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.VESTING_BALANCE_WITHDRAW_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.WORKER_CREATE_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.CUSTOM_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.ASSERT_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.BALANCE_CLAIM_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.OVERRIDE_TRANSFER_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.TRANSFER_TO_BLIND_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.BLIND_TRANSFER_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.TRANSFER_FROM_BLIND_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.ASSET_SETTLE_CANCEL_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } else if (operationId == OperationType.ASSET_CLAIM_FEES_OPERATION.ordinal()) { - //TODO: Add operation deserialization support - } - if (operation != null) operationList.add(operation); - operation = null; - } - return new Transaction(blockData, operationList); - }catch(Exception e){ - System.out.println("Exception. Msg: "+e.getMessage()); - for(StackTraceElement el : e.getStackTrace()){ - System.out.println(el.getFileName()+"#"+el.getMethodName()+":"+el.getLineNumber()); - } - } - return new Transaction(blockData, operationList); - } - } -} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/graphenej/UserAccount.java b/app/src/main/java/cy/agorise/graphenej/UserAccount.java deleted file mode 100644 index dee9197..0000000 --- a/app/src/main/java/cy/agorise/graphenej/UserAccount.java +++ /dev/null @@ -1,329 +0,0 @@ -package cy.agorise.graphenej; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonArray; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.annotations.Expose; - -import java.io.ByteArrayOutputStream; -import java.io.DataOutput; -import java.io.DataOutputStream; -import java.io.IOException; -import java.lang.reflect.Type; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; - -import cy.agorise.graphenej.interfaces.ByteSerializable; -import cy.agorise.graphenej.interfaces.JsonSerializable; - -/** - * Class that represents a graphene user account. - */ -public class UserAccount extends GrapheneObject implements ByteSerializable, JsonSerializable { - - public static final String PROXY_TO_SELF = "1.2.5"; - public static final String KEY_MEMBERSHIP_EXPIRATION_DATE = "membership_expiration_date"; - public static final String KEY_REGISTRAR = "registrar"; - public static final String KEY_REFERRER = "referrer"; - public static final String KEY_LIFETIME_REFERRER = "lifetime_referrer"; - public static final String KEY_NETWORK_FEE_PERCENTAGE = "network_fee_percentage"; - public static final String KEY_LIFETIME_REFERRER_FEE_PERCENTAGE = "lifetime_referrer_fee_percentage"; - public static final String KEY_REFERRER_REWARD_PERCENTAGE = "referrer_rewards_percentage"; - public static final String KEY_NAME = "name"; - public static final String KEY_OWNER = "owner"; - public static final String KEY_ACTIVE = "active"; - public static final String KEY_OPTIONS = "options"; - public static final String KEY_STATISTICS = "statistics"; - public static final String KEY_WHITELISTING_ACCOUNTS = "whitelisting_accounts"; - public static final String KEY_BLACKLISTING_ACCOUNTS = "blacklisting_accounts"; - public static final String KEY_WHITELISTED_ACCOUNTS = "whitelisted_accounts"; - public static final String KEY_BLACKLISTED_ACCOUNTS = "blacklisted_accounts"; - public static final String KEY_OWNER_SPECIAL_AUTHORITY = "owner_special_authority"; - public static final String KEY_ACTIVE_SPECIAL_AUTHORITY = "active_special_authority"; - public static final String KEY_N_CONTROL_FLAGS = "top_n_control_flags"; - - @Expose - private String name; - - @Expose - private Authority owner; - - @Expose - private Authority active; - - @Expose - private AccountOptions options; - - @Expose - private String statistics; - - @Expose - private long membershipExpirationDate; - - @Expose - private String registrar; - - @Expose - private String referrer; - - @Expose - private String lifetimeReferrer; - - @Expose - private long networkFeePercentage; - - @Expose - private long lifetimeReferrerFeePercentage; - - @Expose - private long referrerRewardsPercentage; - - - - /** - * Constructor that expects a user account in the string representation. - * That is in the 1.2.x format. - * @param id: The string representing the user account. - */ - public UserAccount(String id) { - super(id); - } - - /** - * Constructor that expects a user account withe the proper graphene object id and an account name. - * @param id: The string representing the user account. - * @param name: The name of this user account. - */ - public UserAccount(String id, String name){ - super(id); - this.name = name; - } - - /** - * Getter for the account name field. - * @return: The name of this account. - */ - public String getName() { - return name; - } - - - /** - * Setter for the account name field. - * @param name: The account name. - */ - public void setName(String name) { - this.name = name; - } - - @Override - public boolean equals(Object o) { - return this.getObjectId().equals(((UserAccount)o).getObjectId()); - } - - @Override - public int hashCode() { - return this.getObjectId().hashCode(); - } - - @Override - public byte[] toBytes() { - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - DataOutput out = new DataOutputStream(byteArrayOutputStream); - try { - Varint.writeUnsignedVarLong(this.instance, out); - } catch (IOException e) { - e.printStackTrace(); - } - return byteArrayOutputStream.toByteArray(); - } - - @Override - public String toJsonString() { - Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); - return gson.toJson(this); - } - - @Override - public JsonObject toJsonObject() { - return null; - } - - @Override - public String toString() { - return this.toJsonString(); - } - - public long getMembershipExpirationDate() { - return membershipExpirationDate; - } - - public void setMembershipExpirationDate(long membershipExpirationDate) { - this.membershipExpirationDate = membershipExpirationDate; - } - - public String getRegistrar() { - return registrar; - } - - public void setRegistrar(String registrar) { - this.registrar = registrar; - } - - public String getReferrer() { - return referrer; - } - - public void setReferrer(String referrer) { - this.referrer = referrer; - } - - public String getLifetimeReferrer() { - return lifetimeReferrer; - } - - public void setLifetimeReferrer(String lifetimeReferrer) { - this.lifetimeReferrer = lifetimeReferrer; - } - - public long getNetworkFeePercentage() { - return networkFeePercentage; - } - - public void setNetworkFeePercentage(long networkFeePercentage) { - this.networkFeePercentage = networkFeePercentage; - } - - public long getLifetimeReferrerFeePercentage() { - return lifetimeReferrerFeePercentage; - } - - public void setLifetimeReferrerFeePercentage(long lifetimeReferrerFeePercentage) { - this.lifetimeReferrerFeePercentage = lifetimeReferrerFeePercentage; - } - - public long getReferrerRewardsPercentage() { - return referrerRewardsPercentage; - } - - public void setReferrerRewardsPercentage(long referrerRewardsPercentage) { - this.referrerRewardsPercentage = referrerRewardsPercentage; - } - - public Authority getOwner() { - return owner; - } - - public void setOwner(Authority owner) { - this.owner = owner; - } - - public Authority getActive() { - return active; - } - - public void setActive(Authority active) { - this.active = active; - } - - public AccountOptions getOptions() { - return options; - } - - public void setOptions(AccountOptions options) { - this.options = options; - } - - public String getStatistics() { - return statistics; - } - - public void setStatistics(String statistics) { - this.statistics = statistics; - } - - /** - * Deserializer used to build a UserAccount instance from the full JSON-formatted response obtained - * by the 'get_objects' API call. - */ - public static class UserAccountFullDeserializer implements JsonDeserializer { - - @Override - public UserAccount deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - JsonObject jsonAccount = json.getAsJsonObject(); - - SimpleDateFormat dateFormat = new SimpleDateFormat(Util.TIME_DATE_FORMAT); - - // Retrieving and deserializing fields - String id = jsonAccount.get(KEY_ID).getAsString(); - String name = jsonAccount.get(KEY_NAME).getAsString(); - UserAccount userAccount = new UserAccount(id, name); - AccountOptions options = context.deserialize(jsonAccount.get(KEY_OPTIONS), AccountOptions.class); - Authority owner = context.deserialize(jsonAccount.get(KEY_OWNER), Authority.class); - Authority active = context.deserialize(jsonAccount.get(KEY_ACTIVE), Authority.class); - - // Setting deserialized fields into the created instance - userAccount.setRegistrar(jsonAccount.get(KEY_REGISTRAR).getAsString()); - - // Handling the deserialization and assignation of the membership date, which internally - // is stored as a long POSIX time value - try{ - Date date = dateFormat.parse(jsonAccount.get(KEY_MEMBERSHIP_EXPIRATION_DATE).getAsString()); - userAccount.setMembershipExpirationDate(date.getTime()); - } catch (ParseException e) { - System.out.println("ParseException. Msg: "+e.getMessage()); - } - - // Setting the other fields - userAccount.setReferrer(jsonAccount.get(KEY_REFERRER).getAsString()); - userAccount.setLifetimeReferrer(jsonAccount.get(KEY_LIFETIME_REFERRER).getAsString()); - userAccount.setNetworkFeePercentage(jsonAccount.get(KEY_NETWORK_FEE_PERCENTAGE).getAsLong()); - userAccount.setLifetimeReferrerFeePercentage(jsonAccount.get(KEY_LIFETIME_REFERRER_FEE_PERCENTAGE).getAsLong()); - userAccount.setReferrerRewardsPercentage(jsonAccount.get(KEY_REFERRER_REWARD_PERCENTAGE).getAsLong()); - userAccount.setOwner(owner); - userAccount.setActive(active); - userAccount.setOptions(options); - userAccount.setStatistics(jsonAccount.get(KEY_STATISTICS).getAsString()); - return userAccount; - } - } - - /** - * Custom deserializer used to deserialize user accounts provided as response from the 'lookup_accounts' api call. - * This response contains serialized user accounts in the form [[{id1},{name1}][{id1},{name1}]]. - * - * For instance: - * [["bilthon-1","1.2.139205"],["bilthon-2","1.2.139207"],["bilthon-2016","1.2.139262"]] - * - * So this class will pick up this data and turn it into a UserAccount object. - */ - public static class UserAccountDeserializer implements JsonDeserializer { - - @Override - public UserAccount deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - JsonArray array = json.getAsJsonArray(); - String name = array.get(0).getAsString(); - String id = array.get(1).getAsString(); - return new UserAccount(id, name); - } - } - - /** - * Custom deserializer used to deserialize user accounts as provided by the response of the 'get_key_references' api call. - * This response contains serialized user accounts in the form [["id1","id2"]] - */ - public static class UserAccountSimpleDeserializer implements JsonDeserializer { - - @Override - public UserAccount deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - String id = json.getAsString(); - return new UserAccount(id); - } - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/Util.java b/app/src/main/java/cy/agorise/graphenej/Util.java deleted file mode 100644 index 848d89f..0000000 --- a/app/src/main/java/cy/agorise/graphenej/Util.java +++ /dev/null @@ -1,347 +0,0 @@ -package cy.agorise.graphenej; - -import com.google.common.primitives.Bytes; -import org.tukaani.xz.*; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.ByteBuffer; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.Arrays; -import java.util.logging.Level; -import java.util.logging.Logger; -import org.spongycastle.crypto.DataLengthException; -import org.spongycastle.crypto.InvalidCipherTextException; -import org.spongycastle.crypto.engines.AESFastEngine; -import org.spongycastle.crypto.modes.CBCBlockCipher; -import org.spongycastle.crypto.paddings.PaddedBufferedBlockCipher; -import org.spongycastle.crypto.params.KeyParameter; -import org.spongycastle.crypto.params.ParametersWithIV; - -/** - * Class used to encapsulate common utility methods - */ -public class Util { - public static final String TAG = "Util"; - private static final char[] hexArray = "0123456789abcdef".toCharArray(); - public static final int LZMA = 0; - public static final int XZ = 1; - - /** - * AES encryption key length in bytes - */ - public static final int KEY_LENGTH = 32; - - /** - * Time format used across the platform - */ - public static final String TIME_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss"; - - - /** - * Converts an hexadecimal string to its corresponding byte[] value. - * @param s: String with hexadecimal numbers representing a byte array. - * @return: The actual byte array. - */ - public static byte[] hexToBytes(String s) { - int len = s.length(); - byte[] data = new byte[len / 2]; - for (int i = 0; i < len; i += 2) { - data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) - + Character.digit(s.charAt(i+1), 16)); - } - return data; - } - - /** - * Converts a byte array, into a user-friendly hexadecimal string. - * @param bytes: A byte array. - * @return: A string with the representation of the byte array. - */ - public static String bytesToHex(byte[] bytes) { - char[] hexChars = new char[bytes.length * 2]; - for ( int j = 0; j < bytes.length; j++ ) { - int v = bytes[j] & 0xFF; - hexChars[j * 2] = hexArray[v >>> 4]; - hexChars[j * 2 + 1] = hexArray[v & 0x0F]; - } - return new String(hexChars); - } - - /** - * Decodes an ascii string to a byte array. - * @param data: Arbitrary ascii-encoded string. - * @return: Array of bytes. - */ - public static byte[] hexlify(String data){ - ByteBuffer buffer = ByteBuffer.allocate(data.length()); - for(char letter : data.toCharArray()){ - buffer.put((byte) letter); - } - return buffer.array(); - } - - /** - * Utility function that compresses data using the LZMA algorithm. - * @param inputBytes Input bytes of the data to be compressed. - * @param which Which subclass of the FinishableOutputStream to use. - * @return Compressed data - * @author Henry Varona - */ - public static byte[] compress(byte[] inputBytes, int which) { - FinishableOutputStream out = null; - try { - ByteArrayInputStream input = new ByteArrayInputStream(inputBytes); - ByteArrayOutputStream output = new ByteArrayOutputStream(2048); - LZMA2Options options = new LZMA2Options(); - if(which == Util.LZMA) { - out = new LZMAOutputStream(output, options, -1); - }else if(which == Util.XZ){ - out = new XZOutputStream(output, options); - } - byte[] inputBuffer = new byte[inputBytes.length]; - int size; - while ((size = input.read(inputBuffer)) != -1) { - out.write(inputBuffer, 0, size); - } - out.finish(); - return output.toByteArray(); - } catch (IOException ex) { - Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex); - } finally { - try { - out.close(); - } catch (IOException ex) { - Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex); - } - } - return null; - } - - /** - * Utility function that decompresses data that has been compressed using the LZMA algorithm - * by the {@link Util#compress(byte[], int)} method. - * @param inputBytes Compressed data. - * @param which Which subclass if InputStream to use. - * @return Uncompressed data - * @author Henry Varona - */ - public static byte[] decompress(byte[] inputBytes, int which) { - InputStream in = null; - try { - System.out.println("Bytes: "+Util.bytesToHex(inputBytes)); - ByteArrayInputStream input = new ByteArrayInputStream(inputBytes); - ByteArrayOutputStream output = new ByteArrayOutputStream(16*2048); - if(which == XZ) { - in = new XZInputStream(input); - }else if(which == LZMA){ - in = new LZMAInputStream(input); - } - int size; - try{ - while ((size = in.read()) != -1) { - output.write(size); - } - }catch(CorruptedInputException e){ - // Taking property byte - byte[] properties = Arrays.copyOfRange(inputBytes, 0, 1); - // Taking dict size bytes - byte[] dictSize = Arrays.copyOfRange(inputBytes, 1, 5); - // Taking uncompressed size bytes - byte[] uncompressedSize = Arrays.copyOfRange(inputBytes, 5, 13); - - // Reversing bytes in header - byte[] header = Bytes.concat(properties, Util.revertBytes(dictSize), Util.revertBytes(uncompressedSize)); - byte[] payload = Arrays.copyOfRange(inputBytes, 13, inputBytes.length); - - // Trying again - input = new ByteArrayInputStream(Bytes.concat(header, payload)); - output = new ByteArrayOutputStream(2048); - if(which == XZ) { - in = new XZInputStream(input); - }else if(which == LZMA){ - in = new LZMAInputStream(input); - } - try{ - while ((size = in.read()) != -1) { - output.write(size); - } - }catch(CorruptedInputException ex){ - System.out.println("CorruptedInputException. Msg: "+ex.getMessage()); - } - } - in.close(); - return output.toByteArray(); - } catch (IOException ex) { - Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex); - } - return null; - } - - /** - * Returns an array of bytes with the underlying data used to represent an integer in the reverse form. - * This is useful for endianess switches, meaning that if you give this function a big-endian integer - * it will return it's little-endian bytes. - * @param input An Integer value. - * @return The array of bytes that represent this value in the reverse format. - */ - public static byte[] revertInteger(Integer input){ - return ByteBuffer.allocate(Integer.SIZE / 8).putInt(Integer.reverseBytes(input)).array(); - } - - /** - * Same operation as in the revertInteger function, but in this case for a short (2 bytes) value. - * @param input A Short value - * @return The array of bytes that represent this value in the reverse format. - */ - public static byte[] revertShort(Short input){ - return ByteBuffer.allocate(Short.SIZE / 8).putShort(Short.reverseBytes(input)).array(); - } - - /** - * Same operation as in the revertInteger function, but in this case for a long (8 bytes) value. - * @param input A Long value - * @return The array of bytes that represent this value in the reverse format. - */ - public static byte[] revertLong(Long input) { - return ByteBuffer.allocate(Long.SIZE / 8).putLong(Long.reverseBytes(input)).array(); - } - - public static byte[] revertBytes(byte[] array){ - byte[] reverted = new byte[array.length]; - for(int i = 0; i < reverted.length; i++){ - reverted[i] = array[array.length - i - 1]; - } - return reverted; - } - - /** - * Function to encrypt a message with AES - * @param input data to encrypt - * @param key key for encryption - * @return AES Encription of input - */ - public static byte[] encryptAES(byte[] input, byte[] key) { - try { - MessageDigest md = MessageDigest.getInstance("SHA-512"); - byte[] result = md.digest(key); - byte[] ivBytes = new byte[16]; - System.arraycopy(result, 32, ivBytes, 0, 16); - byte[] sksBytes = new byte[32]; - System.arraycopy(result, 0, sksBytes, 0, 32); - - PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(new AESFastEngine())); - cipher.init(true, new ParametersWithIV(new KeyParameter(sksBytes), ivBytes)); - byte[] temp = new byte[input.length + (16 - (input.length % 16))]; - System.arraycopy(input, 0, temp, 0, input.length); - Arrays.fill(temp, input.length, temp.length, (byte) (16 - (input.length % 16))); - byte[] out = new byte[cipher.getOutputSize(temp.length)]; - int proc = cipher.processBytes(temp, 0, temp.length, out, 0); - cipher.doFinal(out, proc); - temp = new byte[out.length - 16]; - System.arraycopy(out, 0, temp, 0, temp.length); - return temp; - } catch (NoSuchAlgorithmException | DataLengthException | IllegalStateException | InvalidCipherTextException ex) { - } - return null; - } - - /** - * Function to decrypt a message with AES encryption - * @param input data to decrypt - * @param key key for decryption - * @return input decrypted with AES. Null if the decrypt failed (Bad Key) - */ - public static byte[] decryptAES(byte[] input, byte[] key) { - try { - MessageDigest md = MessageDigest.getInstance("SHA-512"); - byte[] result = md.digest(key); - byte[] ivBytes = new byte[16]; - System.arraycopy(result, 32, ivBytes, 0, 16); - byte[] sksBytes = new byte[32]; - System.arraycopy(result, 0, sksBytes, 0, 32); - PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(new AESFastEngine())); - cipher.init(false, new ParametersWithIV(new KeyParameter(sksBytes), ivBytes)); - - byte[] pre_out = new byte[cipher.getOutputSize(input.length)]; - int proc = cipher.processBytes(input, 0, input.length, pre_out, 0); - int proc2 = cipher.doFinal(pre_out, proc); - byte[] out = new byte[proc+proc2]; - System.arraycopy(pre_out, 0, out, 0, proc+proc2); - - //Unpadding - byte countByte = (byte)((byte)out[out.length-1] % 16); - int count = countByte & 0xFF; - - if ((count > 15) || (count <= 0)){ - return out; - } - - byte[] temp = new byte[count]; - System.arraycopy(out, out.length - count, temp, 0, temp.length); - byte[] temp2 = new byte[count]; - Arrays.fill(temp2, (byte) count); - if (Arrays.equals(temp, temp2)) { - temp = new byte[out.length - count]; - System.arraycopy(out, 0, temp, 0, out.length - count); - return temp; - } else { - return out; - } - } catch (NoSuchAlgorithmException | DataLengthException | IllegalStateException | InvalidCipherTextException ex) { - ex.printStackTrace(); - } - return null; - } - - /** - * Transform an array of bytes to an hex String representation - * @param input array of bytes to transform as a string - * @return Input as a String - */ - public static String byteToString(byte[] input) { - StringBuilder result = new StringBuilder(); - for (byte in : input) { - if ((in & 0xff) < 0x10) { - result.append("0"); - } - result.append(Integer.toHexString(in & 0xff)); - } - return result.toString(); - } - - /** - * Converts a base value to its standard version, considering the precision of the asset. - * - * By standard representation we mean here the value that is usually presented to the user, - * and which already takes into account the precision of the asset. - * - * For example, a base representation of the core token BTS would be 260000. By taking into - * consideration the precision, the same value when converted to the standard format will - * be 2.6 BTS. - * - * @param assetAmount: The asset amount instance. - * @return: Converts from base to standard representation. - */ - public static double fromBase(AssetAmount assetAmount){ - long value = assetAmount.getAmount().longValue(); - int precision = assetAmount.getAsset().getPrecision(); - if(precision != 0) - return value / Math.pow(10, precision); - else - return 0; - } - - /** - * Converts a value and its corresponding precision to a base value. - * @param value: The value in the standard format - * @param precision: The precision of the asset. - * @return: A value in its base representation. - */ - public static long toBase(double value, int precision){ - return (long) (value * Math.pow(10, precision)); - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/Varint.java b/app/src/main/java/cy/agorise/graphenej/Varint.java deleted file mode 100644 index 0206fdc..0000000 --- a/app/src/main/java/cy/agorise/graphenej/Varint.java +++ /dev/null @@ -1,224 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cy.agorise.graphenej; - - -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; - - -/** - *

Encodes signed and unsigned values using a common variable-length - * scheme, found for example in - * - * Google's Protocol Buffers. It uses fewer bytes to encode smaller values, - * but will use slightly more bytes to encode large values.

- *

- *

Signed values are further encoded using so-called zig-zag encoding - * in order to make them "compatible" with variable-length encoding.

- */ -public final class Varint { - - private Varint() { - } - - /** - * Encodes a value using the variable-length encoding from - * - * Google Protocol Buffers. It uses zig-zag encoding to efficiently - * encode signed values. If values are known to be nonnegative, - * {@link #writeUnsignedVarLong(long, DataOutput)} should be used. - * - * @param value value to encode - * @param out to write bytes to - * @throws IOException if {@link DataOutput} throws {@link IOException} - */ - public static void writeSignedVarLong(long value, DataOutput out) throws IOException { - // Great trick from http://code.google.com/apis/protocolbuffers/docs/encoding.html#types - writeUnsignedVarLong((value << 1) ^ (value >> 63), out); - } - - /** - * Encodes a value using the variable-length encoding from - * - * Google Protocol Buffers. Zig-zag is not used, so input must not be negative. - * If values can be negative, use {@link #writeSignedVarLong(long, DataOutput)} - * instead. This method treats negative input as like a large unsigned value. - * - * @param value value to encode - * @param out to write bytes to - * @throws IOException if {@link DataOutput} throws {@link IOException} - */ - public static void writeUnsignedVarLong(long value, DataOutput out) throws IOException { - while ((value & 0xFFFFFFFFFFFFFF80L) != 0L) { - out.writeByte(((int) value & 0x7F) | 0x80); - value >>>= 7; - } - out.writeByte((int) value & 0x7F); - } - - /** - * @see #writeSignedVarLong(long, DataOutput) - */ - public static void writeSignedVarInt(int value, DataOutput out) throws IOException { - // Great trick from http://code.google.com/apis/protocolbuffers/docs/encoding.html#types - writeUnsignedVarInt((value << 1) ^ (value >> 31), out); - } - - /** - * @see #writeUnsignedVarLong(long, DataOutput) - */ - public static void writeUnsignedVarInt(int value, DataOutput out) throws IOException { - while ((value & 0xFFFFFF80) != 0L) { - out.writeByte((value & 0x7F) | 0x80); - value >>>= 7; - } - out.writeByte(value & 0x7F); - } - - public static byte[] writeSignedVarInt(int value) { - // Great trick from http://code.google.com/apis/protocolbuffers/docs/encoding.html#types - return writeUnsignedVarInt((value << 1) ^ (value >> 31)); - } - - /** - * @see #writeUnsignedVarLong(long, DataOutput) - *

- * This one does not use streams and is much faster. - * Makes a single object each time, and that object is a primitive array. - */ - public static byte[] writeUnsignedVarInt(int value) { - byte[] byteArrayList = new byte[10]; - int i = 0; - while ((value & 0xFFFFFF80) != 0L) { - byteArrayList[i++] = ((byte) ((value & 0x7F) | 0x80)); - value >>>= 7; - } - byteArrayList[i] = ((byte) (value & 0x7F)); - byte[] out = new byte[i + 1]; - for (; i >= 0; i--) { - out[i] = byteArrayList[i]; - } - return out; - } - - /** - * @param in to read bytes from - * @return decode value - * @throws IOException if {@link DataInput} throws {@link IOException} - * @throws IllegalArgumentException if variable-length value does not terminate - * after 9 bytes have been read - * @see #writeSignedVarLong(long, DataOutput) - */ - public static long readSignedVarLong(DataInput in) throws IOException { - long raw = readUnsignedVarLong(in); - // This undoes the trick in writeSignedVarLong() - long temp = (((raw << 63) >> 63) ^ raw) >> 1; - // This extra step lets us deal with the largest signed values by treating - // negative results from read unsigned methods as like unsigned values - // Must re-flip the top bit if the original read value had it set. - return temp ^ (raw & (1L << 63)); - } - - /** - * @param in to read bytes from - * @return decode value - * @throws IOException if {@link DataInput} throws {@link IOException} - * @throws IllegalArgumentException if variable-length value does not terminate - * after 9 bytes have been read - * @see #writeUnsignedVarLong(long, DataOutput) - */ - public static long readUnsignedVarLong(DataInput in) throws IOException { - long value = 0L; - int i = 0; - long b; - while (((b = in.readByte()) & 0x80L) != 0) { - value |= (b & 0x7F) << i; - i += 7; - if (i > 63) { - throw new IllegalArgumentException("Variable length quantity is too long"); - } - } - return value | (b << i); - } - - /** - * @throws IllegalArgumentException if variable-length value does not terminate - * after 5 bytes have been read - * @throws IOException if {@link DataInput} throws {@link IOException} - * @see #readSignedVarLong(DataInput) - */ - public static int readSignedVarInt(DataInput in) throws IOException { - int raw = readUnsignedVarInt(in); - // This undoes the trick in writeSignedVarInt() - int temp = (((raw << 31) >> 31) ^ raw) >> 1; - // This extra step lets us deal with the largest signed values by treating - // negative results from read unsigned methods as like unsigned values. - // Must re-flip the top bit if the original read value had it set. - return temp ^ (raw & (1 << 31)); - } - - /** - * @throws IllegalArgumentException if variable-length value does not terminate - * after 5 bytes have been read - * @throws IOException if {@link DataInput} throws {@link IOException} - * @see #readUnsignedVarLong(DataInput) - */ - public static int readUnsignedVarInt(DataInput in) throws IOException { - int value = 0; - int i = 0; - int b; - while (((b = in.readByte()) & 0x80) != 0) { - value |= (b & 0x7F) << i; - i += 7; - if (i > 35) { - throw new IllegalArgumentException("Variable length quantity is too long"); - } - } - return value | (b << i); - } - - public static int readSignedVarInt(byte[] bytes) { - int raw = readUnsignedVarInt(bytes); - // This undoes the trick in writeSignedVarInt() - int temp = (((raw << 31) >> 31) ^ raw) >> 1; - // This extra step lets us deal with the largest signed values by treating - // negative results from read unsigned methods as like unsigned values. - // Must re-flip the top bit if the original read value had it set. - return temp ^ (raw & (1 << 31)); - } - - public static int readUnsignedVarInt(byte[] bytes) { - int value = 0; - int i = 0; - byte rb = Byte.MIN_VALUE; - for (byte b : bytes) { - rb = b; - if ((b & 0x80) == 0) { - break; - } - value |= (b & 0x7f) << i; - i += 7; - if (i > 35) { - throw new IllegalArgumentException("Variable length quantity is too long"); - } - } - return value | (rb << i); - } -} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/graphenej/Vote.java b/app/src/main/java/cy/agorise/graphenej/Vote.java deleted file mode 100644 index cd22b71..0000000 --- a/app/src/main/java/cy/agorise/graphenej/Vote.java +++ /dev/null @@ -1,33 +0,0 @@ -package cy.agorise.graphenej; - -import cy.agorise.graphenej.interfaces.ByteSerializable; - -/** - * Created by nelson on 12/5/16. - */ -public class Vote implements ByteSerializable { - private int type; - private int instance; - - public Vote(String vote){ - String[] parts = vote.split(":"); - assert(parts.length == 2); - this.type = Integer.valueOf(parts[0]); - this.instance = Integer.valueOf(parts[1]); - } - - public Vote(int type, int instance){ - this.type = type; - this.instance = instance; - } - - @Override - public String toString() { - return String.format("%d:%d", this.type, this.instance); - } - - @Override - public byte[] toBytes() { - return new byte[] { (byte) this.instance, (byte) this.type }; - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/api/BaseGrapheneHandler.java b/app/src/main/java/cy/agorise/graphenej/api/BaseGrapheneHandler.java deleted file mode 100644 index cf12880..0000000 --- a/app/src/main/java/cy/agorise/graphenej/api/BaseGrapheneHandler.java +++ /dev/null @@ -1,84 +0,0 @@ -package cy.agorise.graphenej.api; - -import com.neovisionaries.ws.client.WebSocket; -import com.neovisionaries.ws.client.WebSocketAdapter; -import com.neovisionaries.ws.client.WebSocketException; - -import org.w3c.dom.Node; - -import cy.agorise.graphenej.interfaces.NodeErrorListener; -import cy.agorise.graphenej.interfaces.WitnessResponseListener; -import cy.agorise.graphenej.models.BaseResponse; - -/** - * Base class that should be extended by any implementation of a specific request to the full node. - */ -public abstract class BaseGrapheneHandler extends WebSocketAdapter { - - protected WitnessResponseListener mListener; - protected NodeErrorListener mErrorListener; - - /** - * The 'id' field of a message to the node. This is used in order to multiplex different messages - * using the same websocket connection. - * - * For example: - * - * {"id":5,"method":"call","params":[0,"get_accounts",[["1.2.100"]]],"jsonrpc":"2.0"} - * - * The 'requestId' here is 5. - */ - protected long requestId; - - /** - * Constructor (The original constructor, should be replaced with the one that receives - * NodeErrorListener instead of WitnessResponseListener) - * - * @param listener listener to be notified in if an error occurs - */ - @Deprecated - public BaseGrapheneHandler(WitnessResponseListener listener){ - this.mListener = listener; - } - - /** - * Constructor - * - * @param listener listener to be notified if an error occurs - */ - public BaseGrapheneHandler(NodeErrorListener listener){ - this.mErrorListener = listener; - } - - @Override - public void onError(WebSocket websocket, WebSocketException cause) throws Exception { - System.out.println("onError. cause: "+cause.getMessage()); - mErrorListener.onError(new BaseResponse.Error(cause.getMessage())); - websocket.disconnect(); - } - - @Override - public void handleCallbackError(WebSocket websocket, Throwable cause) throws Exception { - System.out.println("handleCallbackError. message: "+cause.getMessage()+", error: "+cause.getClass()); - for (StackTraceElement element : cause.getStackTrace()){ - System.out.println(element.getFileName()+"#"+element.getClassName()+":"+element.getLineNumber()); - } - // Should be replaced for mErrorListener (NodeErrorListener type) only in the future - if(mErrorListener != null){ - mErrorListener.onError(new BaseResponse.Error(cause.getMessage())); - } - else{ - mListener.onError(new BaseResponse.Error(cause.getMessage())); - } - - websocket.disconnect(); - } - - public void setRequestId(long id){ - this.requestId = id; - } - - public long getRequestId(){ - return this.requestId; - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/api/GetAccountBalances.java b/app/src/main/java/cy/agorise/graphenej/api/GetAccountBalances.java deleted file mode 100644 index e8afee3..0000000 --- a/app/src/main/java/cy/agorise/graphenej/api/GetAccountBalances.java +++ /dev/null @@ -1,106 +0,0 @@ -package cy.agorise.graphenej.api; - -import com.google.gson.GsonBuilder; -import com.google.gson.reflect.TypeToken; -import com.neovisionaries.ws.client.WebSocket; -import com.neovisionaries.ws.client.WebSocketFrame; -import cy.agorise.graphenej.Asset; -import cy.agorise.graphenej.AssetAmount; -import cy.agorise.graphenej.RPC; -import cy.agorise.graphenej.UserAccount; -import cy.agorise.graphenej.interfaces.WitnessResponseListener; -import cy.agorise.graphenej.models.ApiCall; -import cy.agorise.graphenej.models.WitnessResponse; - -import java.io.Serializable; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * Class that implements get_account_balances request handler. - * - * Get an account’s balances in various assets. - * - * The response returns the balances of the account - * - * @see get_account_balances API doc - * - */ -public class GetAccountBalances extends BaseGrapheneHandler { - - private UserAccount mUserAccount; - private List mAssetList; - private boolean mOneTime; - - /** - * Default Constructor - * - * @param userAccount account to get balances for - * @param assets list of the assets to get balances of; if empty, get all assets account - * has a balance in - * @param oneTime boolean value indicating if WebSocket must be closed (true) or not - * (false) after the response - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public GetAccountBalances(UserAccount userAccount, List assets, boolean oneTime, WitnessResponseListener listener) { - super(listener); - this.mUserAccount = userAccount; - this.mAssetList = assets; - this.mOneTime = oneTime; - } - - /** - * Using this constructor the WebSocket connection closes after the response. - * - * @param userAccount account to get balances for - * @param assets list of the assets to get balances of; if empty, get all assets account - * has a balance in - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public GetAccountBalances(UserAccount userAccount, List assets, WitnessResponseListener listener) { - this(userAccount, assets, true, listener); - } - - @Override - public void onConnected(WebSocket websocket, Map> headers) throws Exception { - ArrayList params = new ArrayList<>(); - ArrayList assetList = new ArrayList<>(); - for(Asset asset : mAssetList){ - assetList.add(asset.getObjectId()); - } - params.add(mUserAccount.getObjectId()); - params.add(assetList); - ApiCall apiCall = new ApiCall(0, RPC.GET_ACCOUNT_BALANCES, params, RPC.VERSION, 0); - websocket.sendText(apiCall.toJsonString()); - } - - @Override - public void onTextFrame(WebSocket websocket, WebSocketFrame frame) throws Exception { - if(frame.isTextFrame()){ - System.out.println("<< "+frame.getPayloadText()); - } - String response = frame.getPayloadText(); - GsonBuilder gsonBuilder = new GsonBuilder(); - gsonBuilder.registerTypeAdapter(AssetAmount.class, new AssetAmount.AssetAmountDeserializer()); - - Type WitnessResponseType = new TypeToken>>(){}.getType(); - WitnessResponse> witnessResponse = gsonBuilder.create().fromJson(response, WitnessResponseType); - mListener.onSuccess(witnessResponse); - if(mOneTime){ - websocket.disconnect(); - } - } - - @Override - public void onFrameSent(WebSocket websocket, WebSocketFrame frame) throws Exception { - if(frame.isTextFrame()){ - System.out.println(">> "+frame.getPayloadText()); - } - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/api/GetAccountByName.java b/app/src/main/java/cy/agorise/graphenej/api/GetAccountByName.java deleted file mode 100644 index f2f38f0..0000000 --- a/app/src/main/java/cy/agorise/graphenej/api/GetAccountByName.java +++ /dev/null @@ -1,102 +0,0 @@ -package cy.agorise.graphenej.api; - -import com.google.gson.GsonBuilder; -import com.google.gson.reflect.TypeToken; -import com.neovisionaries.ws.client.WebSocket; -import com.neovisionaries.ws.client.WebSocketFrame; - -import java.io.Serializable; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import cy.agorise.graphenej.AccountOptions; -import cy.agorise.graphenej.Authority; -import cy.agorise.graphenej.RPC; -import cy.agorise.graphenej.interfaces.WitnessResponseListener; -import cy.agorise.graphenej.models.AccountProperties; -import cy.agorise.graphenej.models.ApiCall; -import cy.agorise.graphenej.models.WitnessResponse; - -/** - * Class that implements get_account_by_name request handler. - * - * Get an account’s info by name. - * - * The response returns account data that refer to the name. - * - * @see get_account_by_name API doc - */ -public class GetAccountByName extends BaseGrapheneHandler { - - private String accountName; - private WitnessResponseListener mListener; - private boolean mOneTime; - - /** - * Default Constructor - * - * @param accountName name of the account to get info - * @param oneTime boolean value indicating if WebSocket must be closed (true) or not - * (false) after the response - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public GetAccountByName(String accountName, boolean oneTime, WitnessResponseListener listener){ - super(listener); - this.accountName = accountName; - this.mOneTime = oneTime; - this.mListener = listener; - } - - /** - * Using this constructor the WebSocket connection closes after the response. - * - * @param accountName name of the account to get info - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public GetAccountByName(String accountName, WitnessResponseListener listener){ - this(accountName, true, listener); - } - - @Override - public void onConnected(WebSocket websocket, Map> headers) throws Exception { - ArrayList accountParams = new ArrayList<>(); - accountParams.add(this.accountName); - ApiCall getAccountByName = new ApiCall(0, RPC.CALL_GET_ACCOUNT_BY_NAME, accountParams, RPC.VERSION, 1); - websocket.sendText(getAccountByName.toJsonString()); - } - - @Override - public void onTextFrame(WebSocket websocket, WebSocketFrame frame) throws Exception { - if(frame.isTextFrame()) - System.out.println("<<< "+frame.getPayloadText()); - String response = frame.getPayloadText(); - GsonBuilder builder = new GsonBuilder(); - - Type GetAccountByNameResponse = new TypeToken>(){}.getType(); - builder.registerTypeAdapter(Authority.class, new Authority.AuthorityDeserializer()); - builder.registerTypeAdapter(AccountOptions.class, new AccountOptions.AccountOptionsDeserializer()); - WitnessResponse witnessResponse = builder.create().fromJson(response, GetAccountByNameResponse); - - if(witnessResponse.error != null){ - this.mListener.onError(witnessResponse.error); - }else{ - this.mListener.onSuccess(witnessResponse); - } - if(mOneTime){ - websocket.disconnect(); - } - } - - @Override - public void onFrameSent(WebSocket websocket, WebSocketFrame frame) throws Exception { - if(frame.isTextFrame()){ - System.out.println(">>> "+frame.getPayloadText()); - } - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/api/GetAccountHistory.java b/app/src/main/java/cy/agorise/graphenej/api/GetAccountHistory.java deleted file mode 100644 index 76549a2..0000000 --- a/app/src/main/java/cy/agorise/graphenej/api/GetAccountHistory.java +++ /dev/null @@ -1,8 +0,0 @@ -package cy.agorise.graphenej.api; - -/** - * Created by nelson on 12/26/16. - */ -//TODO: Implement if needed: http://docs.bitshares.eu/api/history.html?highlight=get_market_history#account-history-api -public class GetAccountHistory { -} diff --git a/app/src/main/java/cy/agorise/graphenej/api/GetAccounts.java b/app/src/main/java/cy/agorise/graphenej/api/GetAccounts.java deleted file mode 100644 index 50f38e7..0000000 --- a/app/src/main/java/cy/agorise/graphenej/api/GetAccounts.java +++ /dev/null @@ -1,139 +0,0 @@ -package cy.agorise.graphenej.api; - -import com.google.gson.GsonBuilder; -import com.google.gson.reflect.TypeToken; -import com.neovisionaries.ws.client.WebSocket; -import com.neovisionaries.ws.client.WebSocketFrame; - -import java.io.Serializable; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import cy.agorise.graphenej.AccountOptions; -import cy.agorise.graphenej.Authority; -import cy.agorise.graphenej.RPC; -import cy.agorise.graphenej.UserAccount; -import cy.agorise.graphenej.interfaces.WitnessResponseListener; -import cy.agorise.graphenej.models.AccountProperties; -import cy.agorise.graphenej.models.ApiCall; -import cy.agorise.graphenej.models.WitnessResponse; - -/** - * Class that implements get_accounts request handler. - * - * Get a list of accounts by ID. - * - * The response returns the accounts corresponding to the provided IDs. - * - * @see get_accounts API doc - */ -public class GetAccounts extends BaseGrapheneHandler { - private String accountId; - private List userAccounts; - private WitnessResponseListener mListener; - private boolean mOneTime; - - /** - * Constructor for one account only. - * - * @param accountId ID of the account to retrieve - * @param oneTime boolean value indicating if WebSocket must be closed (true) or not - * (false) after the response - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public GetAccounts(String accountId, boolean oneTime, WitnessResponseListener listener){ - super(listener); - this.accountId = accountId; - this.mOneTime = oneTime; - this.mListener = listener; - } - - /** - * Constructor for account list. - * - * @param accounts list with the accounts to retrieve - * @param oneTime boolean value indicating if WebSocket must be closed (true) or not - * (false) after the response - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public GetAccounts(List accounts, boolean oneTime, WitnessResponseListener listener){ - super(listener); - this.userAccounts = accounts; - this.mOneTime = oneTime; - this.mListener = listener; - } - - /** - * Using this constructor the WebSocket connection closes after the response. (Account based) - * - * @param accountId ID of the account to retrieve - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public GetAccounts(String accountId, WitnessResponseListener listener){ - this(accountId, true, listener); - } - - /** - * Using this constructor the WebSocket connection closes after the response. (Account List - * based) - * - * @param accounts list with the accounts to retrieve - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public GetAccounts(List accounts, WitnessResponseListener listener){ - this(accounts, true, listener); - } - - @Override - public void onConnected(WebSocket websocket, Map> headers) throws Exception { - ArrayList params = new ArrayList(); - ArrayList accountIds = new ArrayList(); - if(accountId == null){ - for(UserAccount account : userAccounts) { - accountIds.add(account.getObjectId()); - } - }else{ - accountIds.add(accountId); - } - params.add(accountIds); - ApiCall getAccountByAddress = new ApiCall(0, RPC.CALL_GET_ACCOUNTS, params, RPC.VERSION, (int) requestId); - websocket.sendText(getAccountByAddress.toJsonString()); - } - - @Override - public void onTextFrame(WebSocket websocket, WebSocketFrame frame) throws Exception { - System.out.println("<<< "+frame.getPayloadText()); - String response = frame.getPayloadText(); - GsonBuilder builder = new GsonBuilder(); - - Type GetAccountByAddressResponse = new TypeToken>>() {}.getType(); - builder.registerTypeAdapter(Authority.class, new Authority.AuthorityDeserializer()); - builder.registerTypeAdapter(AccountOptions.class, new AccountOptions.AccountOptionsDeserializer()); - WitnessResponse> witnessResponse = builder.create().fromJson(response, GetAccountByAddressResponse); - - if (witnessResponse.error != null) { - this.mListener.onError(witnessResponse.error); - } else { - this.mListener.onSuccess(witnessResponse); - } - if(mOneTime){ - websocket.disconnect(); - } - } - - @Override - public void onFrameSent(WebSocket websocket, WebSocketFrame frame) throws Exception { - if(frame.isTextFrame()) - System.out.println(">>> "+frame.getPayloadText()); - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/api/GetAllAssetHolders.java b/app/src/main/java/cy/agorise/graphenej/api/GetAllAssetHolders.java deleted file mode 100644 index 110aefb..0000000 --- a/app/src/main/java/cy/agorise/graphenej/api/GetAllAssetHolders.java +++ /dev/null @@ -1,115 +0,0 @@ -package cy.agorise.graphenej.api; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.reflect.TypeToken; -import com.neovisionaries.ws.client.WebSocket; -import com.neovisionaries.ws.client.WebSocketFrame; -import cy.agorise.graphenej.RPC; -import cy.agorise.graphenej.interfaces.WitnessResponseListener; -import cy.agorise.graphenej.models.*; - -import java.io.Serializable; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * Class that implements get_all_asset_holders request handler. - * - * Get a list of all system assets with holders count. - * - * The response returns the list of all assets with holders count. - * - * @see get_all_asset_holders API doc (source code ref.) - */ -public class GetAllAssetHolders extends BaseGrapheneHandler { - private final static int LOGIN_ID = 1; - private final static int GET_ASSET_API_ID = 2; - private final static int GET_ALL_ASSET_HOLDERS_COUNT = 3; - - private int currentId = 1; - private int assetApiId = -1; - - private boolean mOneTime; - - /** - * Default Constructor - * - * @param oneTime boolean value indicating if WebSocket must be closed (true) or not - * (false) after the response - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public GetAllAssetHolders(boolean oneTime, WitnessResponseListener listener) { - super(listener); - this.mOneTime = oneTime; - } - - /** - * Using this constructor the WebSocket connection closes after the response. - * - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the success/failure - * of the transaction broadcast operation. - */ - public GetAllAssetHolders(WitnessResponseListener listener) { this(true, listener);} - - @Override - public void onConnected(WebSocket websocket, Map> headers) throws Exception { - ArrayList loginParams = new ArrayList<>(); - loginParams.add(null); - loginParams.add(null); - ApiCall loginCall = new ApiCall(1, RPC.CALL_LOGIN, loginParams, RPC.VERSION, currentId); - websocket.sendText(loginCall.toJsonString()); - } - - @Override - public void onTextFrame(WebSocket websocket, WebSocketFrame frame) throws Exception { - if(frame.isTextFrame()) - System.out.println("<<< "+frame.getPayloadText()); - String response = frame.getPayloadText(); - Gson gson = new Gson(); - BaseResponse baseResponse = gson.fromJson(response, BaseResponse.class); - if(baseResponse.error != null){ - mListener.onError(baseResponse.error); - if(mOneTime){ - websocket.disconnect(); - } - }else { - currentId++; - ArrayList emptyParams = new ArrayList<>(); - if (baseResponse.id == LOGIN_ID) { - ApiCall networkApiIdCall = new ApiCall(1, RPC.CALL_ASSET, emptyParams, RPC.VERSION, currentId); - websocket.sendText(networkApiIdCall.toJsonString()); - }else if(baseResponse.id == GET_ASSET_API_ID){ - Type ApiIdResponse = new TypeToken>() {}.getType(); - WitnessResponse witnessResponse = gson.fromJson(response, ApiIdResponse); - assetApiId = witnessResponse.result; - - ApiCall apiCall = new ApiCall(assetApiId, RPC.CALL_GET_ALL_ASSET_HOLDERS, emptyParams, RPC.VERSION, currentId); - websocket.sendText(apiCall.toJsonString()); - } else if (baseResponse.id == GET_ALL_ASSET_HOLDERS_COUNT) { - Type AssetTokenHolders = new TypeToken>>(){}.getType(); - GsonBuilder builder = new GsonBuilder(); - builder.registerTypeAdapter(AssetHolderCount.class, new AssetHolderCount.HoldersCountDeserializer()); - WitnessResponse> witnessResponse = builder.create().fromJson(response, AssetTokenHolders); - mListener.onSuccess(witnessResponse); - if(mOneTime){ - websocket.disconnect(); - } - }else{ - System.out.println("current id: "+currentId); - } - } - } - - @Override - public void onFrameSent(WebSocket websocket, WebSocketFrame frame) throws Exception { - if(frame.isTextFrame()){ - System.out.println(">>> "+frame.getPayloadText()); - } - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/api/GetBlockHeader.java b/app/src/main/java/cy/agorise/graphenej/api/GetBlockHeader.java deleted file mode 100644 index d373b83..0000000 --- a/app/src/main/java/cy/agorise/graphenej/api/GetBlockHeader.java +++ /dev/null @@ -1,129 +0,0 @@ -package cy.agorise.graphenej.api; - -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; -import com.neovisionaries.ws.client.WebSocket; -import com.neovisionaries.ws.client.WebSocketFrame; - -import java.io.Serializable; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import cy.agorise.graphenej.RPC; -import cy.agorise.graphenej.interfaces.WitnessResponseListener; -import cy.agorise.graphenej.models.ApiCall; -import cy.agorise.graphenej.models.BaseResponse; -import cy.agorise.graphenej.models.BlockHeader; -import cy.agorise.graphenej.models.WitnessResponse; - -/** - * Class that implements get_block_header request handler. - * - * Retrieve a block header. - * - * The request returns the header of the referenced block, or null if no matching block was found - * - * @see get_block_header API doc - */ -public class GetBlockHeader extends BaseGrapheneHandler { - - // Sequence of message ids - private final static int LOGIN_ID = 1; - private final static int GET_DATABASE_ID = 2; - private final static int GET_BLOCK_HEADER_ID = 3; - - private long blockNumber; - private WitnessResponseListener mListener; - - private int currentId = LOGIN_ID; - private int apiId = -1; - - private boolean mOneTime; - - /** - * Default Constructor - * - * @param blockNumber height of the block whose header should be returned - * @param oneTime boolean value indicating if WebSocket must be closed (true) or not - * (false) after the response - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public GetBlockHeader(long blockNumber, boolean oneTime, WitnessResponseListener listener){ - super(listener); - this.blockNumber = blockNumber; - this.mOneTime = oneTime; - this.mListener = listener; - } - - /** - * Using this constructor the WebSocket connection closes after the response. - * - * @param blockNumber height of the block whose header should be returned - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public GetBlockHeader(long blockNumber, WitnessResponseListener listener){ - this(blockNumber, true, listener); - } - - @Override - public void onConnected(WebSocket websocket, Map> headers) throws Exception { - ArrayList loginParams = new ArrayList<>(); - loginParams.add(null); - loginParams.add(null); - ApiCall loginCall = new ApiCall(1, RPC.CALL_LOGIN, loginParams, RPC.VERSION, currentId); - websocket.sendText(loginCall.toJsonString()); - } - - @Override - public void onTextFrame(WebSocket websocket, WebSocketFrame frame) throws Exception { - String response = frame.getPayloadText(); - System.out.println("<<< "+response); - - Gson gson = new Gson(); - BaseResponse baseResponse = gson.fromJson(response, BaseResponse.class); - if(baseResponse.error != null){ - mListener.onError(baseResponse.error); - if(mOneTime){ - websocket.disconnect(); - } - }else { - currentId++; - ArrayList emptyParams = new ArrayList<>(); - if(baseResponse.id == LOGIN_ID){ - ApiCall getDatabaseId = new ApiCall(1, RPC.CALL_DATABASE, emptyParams, RPC.VERSION, currentId); - websocket.sendText(getDatabaseId.toJsonString()); - }else if(baseResponse.id == GET_DATABASE_ID){ - Type ApiIdResponse = new TypeToken>() {}.getType(); - WitnessResponse witnessResponse = gson.fromJson(response, ApiIdResponse); - apiId = witnessResponse.result.intValue(); - - ArrayList params = new ArrayList<>(); - String blockNum = String.format("%d", this.blockNumber); - params.add(blockNum); - - ApiCall loginCall = new ApiCall(apiId, RPC.CALL_GET_BLOCK_HEADER, params, RPC.VERSION, currentId); - websocket.sendText(loginCall.toJsonString()); - }else if(baseResponse.id == GET_BLOCK_HEADER_ID){ - Type RelativeAccountHistoryResponse = new TypeToken>(){}.getType(); - WitnessResponse transfersResponse = gson.fromJson(response, RelativeAccountHistoryResponse); - mListener.onSuccess(transfersResponse); - if(mOneTime){ - websocket.disconnect(); - } - } - } - - } - - @Override - public void onFrameSent(WebSocket websocket, WebSocketFrame frame) throws Exception { - if(frame.isTextFrame()) - System.out.println(">>> "+frame.getPayloadText()); - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/api/GetKeyReferences.java b/app/src/main/java/cy/agorise/graphenej/api/GetKeyReferences.java deleted file mode 100644 index aa2266e..0000000 --- a/app/src/main/java/cy/agorise/graphenej/api/GetKeyReferences.java +++ /dev/null @@ -1,129 +0,0 @@ -package cy.agorise.graphenej.api; - -import com.google.gson.GsonBuilder; -import com.google.gson.reflect.TypeToken; -import com.neovisionaries.ws.client.WebSocket; -import com.neovisionaries.ws.client.WebSocketFrame; - -import java.io.Serializable; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import cy.agorise.graphenej.Address; -import cy.agorise.graphenej.RPC; -import cy.agorise.graphenej.UserAccount; -import cy.agorise.graphenej.interfaces.WitnessResponseListener; -import cy.agorise.graphenej.models.ApiCall; -import cy.agorise.graphenej.models.WitnessResponse; - -/** - * Class that implements get_key_references request handler. - * - * Retrieve the keys that refer to the address/list of addresses. - * - * The request returns all accounts that refer to the key or account id in their owner or active authorities. - * - * @see get_key_references API doc - */ -public class GetKeyReferences extends BaseGrapheneHandler { - - private List

addresses; - - private boolean mOneTime; - - /** - * Constructor - * - * @param address address to be query - * @param oneTime boolean value indicating if WebSocket must be closed (true) or not (false) - * after the response - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the success/failure - * of the transaction broadcast operation. - */ - public GetKeyReferences(Address address, boolean oneTime, WitnessResponseListener listener){ - super(listener); - addresses = new ArrayList<>(); - addresses.add(address); - this.mOneTime = oneTime; - } - - /** - * - * @param addresses list of addresses to be query - * @param oneTime boolean value indicating if WebSocket must be closed (true) or not (false) - * after the response - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the success/failure - * of the transaction broadcast operation. - */ - public GetKeyReferences(List
addresses, boolean oneTime, WitnessResponseListener listener) { - super(listener); - this.addresses = addresses; - this.mListener = listener; - this.mOneTime = oneTime; - } - - /** - * Using this constructor the websocket connection closes after the response. - * - * @param address - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the success/failure - * of the transaction broadcast operation. - */ - public GetKeyReferences(Address address, WitnessResponseListener listener){ - this(address, true, listener); - } - - /** - * Using this constructor the websocket connection closes after the response. - * - * @param addresses - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the success/failure - * of the transaction broadcast operation. - */ - public GetKeyReferences(List
addresses, WitnessResponseListener listener) { - this(addresses, true, listener); - } - - @Override - public void onConnected(WebSocket websocket, Map> headers) throws Exception { - ArrayList inner = new ArrayList(); - for(Address addr : addresses){ - inner.add(addr.toString()); - } - ArrayList params = new ArrayList<>(); - params.add(inner); - ApiCall getAccountByAddress = new ApiCall(0, RPC.CALL_GET_KEY_REFERENCES, params, RPC.VERSION, 1); - websocket.sendText(getAccountByAddress.toJsonString()); - } - - @Override - public void onTextFrame(WebSocket websocket, WebSocketFrame frame) throws Exception { - System.out.println("<<< "+frame.getPayloadText()); - String response = frame.getPayloadText(); - GsonBuilder builder = new GsonBuilder(); - - Type GetAccountByAddressResponse = new TypeToken>>>(){}.getType(); - builder.registerTypeAdapter(UserAccount.class, new UserAccount.UserAccountSimpleDeserializer()); - WitnessResponse>> witnessResponse = builder.create().fromJson(response, GetAccountByAddressResponse); - if (witnessResponse.error != null) { - this.mListener.onError(witnessResponse.error); - } else { - this.mListener.onSuccess(witnessResponse); - } - if(mOneTime){ - websocket.disconnect(); - } - } - - @Override - public void onFrameSent(WebSocket websocket, WebSocketFrame frame) throws Exception { - if(frame.isTextFrame()) - System.out.println(">>> "+frame.getPayloadText()); - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/api/GetLimitOrders.java b/app/src/main/java/cy/agorise/graphenej/api/GetLimitOrders.java deleted file mode 100644 index ea67512..0000000 --- a/app/src/main/java/cy/agorise/graphenej/api/GetLimitOrders.java +++ /dev/null @@ -1,137 +0,0 @@ -package cy.agorise.graphenej.api; - -import com.google.gson.GsonBuilder; -import com.google.gson.reflect.TypeToken; -import com.neovisionaries.ws.client.WebSocket; -import com.neovisionaries.ws.client.WebSocketException; -import com.neovisionaries.ws.client.WebSocketFrame; - -import java.io.Serializable; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import cy.agorise.graphenej.AssetAmount; -import cy.agorise.graphenej.LimitOrder; -import cy.agorise.graphenej.RPC; -import cy.agorise.graphenej.UserAccount; -import cy.agorise.graphenej.interfaces.WitnessResponseListener; -import cy.agorise.graphenej.models.ApiCall; -import cy.agorise.graphenej.models.BaseResponse; -import cy.agorise.graphenej.models.WitnessResponse; - -/** - * Class that implements get_limit_orders request handler. - * - * Get limit orders in a given market. - * - * The request returns the limit orders, ordered from least price to greatest - * - * @see get_limit_orders API doc - * - */ -public class GetLimitOrders extends BaseGrapheneHandler { - - private String a; - private String b; - private int limit; - private WitnessResponseListener mListener; - - private boolean mOneTime; - - - /** - * Default Constructor - * - * @param a id of asset being sold - * @param b id of asset being purchased - * @param limit maximum number of orders to retrieve - * @param oneTime boolean value indicating if WebSocket must be closed (true) or not - * (false) after the response - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public GetLimitOrders(String a, String b, int limit, boolean oneTime, WitnessResponseListener listener) { - super(listener); - this.a = a; - this.b = b; - this.limit = limit; - this.mOneTime = oneTime; - this.mListener = listener; - } - - /** - * Using this constructor the WebSocket connection closes after the response. - * - * @param a id of asset being sold - * @param b id of asset being purchased - * @param limit maximum number of orders to retrieve - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public GetLimitOrders(String a, String b, int limit, WitnessResponseListener listener) { - this(a, b, limit, true, listener); - } - - @Override - public void onConnected(WebSocket websocket, Map> headers) throws Exception { - ArrayList accountParams = new ArrayList<>(); - accountParams.add(this.a); - accountParams.add(this.b); - accountParams.add(this.limit); - ApiCall getAccountByName = new ApiCall(0, RPC.CALL_GET_LIMIT_ORDERS, accountParams, RPC.VERSION, 1); - websocket.sendText(getAccountByName.toJsonString()); - } - - @Override - public void onTextFrame(WebSocket websocket, WebSocketFrame frame) throws Exception { - if(frame.isTextFrame()) - System.out.println("<<< "+frame.getPayloadText()); - try { - String response = frame.getPayloadText(); - GsonBuilder builder = new GsonBuilder(); - - Type GetLimitOrdersResponse = new TypeToken>>() {}.getType(); - builder.registerTypeAdapter(AssetAmount.class, new AssetAmount.AssetAmountDeserializer()); - builder.registerTypeAdapter(UserAccount.class, new UserAccount.UserAccountSimpleDeserializer()); - builder.registerTypeAdapter(LimitOrder.class, new LimitOrder.LimitOrderDeserializer()); - WitnessResponse> witnessResponse = builder.create().fromJson(response, GetLimitOrdersResponse); - if (witnessResponse.error != null) { - this.mListener.onError(witnessResponse.error); - } else { - this.mListener.onSuccess(witnessResponse); - } - } catch (Exception e) { - e.printStackTrace(); - } - if(mOneTime){ - websocket.disconnect(); - } - } - - @Override - public void onFrameSent(WebSocket websocket, WebSocketFrame frame) throws Exception { - if(frame.isTextFrame()){ - System.out.println(">>> "+frame.getPayloadText()); - } - } - - @Override - public void onError(WebSocket websocket, WebSocketException cause) throws Exception { - mListener.onError(new BaseResponse.Error(cause.getMessage())); - if(mOneTime){ - websocket.disconnect(); - } - } - - @Override - public void handleCallbackError(WebSocket websocket, Throwable cause) throws Exception { - mListener.onError(new BaseResponse.Error(cause.getMessage())); - if(mOneTime){ - websocket.disconnect(); - } - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/api/GetMarketHistory.java b/app/src/main/java/cy/agorise/graphenej/api/GetMarketHistory.java deleted file mode 100644 index 488486a..0000000 --- a/app/src/main/java/cy/agorise/graphenej/api/GetMarketHistory.java +++ /dev/null @@ -1,243 +0,0 @@ -package cy.agorise.graphenej.api; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.reflect.TypeToken; -import com.neovisionaries.ws.client.WebSocket; -import com.neovisionaries.ws.client.WebSocketFrame; - -import java.io.Serializable; -import java.lang.reflect.Type; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Map; - -import cy.agorise.graphenej.Asset; -import cy.agorise.graphenej.RPC; -import cy.agorise.graphenej.interfaces.WitnessResponseListener; -import cy.agorise.graphenej.models.ApiCall; -import cy.agorise.graphenej.models.BaseResponse; -import cy.agorise.graphenej.models.BucketObject; -import cy.agorise.graphenej.models.WitnessResponse; - -/** - * Class that implements get_market_history request handler. - * - * Get mar - * - * @see get_market_history API doc - * - */ -public class GetMarketHistory extends BaseGrapheneHandler { - - // Sequence of message ids - private final static int LOGIN_ID = 1; - private final static int GET_HISTORY_ID = 2; - private final static int GET_HISTORY_DATA = 3; - - // API call parameters - private Asset base; - private Asset quote; - private long bucket; - private Date start; - private Date end; - private WitnessResponseListener mListener; - private WebSocket mWebsocket; - private int currentId = 1; - private int apiId = -1; - private int counter = 0; - - private boolean mOneTime; - - /** - * Default Constructor - * - * @param base asset which history is desired - * @param quote asset which the base price asset will be compared to - * @param bucket the time interval (in seconds) for each point should be (analog to - * candles on a candle stick graph). - * Note: The bucket value is discrete and node dependent. The default value - * is 3600s. To get the available buckets of a node use - * get_all_asset_holders API call. - * @param start datetime of of the most recent operation to retrieve (Note: The name is - * counter intuitive, but it follow the original API parameter name) - * @param end datetime of the the earliest operation to retrieve - * @param oneTime boolean value indicating if WebSocket must be closed (true) or not - * (false) after the response - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public GetMarketHistory(Asset base, Asset quote, long bucket, Date start, Date end, boolean oneTime, WitnessResponseListener listener){ - super(listener); - this.base = base; - this.quote = quote; - this.bucket = bucket; - this.start = start; - this.end = end; - this.mOneTime = oneTime; - this.mListener = listener; - } - - /** - * Using this constructor the WebSocket connection closes after the response. - * - * @param base asset which history is desired - * @param quote asset which the base price asset will be compared to - * @param bucket the time interval (in seconds) for each point should be (analog to - * candles on a candle stick graph). - * Note: The bucket value is discrete and node dependent. The default value - * is 3600s. To get the available buckets of a node use - * get_all_asset_holders API call. - * @param start datetime of of the most recent operation to retrieve (Note: The name is - * counter intuitive, but it follow the original API parameter name) - * @param end datetime of the the earliest operation to retrieve - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public GetMarketHistory(Asset base, Asset quote, long bucket, Date start, Date end, WitnessResponseListener listener){ - this(base, quote, bucket, start, end, true, listener); - } - - public Asset getBase() { - return base; - } - - public void setBase(Asset base) { - this.base = base; - } - - public Asset getQuote() { - return quote; - } - - public void setQuote(Asset quote) { - this.quote = quote; - } - - public long getBucket() { - return bucket; - } - - public void setBucket(long bucket) { - this.bucket = bucket; - } - - public Date getStart() { - return start; - } - - public void setStart(Date start) { - this.start = start; - } - - public Date getEnd() { - return end; - } - - public void setEnd(Date end) { - this.end = end; - } - - public int getCount(){ - return this.counter; - } - - public void disconnect(){ - if(mWebsocket != null && mWebsocket.isOpen()){ - mWebsocket.disconnect(); - } - } - - /** - * Retries the 'get_market_history' API call. - * Hopefully with different 'start' and 'stop' parameters. - */ - public void retry(){ - sendHistoricalMarketDataRequest(); - } - - - @Override - public void onConnected(WebSocket websocket, Map> headers) throws Exception { - mWebsocket = websocket; - ArrayList loginParams = new ArrayList<>(); - loginParams.add(null); - loginParams.add(null); - ApiCall loginCall = new ApiCall(1, RPC.CALL_LOGIN, loginParams, RPC.VERSION, currentId); - websocket.sendText(loginCall.toJsonString()); - } - - @Override - public void onTextFrame(WebSocket websocket, WebSocketFrame frame) throws Exception { - String response = frame.getPayloadText(); - System.out.println("<<< "+response); - Gson gson = new Gson(); - BaseResponse baseResponse = gson.fromJson(response, BaseResponse.class); - if(baseResponse.error != null){ - mListener.onError(baseResponse.error); - if(mOneTime){ - websocket.disconnect(); - } - }else{ - currentId++; - ArrayList emptyParams = new ArrayList<>(); - if(baseResponse.id == LOGIN_ID){ - ApiCall getRelativeAccountHistoryId = new ApiCall(1, RPC.CALL_HISTORY, emptyParams, RPC.VERSION, currentId); - websocket.sendText(getRelativeAccountHistoryId.toJsonString()); - } else if(baseResponse.id == GET_HISTORY_ID){ - Type ApiIdResponse = new TypeToken>() {}.getType(); - WitnessResponse witnessResponse = gson.fromJson(response, ApiIdResponse); - apiId = witnessResponse.result.intValue(); - - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss"); - - ArrayList params = new ArrayList<>(); - params.add(this.base.getObjectId()); - params.add(this.quote.getObjectId()); - params.add(this.bucket); - params.add(dateFormat.format(this.start)); - params.add(dateFormat.format(this.end)); - - ApiCall getRelativeAccountHistoryCall = new ApiCall(apiId, RPC.CALL_GET_MARKET_HISTORY, params, RPC.VERSION, currentId); - websocket.sendText(getRelativeAccountHistoryCall.toJsonString()); - }else if(baseResponse.id >= GET_HISTORY_DATA){ - GsonBuilder builder = new GsonBuilder(); - Type MarketHistoryResponse = new TypeToken>>(){}.getType(); - builder.registerTypeAdapter(BucketObject.class, new BucketObject.BucketDeserializer()); - WitnessResponse> marketHistoryResponse = builder.create().fromJson(response, MarketHistoryResponse); - mListener.onSuccess(marketHistoryResponse); - } - } - } - - /** - * Actually sends the 'get_market_history' API call request. This method might be called multiple - * times during the life-cycle of this instance because we might not have gotten anything - * in the first requested interval. - */ - private void sendHistoricalMarketDataRequest(){ - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss"); - - ArrayList params = new ArrayList<>(); - params.add(this.base.getObjectId()); - params.add(this.quote.getObjectId()); - params.add(this.bucket); - params.add(dateFormat.format(this.start)); - params.add(dateFormat.format(this.end)); - - ApiCall getRelativeAccountHistoryCall = new ApiCall(apiId, RPC.CALL_GET_MARKET_HISTORY, params, RPC.VERSION, currentId); - mWebsocket.sendText(getRelativeAccountHistoryCall.toJsonString()); - - counter++; - } - - @Override - public void onFrameSent(WebSocket websocket, WebSocketFrame frame) throws Exception { - if(frame.isTextFrame()) - System.out.println(">>> "+frame.getPayloadText()); - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/api/GetObjects.java b/app/src/main/java/cy/agorise/graphenej/api/GetObjects.java deleted file mode 100644 index ab65206..0000000 --- a/app/src/main/java/cy/agorise/graphenej/api/GetObjects.java +++ /dev/null @@ -1,139 +0,0 @@ -package cy.agorise.graphenej.api; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonParser; -import com.google.gson.reflect.TypeToken; -import com.neovisionaries.ws.client.WebSocket; -import com.neovisionaries.ws.client.WebSocketFrame; - -import java.io.Serializable; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import cy.agorise.graphenej.AccountOptions; -import cy.agorise.graphenej.Asset; -import cy.agorise.graphenej.AssetAmount; -import cy.agorise.graphenej.Authority; -import cy.agorise.graphenej.GrapheneObject; -import cy.agorise.graphenej.RPC; -import cy.agorise.graphenej.UserAccount; -import cy.agorise.graphenej.interfaces.WitnessResponseListener; -import cy.agorise.graphenej.models.ApiCall; -import cy.agorise.graphenej.models.BitAssetData; -import cy.agorise.graphenej.models.WitnessResponse; - -/** - * - * Class that implements get_objects request handler. - * - * Get the objects corresponding to the provided IDs. - * - * The response returns a list of objects retrieved, in the order they are mentioned in ids - * - * @see get_objects API doc - * - */ -public class GetObjects extends BaseGrapheneHandler { - private List ids; - - private boolean mOneTime; - - /** - * Default Constructor - * - * @param ids list of IDs of the objects to retrieve - * @param oneTime boolean value indicating if WebSocket must be closed (true) or not - * (false) after the response - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public GetObjects(List ids, boolean oneTime, WitnessResponseListener listener){ - super(listener); - this.ids = ids; - this.mOneTime = oneTime; - } - - /** - * Using this constructor the WebSocket connection closes after the response. - * - * @param ids list of IDs of the objects to retrieve - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public GetObjects(List ids, WitnessResponseListener listener){ - this(ids, true, listener); - } - - @Override - public void onConnected(WebSocket websocket, Map> headers) throws Exception { - ArrayList params = new ArrayList<>(); - ArrayList subParams = new ArrayList<>(); - for(String id : this.ids){ - subParams.add(id); - } - params.add(subParams); - ApiCall apiCall = new ApiCall(0, RPC.GET_OBJECTS, params, RPC.VERSION, 0); - websocket.sendText(apiCall.toJsonString()); - } - - @Override - public void onTextFrame(WebSocket websocket, WebSocketFrame frame) throws Exception { - if(frame.isTextFrame()){ - System.out.println("<< "+frame.getPayloadText()); - } - String response = frame.getPayloadText(); - GsonBuilder gsonBuilder = new GsonBuilder(); - - gsonBuilder.registerTypeAdapter(AssetAmount.class, new AssetAmount.AssetAmountDeserializer()); - gsonBuilder.registerTypeAdapter(Asset.class, new Asset.AssetDeserializer()); - gsonBuilder.registerTypeAdapter(UserAccount.class, new UserAccount.UserAccountFullDeserializer()); - gsonBuilder.registerTypeAdapter(Authority.class, new Authority.AuthorityDeserializer()); - gsonBuilder.registerTypeAdapter(AccountOptions.class, new AccountOptions.AccountOptionsDeserializer()); - Gson gson = gsonBuilder.create(); - - List parsedResult = new ArrayList<>(); - - JsonParser parser = new JsonParser(); - JsonArray resultArray = parser.parse(response).getAsJsonObject().get(WitnessResponse.KEY_RESULT).getAsJsonArray(); - for(JsonElement element : resultArray){ - String id = element.getAsJsonObject().get(GrapheneObject.KEY_ID).getAsString(); - GrapheneObject grapheneObject = new GrapheneObject(id); - switch (grapheneObject.getObjectType()){ - case ASSET_OBJECT: - Asset asset = gson.fromJson(element, Asset.class); - parsedResult.add(asset); - break; - case ACCOUNT_OBJECT: - UserAccount account = gson.fromJson(element, UserAccount.class); - parsedResult.add(account); - break; - case ASSET_BITASSET_DATA: - Type BitAssetDataType = new TypeToken>>(){}.getType(); - WitnessResponse> witnessResponse = gsonBuilder.create().fromJson(response, BitAssetDataType); - BitAssetData bitAssetData = witnessResponse.result.get(0); - parsedResult.add(bitAssetData); - } - } - - WitnessResponse> output = new WitnessResponse<>(); - output.result = parsedResult; - mListener.onSuccess(output); - if(mOneTime){ - websocket.disconnect(); - } - } - - @Override - public void onFrameSent(WebSocket websocket, WebSocketFrame frame) throws Exception { - if(frame.isTextFrame()){ - System.out.println(">> "+frame.getPayloadText()); - } - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/api/GetRelativeAccountHistory.java b/app/src/main/java/cy/agorise/graphenej/api/GetRelativeAccountHistory.java deleted file mode 100644 index 935618f..0000000 --- a/app/src/main/java/cy/agorise/graphenej/api/GetRelativeAccountHistory.java +++ /dev/null @@ -1,214 +0,0 @@ -package cy.agorise.graphenej.api; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.reflect.TypeToken; -import com.neovisionaries.ws.client.WebSocket; -import com.neovisionaries.ws.client.WebSocketFrame; - -import java.io.Serializable; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import cy.agorise.graphenej.AssetAmount; -import cy.agorise.graphenej.RPC; -import cy.agorise.graphenej.UserAccount; -import cy.agorise.graphenej.interfaces.WitnessResponseListener; -import cy.agorise.graphenej.models.ApiCall; -import cy.agorise.graphenej.models.BaseResponse; -import cy.agorise.graphenej.models.HistoricalTransfer; -import cy.agorise.graphenej.models.WitnessResponse; -import cy.agorise.graphenej.objects.Memo; -import cy.agorise.graphenej.operations.TransferOperation; - -/** - * Class used to encapsulate the communication sequence used to retrieve the transaction history of - * a given user. - */ -public class GetRelativeAccountHistory extends BaseGrapheneHandler { - // Sequence of message ids - private final static int LOGIN_ID = 1; - private final static int GET_HISTORY_ID = 2; - private final static int GET_HISTORY_DATA = 3; - - // Default value constants - public static final int DEFAULT_STOP = 0; - public static final int DEFAULT_START = 0; - public static final int MAX_LIMIT = 100; - - // API call parameters - private UserAccount mUserAccount; - private int stop; - private int limit; - private int start; - private WitnessResponseListener mListener; - private WebSocket mWebsocket; - - private int currentId = 1; - private int apiId = -1; - - private boolean mOneTime; - - /** - * Constructor that takes all possible parameters. - * - * @param userAccount The user account to be queried - * @param stop Sequence number of earliest operation - * @param limit Maximum number of operations to retrieve (must not exceed 100) - * @param start Sequence number of the most recent operation to retrieve - * @param oneTime boolean value indicating if WebSocket must be closed (true) or not - * (false) after the response - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public GetRelativeAccountHistory(UserAccount userAccount, int stop, int limit, int start, boolean oneTime, WitnessResponseListener listener){ - super(listener); - if(limit > MAX_LIMIT) limit = MAX_LIMIT; - this.mUserAccount = userAccount; - this.stop = stop; - this.limit = limit; - this.start = start; - this.mOneTime = oneTime; - this.mListener = listener; - } - - /** - * Constructor that uses the default values, and sets the limit to its maximum possible value. - * - * @param userAccount The user account to be queried - * @param oneTime boolean value indicating if WebSocket must be closed (true) or not - * (false) after the response - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public GetRelativeAccountHistory(UserAccount userAccount, boolean oneTime, WitnessResponseListener listener){ - super(listener); - this.mUserAccount = userAccount; - this.stop = DEFAULT_STOP; - this.limit = MAX_LIMIT; - this.start = DEFAULT_START; - this.mOneTime = oneTime; - this.mListener = listener; - } - - /** - * Constructor that takes all possible parameters for the query. - * Using this constructor the WebSocket connection closes after the response. - * - * @param userAccount The user account to be queried - * @param stop Sequence number of earliest operation - * @param limit Maximum number of operations to retrieve (must not exceed 100) - * @param start Sequence number of the most recent operation to retrieve - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public GetRelativeAccountHistory(UserAccount userAccount, int stop, int limit, int start, WitnessResponseListener listener){ - this(userAccount, stop, limit, start, true, listener); - } - - /** - * Constructor that uses the default values, and sets the limit to its maximum possible value. - * Using this constructor the WebSocket connection closes after the response. - * - * @param userAccount The user account to be queried - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public GetRelativeAccountHistory(UserAccount userAccount, WitnessResponseListener listener){ - this(userAccount, true, listener); - } - - @Override - public void onConnected(WebSocket websocket, Map> headers) throws Exception { - mWebsocket = websocket; - ArrayList loginParams = new ArrayList<>(); - loginParams.add(null); - loginParams.add(null); - ApiCall loginCall = new ApiCall(1, RPC.CALL_LOGIN, loginParams, RPC.VERSION, currentId); - websocket.sendText(loginCall.toJsonString()); - } - - @Override - public void onTextFrame(WebSocket websocket, WebSocketFrame frame) throws Exception { - String response = frame.getPayloadText(); - System.out.println("<<< "+response); - Gson gson = new Gson(); - BaseResponse baseResponse = gson.fromJson(response, BaseResponse.class); - if(baseResponse.error != null){ - mListener.onError(baseResponse.error); - if(mOneTime){ - websocket.disconnect(); - } - }else{ - currentId++; - ArrayList emptyParams = new ArrayList<>(); - if(baseResponse.id == LOGIN_ID){ - ApiCall getRelativeAccountHistoryId = new ApiCall(1, RPC.CALL_HISTORY, emptyParams, RPC.VERSION, currentId); - websocket.sendText(getRelativeAccountHistoryId.toJsonString()); - }else if(baseResponse.id == GET_HISTORY_ID){ - Type ApiIdResponse = new TypeToken>() {}.getType(); - WitnessResponse witnessResponse = gson.fromJson(response, ApiIdResponse); - apiId = witnessResponse.result.intValue(); - - sendRelativeAccountHistoryRequest(); - }else if(baseResponse.id >= GET_HISTORY_DATA){ - Type RelativeAccountHistoryResponse = new TypeToken>>(){}.getType(); - GsonBuilder gsonBuilder = new GsonBuilder(); - gsonBuilder.registerTypeAdapter(TransferOperation.class, new TransferOperation.TransferDeserializer()); - gsonBuilder.registerTypeAdapter(AssetAmount.class, new AssetAmount.AssetAmountDeserializer()); - gsonBuilder.registerTypeAdapter(Memo.class, new Memo.MemoDeserializer()); - WitnessResponse> transfersResponse = gsonBuilder.create().fromJson(response, RelativeAccountHistoryResponse); - mListener.onSuccess(transfersResponse); - } - } - } - - /** - * Sends the actual get_relative_account_history request. - */ - private void sendRelativeAccountHistoryRequest(){ - ArrayList params = new ArrayList<>(); - params.add(mUserAccount.getObjectId()); - params.add(this.stop); - params.add(this.limit); - params.add(this.start); - - ApiCall getRelativeAccountHistoryCall = new ApiCall(apiId, RPC.CALL_GET_RELATIVE_ACCOUNT_HISTORY, params, RPC.VERSION, currentId); - mWebsocket.sendText(getRelativeAccountHistoryCall.toJsonString()); - } - - /** - * Updates the arguments and makes a new call to the get_relative_account_history API. - * - * @param stop Sequence number of earliest operation - * @param limit Maximum number of operations to retrieve (must not exceed 100) - * @param start Sequence number of the most recent operation to retrieve - */ - public void retry(int stop, int limit, int start){ - this.stop = stop; - this.limit = limit; - this.start = start; - sendRelativeAccountHistoryRequest(); - } - - /** - * Disconnects the WebSocket. - */ - public void disconnect(){ - if(mWebsocket != null && mWebsocket.isOpen() && mOneTime){ - mWebsocket.disconnect(); - } - } - - @Override - public void onFrameSent(WebSocket websocket, WebSocketFrame frame) throws Exception { - if(frame.isTextFrame()) - System.out.println(">>> "+frame.getPayloadText()); - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/api/GetRequiredFees.java b/app/src/main/java/cy/agorise/graphenej/api/GetRequiredFees.java deleted file mode 100644 index b51cbc6..0000000 --- a/app/src/main/java/cy/agorise/graphenej/api/GetRequiredFees.java +++ /dev/null @@ -1,113 +0,0 @@ -package cy.agorise.graphenej.api; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.reflect.TypeToken; -import cy.agorise.graphenej.AssetAmount; -import cy.agorise.graphenej.RPC; -import cy.agorise.graphenej.interfaces.WitnessResponseListener; -import cy.agorise.graphenej.models.ApiCall; -import cy.agorise.graphenej.models.BaseResponse; -import cy.agorise.graphenej.models.WitnessResponse; -import com.neovisionaries.ws.client.WebSocket; -import com.neovisionaries.ws.client.WebSocketAdapter; -import com.neovisionaries.ws.client.WebSocketException; -import com.neovisionaries.ws.client.WebSocketFrame; -import cy.agorise.graphenej.Asset; -import cy.agorise.graphenej.BaseOperation; - -import java.io.Serializable; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * Class that implements get_required_fees request handler. - * - * For each operation calculate the required fee in the specified asset type. - * - * @see get_required_fees API doc - */ -public class GetRequiredFees extends BaseGrapheneHandler { - - private WitnessResponseListener mListener; - private List operations; - private Asset asset; - - private boolean mOneTime; - - /** - * Default Constructor - * - * @param operations list of operations that fee should be calculated - * @param asset specify the asset of the operations - * @param oneTime boolean value indicating if WebSocket must be closed (true) or not - * (false) after the response - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public GetRequiredFees(List operations, Asset asset, boolean oneTime, WitnessResponseListener listener){ - super(listener); - this.operations = operations; - this.asset = asset; - this.mOneTime = oneTime; - this.mListener = listener; - } - - /** - * Using this constructor the WebSocket connection closes after the response. - * - * @param operations list of operations that fee should be calculated - * @param asset specify the asset of the operations - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public GetRequiredFees(List operations, Asset asset, WitnessResponseListener listener){ - this(operations, asset, true, listener); - } - - @Override - public void onConnected(WebSocket websocket, Map> headers) throws Exception { - ArrayList accountParams = new ArrayList<>(); - accountParams.add((Serializable) this.operations); - accountParams.add(this.asset.getObjectId()); - ApiCall getRequiredFees = new ApiCall(0, RPC.CALL_GET_REQUIRED_FEES, accountParams, RPC.VERSION, 1); - websocket.sendText(getRequiredFees.toJsonString()); - } - - @Override - public void onTextFrame(WebSocket websocket, WebSocketFrame frame) throws Exception { - String response = frame.getPayloadText(); - Gson gson = new Gson(); - - Type GetRequiredFeesResponse = new TypeToken>>(){}.getType(); - GsonBuilder gsonBuilder = new GsonBuilder(); - gsonBuilder.registerTypeAdapter(AssetAmount.class, new AssetAmount.AssetAmountDeserializer()); - WitnessResponse> witnessResponse = gsonBuilder.create().fromJson(response, GetRequiredFeesResponse); - - if(witnessResponse.error != null){ - mListener.onError(witnessResponse.error); - }else{ - mListener.onSuccess(witnessResponse); - } - } - - @Override - public void onError(WebSocket websocket, WebSocketException cause) throws Exception { - mListener.onError(new BaseResponse.Error(cause.getMessage())); - if(mOneTime){ - websocket.disconnect(); - } - } - - @Override - public void handleCallbackError(WebSocket websocket, Throwable cause) throws Exception { - mListener.onError(new BaseResponse.Error(cause.getMessage())); - if(mOneTime){ - websocket.disconnect(); - } - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/api/GetTradeHistory.java b/app/src/main/java/cy/agorise/graphenej/api/GetTradeHistory.java deleted file mode 100644 index 327a04d..0000000 --- a/app/src/main/java/cy/agorise/graphenej/api/GetTradeHistory.java +++ /dev/null @@ -1,127 +0,0 @@ -package cy.agorise.graphenej.api; - -import com.google.gson.GsonBuilder; -import com.google.gson.reflect.TypeToken; -import com.neovisionaries.ws.client.WebSocket; -import com.neovisionaries.ws.client.WebSocketFrame; - -import java.io.Serializable; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import cy.agorise.graphenej.MarketTrade; -import cy.agorise.graphenej.RPC; -import cy.agorise.graphenej.interfaces.WitnessResponseListener; -import cy.agorise.graphenej.models.ApiCall; -import cy.agorise.graphenej.models.WitnessResponse; - -/** - * Class that implements get_trade_history request handler. - * - * Get recent trades for the market assetA:assetB for a time interval - * Note: Currently, timezone offsets are not supported. The time must be UTC. - * - * The request returns the all trades of the passed pair of asset at a specific time interval. - * - * @see get_trade_history API doc - * - */ -public class GetTradeHistory extends BaseGrapheneHandler { - - private String a; - private String b; - private String toTime; - private String fromTime; - private int limit; - private WitnessResponseListener mListener; - - private boolean mOneTime; - - /** - * Constructor - * - * @param a name of the first asset - * @param b name of the second asset - * @param toTime stop time as a UNIX timestamp - * @param fromTime start time as a UNIX timestamp - * @param limit number of transactions to retrieve, capped at 100 - * @param oneTime boolean value indicating if WebSocket must be closed (true) or not - * (false) after the response - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public GetTradeHistory(String a, String b, String toTime, String fromTime,int limit, boolean oneTime, WitnessResponseListener listener) { - super(listener); - this.a = a; - this.b = b; - this.toTime = toTime; - this.fromTime = fromTime; - this.limit = limit; - this.mOneTime = oneTime; - this.mListener = listener; - } - - /** - * Using this constructor the WebSocket connection closes after the response. - * - * @param a name of the first asset - * @param b name of the second asset - * @param toTime stop time as a UNIX timestamp - * @param fromTime start time as a UNIX timestamp - * @param limit number of transactions to retrieve, capped at 100 - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public GetTradeHistory(String a, String b, String toTime, String fromTime,int limit, WitnessResponseListener listener) { - this(a, b, toTime, fromTime, limit, true, listener); - } - - @Override - public void onConnected(WebSocket websocket, Map> headers) throws Exception { - ArrayList accountParams = new ArrayList<>(); - accountParams.add(this.a); - accountParams.add(this.b); - accountParams.add(this.toTime); - accountParams.add(this.fromTime); - accountParams.add(this.limit); - - ApiCall getAccountByName = new ApiCall(0, RPC.CALL_GET_TRADE_HISTORY, accountParams, RPC.VERSION, 1); - websocket.sendText(getAccountByName.toJsonString()); - } - - @Override - public void onTextFrame(WebSocket websocket, WebSocketFrame frame) throws Exception { - if (frame.isTextFrame()) { - System.out.println("<<< " + frame.getPayloadText()); - } - try { - String response = frame.getPayloadText(); - GsonBuilder builder = new GsonBuilder(); - - Type GetTradeHistoryResponse = new TypeToken>>() { - }.getType(); - WitnessResponse> witnessResponse = builder.create().fromJson(response, GetTradeHistoryResponse); - if (witnessResponse.error != null) { - this.mListener.onError(witnessResponse.error); - } else { - this.mListener.onSuccess(witnessResponse); - } - } catch (Exception e) { - e.printStackTrace(); - } - if(mOneTime){ - websocket.disconnect(); - } - } - - @Override - public void onFrameSent(WebSocket websocket, WebSocketFrame frame) throws Exception { - if (frame.isTextFrame()) { - System.out.println(">>> " + frame.getPayloadText()); - } - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/api/ListAssets.java b/app/src/main/java/cy/agorise/graphenej/api/ListAssets.java deleted file mode 100644 index df85ac3..0000000 --- a/app/src/main/java/cy/agorise/graphenej/api/ListAssets.java +++ /dev/null @@ -1,146 +0,0 @@ -package cy.agorise.graphenej.api; - -import com.google.gson.GsonBuilder; -import com.google.gson.reflect.TypeToken; -import com.neovisionaries.ws.client.WebSocket; -import com.neovisionaries.ws.client.WebSocketFrame; -import cy.agorise.graphenej.Asset; -import cy.agorise.graphenej.RPC; -import cy.agorise.graphenej.interfaces.WitnessResponseListener; -import cy.agorise.graphenej.models.ApiCall; -import cy.agorise.graphenej.models.WitnessResponse; - -import java.io.Serializable; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * WebSocketAdapter class used to send a request a 'list_assets' API call to the witness node. - * - * The API imposes a limit of of 100 assets per request, but if the user of this class wants - * to get a list of all assets, the LIST_ALL constant must be used as second argument in the - * constructor. Internally we are going to perform multiple calls in order to satisfy the user's - * request. - * - * @see: - */ -public class ListAssets extends BaseGrapheneHandler { - /** - * Constant that must be used as argument to the constructor of this class to indicate - * that the user wants to get all existing assets. - */ - public static final int LIST_ALL = -1; - - /** - * Internal constant used to represent the maximum limit of assets retrieved in one call. - */ - private final int MAX_BATCH_SIZE = 100; - - private List assets; - private String lowerBound; - private int limit; - private int requestCounter = 0; - - private boolean mOneTime; - - /** - * Constructor - * - * @param lowerBoundSymbol Lower bound of symbol names to retrieve - * @param limit Maximum number of assets to fetch, if the constant LIST_ALL - * is passed, all existing assets will be retrieved. - * @param oneTime boolean value indicating if WebSocket must be closed (true) or not - * (false) after the response - * @param listener A class implementing the WitnessResponseListener interface. This - * should be implemented by the party interested in being notified - * about the success/failure of the operation. - */ - public ListAssets(String lowerBoundSymbol, int limit, boolean oneTime, WitnessResponseListener listener){ - super(listener); - this.lowerBound = lowerBoundSymbol; - this.limit = limit; - this.mOneTime = oneTime; - } - - /** - * Using this constructor the WebSocket connection closes after the response. - * - * @param lowerBoundSymbol Lower bound of symbol names to retrieve - * @param limit Maximum number of assets to fetch, if the constant LIST_ALL - * is passed, all existing assets will be retrieved. - * @param oneTime boolean value indicating if WebSocket must be closed (true) or not - * (false) after the response - * @param listener A class implementing the WitnessResponseListener interface. This - * should be implemented by the party interested in being notified - * about the success/failure of the operation. - */ - public ListAssets(String lowerBoundSymbol, int limit, WitnessResponseListener listener){ - this(lowerBoundSymbol, limit, true, listener); - } - - @Override - public void onConnected(WebSocket websocket, Map> headers) throws Exception { - ArrayList params = new ArrayList<>(); - params.add(this.lowerBound); - if(limit > MAX_BATCH_SIZE || limit == LIST_ALL){ - params.add(MAX_BATCH_SIZE); - }else{ - params.add(this.limit); - } - ApiCall apiCall = new ApiCall(0, RPC.CALL_LIST_ASSETS, params, RPC.VERSION, 0); - websocket.sendText(apiCall.toJsonString()); - } - - @Override - public void onTextFrame(WebSocket websocket, WebSocketFrame frame) throws Exception { - String response = frame.getPayloadText(); - GsonBuilder gsonBuilder = new GsonBuilder(); - Type LookupAssetSymbolsResponse = new TypeToken>>(){}.getType(); - gsonBuilder.registerTypeAdapter(Asset.class, new Asset.AssetDeserializer()); - WitnessResponse> witnessResponse = gsonBuilder.create().fromJson(response, LookupAssetSymbolsResponse); - if(this.limit != LIST_ALL && this.limit < MAX_BATCH_SIZE){ - // If the requested number of assets was below - // the limit, we just call the listener. - mListener.onSuccess(witnessResponse); - if(mOneTime){ - websocket.disconnect(); - } - }else{ - // Updating counter to keep track of how many batches we already retrieved. - requestCounter++; - if(this.assets == null){ - this.assets = new ArrayList<>(); - } - this.assets.addAll(witnessResponse.result); - - // Checking to see if we're done - if(this.limit == LIST_ALL && witnessResponse.result.size() < MAX_BATCH_SIZE){ - // In case we requested all assets, we might be in the last round whenever - // we got less than the requested amount. - witnessResponse.result = this.assets; - mListener.onSuccess(witnessResponse); - if(mOneTime){ - websocket.disconnect(); - } - }else if(this.assets.size() == this.limit){ - // We already have the required amount of assets - witnessResponse.result = this.assets; - mListener.onSuccess(witnessResponse); - if(mOneTime){ - websocket.disconnect(); - } - }else{ - // We still need to fetch some more assets - this.lowerBound = this.assets.get(this.assets.size() - 1).getSymbol(); - int nextBatch = this.limit == LIST_ALL ? MAX_BATCH_SIZE : this.limit - (MAX_BATCH_SIZE * requestCounter); - ArrayList params = new ArrayList<>(); - params.add(this.lowerBound); - params.add(nextBatch); - ApiCall apiCall = new ApiCall(0, RPC.CALL_LIST_ASSETS, params, RPC.VERSION, 0); - websocket.sendText(apiCall.toJsonString()); - } - } - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/api/LookupAccounts.java b/app/src/main/java/cy/agorise/graphenej/api/LookupAccounts.java deleted file mode 100644 index afae255..0000000 --- a/app/src/main/java/cy/agorise/graphenej/api/LookupAccounts.java +++ /dev/null @@ -1,134 +0,0 @@ -package cy.agorise.graphenej.api; - -import com.google.gson.GsonBuilder; -import com.google.gson.reflect.TypeToken; -import com.neovisionaries.ws.client.WebSocket; -import com.neovisionaries.ws.client.WebSocketFrame; - -import java.io.Serializable; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import cy.agorise.graphenej.RPC; -import cy.agorise.graphenej.UserAccount; -import cy.agorise.graphenej.interfaces.WitnessResponseListener; -import cy.agorise.graphenej.models.ApiCall; -import cy.agorise.graphenej.models.WitnessResponse; - -/** - * Class that implements lookup_accounts request handler. - * - * Get names and IDs for registered accounts. - * - * The request returns a map of account names to corresponding IDs. - * - * @see lookup_accounts API doc - */ -public class LookupAccounts extends BaseGrapheneHandler { - - public static final int DEFAULT_MAX = 1000; - private final String accountName; - private int maxAccounts = DEFAULT_MAX; - private final WitnessResponseListener mListener; - - private boolean mOneTime; - - /** - * Constructor - * - * @param accountName account name used at the query - * @param oneTime boolean value indicating if WebSocket must be closed (true) or not - * (false) after the response - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public LookupAccounts(String accountName, boolean oneTime, WitnessResponseListener listener){ - super(listener); - this.accountName = accountName; - this.maxAccounts = DEFAULT_MAX; - this.mOneTime = oneTime; - this.mListener = listener; - } - - /** - * Constructor with maxAccounts - * - * @param accountName account name used at the query - * @param maxAccounts maximum number of results to return (must not exceed 1000) - * @param oneTime boolean value indicating if WebSocket must be closed (true) or not - * (false) after the response - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public LookupAccounts(String accountName, int maxAccounts, boolean oneTime, WitnessResponseListener listener){ - super(listener); - this.accountName = accountName; - this.maxAccounts = maxAccounts; - this.mOneTime = oneTime; - this.mListener = listener; - } - - /** - * Using this constructor the WebSocket connection closes after the response. - * - * @param accountName account name used at the query - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public LookupAccounts(String accountName, WitnessResponseListener listener){ - this(accountName, true, listener); - } - - /** - * Using this constructor the WebSocket connection closes after the response. - * - * @param accountName account name used at the query - * @param maxAccounts maximum number of results to return (must not exceed 1000) - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public LookupAccounts(String accountName, int maxAccounts, WitnessResponseListener listener){ - this(accountName, maxAccounts, true, listener); - } - - @Override - public void onConnected(WebSocket websocket, Map> headers) throws Exception { - ArrayList accountParams = new ArrayList<>(); - accountParams.add(this.accountName); - accountParams.add(this.maxAccounts); - ApiCall getAccountByName = new ApiCall(0, RPC.CALL_LOOKUP_ACCOUNTS, accountParams, RPC.VERSION, 1); - websocket.sendText(getAccountByName.toJsonString()); - } - - @Override - public void onTextFrame(WebSocket websocket, WebSocketFrame frame) throws Exception { - System.out.println("<<< "+frame.getPayloadText()); - String response = frame.getPayloadText(); - - Type LookupAccountsResponse = new TypeToken>>(){}.getType(); - GsonBuilder builder = new GsonBuilder(); - builder.registerTypeAdapter(UserAccount.class, new UserAccount.UserAccountDeserializer()); - WitnessResponse> witnessResponse = builder.create().fromJson(response, LookupAccountsResponse); - if(witnessResponse.error != null){ - this.mListener.onError(witnessResponse.error); - }else{ - this.mListener.onSuccess(witnessResponse); - } - - if(mOneTime){ - websocket.disconnect(); - } - } - - @Override - public void onFrameSent(WebSocket websocket, WebSocketFrame frame) throws Exception { - if(frame.isTextFrame()) - System.out.println(">>> "+frame.getPayloadText()); - } -} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/graphenej/api/LookupAssetSymbols.java b/app/src/main/java/cy/agorise/graphenej/api/LookupAssetSymbols.java deleted file mode 100644 index d60f90c..0000000 --- a/app/src/main/java/cy/agorise/graphenej/api/LookupAssetSymbols.java +++ /dev/null @@ -1,95 +0,0 @@ -package cy.agorise.graphenej.api; - -import com.google.gson.GsonBuilder; -import com.google.gson.reflect.TypeToken; -import com.neovisionaries.ws.client.WebSocket; -import com.neovisionaries.ws.client.WebSocketFrame; - -import java.io.Serializable; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import cy.agorise.graphenej.Asset; -import cy.agorise.graphenej.RPC; -import cy.agorise.graphenej.interfaces.WitnessResponseListener; -import cy.agorise.graphenej.models.ApiCall; -import cy.agorise.graphenej.models.WitnessResponse; - -/** - * Class that implements lookup_asset_symbols request handler. - * - * Get the assets corresponding to the provided IDs. - * - * The response returns the assets corresponding to the provided symbols or IDs. - * - * @see lookup_asset_symbols API doc - */ -public class LookupAssetSymbols extends BaseGrapheneHandler { - private WitnessResponseListener mListener; - private List assets; - - private boolean mOneTime; - - /** - * Default Constructor - * - * @param assets list of the assets to retrieve - * @param oneTime boolean value indicating if WebSocket must be closed (true) or not - * (false) after the response - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public LookupAssetSymbols(List assets, boolean oneTime, WitnessResponseListener listener){ - super(listener); - this.assets = assets; - this.mOneTime = oneTime; - this.mListener = listener; - } - - /** - * Using this constructor the WebSocket connection closes after the response. - * - * @param assets list of the assets to retrieve - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public LookupAssetSymbols(List assets, WitnessResponseListener listener){ - this(assets, true, listener); - } - - @Override - public void onConnected(WebSocket websocket, Map> headers) throws Exception { - ArrayList params = new ArrayList<>(); - ArrayList subArray = new ArrayList<>(); - for(Asset asset : this.assets){ - subArray.add(asset.getObjectId()); - params.add(subArray); - } - ApiCall loginCall = new ApiCall(0, RPC.CALL_LOOKUP_ASSET_SYMBOLS, params, RPC.VERSION, 0); - websocket.sendText(loginCall.toJsonString()); - } - - @Override - public void onTextFrame(WebSocket websocket, WebSocketFrame frame) throws Exception { - String response = frame.getPayloadText(); - System.out.println("<<< "+response); - GsonBuilder gsonBuilder = new GsonBuilder(); - Type LookupAssetSymbolsResponse = new TypeToken>>(){}.getType(); - gsonBuilder.registerTypeAdapter(Asset.class, new Asset.AssetDeserializer()); - WitnessResponse> witnessResponse = gsonBuilder.create().fromJson(response, LookupAssetSymbolsResponse); - mListener.onSuccess(witnessResponse); - if(mOneTime){ - websocket.disconnect(); - } - } - - @Override - public void onFrameSent(WebSocket websocket, WebSocketFrame frame) throws Exception { - if(frame.isTextFrame()) - System.out.println(">>> "+frame.getPayloadText()); - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/api/SubscriptionMessagesHub.java b/app/src/main/java/cy/agorise/graphenej/api/SubscriptionMessagesHub.java deleted file mode 100644 index f1bd5f5..0000000 --- a/app/src/main/java/cy/agorise/graphenej/api/SubscriptionMessagesHub.java +++ /dev/null @@ -1,284 +0,0 @@ -package cy.agorise.graphenej.api; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.reflect.TypeToken; -import com.neovisionaries.ws.client.WebSocket; -import com.neovisionaries.ws.client.WebSocketFrame; - -import java.io.Serializable; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import cy.agorise.graphenej.AssetAmount; -import cy.agorise.graphenej.RPC; -import cy.agorise.graphenej.Transaction; -import cy.agorise.graphenej.UserAccount; -import cy.agorise.graphenej.errors.RepeatedRequestIdException; -import cy.agorise.graphenej.interfaces.NodeErrorListener; -import cy.agorise.graphenej.interfaces.SubscriptionHub; -import cy.agorise.graphenej.interfaces.SubscriptionListener; -import cy.agorise.graphenej.interfaces.WitnessResponseListener; -import cy.agorise.graphenej.models.ApiCall; -import cy.agorise.graphenej.models.DynamicGlobalProperties; -import cy.agorise.graphenej.models.SubscriptionResponse; -import cy.agorise.graphenej.models.WitnessResponse; -import cy.agorise.graphenej.objects.Memo; -import cy.agorise.graphenej.operations.LimitOrderCreateOperation; -import cy.agorise.graphenej.operations.TransferOperation; - -/** - * A WebSocket adapter prepared to be used as a basic dispatch hub for subscription messages. - */ -public class SubscriptionMessagesHub extends BaseGrapheneHandler implements SubscriptionHub { - - private WebSocket mWebsocket; - - // Sequence of message ids - public final static int LOGIN_ID = 1; - public final static int GET_DATABASE_ID = 2; - public final static int SUBSCRIPTION_REQUEST = 3; - - // ID of subscription notifications - public final static int SUBSCRIPTION_NOTIFICATION = 4; - - /** - * Id attributed to the indivitual 'get_objects' API call required for a fine-grained - * subscription request. - */ - public final static int MANUAL_SUBSCRIPTION_ID = 5; - - private SubscriptionResponse.SubscriptionResponseDeserializer mSubscriptionDeserializer; - private Gson gson; - private String user; - private String password; - private boolean clearFilter; - private int currentId; - private int databaseApiId = -1; - private int subscriptionCounter = 0; - private HashMap mHandlerMap = new HashMap<>(); - - // State variables - private boolean isUnsubscribing; - private boolean isSubscribed; - - /** - * Constructor used to create a subscription message hub that will call the set_subscribe_callback - * API with the clear_filter parameter set to false, meaning that it will only receive automatic updates - * from objects we register. - * - * A list of ObjectTypes must be provided, otherwise we won't get any update. - * - * @param user User name, in case the node to which we're going to connect to requires - * authentication - * @param password Password, same as above - * @param clearFilter Whether to automatically subscribe of not to the notification feed. - * @param errorListener Callback that will be fired in case there is an error. - */ - public SubscriptionMessagesHub(String user, String password, boolean clearFilter, NodeErrorListener errorListener){ - super(errorListener); - this.user = user; - this.password = password; - this.clearFilter = clearFilter; - this.mSubscriptionDeserializer = new SubscriptionResponse.SubscriptionResponseDeserializer(); - GsonBuilder builder = new GsonBuilder(); - builder.registerTypeAdapter(SubscriptionResponse.class, mSubscriptionDeserializer); - builder.registerTypeAdapter(Transaction.class, new Transaction.TransactionDeserializer()); - builder.registerTypeAdapter(TransferOperation.class, new TransferOperation.TransferDeserializer()); - builder.registerTypeAdapter(LimitOrderCreateOperation.class, new LimitOrderCreateOperation.LimitOrderCreateDeserializer()); - builder.registerTypeAdapter(AssetAmount.class, new AssetAmount.AssetAmountDeserializer()); - builder.registerTypeAdapter(UserAccount.class, new UserAccount.UserAccountSimpleDeserializer()); - builder.registerTypeAdapter(DynamicGlobalProperties.class, new DynamicGlobalProperties.DynamicGlobalPropertiesDeserializer()); - builder.registerTypeAdapter(Memo.class, new Memo.MemoDeserializer()); - this.gson = builder.create(); - } - - /** - * Constructor used to create a subscription message hub that will call the - * set_subscribe_callback API with the clear_filter parameter set to false, meaning that it will - * only receive updates from objects we register. - * - * @param user User name, in case the node to which we're going to connect to requires - * authentication - * @param password Password, same as above - * @param errorListener Callback that will be fired in case there is an error. - */ - public SubscriptionMessagesHub(String user, String password, NodeErrorListener errorListener){ - this(user, password, false, errorListener); - } - - @Override - public void addSubscriptionListener(SubscriptionListener listener){ - this.mSubscriptionDeserializer.addSubscriptionListener(listener); - } - - @Override - public void removeSubscriptionListener(SubscriptionListener listener){ - this.mSubscriptionDeserializer.removeSubscriptionListener(listener); - } - - @Override - public List getSubscriptionListeners() { - return this.mSubscriptionDeserializer.getSubscriptionListeners(); - } - - @Override - public void onConnected(WebSocket websocket, Map> headers) throws Exception { - this.mWebsocket = websocket; - ArrayList loginParams = new ArrayList<>(); - currentId = LOGIN_ID; - loginParams.add(user); - loginParams.add(password); - ApiCall loginCall = new ApiCall(1, RPC.CALL_LOGIN, loginParams, RPC.VERSION, currentId); - websocket.sendText(loginCall.toJsonString()); - } - - @Override - public void onTextFrame(WebSocket websocket, WebSocketFrame frame) throws Exception { - String message = frame.getPayloadText(); - System.out.println("<< "+message); - if(currentId == LOGIN_ID){ - ArrayList emptyParams = new ArrayList<>(); - ApiCall getDatabaseId = new ApiCall(1, RPC.CALL_DATABASE, emptyParams, RPC.VERSION, currentId); - websocket.sendText(getDatabaseId.toJsonString()); - currentId++; - }else if(currentId == GET_DATABASE_ID){ - Type ApiIdResponse = new TypeToken>() {}.getType(); - WitnessResponse witnessResponse = gson.fromJson(message, ApiIdResponse); - databaseApiId = witnessResponse.result; - - subscribe(); - } else if(currentId == SUBSCRIPTION_REQUEST){ - List subscriptionListeners = mSubscriptionDeserializer.getSubscriptionListeners(); - - if(!isUnsubscribing){ - isSubscribed = true; - } - - // If we haven't subscribed to all requested subscription channels yet, - // just send one more subscription - if(subscriptionListeners != null && - subscriptionListeners.size() > 0 && - subscriptionCounter < subscriptionListeners.size()){ - - ArrayList objects = new ArrayList<>(); - ArrayList payload = new ArrayList<>(); - for(SubscriptionListener listener : subscriptionListeners){ - objects.add(listener.getInterestObjectType().getGenericObjectId()); - } - - payload.add(objects); - ApiCall subscribe = new ApiCall(databaseApiId, RPC.GET_OBJECTS, payload, RPC.VERSION, MANUAL_SUBSCRIPTION_ID); - websocket.sendText(subscribe.toJsonString()); - subscriptionCounter++; - }else{ - WitnessResponse witnessResponse = gson.fromJson(message, WitnessResponse.class); - if(witnessResponse.result != null && - mHandlerMap.get(witnessResponse.id) != null){ - // This is the response to a request that was submitted to the message hub - // and whose handler was stored in the "request id" -> "handler" map - BaseGrapheneHandler handler = mHandlerMap.get(witnessResponse.id); - handler.onTextFrame(websocket, frame); - mHandlerMap.remove(witnessResponse.id); - }else{ - // If we've already subscribed to all requested subscription channels, we - // just proceed to deserialize content. - // The deserialization is handled by all those TypeAdapters registered in the class - // constructor while building the gson instance. - SubscriptionResponse response = gson.fromJson(message, SubscriptionResponse.class); - } - } - } - } - - @Override - public void onFrameSent(WebSocket websocket, WebSocketFrame frame) throws Exception { - System.out.println(">> "+frame.getPayloadText()); - } - - /** - * Private method that sends a subscription request to the full node - */ - private void subscribe(){ - isUnsubscribing = false; - - ArrayList subscriptionParams = new ArrayList<>(); - subscriptionParams.add(String.format("%d", SUBSCRIPTION_NOTIFICATION)); - subscriptionParams.add(clearFilter); - ApiCall getDatabaseId = new ApiCall(databaseApiId, RPC.CALL_SET_SUBSCRIBE_CALLBACK, subscriptionParams, RPC.VERSION, SUBSCRIPTION_REQUEST); - mWebsocket.sendText(getDatabaseId.toJsonString()); - currentId = SUBSCRIPTION_REQUEST; - } - - /** - * Public method used to re-establish a subscription after it was cancelled by a previous - * call to the {@see #cancelSubscriptions()} method call. - * - * Please note that you should repeat the registration step for every interested listener, since - * those were probably lost after the previous {@see #cancelSubscriptions()} method call. - */ - public void resubscribe(){ - if(mWebsocket.isOpen()){ - subscribe(); - }else{ - throw new IllegalStateException("Websocket is not open, can't resubscribe"); - } - } - - /** - * Method that sends a subscription cancellation request to the full node, and also - * de-registers all subscription and request listeners. - */ - public void cancelSubscriptions(){ - isSubscribed = false; - isUnsubscribing = true; - - ApiCall unsubscribe = new ApiCall(databaseApiId, RPC.CALL_CANCEL_ALL_SUBSCRIPTIONS, new ArrayList(), RPC.VERSION, SUBSCRIPTION_REQUEST); - mWebsocket.sendText(unsubscribe.toJsonString()); - - // Clearing all subscription listeners - mSubscriptionDeserializer.clearAllSubscriptionListeners(); - - // Clearing all request handler listners - mHandlerMap.clear(); - } - - /** - * Method used to check the current state of the connection. - * - * @return True if the websocket is open and there is an active subscription, false otherwise. - */ - public boolean isSubscribed(){ - return this.mWebsocket.isOpen() && isSubscribed; - } - - /** - * Method used to reset all internal variables. - */ - public void reset(){ - currentId = 0; - databaseApiId = -1; - subscriptionCounter = 0; - } - - public void addRequestHandler(BaseGrapheneHandler handler) throws RepeatedRequestIdException { - if(mHandlerMap.get(handler.getRequestId()) != null){ - throw new RepeatedRequestIdException("Already registered handler with id: "+handler.getRequestId()); - } - - mHandlerMap.put(handler.getRequestId(), handler); - - try { - // Artificially calling the 'onConnected' method of the handler. - // The underlying websocket was already connected, but from the WebSocketAdapter - // point of view it doesn't make a difference. - handler.onConnected(mWebsocket, null); - } catch (Exception e) { - System.out.println("Exception. Msg: "+e.getMessage()); - System.out.println("Exception type: "+e); - } - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/api/TransactionBroadcastSequence.java b/app/src/main/java/cy/agorise/graphenej/api/TransactionBroadcastSequence.java deleted file mode 100644 index 0b17939..0000000 --- a/app/src/main/java/cy/agorise/graphenej/api/TransactionBroadcastSequence.java +++ /dev/null @@ -1,197 +0,0 @@ -package cy.agorise.graphenej.api; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.reflect.TypeToken; -import com.neovisionaries.ws.client.WebSocket; -import com.neovisionaries.ws.client.WebSocketException; -import com.neovisionaries.ws.client.WebSocketFrame; - -import java.io.Serializable; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import cy.agorise.graphenej.Asset; -import cy.agorise.graphenej.AssetAmount; -import cy.agorise.graphenej.BlockData; -import cy.agorise.graphenej.RPC; -import cy.agorise.graphenej.Transaction; -import cy.agorise.graphenej.interfaces.WitnessResponseListener; -import cy.agorise.graphenej.models.ApiCall; -import cy.agorise.graphenej.models.BaseResponse; -import cy.agorise.graphenej.models.DynamicGlobalProperties; -import cy.agorise.graphenej.models.WitnessResponse; - -/** - * Class that will handle the transaction publication procedure. - */ -public class TransactionBroadcastSequence extends BaseGrapheneHandler { - private final String TAG = this.getClass().getName(); - - private final static int LOGIN_ID = 1; - private final static int GET_NETWORK_BROADCAST_ID = 2; - private final static int GET_NETWORK_DYNAMIC_PARAMETERS = 3; - private final static int GET_REQUIRED_FEES = 4; - private final static int BROADCAST_TRANSACTION = 5; - - private Asset feeAsset; - private Transaction transaction; - private WitnessResponseListener mListener; - - private int currentId = 1; - private int broadcastApiId = -1; - - private boolean mOneTime; - - /** - * Default Constructor - * - * @param transaction transaction to be broadcasted. - * @param oneTime boolean value indicating if WebSocket must be closed (true) or not - * (false) after the response - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public TransactionBroadcastSequence(Transaction transaction, Asset feeAsset, boolean oneTime, WitnessResponseListener listener){ - super(listener); - this.transaction = transaction; - this.feeAsset = feeAsset; - this.mOneTime = oneTime; - this.mListener = listener; - } - - /** - * Using this constructor the WebSocket connection closes after the response. - * - * @param transaction: transaction to be broadcasted. - * @param listener A class implementing the WitnessResponseListener interface. This should - * be implemented by the party interested in being notified about the - * success/failure of the operation. - */ - public TransactionBroadcastSequence(Transaction transaction, Asset feeAsset, WitnessResponseListener listener){ - this(transaction, feeAsset, true, listener); - } - - @Override - public void onConnected(WebSocket websocket, Map> headers) throws Exception { - ArrayList loginParams = new ArrayList<>(); - loginParams.add(null); - loginParams.add(null); - ApiCall loginCall = new ApiCall(1, RPC.CALL_LOGIN, loginParams, RPC.VERSION, currentId); - websocket.sendText(loginCall.toJsonString()); - } - - @Override - public void onTextFrame(WebSocket websocket, WebSocketFrame frame) throws Exception { - if(frame.isTextFrame()) - System.out.println("<<< "+frame.getPayloadText()); - String response = frame.getPayloadText(); - GsonBuilder builder = new GsonBuilder(); - builder.registerTypeAdapter(DynamicGlobalProperties.class, new DynamicGlobalProperties.DynamicGlobalPropertiesDeserializer()); - Gson gson = builder.create(); - BaseResponse baseResponse = gson.fromJson(response, BaseResponse.class); - if(baseResponse.error != null){ - mListener.onError(baseResponse.error); - if(mOneTime){ - websocket.disconnect(); - } - }else{ - currentId++; - ArrayList emptyParams = new ArrayList<>(); - if(baseResponse.id == LOGIN_ID){ - ApiCall networkApiIdCall = new ApiCall(1, RPC.CALL_NETWORK_BROADCAST, emptyParams, RPC.VERSION, currentId); - websocket.sendText(networkApiIdCall.toJsonString()); - }else if(baseResponse.id == GET_NETWORK_BROADCAST_ID){ - Type ApiIdResponse = new TypeToken>() {}.getType(); - WitnessResponse witnessResponse = gson.fromJson(response, ApiIdResponse); - broadcastApiId = witnessResponse.result; - - // Building API call to request dynamic network properties - ApiCall getDynamicParametersCall = new ApiCall(0, - RPC.CALL_GET_DYNAMIC_GLOBAL_PROPERTIES, - emptyParams, - RPC.VERSION, - currentId); - - // Requesting network properties - websocket.sendText(getDynamicParametersCall.toJsonString()); - }else if(baseResponse.id == GET_NETWORK_DYNAMIC_PARAMETERS){ - Type DynamicGlobalPropertiesResponse = new TypeToken>(){}.getType(); - WitnessResponse witnessResponse = gson.fromJson(response, DynamicGlobalPropertiesResponse); - DynamicGlobalProperties dynamicProperties = witnessResponse.result; - - // Adjusting dynamic block data to every transaction - long expirationTime = (dynamicProperties.time.getTime() / 1000) + Transaction.DEFAULT_EXPIRATION_TIME; - String headBlockId = dynamicProperties.head_block_id; - long headBlockNumber = dynamicProperties.head_block_number; - transaction.setBlockData(new BlockData(headBlockNumber, headBlockId, expirationTime)); - - // Building a new API call to request fees information - ArrayList accountParams = new ArrayList<>(); - accountParams.add((Serializable) transaction.getOperations()); - accountParams.add(this.feeAsset.getObjectId()); - ApiCall getRequiredFees = new ApiCall(0, RPC.CALL_GET_REQUIRED_FEES, accountParams, RPC.VERSION, currentId); - - // Requesting fee amount - websocket.sendText(getRequiredFees.toJsonString()); - }else if(baseResponse.id == GET_REQUIRED_FEES){ - Type GetRequiredFeesResponse = new TypeToken>>(){}.getType(); - GsonBuilder gsonBuilder = new GsonBuilder(); - gsonBuilder.registerTypeAdapter(AssetAmount.class, new AssetAmount.AssetAmountDeserializer()); - WitnessResponse> requiredFeesResponse = gsonBuilder.create().fromJson(response, GetRequiredFeesResponse); - - // Setting fees - transaction.setFees(requiredFeesResponse.result); - ArrayList transactions = new ArrayList<>(); - transactions.add(transaction); - - ApiCall call = new ApiCall(broadcastApiId, - RPC.CALL_BROADCAST_TRANSACTION, - transactions, - RPC.VERSION, - currentId); - - // Finally broadcasting transaction - websocket.sendText(call.toJsonString()); - }else if(baseResponse.id >= BROADCAST_TRANSACTION){ - Type WitnessResponseType = new TypeToken>(){}.getType(); - WitnessResponse witnessResponse = gson.fromJson(response, WitnessResponseType); - mListener.onSuccess(witnessResponse); - if(mOneTime){ - websocket.disconnect(); - } - } - } - } - - @Override - public void onFrameSent(WebSocket websocket, WebSocketFrame frame) throws Exception { - if(frame.isTextFrame()){ - System.out.println(">>> "+frame.getPayloadText()); - } - } - - @Override - public void onError(WebSocket websocket, WebSocketException cause) throws Exception { - System.out.println("onError. cause: "+cause.getMessage()); - mListener.onError(new BaseResponse.Error(cause.getMessage())); - if(mOneTime){ - websocket.disconnect(); - } - } - - @Override - public void handleCallbackError(WebSocket websocket, Throwable cause) throws Exception { - System.out.println("handleCallbackError. cause: "+cause.getMessage()+", error: "+cause.getClass()); - for (StackTraceElement element : cause.getStackTrace()){ - System.out.println(element.getFileName()+"#"+element.getClassName()+":"+element.getLineNumber()); - } - mListener.onError(new BaseResponse.Error(cause.getMessage())); - if(mOneTime){ - websocket.disconnect(); - } - } -} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/graphenej/api/android/NodeConnection.java b/app/src/main/java/cy/agorise/graphenej/api/android/NodeConnection.java deleted file mode 100644 index 98a0b79..0000000 --- a/app/src/main/java/cy/agorise/graphenej/api/android/NodeConnection.java +++ /dev/null @@ -1,143 +0,0 @@ -package cy.agorise.graphenej.api.android; - -import java.util.ArrayList; -import java.util.List; - -import cy.agorise.graphenej.api.BaseGrapheneHandler; -import cy.agorise.graphenej.api.SubscriptionMessagesHub; -import cy.agorise.graphenej.errors.RepeatedRequestIdException; -import cy.agorise.graphenej.interfaces.NodeErrorListener; -import cy.agorise.graphenej.interfaces.WitnessResponseListener; -import cy.agorise.graphenej.models.BaseResponse; - -/** - * Class used to encapsulate all connections that should be done to a node (with node hop support). - * - * This class is intended to be used as a central broker for all full node API requests. It should - * be used as a singleton under an application. - */ -public class NodeConnection { - /** - * List of URLs of the nodes - */ - private List mUrlList; - /** - * Index of the current node from the list - */ - private int mUrlIndex; - private WebsocketWorkerThread mThread; - private SubscriptionMessagesHub mMessagesHub; - private long requestCounter = SubscriptionMessagesHub.MANUAL_SUBSCRIPTION_ID + 1; - private WitnessResponseListener mErrorListener; - - private static NodeConnection instance; - - private String mUser; - private String mPassword; - private boolean mSubscribe; - - /* - * Get the instance of the NodeConnection which is intended to be used as a Singleton. - */ - public static NodeConnection getInstance(){ - if(instance == null){ - instance = new NodeConnection(); - } - return instance; - } - - public NodeConnection(){ - this.mUrlList = new ArrayList<>(); - } - - /** - * Add a WebSocket URL node that will be added to the list used at node hop scheme. - * - * @param url: URL of the node - */ - public void addNodeUrl(String url){ - System.out.println("addNodeUrl: "+url); - this.mUrlList.add(url); - } - - /** - * Add a list of WebSocket URL nodes that will be added to the current list and - * be used at node hop scheme. - * - * @param urlList: List of URLs of the nodes - */ - public void addNodeUrls(List urlList){ - List newList = new ArrayList(mUrlList); - newList.addAll(urlList); - } - - /** - * Get the list of WebSocket URL nodes. - * - * @return List of URLs of the nodes - */ - public List getNodeUrls(){ - return this.mUrlList; - } - - /** - * Clear list of WebSocket URL nodes. - */ - public void clearNodeList(){ - this.mUrlList.clear(); - } - - private NodeErrorListener mInternalErrorListener = new NodeErrorListener() { - @Override - public void onError(BaseResponse.Error error) { - System.out.println("NodeConnect Error. Msg: "+error); - - connect(mUser, mPassword, mSubscribe, mErrorListener); - } - }; - - /** - - */ - /** - * Method that will try to connect to one of the nodes. If the connection fails - * a subsequent call to this method will try to connect with the next node in the - * list if there is one. - * - * @param user user credential used for restricted requested that needed to be - * logged - * @param password password credential used for restricted requested that needed to be - * logged - * @param subscribe if the node should be subscribed to the node - * @param errorListener a class implementing the WitnessResponseListener interface. This - * should be implemented by the party interested in being notified - * about the failure of the desired broadcast operation. - */ - public void connect(String user, String password, boolean subscribe, WitnessResponseListener errorListener) { - if(this.mUrlList.size() > 0){ - mUser = user; - mPassword = password; - mSubscribe = subscribe; - System.out.println("Connecting to: "+ this.mUrlList.get(mUrlIndex)); - mErrorListener = errorListener; - mThread = new WebsocketWorkerThread(this.mUrlList.get(mUrlIndex), mInternalErrorListener); - mUrlIndex = mUrlIndex + 1 % this.mUrlList.size(); - - mMessagesHub = new SubscriptionMessagesHub(user, password, subscribe, mInternalErrorListener); - mThread.addListener(mMessagesHub); - mThread.start(); - } - } - - /** - * Add the API Handler to the node. - * - * @param handler request handler to be added to the connection - * @throws RepeatedRequestIdException - */ - public void addRequestHandler(BaseGrapheneHandler handler) throws RepeatedRequestIdException { - handler.setRequestId(requestCounter); - requestCounter++; - mMessagesHub.addRequestHandler(handler); - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/api/android/WebsocketWorkerThread.java b/app/src/main/java/cy/agorise/graphenej/api/android/WebsocketWorkerThread.java deleted file mode 100644 index 231b460..0000000 --- a/app/src/main/java/cy/agorise/graphenej/api/android/WebsocketWorkerThread.java +++ /dev/null @@ -1,110 +0,0 @@ -package cy.agorise.graphenej.api.android; - -import com.neovisionaries.ws.client.WebSocket; -import com.neovisionaries.ws.client.WebSocketException; -import com.neovisionaries.ws.client.WebSocketFactory; -import com.neovisionaries.ws.client.WebSocketListener; - -import java.io.IOException; -import java.security.NoSuchAlgorithmException; - -import javax.net.ssl.SSLContext; - -import cy.agorise.graphenej.interfaces.NodeErrorListener; -import cy.agorise.graphenej.models.BaseResponse; -import cy.agorise.graphenej.test.NaiveSSLContext; - -/** - * Class used to encapsulate the thread where the WebSocket does the requests. - * - */ -public class WebsocketWorkerThread extends Thread { - private final String TAG = this.getClass().getName(); - - // When debugging we'll use a NaiveSSLContext - public static final boolean DEBUG = true; - - private final int TIMEOUT = 5000; - private WebSocket mWebSocket; - private NodeErrorListener mErrorListener; - - /** - * Constructor - * - * @param url URL of the WebSocket - */ - public WebsocketWorkerThread(String url){ - try { - WebSocketFactory factory = new WebSocketFactory().setConnectionTimeout(TIMEOUT); - - if(DEBUG){ - SSLContext context = NaiveSSLContext.getInstance("TLS"); - - // Set the custom SSL context. - factory.setSSLContext(context); - } - - mWebSocket = factory.createSocket(url); - } catch (IOException e) { - System.out.println("IOException. Msg: "+e.getMessage()); - } catch(NullPointerException e){ - System.out.println("NullPointerException at WebsocketWorkerThreas. Msg: "+e.getMessage()); - } catch (NoSuchAlgorithmException e) { - System.out.println("NoSuchAlgorithmException. Msg: "+e.getMessage()); - } - } - - /** - * Constructor with connection error listener. - * - * @param url URL of the WebSocket - * @param errorListener a class implementing the NodeErrorListener interface. This - * should be implemented by the party interested in being notified - * about the failure of the connection. - */ - public WebsocketWorkerThread(String url, NodeErrorListener errorListener){ - try { - WebSocketFactory factory = new WebSocketFactory().setConnectionTimeout(TIMEOUT); - - if(DEBUG){ - SSLContext context = NaiveSSLContext.getInstance("TLS"); - - // Set the custom SSL context. - factory.setSSLContext(context); - } - - mWebSocket = factory.createSocket(url); - mErrorListener = errorListener; - } catch (IOException e) { - System.out.println("IOException. Msg: "+e.getMessage()); - } catch(NullPointerException e){ - System.out.println("NullPointerException at WebsocketWorkerThreas. Msg: "+e.getMessage()); - } catch (NoSuchAlgorithmException e) { - System.out.println("NoSuchAlgorithmException. Msg: "+e.getMessage()); - } - } - - /** - * Method call when the thread is started. - */ - @Override - public void run() { - try { - mWebSocket.connect(); - } catch (WebSocketException e) { - System.out.println("WebSocketException. Msg: "+e.getMessage()); - mErrorListener.onError(new BaseResponse.Error(e.getMessage())); - } - } - - /** - * Add a WebSocketListener to the thread that will run. This should be implemented by the party - * interested in being notified about the response value of a request. - * - * @param listener listener implemented to be notified when the socket get a response from the - * node - */ - public void addListener(WebSocketListener listener){ - mWebSocket.addListener(listener); - } -} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/graphenej/brainkeydict.txt b/app/src/main/java/cy/agorise/graphenej/brainkeydict.txt deleted file mode 100644 index d8b2fc9..0000000 --- a/app/src/main/java/cy/agorise/graphenej/brainkeydict.txt +++ /dev/null @@ -1 +0,0 @@ -a,aa,aal,aalii,aam,aba,abac,abaca,abacate,abacay,abacist,aback,abactor,abacus,abaff,abaft,abaiser,abalone,abandon,abas,abase,abased,abaser,abash,abashed,abasia,abasic,abask,abate,abater,abatis,abaton,abator,abature,abave,abaxial,abaxile,abaze,abb,abbacy,abbas,abbasi,abbassi,abbess,abbey,abbot,abbotcy,abdal,abdat,abdest,abdomen,abduce,abduct,abeam,abear,abed,abeigh,abele,abelite,abet,abettal,abettor,abey,abeyant,abfarad,abhenry,abhor,abidal,abide,abider,abidi,abiding,abietic,abietin,abigail,abigeat,abigeus,abilao,ability,abilla,abilo,abiosis,abiotic,abir,abiston,abiuret,abject,abjoint,abjudge,abjure,abjurer,abkar,abkari,ablach,ablare,ablate,ablator,ablaut,ablaze,able,ableeze,abler,ablest,ablins,abloom,ablow,ablude,abluent,ablush,ably,abmho,abnet,aboard,abode,abody,abohm,aboil,abolish,abolla,aboma,abomine,aboon,aborad,aboral,abord,abort,aborted,abortin,abortus,abound,about,abouts,above,abox,abrade,abrader,abraid,abrasax,abrase,abrash,abraum,abraxas,abreact,abreast,abret,abrico,abridge,abrim,abrin,abroach,abroad,abrook,abrupt,abscess,abscind,abscise,absciss,abscond,absence,absent,absit,absmho,absohm,absolve,absorb,absorpt,abstain,absume,absurd,absvolt,abthain,abu,abucco,abulia,abulic,abuna,abura,aburban,aburst,aburton,abuse,abusee,abuser,abusion,abusive,abut,abuttal,abutter,abuzz,abvolt,abwab,aby,abysm,abysmal,abyss,abyssal,acaciin,acacin,academe,academy,acajou,acaleph,acana,acanth,acantha,acapnia,acapu,acara,acardia,acari,acarian,acarid,acarine,acaroid,acarol,acate,acatery,acaudal,acca,accede,acceder,accend,accent,accept,accerse,access,accidia,accidie,accinge,accite,acclaim,accloy,accoast,accoil,accolle,accompt,accord,accost,account,accoy,accrete,accrual,accrue,accruer,accurse,accusal,accuse,accused,accuser,ace,acedia,acedy,acephal,acerate,acerb,acerbic,acerdol,acerin,acerose,acerous,acerra,aceship,acetal,acetate,acetic,acetify,acetin,acetize,acetoin,acetol,acetone,acetose,acetous,acetum,acetyl,ach,achage,achar,achate,ache,achene,acher,achete,achieve,achigan,achill,achime,aching,achira,acholia,acholic,achor,achree,achroma,achtel,achy,achylia,achymia,acicula,acid,acider,acidic,acidify,acidite,acidity,acidize,acidly,acidoid,acidyl,acier,aciform,acinar,acinary,acinic,acinose,acinous,acinus,aciurgy,acker,ackey,ackman,acknow,acle,aclinal,aclinic,acloud,aclys,acmatic,acme,acmic,acmite,acne,acnemia,acnodal,acnode,acock,acocotl,acoin,acoine,acold,acology,acolous,acolyte,acoma,acomia,acomous,acone,aconic,aconin,aconine,aconite,acopic,acopon,acor,acorea,acoria,acorn,acorned,acosmic,acouasm,acouchi,acouchy,acoupa,acquest,acquire,acquist,acquit,acracy,acraein,acrasia,acratia,acrawl,acraze,acre,acreage,acreak,acream,acred,acreman,acrid,acridan,acridic,acridly,acridyl,acrinyl,acrisia,acritan,acrite,acritol,acroama,acrobat,acrogen,acron,acronyc,acronym,acronyx,acrook,acrose,across,acrotic,acryl,acrylic,acrylyl,act,acta,actable,actify,actin,actinal,actine,acting,actinic,actinon,action,active,activin,actless,acton,actor,actress,actu,actual,actuary,acture,acuate,acuity,aculea,aculeus,acumen,acushla,acutate,acute,acutely,acutish,acyclic,acyesis,acyetic,acyl,acylate,acyloin,acyloxy,acystia,ad,adactyl,adad,adage,adagial,adagio,adamant,adamas,adamine,adamite,adance,adangle,adapid,adapt,adapter,adaptor,adarme,adat,adati,adatom,adaunt,adaw,adawe,adawlut,adawn,adaxial,aday,adays,adazzle,adcraft,add,adda,addable,addax,added,addedly,addend,addenda,adder,addible,addict,addle,addlins,address,addrest,adduce,adducer,adduct,ade,adead,adeem,adeep,adeling,adelite,adenase,adenia,adenine,adenoid,adenoma,adenose,adenyl,adept,adermia,adermin,adet,adevism,adfix,adhaka,adharma,adhere,adherer,adhibit,adiate,adicity,adieu,adieux,adinole,adion,adipate,adipic,adipoid,adipoma,adipose,adipous,adipsia,adipsic,adipsy,adipyl,adit,adital,aditus,adjag,adject,adjiger,adjoin,adjoint,adjourn,adjudge,adjunct,adjure,adjurer,adjust,adlay,adless,adlet,adman,admi,admiral,admire,admired,admirer,admit,admix,adnate,adnex,adnexal,adnexed,adnoun,ado,adobe,adonin,adonite,adonize,adopt,adopted,adoptee,adopter,adoral,adorant,adore,adorer,adorn,adorner,adossed,adoulie,adown,adoxy,adoze,adpao,adpress,adread,adream,adreamt,adrenal,adrenin,adrift,adrip,adroit,adroop,adrop,adrowse,adrue,adry,adsbud,adsmith,adsorb,adtevac,adular,adulate,adult,adulter,adunc,adusk,adust,advance,advene,adverb,adverse,advert,advice,advisal,advise,advised,advisee,adviser,advisor,advowee,ady,adynamy,adyta,adyton,adytum,adz,adze,adzer,adzooks,ae,aecial,aecium,aedile,aedilic,aefald,aefaldy,aefauld,aegis,aenach,aenean,aeneous,aeolid,aeolina,aeoline,aeon,aeonial,aeonian,aeonist,aer,aerage,aerate,aerator,aerial,aeric,aerical,aerie,aeried,aerify,aero,aerobe,aerobic,aerobus,aerogel,aerogen,aerogun,aeronat,aeronef,aerose,aerosol,aerugo,aery,aes,aevia,aface,afaint,afar,afara,afear,afeard,afeared,afernan,afetal,affa,affable,affably,affair,affaite,affect,affeer,affeir,affiant,affinal,affine,affined,affirm,affix,affixal,affixer,afflict,afflux,afforce,afford,affray,affront,affuse,affy,afghani,afield,afire,aflame,aflare,aflat,aflaunt,aflight,afloat,aflow,aflower,aflush,afoam,afoot,afore,afoul,afraid,afreet,afresh,afret,afront,afrown,aft,aftaba,after,aftergo,aftmost,aftosa,aftward,aga,again,against,agal,agalaxy,agalite,agallop,agalma,agama,agamete,agami,agamian,agamic,agamid,agamoid,agamont,agamous,agamy,agape,agapeti,agar,agaric,agarita,agarwal,agasp,agate,agathin,agatine,agatize,agatoid,agaty,agavose,agaze,agazed,age,aged,agedly,agee,ageless,agelong,agen,agency,agenda,agendum,agent,agentry,ager,ageusia,ageusic,agger,aggrade,aggrate,aggress,aggroup,aggry,aggur,agha,aghanee,aghast,agile,agilely,agility,aging,agio,agist,agistor,agitant,agitate,agla,aglance,aglare,agleaf,agleam,aglet,agley,aglint,aglow,aglucon,agnail,agname,agnamed,agnate,agnatic,agnel,agnize,agnomen,agnosia,agnosis,agnosy,agnus,ago,agog,agoge,agogic,agogics,agoho,agoing,agon,agonal,agone,agonic,agonied,agonist,agonium,agonize,agony,agora,agouara,agouta,agouti,agpaite,agrah,agral,agre,agree,agreed,agreer,agrege,agria,agrin,agrise,agrito,agroan,agrom,agroof,agrope,aground,agrufe,agruif,agsam,agua,ague,aguey,aguish,agunah,agush,agust,agy,agynary,agynous,agyrate,agyria,ah,aha,ahaaina,ahaunch,ahead,aheap,ahem,ahey,ahimsa,ahind,ahint,ahmadi,aho,ahong,ahorse,ahoy,ahsan,ahu,ahuatle,ahull,ahum,ahungry,ahunt,ahura,ahush,ahwal,ahypnia,ai,aid,aidable,aidance,aidant,aide,aider,aidful,aidless,aiel,aiglet,ail,ailanto,aile,aileron,ailette,ailing,aillt,ailment,ailsyte,ailuro,ailweed,aim,aimara,aimer,aimful,aiming,aimless,ainaleh,ainhum,ainoi,ainsell,aint,aion,aionial,air,airable,airampo,airan,aircrew,airdock,airdrop,aire,airer,airfoil,airhead,airily,airing,airish,airless,airlift,airlike,airmail,airman,airmark,airpark,airport,airship,airsick,airt,airward,airway,airy,aisle,aisled,aisling,ait,aitch,aitesis,aition,aiwan,aizle,ajaja,ajangle,ajar,ajari,ajava,ajhar,ajivika,ajog,ajoint,ajowan,ak,aka,akala,akaroa,akasa,akazga,akcheh,ake,akeake,akebi,akee,akeki,akeley,akepiro,akerite,akey,akhoond,akhrot,akhyana,akia,akimbo,akin,akindle,akinete,akmudar,aknee,ako,akoasm,akoasma,akonge,akov,akpek,akra,aku,akule,akund,al,ala,alacha,alack,alada,alaihi,alaite,alala,alalite,alalus,alameda,alamo,alamoth,alan,aland,alangin,alani,alanine,alannah,alantic,alantin,alantol,alanyl,alar,alares,alarm,alarmed,alarum,alary,alas,alate,alated,alatern,alation,alb,alba,alban,albarco,albata,albe,albedo,albee,albeit,albetad,albify,albinal,albinic,albino,albite,albitic,albugo,album,albumen,albumin,alburn,albus,alcaide,alcalde,alcanna,alcazar,alchemy,alchera,alchimy,alchymy,alcine,alclad,alco,alcoate,alcogel,alcohol,alcosol,alcove,alcyon,aldane,aldazin,aldehol,alder,aldern,aldim,aldime,aldine,aldol,aldose,ale,aleak,alec,alecize,alecost,alecup,alee,alef,aleft,alegar,alehoof,alem,alemana,alembic,alemite,alemmal,alen,aleph,alephs,alepole,alepot,alerce,alerse,alert,alertly,alesan,aletap,alette,alevin,alewife,alexia,alexic,alexin,aleyard,alf,alfa,alfaje,alfalfa,alfaqui,alfet,alfiona,alfonso,alforja,alga,algae,algal,algalia,algate,algebra,algedo,algesia,algesic,algesis,algetic,algic,algid,algific,algin,algine,alginic,algist,algoid,algor,algosis,algous,algum,alhenna,alias,alibi,alible,alichel,alidade,alien,aliency,alienee,aliener,alienor,alif,aliform,alight,align,aligner,aliipoe,alike,alima,aliment,alimony,alin,aliofar,alipata,aliped,aliptes,aliptic,aliquot,alish,alisier,alismad,alismal,aliso,alison,alisp,alist,alit,alite,aliunde,alive,aliyah,alizari,aljoba,alk,alkali,alkalic,alkamin,alkane,alkanet,alkene,alkenna,alkenyl,alkide,alkine,alkool,alkoxy,alkoxyl,alky,alkyd,alkyl,alkylic,alkyne,all,allan,allay,allayer,allbone,allege,alleger,allegro,allele,allelic,allene,aller,allergy,alley,alleyed,allgood,allheal,allice,allied,allies,allness,allonym,alloquy,allose,allot,allotee,allover,allow,allower,alloxan,alloy,allseed,alltud,allude,allure,allurer,alluvia,allwork,ally,allyl,allylic,alma,almadia,almadie,almagra,almanac,alme,almemar,almique,almirah,almoign,almon,almond,almondy,almoner,almonry,almost,almous,alms,almsful,almsman,almuce,almud,almude,almug,almuten,aln,alnage,alnager,alnein,alnico,alnoite,alnuin,alo,alochia,alod,alodial,alodian,alodium,alody,aloe,aloed,aloesol,aloetic,aloft,alogia,alogism,alogy,aloid,aloin,aloma,alone,along,alongst,aloof,aloofly,aloose,alop,alopeke,alose,aloud,alow,alowe,alp,alpaca,alpeen,alpha,alphol,alphorn,alphos,alphyl,alpieu,alpine,alpist,alquier,alraun,already,alright,alroot,alruna,also,alsoon,alt,altaite,altar,altared,alter,alterer,altern,alterne,althea,althein,altho,althorn,altilik,altin,alto,altoun,altrose,altun,aludel,alula,alular,alulet,alum,alumic,alumina,alumine,alumish,alumite,alumium,alumna,alumnae,alumnal,alumni,alumnus,alunite,alupag,alure,aluta,alvar,alveary,alveloz,alveola,alveole,alveoli,alveus,alvine,alvite,alvus,alway,always,aly,alypin,alysson,am,ama,amaas,amadou,amaga,amah,amain,amakebe,amala,amalaka,amalgam,amaltas,amamau,amandin,amang,amani,amania,amanori,amanous,amapa,amar,amarin,amarine,amarity,amaroid,amass,amasser,amastia,amasty,amateur,amative,amatol,amatory,amaze,amazed,amazia,amazing,amba,ambage,ambalam,amban,ambar,ambaree,ambary,ambash,ambassy,ambatch,ambay,ambeer,amber,ambery,ambiens,ambient,ambier,ambit,ambital,ambitty,ambitus,amble,ambler,ambling,ambo,ambon,ambos,ambrain,ambrein,ambrite,ambroid,ambrose,ambry,ambsace,ambury,ambush,amchoor,ame,ameed,ameen,amelia,amellus,amelu,amelus,amen,amend,amende,amender,amends,amene,amenia,amenity,ament,amental,amentia,amentum,amerce,amercer,amerism,amesite,ametria,amgarn,amhar,amhran,ami,amiable,amiably,amianth,amic,amical,amice,amiced,amicron,amid,amidase,amidate,amide,amidic,amidid,amidide,amidin,amidine,amido,amidol,amidon,amidoxy,amidst,amil,amimia,amimide,amin,aminate,amine,amini,aminic,aminity,aminize,amino,aminoid,amir,amiray,amiss,amity,amixia,amla,amli,amlikar,amlong,amma,amman,ammelin,ammer,ammeter,ammine,ammo,ammonal,ammonia,ammonic,ammono,ammu,amnesia,amnesic,amnesty,amnia,amniac,amnic,amnion,amniote,amober,amobyr,amoeba,amoebae,amoeban,amoebic,amoebid,amok,amoke,amole,amomal,amomum,among,amongst,amor,amorado,amoraic,amoraim,amoral,amoret,amorism,amorist,amoroso,amorous,amorphy,amort,amotion,amotus,amount,amour,amove,ampalea,amper,ampere,ampery,amphid,amphide,amphora,amphore,ample,amplify,amply,ampoule,ampul,ampulla,amputee,ampyx,amra,amreeta,amrita,amsath,amsel,amt,amtman,amuck,amuguis,amula,amulet,amulla,amunam,amurca,amuse,amused,amusee,amuser,amusia,amusing,amusive,amutter,amuyon,amuyong,amuze,amvis,amy,amyelia,amyelic,amygdal,amyl,amylan,amylase,amylate,amylene,amylic,amylin,amylo,amyloid,amylom,amylon,amylose,amylum,amyous,amyrin,amyrol,amyroot,an,ana,anabata,anabo,anabong,anacara,anacard,anacid,anadem,anadrom,anaemia,anaemic,anagap,anagep,anagoge,anagogy,anagram,anagua,anahau,anal,analav,analgen,analgia,analgic,anally,analogy,analyse,analyst,analyze,anam,anama,anamite,anan,anana,ananas,ananda,ananym,anaphia,anapnea,anapsid,anaqua,anarch,anarchy,anareta,anarya,anatase,anatifa,anatine,anatomy,anatox,anatron,anaudia,anaxial,anaxon,anaxone,anay,anba,anbury,anchor,anchovy,ancient,ancile,ancilla,ancon,anconad,anconal,ancone,ancony,ancora,ancoral,and,anda,andante,andirin,andiron,andric,android,androl,andron,anear,aneath,anele,anemia,anemic,anemone,anemony,anend,anenst,anent,anepia,anergia,anergic,anergy,anerly,aneroid,anes,anesis,aneuria,aneuric,aneurin,anew,angaria,angary,angekok,angel,angelet,angelic,angelin,angelot,anger,angerly,angeyok,angico,angild,angili,angina,anginal,angioid,angioma,angle,angled,angler,angling,angloid,ango,angolar,angor,angrily,angrite,angry,angst,angster,anguid,anguine,anguis,anguish,angula,angular,anguria,anhang,anhima,anhinga,ani,anicut,anidian,aniente,anigh,anight,anights,anil,anilao,anilau,anile,anilic,anilid,anilide,aniline,anility,anilla,anima,animal,animate,anime,animi,animism,animist,animize,animous,animus,anion,anionic,anis,anisal,anisate,anise,aniseed,anisic,anisil,anisoin,anisole,anisoyl,anisum,anisyl,anither,anjan,ankee,anker,ankh,ankle,anklet,anklong,ankus,ankusha,anlace,anlaut,ann,anna,annal,annale,annals,annat,annates,annatto,anneal,annelid,annet,annex,annexa,annexal,annexer,annite,annona,annoy,annoyer,annual,annuary,annuent,annuity,annul,annular,annulet,annulus,anoa,anodal,anode,anodic,anodize,anodos,anodyne,anoesia,anoesis,anoetic,anoil,anoine,anoint,anole,anoli,anolian,anolyte,anomaly,anomite,anomy,anon,anonang,anonol,anonym,anonyma,anopia,anopsia,anorak,anorexy,anormal,anorth,anosmia,anosmic,another,anotia,anotta,anotto,anotus,anounou,anoxia,anoxic,ansa,ansar,ansate,ansu,answer,ant,anta,antacid,antal,antapex,antdom,ante,anteact,anteal,antefix,antenna,antes,antewar,anthela,anthem,anthema,anthemy,anther,anthill,anthine,anthoid,anthood,anthrax,anthrol,anthryl,anti,antiae,antiar,antic,antical,anticly,anticor,anticum,antifat,antigen,antigod,antihum,antiqua,antique,antired,antirun,antisun,antitax,antiwar,antiwit,antler,antlia,antling,antoeci,antonym,antra,antral,antre,antrin,antrum,antship,antu,antwise,anubing,anuloma,anuran,anuria,anuric,anurous,anury,anus,anusim,anvil,anxiety,anxious,any,anybody,anyhow,anyone,anyway,anyways,anywhen,anywhy,anywise,aogiri,aonach,aorist,aorta,aortal,aortic,aortism,aosmic,aoudad,apa,apace,apache,apadana,apagoge,apaid,apalit,apandry,apar,aparejo,apart,apasote,apatan,apathic,apathy,apatite,ape,apeak,apedom,apehood,apeiron,apelet,apelike,apeling,apepsia,apepsy,apeptic,aper,aperch,aperea,apert,apertly,apery,apetaly,apex,apexed,aphagia,aphakia,aphakic,aphasia,aphasic,aphemia,aphemic,aphesis,apheta,aphetic,aphid,aphides,aphidid,aphodal,aphodus,aphonia,aphonic,aphony,aphoria,aphotic,aphrite,aphtha,aphthic,aphylly,aphyric,apian,apiary,apiator,apicad,apical,apices,apicula,apiece,apieces,apii,apiin,apilary,apinch,aping,apinoid,apio,apioid,apiole,apiolin,apionol,apiose,apish,apishly,apism,apitong,apitpat,aplanat,aplasia,aplenty,aplite,aplitic,aplomb,aplome,apnea,apneal,apneic,apocarp,apocha,apocope,apod,apodal,apodan,apodema,apodeme,apodia,apodous,apogamy,apogeal,apogean,apogee,apogeic,apogeny,apohyal,apoise,apojove,apokrea,apolar,apology,aponia,aponic,apoop,apoplex,apopyle,aporia,aporose,aport,aposia,aposoro,apostil,apostle,apothem,apotome,apotype,apout,apozem,apozema,appall,apparel,appay,appeal,appear,appease,append,appet,appete,applaud,apple,applied,applier,applot,apply,appoint,apport,appose,apposer,apprend,apprise,apprize,approof,approve,appulse,apraxia,apraxic,apricot,apriori,apron,apropos,apse,apsidal,apsides,apsis,apt,apteral,apteran,aptly,aptness,aptote,aptotic,apulse,apyonin,apyrene,apyrexy,apyrous,aqua,aquabib,aquage,aquaria,aquatic,aquavit,aqueous,aquifer,aquiver,aquo,aquose,ar,ara,araba,araban,arabana,arabin,arabit,arable,araca,aracari,arachic,arachin,arad,arado,arain,arake,araliad,aralie,aralkyl,aramina,araneid,aranein,aranga,arango,arar,arara,ararao,arariba,araroba,arati,aration,aratory,arba,arbacin,arbalo,arbiter,arbor,arboral,arbored,arboret,arbute,arbutin,arbutus,arc,arca,arcade,arcana,arcanal,arcane,arcanum,arcate,arch,archae,archaic,arche,archeal,arched,archer,archery,arches,archeus,archfoe,archgod,archil,arching,archive,archly,archon,archont,archsee,archsin,archspy,archwag,archway,archy,arcing,arcked,arcking,arctian,arctic,arctiid,arctoid,arcual,arcuale,arcuate,arcula,ardeb,ardella,ardency,ardent,ardish,ardoise,ardor,ardri,ardu,arduous,are,area,areach,aread,areal,arear,areaway,arecain,ared,areek,areel,arefact,areito,arena,arenae,arend,areng,arenoid,arenose,arent,areola,areolar,areole,areolet,arete,argal,argala,argali,argans,argasid,argeers,argel,argenol,argent,arghan,arghel,arghool,argil,argo,argol,argolet,argon,argosy,argot,argotic,argue,arguer,argufy,argute,argyria,argyric,arhar,arhat,aria,aribine,aricine,arid,aridge,aridian,aridity,aridly,ariel,arienzo,arietta,aright,arigue,aril,ariled,arillus,ariose,arioso,ariot,aripple,arisard,arise,arisen,arist,arista,arite,arjun,ark,arkite,arkose,arkosic,arles,arm,armada,armbone,armed,armer,armet,armful,armhole,armhoop,armied,armiger,armil,armilla,arming,armless,armlet,armload,armoire,armor,armored,armorer,armory,armpit,armrack,armrest,arms,armscye,armure,army,arn,arna,arnee,arni,arnica,arnotta,arnotto,arnut,aroar,aroast,arock,aroeira,aroid,aroint,arolium,arolla,aroma,aroon,arose,around,arousal,arouse,arouser,arow,aroxyl,arpen,arpent,arrack,arrah,arraign,arrame,arrange,arrant,arras,arrased,arratel,arrau,array,arrayal,arrayer,arrear,arrect,arrent,arrest,arriage,arriba,arride,arridge,arrie,arriere,arrimby,arris,arrish,arrival,arrive,arriver,arroba,arrope,arrow,arrowed,arrowy,arroyo,arse,arsenal,arsenic,arseno,arsenyl,arses,arsheen,arshin,arshine,arsine,arsinic,arsino,arsis,arsle,arsoite,arson,arsonic,arsono,arsyl,art,artaba,artabe,artal,artar,artel,arterin,artery,artful,artha,arthel,arthral,artiad,article,artisan,artist,artiste,artless,artlet,artlike,artware,arty,aru,arui,aruke,arumin,arupa,arusa,arusha,arustle,arval,arvel,arx,ary,aryl,arylate,arzan,arzun,as,asaddle,asak,asale,asana,asaphia,asaphid,asaprol,asarite,asaron,asarone,asbest,asbolin,ascan,ascare,ascarid,ascaron,ascend,ascent,ascetic,ascham,asci,ascian,ascii,ascites,ascitic,asclent,ascoma,ascon,ascot,ascribe,ascript,ascry,ascula,ascus,asdic,ase,asearch,aseethe,aseity,asem,asemia,asepsis,aseptic,aseptol,asexual,ash,ashake,ashame,ashamed,ashamnu,ashcake,ashen,asherah,ashery,ashes,ashet,ashily,ashine,ashiver,ashkoko,ashlar,ashless,ashling,ashman,ashore,ashpan,ashpit,ashraf,ashrafi,ashur,ashweed,ashwort,ashy,asialia,aside,asideu,asiento,asilid,asimen,asimmer,asinego,asinine,asitia,ask,askable,askance,askant,askar,askari,asker,askew,askip,asklent,askos,aslant,aslaver,asleep,aslop,aslope,asmack,asmalte,asmear,asmile,asmoke,asnort,asoak,asocial,asok,asoka,asonant,asonia,asop,asor,asouth,asp,aspace,aspect,aspen,asper,asperge,asperse,asphalt,asphyxy,aspic,aspire,aspirer,aspirin,aspish,asport,aspout,asprawl,aspread,aspring,asprout,asquare,asquat,asqueal,asquint,asquirm,ass,assacu,assagai,assai,assail,assapan,assart,assary,assate,assault,assaut,assay,assayer,assbaa,asse,assegai,asself,assent,assert,assess,asset,assets,assever,asshead,assi,assify,assign,assilag,assis,assise,assish,assist,assize,assizer,assizes,asslike,assman,assoil,assort,assuade,assuage,assume,assumed,assumer,assure,assured,assurer,assurge,ast,asta,astalk,astare,astart,astasia,astatic,astay,asteam,asteep,asteer,asteism,astelic,astely,aster,asteria,asterin,astern,astheny,asthma,asthore,astilbe,astint,astir,astite,astomia,astony,astoop,astor,astound,astrain,astral,astrand,astray,astream,astrer,astrict,astride,astrier,astrild,astroid,astrut,astute,astylar,asudden,asunder,aswail,aswarm,asway,asweat,aswell,aswim,aswing,aswirl,aswoon,asyla,asylum,at,atabal,atabeg,atabek,atactic,atafter,ataman,atangle,atap,ataraxy,ataunt,atavi,atavic,atavism,atavist,atavus,ataxia,ataxic,ataxite,ataxy,atazir,atbash,ate,atebrin,atechny,ateeter,atef,atelets,atelier,atelo,ates,ateuchi,athanor,athar,atheism,atheist,atheize,athelia,athenee,athenor,atheous,athing,athirst,athlete,athodyd,athort,athrill,athrive,athrob,athrong,athwart,athymia,athymic,athymy,athyria,athyrid,atilt,atimon,atinga,atingle,atinkle,atip,atis,atlas,atlatl,atle,atlee,atloid,atma,atman,atmid,atmo,atmos,atocha,atocia,atokal,atoke,atokous,atoll,atom,atomerg,atomic,atomics,atomism,atomist,atomity,atomize,atomy,atonal,atone,atoner,atonia,atonic,atony,atop,atophan,atopic,atopite,atopy,atour,atoxic,atoxyl,atrail,atrepsy,atresia,atresic,atresy,atretic,atria,atrial,atrip,atrium,atrocha,atropal,atrophy,atropia,atropic,atrous,atry,atta,attacco,attach,attache,attack,attacus,attagen,attain,attaint,attaleh,attar,attask,attempt,attend,attent,atter,attern,attery,attest,attic,attid,attinge,attire,attired,attirer,attorn,attract,attrap,attrist,attrite,attune,atule,atumble,atune,atwain,atweel,atween,atwin,atwirl,atwist,atwitch,atwixt,atwo,atypic,atypy,auantic,aube,aubrite,auburn,auca,auchlet,auction,aucuba,audible,audibly,audient,audile,audio,audion,audit,auditor,auge,augen,augend,auger,augerer,augh,aught,augite,augitic,augment,augur,augural,augury,august,auh,auhuhu,auk,auklet,aula,aulae,auld,auletai,aulete,auletes,auletic,aulic,auloi,aulos,aulu,aum,aumaga,aumail,aumbry,aumery,aumil,aumous,aumrie,auncel,aune,aunt,auntie,auntish,auntly,aupaka,aura,aurae,aural,aurally,aurar,aurate,aurated,aureate,aureity,aurelia,aureola,aureole,aureous,auresca,aureus,auric,auricle,auride,aurific,aurify,aurigal,aurin,aurir,aurist,aurite,aurochs,auronal,aurora,aurorae,auroral,aurore,aurous,aurum,aurure,auryl,auscult,auslaut,auspex,auspice,auspicy,austere,austral,ausu,ausubo,autarch,autarky,aute,autecy,autem,author,autism,autist,auto,autobus,autocab,autocar,autoecy,autoist,automa,automat,autonym,autopsy,autumn,auxesis,auxetic,auxin,auxinic,auxotox,ava,avadana,avahi,avail,aval,avalent,avania,avarice,avast,avaunt,ave,avellan,aveloz,avenage,avener,avenge,avenger,avenin,avenous,avens,avenue,aver,avera,average,averah,averil,averin,averral,averse,avert,averted,averter,avian,aviary,aviate,aviatic,aviator,avichi,avicide,avick,avid,avidity,avidly,avidous,avidya,avigate,avijja,avine,aviso,avital,avitic,avives,avo,avocado,avocate,avocet,avodire,avoid,avoider,avolate,avouch,avow,avowal,avowant,avowed,avower,avowry,avoyer,avulse,aw,awa,awabi,awaft,awag,await,awaiter,awake,awaken,awald,awalim,awalt,awane,awapuhi,award,awarder,aware,awash,awaste,awat,awatch,awater,awave,away,awber,awd,awe,aweary,aweband,awee,aweek,aweel,aweigh,awesome,awest,aweto,awfu,awful,awfully,awheel,awheft,awhet,awhile,awhir,awhirl,awide,awiggle,awin,awing,awink,awiwi,awkward,awl,awless,awlwort,awmous,awn,awned,awner,awning,awnless,awnlike,awny,awoke,awork,awreck,awrist,awrong,awry,ax,axal,axe,axed,axenic,axes,axfetch,axhead,axial,axially,axiate,axiform,axil,axile,axilla,axillae,axillar,axine,axinite,axiom,axion,axis,axised,axite,axle,axled,axmaker,axman,axogamy,axoid,axolotl,axon,axonal,axonost,axseed,axstone,axtree,axunge,axweed,axwise,axwort,ay,ayah,aye,ayelp,ayin,ayless,aylet,ayllu,ayond,ayont,ayous,ayu,azafrin,azalea,azarole,azelaic,azelate,azide,azilut,azimene,azimide,azimine,azimino,azimuth,azine,aziola,azo,azoch,azofier,azofy,azoic,azole,azon,azonal,azonic,azonium,azophen,azorite,azotate,azote,azoted,azoth,azotic,azotine,azotite,azotize,azotous,azox,azoxime,azoxine,azoxy,azteca,azulene,azulite,azulmic,azumbre,azure,azurean,azured,azurine,azurite,azurous,azury,azygos,azygous,azyme,azymite,azymous,b,ba,baa,baal,baar,baba,babai,babasco,babassu,babbitt,babble,babbler,babbly,babby,babe,babelet,babery,babiche,babied,babish,bablah,babloh,baboen,baboo,baboon,baboot,babroot,babu,babudom,babuina,babuism,babul,baby,babydom,babyish,babyism,bac,bacaba,bacach,bacalao,bacao,bacca,baccae,baccara,baccate,bacchar,bacchic,bacchii,bach,bache,bachel,bacilli,back,backage,backcap,backed,backen,backer,backet,backie,backing,backjaw,backlet,backlog,backrun,backsaw,backset,backup,backway,baclin,bacon,baconer,bacony,bacula,bacule,baculi,baculum,baculus,bacury,bad,badan,baddish,baddock,bade,badge,badger,badiaga,badian,badious,badland,badly,badness,bae,baetuli,baetyl,bafaro,baff,baffeta,baffle,baffler,baffy,baft,bafta,bag,baga,bagani,bagasse,bagel,bagful,baggage,baggala,bagged,bagger,baggie,baggily,bagging,baggit,baggy,baglike,bagman,bagnio,bagnut,bago,bagonet,bagpipe,bagre,bagreef,bagroom,bagwig,bagworm,bagwyn,bah,bahan,bahar,bahay,bahera,bahisti,bahnung,baho,bahoe,bahoo,baht,bahur,bahut,baignet,baikie,bail,bailage,bailee,bailer,bailey,bailie,bailiff,bailor,bain,bainie,baioc,baiocco,bairagi,bairn,bairnie,bairnly,baister,bait,baiter,baith,baittle,baize,bajada,bajan,bajra,bajree,bajri,bajury,baka,bakal,bake,baked,baken,bakepan,baker,bakerly,bakery,bakie,baking,bakli,baktun,baku,bakula,bal,balafo,balagan,balai,balance,balanic,balanid,balao,balas,balata,balboa,balcony,bald,balden,balder,baldish,baldly,baldrib,baldric,baldy,bale,baleen,baleful,balei,baleise,baler,balete,bali,baline,balita,balk,balker,balky,ball,ballad,ballade,ballam,ballan,ballant,ballast,ballata,ballate,balldom,balled,baller,ballet,balli,ballist,ballium,balloon,ballot,ballow,ballup,bally,balm,balmily,balmony,balmy,balneal,balonea,baloney,baloo,balow,balsa,balsam,balsamo,balsamy,baltei,balter,balteus,balu,balut,balza,bam,bamban,bambini,bambino,bamboo,bamoth,ban,banaba,banago,banak,banal,banally,banana,banat,banc,banca,bancal,banchi,banco,bancus,band,banda,bandage,bandaka,bandala,bandar,bandbox,bande,bandeau,banded,bander,bandhu,bandi,bandie,banding,bandit,bandle,bandlet,bandman,bando,bandog,bandore,bandrol,bandy,bane,baneful,bang,banga,bange,banger,banghy,banging,bangkok,bangle,bangled,bani,banian,banig,banilad,banish,baniwa,baniya,banjo,banjore,banjuke,bank,banked,banker,bankera,banket,banking,bankman,banky,banner,bannet,banning,bannock,banns,bannut,banquet,banshee,bant,bantam,bantay,banteng,banter,bantery,banty,banuyo,banya,banyan,banzai,baobab,bap,baptism,baptize,bar,bara,barad,barauna,barb,barbal,barbary,barbas,barbate,barbe,barbed,barbel,barber,barbet,barbion,barblet,barbone,barbudo,barbule,bard,bardane,bardash,bardel,bardess,bardic,bardie,bardily,barding,bardish,bardism,bardlet,bardo,bardy,bare,bareca,barefit,barely,barer,baresma,baretta,barff,barfish,barfly,barful,bargain,barge,bargee,bargeer,barger,bargh,bargham,bari,baria,baric,barid,barie,barile,barilla,baring,baris,barish,barit,barite,barium,bark,barken,barker,barkery,barkey,barkhan,barking,barkle,barky,barless,barley,barling,barlock,barlow,barm,barmaid,barman,barmkin,barmote,barmy,barn,barnard,barney,barnful,barnman,barny,baroi,barolo,baron,baronet,barong,baronry,barony,baroque,baroto,barpost,barra,barrack,barrad,barrage,barras,barred,barrel,barren,barrer,barret,barrico,barrier,barring,barrio,barroom,barrow,barruly,barry,barse,barsom,barter,barth,barton,baru,baruria,barvel,barwal,barway,barways,barwise,barwood,barye,baryta,barytes,barytic,baryton,bas,basal,basale,basalia,basally,basalt,basaree,bascule,base,based,basely,baseman,basenji,bases,bash,bashaw,bashful,bashlyk,basial,basiate,basic,basidia,basify,basil,basilar,basilic,basin,basined,basinet,basion,basis,bask,basker,basket,basoid,bason,basos,basote,basque,basqued,bass,bassan,bassara,basset,bassie,bassine,bassist,basso,bassoon,bassus,bast,basta,bastard,baste,basten,baster,bastide,basting,bastion,bastite,basto,baston,bat,bataan,batad,batakan,batara,batata,batch,batcher,bate,batea,bateau,bateaux,bated,batel,bateman,bater,batfish,batfowl,bath,bathe,bather,bathic,bathing,bathman,bathmic,bathos,bathtub,bathyal,batik,batiker,bating,batino,batiste,batlan,batlike,batling,batlon,batman,batoid,baton,batonne,bats,batsman,batster,batt,batta,battel,batten,batter,battery,battik,batting,battish,battle,battled,battler,battue,batty,batule,batwing,batz,batzen,bauble,bauch,bauchle,bauckie,baud,baul,bauleah,baun,bauno,bauson,bausond,bauta,bauxite,bavaroy,bavary,bavian,baviere,bavin,bavoso,baw,bawbee,bawcock,bawd,bawdily,bawdry,bawl,bawler,bawley,bawn,bawtie,baxter,baxtone,bay,baya,bayal,bayamo,bayard,baybolt,baybush,baycuru,bayed,bayeta,baygall,bayhead,bayish,baylet,baylike,bayman,bayness,bayok,bayonet,bayou,baywood,bazaar,baze,bazoo,bazooka,bazzite,bdellid,be,beach,beached,beachy,beacon,bead,beaded,beader,beadily,beading,beadle,beadlet,beadman,beadrow,beady,beagle,beak,beaked,beaker,beakful,beaky,beal,beala,bealing,beam,beamage,beamed,beamer,beamful,beamily,beaming,beamish,beamlet,beamman,beamy,bean,beanbag,beancod,beanery,beanie,beano,beant,beany,bear,beard,bearded,bearder,beardie,beardom,beardy,bearer,bearess,bearing,bearish,bearlet,bearm,beast,beastie,beastly,beat,beata,beatae,beatee,beaten,beater,beath,beatify,beating,beatus,beau,beaufin,beauish,beauism,beauti,beauty,beaux,beaver,beavery,beback,bebait,bebang,bebar,bebaron,bebaste,bebat,bebathe,bebay,bebeast,bebed,bebeeru,bebilya,bebite,beblain,beblear,bebled,bebless,beblood,bebloom,bebog,bebop,beboss,bebotch,bebrave,bebrine,bebrush,bebump,bebusy,becall,becalm,becap,becard,becarve,becater,because,becense,bechalk,becharm,bechase,becheck,becher,bechern,bechirp,becivet,beck,becker,becket,beckon,beclad,beclang,beclart,beclasp,beclaw,becloak,beclog,becloud,beclout,beclown,becolme,becolor,become,becomes,becomma,becoom,becost,becovet,becram,becramp,becrawl,becreep,becrime,becroak,becross,becrowd,becrown,becrush,becrust,becry,becuiba,becuna,becurl,becurry,becurse,becut,bed,bedad,bedamn,bedamp,bedare,bedark,bedash,bedaub,bedawn,beday,bedaze,bedbug,bedcap,bedcase,bedcord,bedded,bedder,bedding,bedead,bedeaf,bedebt,bedeck,bedel,beden,bedene,bedevil,bedew,bedewer,bedfast,bedfoot,bedgery,bedgoer,bedgown,bedight,bedikah,bedim,bedin,bedip,bedirt,bedirty,bedizen,bedkey,bedlam,bedlar,bedless,bedlids,bedman,bedmate,bedog,bedolt,bedot,bedote,bedouse,bedown,bedoyo,bedpan,bedpost,bedrail,bedral,bedrape,bedress,bedrid,bedrift,bedrip,bedrock,bedroll,bedroom,bedrop,bedrown,bedrug,bedsick,bedside,bedsite,bedsock,bedsore,bedtick,bedtime,bedub,beduck,beduke,bedull,bedumb,bedunce,bedunch,bedung,bedur,bedusk,bedust,bedwarf,bedway,bedways,bedwell,bedye,bee,beearn,beech,beechen,beechy,beedged,beedom,beef,beefer,beefily,beefin,beefish,beefy,beehead,beeherd,beehive,beeish,beek,beekite,beelbow,beelike,beeline,beelol,beeman,been,beennut,beer,beerage,beerily,beerish,beery,bees,beest,beeswax,beet,beeth,beetle,beetled,beetler,beety,beeve,beevish,beeware,beeway,beeweed,beewise,beewort,befall,befame,befan,befancy,befavor,befilch,befile,befilth,befire,befist,befit,beflag,beflap,beflea,befleck,beflour,beflout,beflum,befoam,befog,befool,befop,before,befoul,befret,befrill,befriz,befume,beg,begad,begall,begani,begar,begari,begash,begat,begaud,begaudy,begay,begaze,begeck,begem,beget,beggar,beggary,begging,begift,begild,begin,begird,beglad,beglare,beglic,beglide,begloom,begloze,begluc,beglue,begnaw,bego,begob,begobs,begohm,begone,begonia,begorra,begorry,begoud,begowk,begrace,begrain,begrave,begray,begreen,begrett,begrim,begrime,begroan,begrown,beguard,beguess,beguile,beguine,begulf,begum,begun,begunk,begut,behale,behalf,behap,behave,behead,behear,behears,behedge,beheld,behelp,behen,behenic,behest,behind,behint,behn,behold,behoney,behoof,behoot,behoove,behorn,behowl,behung,behymn,beice,beige,being,beinked,beira,beisa,bejade,bejan,bejant,bejazz,bejel,bejewel,bejig,bekah,bekick,beking,bekiss,bekko,beknave,beknit,beknow,beknown,bel,bela,belabor,belaced,beladle,belady,belage,belah,belam,belanda,belar,belard,belash,belate,belated,belaud,belay,belayer,belch,belcher,beld,beldam,beleaf,beleap,beleave,belee,belfry,belga,belibel,belick,belie,belief,belier,believe,belight,beliked,belion,belite,belive,bell,bellboy,belle,belled,bellhop,bellied,belling,bellite,bellman,bellote,bellow,bellows,belly,bellyer,beloam,beloid,belong,belonid,belord,belout,belove,beloved,below,belsire,belt,belted,belter,beltie,beltine,belting,beltman,belton,beluga,belute,belve,bely,belying,bema,bemad,bemadam,bemail,bemaim,beman,bemar,bemask,bemat,bemata,bemaul,bemazed,bemeal,bemean,bemercy,bemire,bemist,bemix,bemoan,bemoat,bemock,bemoil,bemole,bemolt,bemoon,bemotto,bemoult,bemouth,bemuck,bemud,bemuddy,bemuse,bemused,bemusk,ben,bena,benab,bename,benami,benasty,benben,bench,bencher,benchy,bencite,bend,benda,bended,bender,bending,bendlet,bendy,bene,beneath,benefic,benefit,benempt,benet,beng,beni,benight,benign,benison,benj,benjy,benmost,benn,benne,bennel,bennet,benny,beno,benorth,benote,bensel,bensh,benshea,benshee,benshi,bent,bentang,benthal,benthic,benthon,benthos,benting,benty,benumb,benward,benweed,benzal,benzein,benzene,benzil,benzine,benzo,benzoic,benzoid,benzoin,benzol,benzole,benzoxy,benzoyl,benzyl,beode,bepaid,bepale,bepaper,beparch,beparse,bepart,bepaste,bepat,bepaw,bepearl,bepelt,bepen,bepewed,bepiece,bepile,bepill,bepinch,bepity,beprank,bepray,bepress,bepride,beprose,bepuff,bepun,bequalm,bequest,bequote,ber,berain,berakah,berake,berapt,berat,berate,beray,bere,bereave,bereft,berend,beret,berg,berger,berglet,bergut,bergy,bergylt,berhyme,beride,berinse,berith,berley,berlin,berline,berm,berne,berobed,beroll,beround,berret,berri,berried,berrier,berry,berseem,berserk,berth,berthed,berther,bertram,bertrum,berust,bervie,berycid,beryl,bes,besa,besagne,besaiel,besaint,besan,besauce,bescab,bescarf,bescent,bescorn,bescour,bescurf,beseam,besee,beseech,beseem,beseen,beset,beshade,beshag,beshake,beshame,beshear,beshell,beshine,beshlik,beshod,beshout,beshow,beshrew,beside,besides,besiege,besigh,besin,besing,besiren,besit,beslab,beslap,beslash,beslave,beslime,beslow,beslur,besmear,besmell,besmile,besmoke,besmut,besnare,besneer,besnow,besnuff,besogne,besoil,besom,besomer,besoot,besot,besoul,besour,bespate,bespawl,bespeak,besped,bespeed,bespell,bespend,bespete,bespew,bespice,bespill,bespin,bespit,besplit,bespoke,bespot,bespout,bespray,bespy,besquib,besra,best,bestab,bestain,bestamp,bestar,bestare,bestay,bestead,besteer,bester,bestial,bestick,bestill,bestink,bestir,bestock,bestore,bestorm,bestove,bestow,bestraw,bestrew,bestuck,bestud,besugar,besuit,besully,beswarm,beswim,bet,beta,betag,betail,betaine,betalk,betask,betaxed,betear,beteela,beteem,betel,beth,bethel,bethink,bethumb,bethump,betide,betimes,betinge,betire,betis,betitle,betoil,betoken,betone,betony,betoss,betowel,betrace,betrail,betrap,betray,betread,betrend,betrim,betroth,betrunk,betso,betted,better,betters,betting,bettong,bettor,betty,betulin,betutor,between,betwine,betwit,betwixt,beveil,bevel,beveled,beveler,bevenom,bever,beverse,beveto,bevined,bevomit,bevue,bevy,bewail,bewall,beware,bewash,bewaste,bewater,beweary,beweep,bewept,bewest,bewet,bewhig,bewhite,bewidow,bewig,bewired,bewitch,bewith,bework,beworm,beworn,beworry,bewrap,bewray,bewreck,bewrite,bey,beydom,beylic,beyond,beyship,bezant,bezanty,bezel,bezetta,bezique,bezoar,bezzi,bezzle,bezzo,bhabar,bhakta,bhakti,bhalu,bhandar,bhang,bhangi,bhara,bharal,bhat,bhava,bheesty,bhikku,bhikshu,bhoosa,bhoy,bhungi,bhut,biabo,biacid,biacuru,bialate,biallyl,bianco,biarchy,bias,biaxal,biaxial,bib,bibasic,bibb,bibber,bibble,bibbler,bibbons,bibcock,bibi,bibiri,bibless,biblus,bice,biceps,bicetyl,bichir,bichord,bichy,bick,bicker,bickern,bicolor,bicone,biconic,bicorn,bicorne,bicron,bicycle,bicyclo,bid,bidar,bidarka,bidcock,bidder,bidding,biddy,bide,bident,bider,bidet,biding,bidri,biduous,bield,bieldy,bien,bienly,biennia,bier,bietle,bifara,bifer,biff,biffin,bifid,bifidly,bifilar,biflex,bifocal,bifoil,bifold,bifolia,biform,bifront,big,biga,bigamic,bigamy,bigener,bigeye,bigg,biggah,biggen,bigger,biggest,biggin,biggish,bigha,bighead,bighorn,bight,biglot,bigness,bignou,bigot,bigoted,bigotry,bigotty,bigroot,bigwig,bija,bijasal,bijou,bijoux,bike,bikh,bikini,bilabe,bilalo,bilbie,bilbo,bilby,bilch,bilcock,bildar,bilders,bile,bilge,bilgy,biliary,biliate,bilic,bilify,bilimbi,bilio,bilious,bilith,bilk,bilker,bill,billa,billbug,billed,biller,billet,billety,billian,billing,billion,billman,billon,billot,billow,billowy,billy,billyer,bilo,bilobe,bilobed,bilsh,bilsted,biltong,bimalar,bimanal,bimane,bimasty,bimbil,bimeby,bimodal,bin,binal,binary,binate,bind,binder,bindery,binding,bindle,bindlet,bindweb,bine,bing,binge,bingey,binghi,bingle,bingo,bingy,binh,bink,binman,binna,binning,binnite,bino,binocle,binodal,binode,binotic,binous,bint,binukau,biod,biodyne,biogen,biogeny,bioherm,biolith,biology,biome,bion,bionomy,biopsic,biopsy,bioral,biorgan,bios,biose,biosis,biota,biotaxy,biotic,biotics,biotin,biotite,biotome,biotomy,biotope,biotype,bioxide,bipack,biparty,biped,bipedal,biphase,biplane,bipod,bipolar,biprism,biprong,birch,birchen,bird,birddom,birdeen,birder,birdie,birding,birdlet,birdman,birdy,bireme,biretta,biri,biriba,birk,birken,birkie,birl,birle,birler,birlie,birlinn,birma,birn,birny,birr,birse,birsle,birsy,birth,birthy,bis,bisabol,bisalt,biscuit,bisect,bisexed,bisext,bishop,bismar,bismite,bismuth,bisnaga,bison,bispore,bisque,bissext,bisson,bistate,bister,bisti,bistort,bistro,bit,bitable,bitch,bite,biter,biti,biting,bitless,bito,bitolyl,bitt,bitted,bitten,bitter,bittern,bitters,bittie,bittock,bitty,bitume,bitumed,bitumen,bitwise,bityite,bitypic,biune,biunial,biunity,biurate,biurea,biuret,bivalve,bivinyl,bivious,bivocal,bivouac,biwa,bixin,biz,bizarre,bizet,bizonal,bizone,bizz,blab,blabber,black,blacken,blacker,blackey,blackie,blackit,blackly,blacky,blad,bladder,blade,bladed,blader,blading,bladish,blady,blae,blaff,blaflum,blah,blain,blair,blake,blame,blamed,blamer,blaming,blan,blanc,blanca,blanch,blanco,bland,blanda,blandly,blank,blanked,blanket,blankly,blanky,blanque,blare,blarney,blarnid,blarny,blart,blas,blase,blash,blashy,blast,blasted,blaster,blastid,blastie,blasty,blat,blatant,blate,blately,blather,blatta,blatter,blatti,blattid,blaubok,blaver,blaw,blawort,blay,blaze,blazer,blazing,blazon,blazy,bleach,bleak,bleakly,bleaky,blear,bleared,bleary,bleat,bleater,bleaty,bleb,blebby,bleck,blee,bleed,bleeder,bleery,bleeze,bleezy,blellum,blemish,blench,blend,blende,blended,blender,blendor,blenny,blent,bleo,blesbok,bless,blessed,blesser,blest,blet,blewits,blibe,blick,blickey,blight,blighty,blimp,blimy,blind,blinded,blinder,blindly,blink,blinked,blinker,blinks,blinky,blinter,blintze,blip,bliss,blissom,blister,blite,blithe,blithen,blither,blitter,blitz,blizz,blo,bloat,bloated,bloater,blob,blobbed,blobber,blobby,bloc,block,blocked,blocker,blocky,blodite,bloke,blolly,blonde,blood,blooded,bloody,blooey,bloom,bloomer,bloomy,bloop,blooper,blore,blosmy,blossom,blot,blotch,blotchy,blotter,blotto,blotty,blouse,bloused,blout,blow,blowen,blower,blowfly,blowgun,blowing,blown,blowoff,blowout,blowth,blowup,blowy,blowze,blowzed,blowzy,blub,blubber,blucher,blue,bluecap,bluecup,blueing,blueleg,bluely,bluer,blues,bluet,bluetop,bluey,bluff,bluffer,bluffly,bluffy,bluggy,bluing,bluish,bluism,blunder,blunge,blunger,blunk,blunker,blunks,blunnen,blunt,blunter,bluntie,bluntly,blup,blur,blurb,blurred,blurrer,blurry,blurt,blush,blusher,blushy,bluster,blype,bo,boa,boagane,boar,board,boarder,boardly,boardy,boarish,boast,boaster,boat,boatage,boater,boatful,boatie,boating,boatlip,boatly,boatman,bob,boba,bobac,bobbed,bobber,bobbery,bobbin,bobbing,bobbish,bobble,bobby,bobcat,bobcoat,bobeche,bobfly,bobo,bobotie,bobsled,bobstay,bobtail,bobwood,bocal,bocardo,bocca,boccale,boccaro,bocce,boce,bocher,bock,bocking,bocoy,bod,bodach,bode,bodeful,bodega,boden,boder,bodge,bodger,bodgery,bodhi,bodice,bodiced,bodied,bodier,bodikin,bodily,boding,bodkin,bodle,bodock,body,bog,boga,bogan,bogard,bogart,bogey,boggart,boggin,boggish,boggle,boggler,boggy,boghole,bogie,bogier,bogland,bogle,boglet,bogman,bogmire,bogo,bogong,bogtrot,bogue,bogum,bogus,bogway,bogwood,bogwort,bogy,bogydom,bogyism,bohawn,bohea,boho,bohor,bohunk,boid,boil,boiled,boiler,boilery,boiling,boily,boist,bojite,bojo,bokadam,bokard,bokark,boke,bokom,bola,bolar,bold,bolden,boldine,boldly,boldo,bole,boled,boleite,bolero,bolete,bolide,bolimba,bolis,bolivar,bolivia,bolk,boll,bollard,bolled,boller,bolling,bollock,bolly,bolo,boloman,boloney,bolson,bolster,bolt,boltage,boltant,boltel,bolter,bolti,bolting,bolus,bom,boma,bomb,bombard,bombast,bombed,bomber,bombo,bombola,bombous,bon,bonaci,bonagh,bonaght,bonair,bonally,bonang,bonanza,bonasus,bonbon,bonce,bond,bondage,bondar,bonded,bonder,bonding,bondman,bonduc,bone,boned,bonedog,bonelet,boner,boneset,bonfire,bong,bongo,boniata,bonify,bonito,bonk,bonnaz,bonnet,bonnily,bonny,bonsai,bonus,bonxie,bony,bonze,bonzer,bonzery,bonzian,boo,boob,boobery,boobily,boobook,booby,bood,boodie,boodle,boodler,boody,boof,booger,boohoo,boojum,book,bookdom,booked,booker,bookery,bookful,bookie,booking,bookish,bookism,booklet,bookman,booky,bool,booly,boolya,boom,boomage,boomah,boomdas,boomer,booming,boomlet,boomy,boon,boonk,boopis,boor,boorish,boort,boose,boost,booster,boosy,boot,bootboy,booted,bootee,booter,bootery,bootful,booth,boother,bootied,booting,bootleg,boots,booty,booze,boozed,boozer,boozily,boozy,bop,bopeep,boppist,bopyrid,bor,bora,borable,boracic,borage,borak,boral,borasca,borate,borax,bord,bordage,bordar,bordel,border,bordure,bore,boread,boreal,borean,boredom,boree,boreen,boregat,boreism,borele,borer,borg,borgh,borh,boric,boride,borine,boring,borish,borism,bority,borize,borlase,born,borne,borneol,borning,bornite,bornyl,boro,boron,boronic,borough,borrel,borrow,borsch,borscht,borsht,bort,bortsch,borty,bortz,borwort,boryl,borzoi,boscage,bosch,bose,boser,bosh,bosher,bosk,bosker,bosket,bosky,bosn,bosom,bosomed,bosomer,bosomy,boss,bossage,bossdom,bossed,bosser,bosset,bossing,bossism,bosslet,bossy,boston,bostryx,bosun,bot,bota,botanic,botany,botargo,botch,botched,botcher,botchka,botchy,bote,botella,boterol,botfly,both,bother,bothros,bothway,bothy,botonee,botong,bott,bottine,bottle,bottled,bottler,bottom,botulin,bouchal,bouche,boucher,boud,boudoir,bougar,bouge,bouget,bough,boughed,bought,boughy,bougie,bouk,boukit,boulder,boule,boultel,boulter,boun,bounce,bouncer,bound,bounded,bounden,bounder,boundly,bounty,bouquet,bourbon,bourd,bourder,bourdon,bourg,bourn,bourock,bourse,bouse,bouser,bousy,bout,boutade,bouto,bouw,bovate,bovid,bovine,bovoid,bow,bowable,bowback,bowbent,bowboy,bowed,bowel,boweled,bowels,bower,bowery,bowet,bowfin,bowhead,bowie,bowing,bowk,bowkail,bowker,bowknot,bowl,bowla,bowleg,bowler,bowless,bowlful,bowlike,bowline,bowling,bowls,bowly,bowman,bowpin,bowshot,bowwood,bowwort,bowwow,bowyer,boxbush,boxcar,boxen,boxer,boxfish,boxful,boxhaul,boxhead,boxing,boxlike,boxman,boxty,boxwood,boxwork,boxy,boy,boyang,boyar,boyard,boycott,boydom,boyer,boyhood,boyish,boyism,boyla,boylike,boyship,boza,bozal,bozo,bozze,bra,brab,brabant,brabble,braca,braccia,braccio,brace,braced,bracer,bracero,braces,brach,brachet,bracing,brack,bracken,bracker,bracket,bracky,bract,bractea,bracted,brad,bradawl,bradsot,brae,braeman,brag,braggat,bragger,bragget,bragite,braid,braided,braider,brail,brain,brainer,brainge,brains,brainy,braird,brairo,braise,brake,braker,brakie,braky,bramble,brambly,bran,branch,branchi,branchy,brand,branded,brander,brandy,brangle,branial,brank,brankie,branle,branner,branny,bransle,brant,brash,brashy,brasque,brass,brasse,brasser,brasset,brassic,brassie,brassy,brat,brattie,brattle,brauna,bravade,bravado,brave,bravely,braver,bravery,braving,bravish,bravo,bravura,braw,brawl,brawler,brawly,brawlys,brawn,brawned,brawner,brawny,braws,braxy,bray,brayer,brayera,braza,braze,brazen,brazer,brazera,brazier,brazil,breach,breachy,bread,breaden,breadth,breaghe,break,breakax,breaker,breakup,bream,breards,breast,breath,breathe,breathy,breba,breccia,brecham,breck,brecken,bred,brede,bredi,bree,breech,breed,breeder,breedy,breek,breeze,breezy,bregma,brehon,brei,brekkle,brelaw,breme,bremely,brent,brephic,bret,breth,brett,breva,breve,brevet,brevier,brevit,brevity,brew,brewage,brewer,brewery,brewing,brewis,brewst,brey,briar,bribe,bribee,briber,bribery,brichen,brick,brickel,bricken,brickle,brickly,bricky,bricole,bridal,bridale,bride,bridely,bridge,bridged,bridger,bridle,bridled,bridler,bridoon,brief,briefly,briefs,brier,briered,briery,brieve,brig,brigade,brigand,bright,brill,brills,brim,brimful,briming,brimmed,brimmer,brin,brine,briner,bring,bringal,bringer,brinish,brinjal,brink,briny,brioche,brique,brisk,brisken,brisket,briskly,brisque,briss,bristle,bristly,brisure,brit,brith,brither,britska,britten,brittle,brizz,broach,broad,broadax,broaden,broadly,brob,brocade,brocard,broch,brochan,broche,brocho,brock,brocked,brocket,brockle,brod,brodder,brog,brogan,brogger,broggle,brogue,broguer,broider,broigne,broil,broiler,brokage,broke,broken,broker,broking,brolga,broll,brolly,broma,bromal,bromate,brome,bromic,bromide,bromine,bromism,bromite,bromize,bromoil,bromol,bromous,bronc,bronchi,bronco,bronk,bronze,bronzed,bronzen,bronzer,bronzy,broo,brooch,brood,brooder,broody,brook,brooked,brookie,brooky,brool,broom,broomer,broomy,broon,broose,brose,brosot,brosy,brot,brotan,brotany,broth,brothel,brother,brothy,brough,brought,brow,browden,browed,browis,browman,brown,browner,brownie,brownly,browny,browse,browser,browst,bruang,brucia,brucina,brucine,brucite,bruckle,brugh,bruin,bruise,bruiser,bruit,bruiter,bruke,brulee,brulyie,brumal,brumby,brume,brumous,brunch,brunet,brunt,bruscus,brush,brushed,brusher,brushes,brushet,brushy,brusque,brustle,brut,brutage,brutal,brute,brutely,brutify,bruting,brutish,brutism,brutter,bruzz,bryonin,bryony,bu,bual,buaze,bub,buba,bubal,bubalis,bubble,bubbler,bubbly,bubby,bubinga,bubo,buboed,bubonic,bubukle,bucare,bucca,buccal,buccan,buccate,buccina,buccula,buchite,buchu,buck,bucked,buckeen,bucker,bucket,buckety,buckeye,buckie,bucking,buckish,buckle,buckled,buckler,bucklum,bucko,buckpot,buckra,buckram,bucksaw,bucky,bucolic,bucrane,bud,buda,buddage,budder,buddhi,budding,buddle,buddler,buddy,budge,budger,budget,budless,budlet,budlike,budmash,budtime,budwood,budworm,budzat,bufagin,buff,buffalo,buffed,buffer,buffet,buffing,buffle,buffont,buffoon,buffy,bufidin,bufo,bug,bugaboo,bugan,bugbane,bugbear,bugbite,bugdom,bugfish,bugger,buggery,buggy,bughead,bugle,bugled,bugler,buglet,bugloss,bugre,bugseed,bugweed,bugwort,buhl,buhr,build,builder,buildup,built,buirdly,buisson,buist,bukh,bukshi,bulak,bulb,bulbar,bulbed,bulbil,bulblet,bulbose,bulbous,bulbul,bulbule,bulby,bulchin,bulge,bulger,bulgy,bulimia,bulimic,bulimy,bulk,bulked,bulker,bulkily,bulkish,bulky,bull,bulla,bullace,bullan,bullary,bullate,bullbat,bulldog,buller,bullet,bullety,bulling,bullion,bullish,bullism,bullit,bullnut,bullock,bullous,bullule,bully,bulrush,bulse,bult,bulter,bultey,bultong,bultow,bulwand,bulwark,bum,bumbaze,bumbee,bumble,bumbler,bumbo,bumboat,bumicky,bummalo,bummed,bummer,bummie,bumming,bummler,bummock,bump,bumpee,bumper,bumpily,bumping,bumpkin,bumpy,bumtrap,bumwood,bun,buna,buncal,bunce,bunch,buncher,bunchy,bund,bunder,bundle,bundler,bundlet,bundook,bundy,bung,bungee,bungey,bungfu,bungle,bungler,bungo,bungy,bunion,bunk,bunker,bunkery,bunkie,bunko,bunkum,bunnell,bunny,bunt,buntal,bunted,bunter,bunting,bunton,bunty,bunya,bunyah,bunyip,buoy,buoyage,buoyant,bur,buran,burao,burbank,burbark,burble,burbler,burbly,burbot,burbush,burd,burden,burdie,burdock,burdon,bure,bureau,bureaux,burel,burele,buret,burette,burfish,burg,burgage,burgall,burgee,burgeon,burgess,burgh,burghal,burgher,burglar,burgle,burgoo,burgul,burgus,burhead,buri,burial,burian,buried,burier,burin,burion,buriti,burka,burke,burker,burl,burlap,burled,burler,burlet,burlily,burly,burmite,burn,burned,burner,burnet,burnie,burning,burnish,burnous,burnout,burnt,burnut,burny,buro,burp,burr,burrah,burred,burrel,burrer,burring,burrish,burrito,burro,burrow,burry,bursa,bursal,bursar,bursary,bursate,burse,burseed,burst,burster,burt,burton,burucha,burweed,bury,burying,bus,busby,buscarl,bush,bushed,bushel,busher,bushful,bushi,bushily,bushing,bushlet,bushwa,bushy,busied,busily,busine,busk,busked,busker,busket,buskin,buskle,busky,busman,buss,busser,bussock,bussu,bust,bustard,busted,bustee,buster,bustic,bustle,bustled,bustler,busy,busying,busyish,but,butanal,butane,butanol,butch,butcher,butein,butene,butenyl,butic,butine,butler,butlery,butment,butoxy,butoxyl,butt,butte,butter,buttery,butting,buttle,buttock,button,buttons,buttony,butty,butyl,butylic,butyne,butyr,butyral,butyric,butyrin,butyryl,buxerry,buxom,buxomly,buy,buyable,buyer,buzane,buzz,buzzard,buzzer,buzzies,buzzing,buzzle,buzzwig,buzzy,by,bycoket,bye,byee,byeman,byepath,byerite,bygane,bygo,bygoing,bygone,byhand,bylaw,byname,byon,byous,byously,bypass,bypast,bypath,byplay,byre,byreman,byrlaw,byrnie,byroad,byrrus,bysen,byspell,byssal,byssin,byssine,byssoid,byssus,byth,bytime,bywalk,byway,bywoner,byword,bywork,c,ca,caam,caama,caaming,caapeba,cab,caba,cabaan,caback,cabaho,cabal,cabala,cabalic,caban,cabana,cabaret,cabas,cabbage,cabbagy,cabber,cabble,cabbler,cabby,cabda,caber,cabezon,cabin,cabinet,cabio,cable,cabled,cabler,cablet,cabling,cabman,cabob,cabocle,cabook,caboose,cabot,cabree,cabrit,cabuya,cacam,cacao,cachaza,cache,cachet,cachexy,cachou,cachrys,cacique,cack,cackle,cackler,cacodyl,cacoepy,caconym,cacoon,cacti,cactoid,cacur,cad,cadamba,cadaver,cadbait,cadbit,cadbote,caddice,caddie,caddis,caddish,caddle,caddow,caddy,cade,cadelle,cadence,cadency,cadent,cadenza,cader,caderas,cadet,cadetcy,cadette,cadew,cadge,cadger,cadgily,cadgy,cadi,cadism,cadjan,cadlock,cadmia,cadmic,cadmide,cadmium,cados,cadrans,cadre,cadua,caduac,caduca,cadus,cadweed,caeca,caecal,caecum,caeoma,caesura,cafeneh,cafenet,caffa,caffeic,caffeol,caffiso,caffle,caffoy,cafh,cafiz,caftan,cag,cage,caged,cageful,cageman,cager,cagey,caggy,cagily,cagit,cagmag,cahiz,cahoot,cahot,cahow,caickle,caid,caiman,caimito,cain,caique,caird,cairn,cairned,cairny,caisson,caitiff,cajeput,cajole,cajoler,cajuela,cajun,cajuput,cake,cakebox,caker,cakette,cakey,caky,cal,calaba,calaber,calade,calais,calalu,calamus,calash,calcar,calced,calcic,calcify,calcine,calcite,calcium,calculi,calden,caldron,calean,calends,calepin,calf,calfish,caliber,calibre,calices,calicle,calico,calid,caliga,caligo,calinda,calinut,calipee,caliper,caliph,caliver,calix,calk,calkage,calker,calkin,calking,call,callant,callboy,caller,callet,calli,callid,calling,callo,callose,callous,callow,callus,calm,calmant,calmer,calmly,calmy,calomba,calomel,calool,calor,caloric,calorie,caloris,calotte,caloyer,calp,calpac,calpack,caltrap,caltrop,calumba,calumet,calumny,calve,calved,calver,calves,calvish,calvity,calvous,calx,calyces,calycle,calymma,calypso,calyx,cam,camaca,camagon,camail,caman,camansi,camara,camass,camata,camb,cambaye,camber,cambial,cambism,cambist,cambium,cambrel,cambuca,came,cameist,camel,camelry,cameo,camera,cameral,camilla,camion,camise,camisia,camlet,cammed,cammock,camoodi,camp,campana,campane,camper,campho,camphol,camphor,campion,cample,campo,campody,campoo,campus,camus,camused,camwood,can,canaba,canada,canadol,canal,canamo,canape,canard,canari,canarin,canary,canasta,canaut,cancan,cancel,cancer,canch,cancrum,cand,candela,candent,candid,candied,candier,candify,candiru,candle,candler,candock,candor,candroy,candy,candys,cane,canel,canella,canelo,caner,canette,canful,cangan,cangia,cangle,cangler,cangue,canhoop,canid,canille,caninal,canine,caninus,canions,canjac,cank,canker,cankery,canman,canna,cannach,canned,cannel,canner,cannery,cannet,cannily,canning,cannon,cannot,cannula,canny,canoe,canon,canonic,canonry,canopic,canopy,canroy,canso,cant,cantala,cantar,cantara,cantaro,cantata,canted,canteen,canter,canthal,canthus,cantic,cantico,cantily,cantina,canting,cantion,cantish,cantle,cantlet,canto,canton,cantoon,cantor,cantred,cantref,cantrip,cantus,canty,canun,canvas,canvass,cany,canyon,canzon,caoba,cap,capable,capably,capanna,capanne,capax,capcase,cape,caped,capel,capelet,capelin,caper,caperer,capes,capful,caph,caphar,caphite,capias,capicha,capital,capitan,capivi,capkin,capless,caplin,capman,capmint,capomo,capon,caporal,capot,capote,capped,capper,cappie,capping,capple,cappy,caprate,capreol,capric,caprice,caprid,caprin,caprine,caproic,caproin,caprone,caproyl,capryl,capsa,capsid,capsize,capstan,capsula,capsule,captain,caption,captive,captor,capture,capuche,capulet,capulin,car,carabao,carabid,carabin,carabus,caracal,caracol,caract,carafe,caraibe,caraipi,caramba,caramel,caranda,carane,caranna,carapax,carapo,carat,caratch,caravan,caravel,caraway,carbarn,carbeen,carbene,carbide,carbine,carbo,carbon,carbona,carbora,carboxy,carboy,carbro,carbure,carbyl,carcake,carcass,carceag,carcel,carcoon,card,cardecu,carded,cardel,carder,cardia,cardiac,cardial,cardin,carding,cardo,cardol,cardon,cardona,cardoon,care,careen,career,careful,carene,carer,caress,carest,caret,carfare,carfax,carful,carga,cargo,carhop,cariama,caribou,carid,caries,carina,carinal,cariole,carious,cark,carking,carkled,carl,carless,carlet,carlie,carlin,carline,carling,carlish,carload,carlot,carls,carman,carmele,carmine,carmot,carnage,carnal,carnate,carneol,carney,carnic,carnify,carnose,carnous,caroa,carob,caroba,caroche,carol,caroler,caroli,carolin,carolus,carom,carone,caronic,caroome,caroon,carotic,carotid,carotin,carouse,carp,carpal,carpale,carpel,carpent,carper,carpet,carpid,carping,carpium,carport,carpos,carpus,carr,carrack,carrel,carrick,carried,carrier,carrion,carrizo,carroch,carrot,carroty,carrow,carry,carse,carshop,carsick,cart,cartage,carte,cartel,carter,cartful,cartman,carton,cartoon,cartway,carty,carua,carucal,carval,carve,carvel,carven,carvene,carver,carving,carvol,carvone,carvyl,caryl,casaba,casabe,casal,casalty,casate,casaun,casava,casave,casavi,casbah,cascade,cascado,cascara,casco,cascol,case,casease,caseate,casebox,cased,caseful,casefy,caseic,casein,caseose,caseous,caser,casern,caseum,cash,casha,cashaw,cashbox,cashboy,cashel,cashew,cashier,casing,casino,casiri,cask,casket,casking,casque,casqued,casquet,cass,cassady,casse,cassena,cassia,cassie,cassina,cassine,cassino,cassis,cassock,casson,cassoon,cast,caste,caster,castice,casting,castle,castled,castlet,castock,castoff,castor,castory,castra,castral,castrum,castuli,casual,casuary,casuist,casula,cat,catalpa,catan,catapan,cataria,catarrh,catasta,catbird,catboat,catcall,catch,catcher,catchup,catchy,catclaw,catdom,cate,catechu,catella,catena,catenae,cater,cateran,caterer,caterva,cateye,catface,catfall,catfish,catfoot,catgut,cathead,cathect,catheti,cathin,cathine,cathion,cathode,cathole,cathood,cathop,cathro,cation,cativo,catjang,catkin,catlap,catlike,catlin,catling,catmint,catnip,catpipe,catskin,catstep,catsup,cattabu,cattail,cattalo,cattery,cattily,catting,cattish,cattle,catty,catvine,catwalk,catwise,catwood,catwort,caubeen,cauboge,cauch,caucho,caucus,cauda,caudad,caudae,caudal,caudata,caudate,caudex,caudle,caught,cauk,caul,cauld,caules,cauline,caulis,caulome,caulote,caum,cauma,caunch,caup,caupo,caurale,causal,causate,cause,causer,causey,causing,causse,causson,caustic,cautel,cauter,cautery,caution,cautivo,cava,cavae,caval,cavalla,cavalry,cavate,cave,caveat,cavel,cavelet,cavern,cavetto,caviar,cavie,cavil,caviler,caving,cavings,cavish,cavity,caviya,cavort,cavus,cavy,caw,cawk,cawky,cawney,cawquaw,caxiri,caxon,cay,cayenne,cayman,caza,cazimi,ce,cearin,cease,ceasmic,cebell,cebian,cebid,cebil,cebine,ceboid,cebur,cecils,cecity,cedar,cedared,cedarn,cedary,cede,cedent,ceder,cedilla,cedrat,cedrate,cedre,cedrene,cedrin,cedrine,cedrium,cedrol,cedron,cedry,cedula,cee,ceibo,ceil,ceile,ceiler,ceilidh,ceiling,celadon,celemin,celery,celesta,celeste,celiac,celite,cell,cella,cellae,cellar,celled,cellist,cello,celloid,cellose,cellule,celsian,celt,celtium,celtuce,cembalo,cement,cenacle,cendre,cenoby,cense,censer,censive,censor,censual,censure,census,cent,centage,cental,centare,centaur,centavo,centena,center,centiar,centile,centime,centimo,centner,cento,centrad,central,centric,centrum,centry,centum,century,ceorl,cep,cepa,cepe,cephid,ceps,ceptor,cequi,cerago,ceral,ceramal,ceramic,ceras,cerasin,cerata,cerate,cerated,cercal,cerci,cercus,cere,cereal,cerebra,cered,cereous,cerer,ceresin,cerevis,ceria,ceric,ceride,cerillo,ceriman,cerin,cerine,ceriops,cerise,cerite,cerium,cermet,cern,cero,ceroma,cerote,cerotic,cerotin,cerous,cerrero,cerrial,cerris,certain,certie,certify,certis,certy,cerule,cerumen,ceruse,cervid,cervine,cervix,cervoid,ceryl,cesious,cesium,cess,cesser,cession,cessor,cesspit,cest,cestode,cestoid,cestrum,cestus,cetane,cetene,ceti,cetic,cetin,cetyl,cetylic,cevine,cha,chaa,chab,chabot,chabouk,chabuk,chacate,chack,chacker,chackle,chacma,chacona,chacte,chad,chaeta,chafe,chafer,chafery,chaff,chaffer,chaffy,chaft,chafted,chagan,chagrin,chaguar,chagul,chahar,chai,chain,chained,chainer,chainon,chair,chairer,chais,chaise,chaitya,chaja,chaka,chakar,chakari,chakazi,chakdar,chakobu,chakra,chakram,chaksi,chal,chalaco,chalana,chalaza,chalaze,chalcid,chalcon,chalcus,chalder,chalet,chalice,chalk,chalker,chalky,challah,challie,challis,chalmer,chalon,chalone,chalque,chalta,chalutz,cham,chamal,chamar,chamber,chambul,chamfer,chamiso,chamite,chamma,chamois,champ,champac,champer,champy,chance,chancel,chancer,chanche,chanco,chancre,chancy,chandam,chandi,chandoo,chandu,chandul,chang,changa,changar,change,changer,chank,channel,channer,chanson,chanst,chant,chanter,chantey,chantry,chao,chaos,chaotic,chap,chapah,chape,chapeau,chaped,chapel,chapin,chaplet,chapman,chapped,chapper,chappie,chappin,chappow,chappy,chaps,chapt,chapter,char,charac,charade,charas,charbon,chard,chare,charer,charet,charge,chargee,charger,charier,charily,chariot,charism,charity,chark,charka,charkha,charm,charmel,charmer,charnel,charpit,charpoy,charqui,charr,charry,chart,charter,charuk,chary,chase,chaser,chasing,chasm,chasma,chasmal,chasmed,chasmic,chasmy,chasse,chassis,chaste,chasten,chat,chataka,chateau,chati,chatta,chattel,chatter,chatty,chauk,chaus,chaute,chauth,chavish,chaw,chawan,chawer,chawk,chawl,chay,chaya,chayote,chazan,che,cheap,cheapen,cheaply,cheat,cheatee,cheater,chebec,chebel,chebog,chebule,check,checked,checker,checkup,checky,cheder,chee,cheecha,cheek,cheeker,cheeky,cheep,cheeper,cheepy,cheer,cheered,cheerer,cheerio,cheerly,cheery,cheese,cheeser,cheesy,cheet,cheetah,cheeter,cheetie,chef,chegoe,chegre,cheir,chekan,cheke,cheki,chekmak,chela,chelate,chelem,chelide,chello,chelone,chelp,chelys,chemic,chemis,chemise,chemism,chemist,chena,chende,cheng,chenica,cheque,cherem,cherish,cheroot,cherry,chert,cherte,cherty,cherub,chervil,cheson,chess,chessel,chesser,chest,chester,chesty,cheth,chettik,chetty,chevage,cheval,cheve,cheven,chevin,chevise,chevon,chevron,chevy,chew,chewer,chewink,chewy,cheyney,chhatri,chi,chia,chiasm,chiasma,chiaus,chibouk,chibrit,chic,chicane,chichi,chick,chicken,chicker,chicky,chicle,chico,chicory,chicot,chicote,chid,chidden,chide,chider,chiding,chidra,chief,chiefly,chield,chien,chiffer,chiffon,chiggak,chigger,chignon,chigoe,chih,chihfu,chikara,chil,child,childe,childed,childly,chile,chili,chiliad,chill,chilla,chilled,chiller,chillo,chillum,chilly,chiloma,chilver,chimble,chime,chimer,chimera,chimney,chin,china,chinar,chinch,chincha,chinche,chine,chined,ching,chingma,chinik,chinin,chink,chinker,chinkle,chinks,chinky,chinnam,chinned,chinny,chino,chinoa,chinol,chinse,chint,chintz,chip,chiplet,chipped,chipper,chippy,chips,chiral,chirata,chiripa,chirk,chirm,chiro,chirp,chirper,chirpy,chirr,chirrup,chisel,chit,chitak,chital,chitin,chiton,chitose,chitra,chitter,chitty,chive,chivey,chkalik,chlamyd,chlamys,chlor,chloral,chlore,chloric,chloryl,cho,choana,choate,choaty,chob,choca,chocard,chocho,chock,chocker,choel,choenix,choffer,choga,chogak,chogset,choice,choicy,choil,choiler,choir,chokage,choke,choker,choking,chokra,choky,chol,chola,cholane,cholate,chold,choleic,choler,cholera,choli,cholic,choline,cholla,choller,cholum,chomp,chondre,chonta,choop,choose,chooser,choosy,chop,chopa,chopin,chopine,chopped,chopper,choppy,choragy,choral,chord,chorda,chordal,chorded,chore,chorea,choreal,choree,choregy,choreic,choreus,chorial,choric,chorine,chorion,chorism,chorist,chorogi,choroid,chorook,chort,chorten,chortle,chorus,choryos,chose,chosen,chott,chough,chouka,choup,chous,chouse,chouser,chow,chowder,chowk,chowry,choya,chria,chrism,chrisma,chrisom,chroma,chrome,chromic,chromid,chromo,chromy,chromyl,chronal,chronic,chrotta,chrysal,chrysid,chrysin,chub,chubbed,chubby,chuck,chucker,chuckle,chucky,chuddar,chufa,chuff,chuffy,chug,chugger,chuhra,chukar,chukker,chukor,chulan,chullpa,chum,chummer,chummy,chump,chumpy,chun,chunari,chunga,chunk,chunky,chunner,chunnia,chunter,chupak,chupon,church,churchy,churel,churl,churled,churly,churm,churn,churr,churrus,chut,chute,chuter,chutney,chyack,chyak,chyle,chylify,chyloid,chylous,chymase,chyme,chymia,chymic,chymify,chymous,chypre,chytra,chytrid,cibol,cibory,ciboule,cicad,cicada,cicadid,cicala,cicely,cicer,cichlid,cidarid,cidaris,cider,cig,cigala,cigar,cigua,cilia,ciliary,ciliate,cilice,cilium,cimbia,cimelia,cimex,cimicid,cimline,cinch,cincher,cinclis,cinct,cinder,cindery,cine,cinel,cinema,cinene,cineole,cinerea,cingle,cinnyl,cinque,cinter,cinuran,cion,cipher,cipo,cipolin,cippus,circa,circle,circled,circler,circlet,circuit,circus,circusy,cirque,cirrate,cirri,cirrose,cirrous,cirrus,cirsoid,ciruela,cisco,cise,cisele,cissing,cissoid,cist,cista,cistae,cisted,cistern,cistic,cit,citable,citadel,citator,cite,citee,citer,citess,cithara,cither,citied,citify,citizen,citole,citral,citrate,citrean,citrene,citric,citril,citrin,citrine,citron,citrous,citrus,cittern,citua,city,citydom,cityful,cityish,cive,civet,civic,civics,civil,civilly,civism,civvy,cixiid,clabber,clachan,clack,clacker,clacket,clad,cladine,cladode,cladose,cladus,clag,claggum,claggy,claim,claimer,clairce,claith,claiver,clam,clamant,clamb,clamber,clame,clamer,clammed,clammer,clammy,clamor,clamp,clamper,clan,clang,clangor,clank,clanned,clap,clapnet,clapped,clapper,clapt,claque,claquer,clarain,claret,clarify,clarin,clarion,clarity,clark,claro,clart,clarty,clary,clash,clasher,clashy,clasp,clasper,claspt,class,classed,classer,classes,classic,classis,classy,clastic,clat,clatch,clatter,clatty,claught,clausal,clause,claut,clava,claval,clavate,clave,clavel,claver,clavial,clavier,claviol,clavis,clavola,clavus,clavy,claw,clawed,clawer,clawk,clawker,clay,clayen,clayer,clayey,clayish,clayman,claypan,cleach,clead,cleaded,cleam,cleamer,clean,cleaner,cleanly,cleanse,cleanup,clear,clearer,clearly,cleat,cleave,cleaver,cleche,cleck,cled,cledge,cledgy,clee,cleek,cleeked,cleeky,clef,cleft,clefted,cleg,clem,clement,clench,cleoid,clep,clergy,cleric,clerid,clerisy,clerk,clerkly,cleruch,cletch,cleuch,cleve,clever,clevis,clew,cliack,cliche,click,clicker,clicket,clicky,cliency,client,cliff,cliffed,cliffy,clift,clifty,clima,climata,climate,climath,climax,climb,climber,clime,clinal,clinch,cline,cling,clinger,clingy,clinia,clinic,clinium,clink,clinker,clinkum,clinoid,clint,clinty,clip,clipei,clipeus,clipped,clipper,clips,clipse,clipt,clique,cliquy,clisere,clit,clitch,clite,clites,clithe,clitia,clition,clitter,clival,clive,clivers,clivis,clivus,cloaca,cloacal,cloak,cloaked,cloam,cloamen,cloamer,clobber,clochan,cloche,clocher,clock,clocked,clocker,clod,clodder,cloddy,clodlet,cloff,clog,clogger,cloggy,cloghad,clogwyn,cloit,clomb,clomben,clonal,clone,clonic,clonism,clonus,cloof,cloop,cloot,clootie,clop,close,closed,closely,closen,closer,closet,closh,closish,closter,closure,clot,clotbur,clote,cloth,clothe,clothes,clothy,clotter,clotty,cloture,cloud,clouded,cloudy,clough,clour,clout,clouted,clouter,clouty,clove,cloven,clovene,clover,clovery,clow,clown,cloy,cloyer,cloying,club,clubbed,clubber,clubby,clubdom,clubman,cluck,clue,cluff,clump,clumpy,clumse,clumsy,clunch,clung,clunk,clupeid,cluster,clutch,cluther,clutter,cly,clyer,clype,clypeal,clypeus,clysis,clysma,clysmic,clyster,cnemial,cnemis,cnicin,cnida,coabode,coach,coachee,coacher,coachy,coact,coactor,coadapt,coadmit,coadore,coaged,coagent,coagula,coaid,coaita,coak,coakum,coal,coalbag,coalbin,coalbox,coaler,coalify,coalize,coalpit,coaly,coaming,coannex,coapt,coarb,coarse,coarsen,coast,coastal,coaster,coat,coated,coatee,coater,coati,coatie,coating,coax,coaxal,coaxer,coaxial,coaxing,coaxy,cob,cobaea,cobalt,cobang,cobbed,cobber,cobbing,cobble,cobbler,cobbly,cobbra,cobby,cobcab,cobego,cobhead,cobia,cobiron,coble,cobless,cobloaf,cobnut,cobola,cobourg,cobra,coburg,cobweb,cobwork,coca,cocaine,cocash,cocause,coccal,cocci,coccid,cocco,coccoid,coccous,coccule,coccus,coccyx,cochal,cochief,cochlea,cock,cockade,cockal,cocked,cocker,cocket,cockeye,cockily,cocking,cockish,cockle,cockled,cockler,cocklet,cockly,cockney,cockpit,cockshy,cockup,cocky,coco,cocoa,cocoach,coconut,cocoon,cocotte,coctile,coction,cocuisa,cocullo,cocuyo,cod,coda,codbank,codder,codding,coddle,coddler,code,codeine,coder,codex,codfish,codger,codhead,codical,codices,codicil,codify,codilla,codille,codist,codling,codman,codo,codol,codon,codworm,coe,coecal,coecum,coed,coelar,coelder,coelect,coelho,coelia,coeliac,coelian,coelin,coeline,coelom,coeloma,coempt,coenact,coenjoy,coenobe,coequal,coerce,coercer,coetus,coeval,coexert,coexist,coff,coffee,coffer,coffin,coffle,coffret,coft,cog,cogence,cogency,cogener,cogent,cogged,cogger,coggie,cogging,coggle,coggly,coghle,cogman,cognac,cognate,cognize,cogon,cogonal,cograil,cogroad,cogue,cogway,cogwood,cohabit,coheir,cohere,coherer,cohibit,coho,cohoba,cohol,cohort,cohosh,cohune,coif,coifed,coign,coigue,coil,coiled,coiler,coiling,coin,coinage,coiner,coinfer,coining,cointer,coiny,coir,coital,coition,coiture,coitus,cojudge,cojuror,coke,cokeman,coker,cokery,coking,coky,col,cola,colane,colarin,colate,colauxe,colback,cold,colder,coldish,coldly,cole,coletit,coleur,coli,colibri,colic,colical,colicky,colima,colin,coling,colitic,colitis,colk,coll,collage,collar,collard,collare,collate,collaud,collect,colleen,college,collery,collet,colley,collide,collie,collied,collier,collin,colline,colling,collins,collock,colloid,collop,collude,collum,colly,collyba,colmar,colobin,colon,colonel,colonic,colony,color,colored,colorer,colorin,colors,colory,coloss,colossi,colove,colp,colpeo,colport,colpus,colt,colter,coltish,colugo,columbo,column,colunar,colure,coly,colyone,colytic,colyum,colza,coma,comaker,comal,comamie,comanic,comart,comate,comb,combat,combed,comber,combine,combing,comble,comboy,combure,combust,comby,come,comedic,comedo,comedy,comely,comenic,comer,comes,comet,cometic,comfit,comfort,comfrey,comfy,comic,comical,comicry,coming,comino,comism,comital,comitia,comity,comma,command,commend,comment,commie,commit,commix,commixt,commode,common,commons,commot,commove,communa,commune,commute,comoid,comose,comourn,comous,compact,company,compare,compart,compass,compear,compeer,compel,compend,compete,compile,complex,complin,complot,comply,compo,compoer,compole,compone,compony,comport,compos,compose,compost,compote,compreg,compter,compute,comrade,con,conacre,conal,conamed,conatus,concave,conceal,concede,conceit,concent,concept,concern,concert,conch,concha,conchal,conche,conched,concher,conchy,concile,concise,concoct,concord,concupy,concur,concuss,cond,condemn,condign,condite,condole,condone,condor,conduce,conduct,conduit,condyle,cone,coned,coneen,coneine,conelet,coner,cones,confab,confact,confect,confess,confide,confine,confirm,confix,conflow,conflux,conform,confuse,confute,conga,congeal,congee,conger,congest,congius,congou,conic,conical,conicle,conics,conidia,conifer,conima,conin,conine,conject,conjoin,conjure,conjury,conk,conker,conkers,conky,conn,connach,connate,connect,conner,connex,conning,connive,connote,conoid,conopid,conquer,conred,consent,consign,consist,consol,console,consort,conspue,constat,consul,consult,consume,consute,contact,contain,conte,contect,contemn,content,conter,contest,context,contise,conto,contort,contour,contra,control,contund,contuse,conure,conus,conusee,conusor,conuzee,conuzor,convect,convene,convent,convert,conveth,convex,convey,convict,convive,convoke,convoy,cony,coo,cooba,coodle,cooee,cooer,coof,cooing,cooja,cook,cookdom,cookee,cooker,cookery,cooking,cookish,cookout,cooky,cool,coolant,coolen,cooler,coolie,cooling,coolish,coolly,coolth,coolung,cooly,coom,coomb,coomy,coon,cooncan,coonily,coontie,coony,coop,cooper,coopery,cooree,coorie,cooser,coost,coot,cooter,coothay,cootie,cop,copa,copable,copaene,copaiba,copaiye,copal,copalm,copart,coparty,cope,copei,copeman,copen,copepod,coper,coperta,copied,copier,copilot,coping,copious,copis,copist,copita,copolar,copped,copper,coppery,coppet,coppice,coppin,copping,copple,coppled,coppy,copr,copra,coprose,copse,copsing,copsy,copter,copula,copular,copus,copy,copycat,copyism,copyist,copyman,coque,coquet,coquina,coquita,coquito,cor,cora,corach,coracle,corah,coraise,coral,coraled,coram,coranto,corban,corbeau,corbeil,corbel,corbie,corbula,corcass,corcir,cord,cordage,cordant,cordate,cordax,corded,cordel,corder,cordial,cordies,cording,cordite,cordoba,cordon,cordy,cordyl,core,corebel,cored,coreid,coreign,corella,corer,corf,corge,corgi,corial,coriin,coring,corinne,corium,cork,corkage,corke,corked,corker,corking,corkish,corkite,corky,corm,cormel,cormoid,cormous,cormus,corn,cornage,cornbin,corncob,cornea,corneal,cornein,cornel,corner,cornet,corneum,cornic,cornice,cornin,corning,cornu,cornual,cornule,cornute,cornuto,corny,coroa,corody,corol,corolla,corona,coronad,coronae,coronal,coroner,coronet,corozo,corp,corpora,corps,corpse,corpus,corrade,corral,correal,correct,corrie,corrige,corrode,corrupt,corsac,corsage,corsair,corse,corset,corsie,corsite,corta,cortege,cortex,cortez,cortin,cortina,coruco,coruler,corupay,corver,corvina,corvine,corvoid,coryl,corylin,corymb,coryza,cos,cosaque,coscet,coseat,cosec,cosech,coseism,coset,cosh,cosher,coshery,cosily,cosine,cosmic,cosmism,cosmist,cosmos,coss,cossas,cosse,cosset,cossid,cost,costa,costal,costar,costard,costate,costean,coster,costing,costive,costly,costrel,costula,costume,cosy,cot,cotch,cote,coteful,coterie,coth,cothe,cothish,cothon,cothurn,cothy,cotidal,cotise,cotland,cotman,coto,cotoin,cotoro,cotrine,cotset,cotta,cottage,cotte,cotted,cotter,cottid,cottier,cottoid,cotton,cottony,cotty,cotuit,cotula,cotutor,cotwin,cotwist,cotyla,cotylar,cotype,couac,coucal,couch,couched,couchee,coucher,couchy,coude,coudee,coue,cougar,cough,cougher,cougnar,coul,could,coulee,coulomb,coulure,couma,coumara,council,counite,counsel,count,counter,countor,country,county,coup,coupage,coupe,couped,coupee,couper,couple,coupled,coupler,couplet,coupon,coupure,courage,courant,courap,courb,courge,courida,courier,couril,courlan,course,coursed,courser,court,courter,courtin,courtly,cousin,cousiny,coutel,couter,couth,couthie,coutil,couvade,couxia,covado,cove,coved,covent,cover,covered,coverer,covert,covet,coveter,covey,covid,covin,coving,covisit,covite,cow,cowal,coward,cowardy,cowbane,cowbell,cowbind,cowbird,cowboy,cowdie,coween,cower,cowfish,cowgate,cowgram,cowhage,cowheel,cowherb,cowherd,cowhide,cowhorn,cowish,cowitch,cowl,cowle,cowled,cowlick,cowlike,cowling,cowman,cowpath,cowpea,cowpen,cowpock,cowpox,cowrie,cowroid,cowshed,cowskin,cowslip,cowtail,cowweed,cowy,cowyard,cox,coxa,coxal,coxcomb,coxite,coxitis,coxy,coy,coyan,coydog,coyish,coyly,coyness,coynye,coyo,coyol,coyote,coypu,coyure,coz,coze,cozen,cozener,cozier,cozily,cozy,crab,crabbed,crabber,crabby,craber,crablet,crabman,crack,cracked,cracker,crackle,crackly,cracky,craddy,cradge,cradle,cradler,craft,crafty,crag,craggan,cragged,craggy,craichy,crain,craisey,craizey,crajuru,crake,crakow,cram,crambe,crambid,cramble,crambly,crambo,crammer,cramp,cramped,cramper,crampet,crampon,crampy,cran,cranage,crance,crane,craner,craney,crania,craniad,cranial,cranian,cranic,cranium,crank,cranked,cranker,crankle,crankly,crankum,cranky,crannog,cranny,crants,crap,crapaud,crape,crappie,crappin,crapple,crappo,craps,crapy,crare,crash,crasher,crasis,crass,crassly,cratch,crate,crater,craunch,cravat,crave,craven,craver,craving,cravo,craw,crawdad,crawful,crawl,crawler,crawley,crawly,crawm,crawtae,crayer,crayon,craze,crazed,crazily,crazy,crea,creagh,creaght,creak,creaker,creaky,cream,creamer,creamy,creance,creant,crease,creaser,creasy,creat,create,creatic,creator,creche,credent,credit,cree,creed,creedal,creeded,creek,creeker,creeky,creel,creeler,creem,creen,creep,creeper,creepie,creepy,creese,creesh,creeshy,cremate,cremone,cremor,cremule,crena,crenate,crenel,crenele,crenic,crenula,creole,creosol,crepe,crepine,crepon,crept,crepy,cresol,cresoxy,cress,cressed,cresset,cresson,cressy,crest,crested,cresyl,creta,cretic,cretify,cretin,cretion,crevice,crew,crewel,crewer,crewman,crib,cribber,cribble,cribo,cribral,cric,crick,cricket,crickey,crickle,cricoid,cried,crier,criey,crig,crile,crime,crimine,crimp,crimper,crimple,crimpy,crimson,crin,crinal,crine,crined,crinet,cringe,cringer,cringle,crinite,crink,crinkle,crinkly,crinoid,crinose,crinula,cripes,cripple,cripply,crises,crisic,crisis,crisp,crisped,crisper,crisply,crispy,criss,crissal,crissum,crista,critch,crith,critic,crizzle,cro,croak,croaker,croaky,croc,crocard,croceic,crocein,croche,crochet,croci,crocin,crock,crocker,crocket,crocky,crocus,croft,crofter,crome,crone,cronet,cronish,cronk,crony,crood,croodle,crook,crooked,crooken,crookle,crool,croon,crooner,crop,cropman,croppa,cropper,croppie,croppy,croquet,crore,crosa,crosier,crosnes,cross,crosse,crossed,crosser,crossly,crotal,crotalo,crotch,crotchy,crotin,crottle,crotyl,crouch,croup,croupal,croupe,croupy,crouse,crout,croute,crouton,crow,crowbar,crowd,crowded,crowder,crowdy,crower,crowhop,crowing,crowl,crown,crowned,crowner,crowtoe,croy,croyden,croydon,croze,crozer,crozzle,crozzly,crubeen,cruce,cruces,cruche,crucial,crucian,crucify,crucily,cruck,crude,crudely,crudity,cruel,cruelly,cruels,cruelty,cruent,cruet,cruety,cruise,cruiser,cruive,cruller,crum,crumb,crumber,crumble,crumbly,crumby,crumen,crumlet,crummie,crummy,crump,crumper,crumpet,crumple,crumply,crumpy,crunch,crunchy,crunk,crunkle,crunode,crunt,cruor,crupper,crural,crureus,crus,crusade,crusado,cruse,crush,crushed,crusher,crusie,crusily,crust,crusta,crustal,crusted,cruster,crusty,crutch,cruth,crutter,crux,cry,cryable,crybaby,crying,cryogen,cryosel,crypt,crypta,cryptal,crypted,cryptic,crystal,crystic,csardas,ctene,ctenoid,cuadra,cuarta,cub,cubage,cubbing,cubbish,cubby,cubdom,cube,cubeb,cubelet,cuber,cubhood,cubi,cubic,cubica,cubical,cubicle,cubicly,cubism,cubist,cubit,cubital,cubited,cubito,cubitus,cuboid,cuck,cuckold,cuckoo,cuculla,cud,cudava,cudbear,cudden,cuddle,cuddly,cuddy,cudgel,cudweed,cue,cueball,cueca,cueist,cueman,cuerda,cuesta,cuff,cuffer,cuffin,cuffy,cuinage,cuir,cuirass,cuisine,cuisse,cuissen,cuisten,cuke,culbut,culebra,culet,culeus,culgee,culicid,cull,culla,cullage,culler,cullet,culling,cullion,cullis,cully,culm,culmen,culmy,culotte,culpa,culpose,culprit,cult,cultch,cultic,cultish,cultism,cultist,cultual,culture,cultus,culver,culvert,cum,cumal,cumay,cumbent,cumber,cumbha,cumbly,cumbre,cumbu,cumene,cumenyl,cumhal,cumic,cumidin,cumin,cuminal,cuminic,cuminol,cuminyl,cummer,cummin,cumol,cump,cumshaw,cumular,cumuli,cumulus,cumyl,cuneal,cuneate,cunette,cuneus,cunila,cunjah,cunjer,cunner,cunning,cunye,cuorin,cup,cupay,cupcake,cupel,cupeler,cupful,cuphead,cupidon,cupless,cupman,cupmate,cupola,cupolar,cupped,cupper,cupping,cuppy,cuprene,cupric,cupride,cuprite,cuproid,cuprose,cuprous,cuprum,cupseed,cupula,cupule,cur,curable,curably,curacao,curacy,curare,curate,curatel,curatic,curator,curb,curber,curbing,curby,curcas,curch,curd,curdle,curdler,curdly,curdy,cure,curer,curette,curfew,curial,curiate,curie,curin,curine,curing,curio,curiosa,curioso,curious,curite,curium,curl,curled,curler,curlew,curlike,curlily,curling,curly,curn,curney,curnock,curple,curr,currach,currack,curragh,currant,current,curried,currier,currish,curry,cursal,curse,cursed,curser,curship,cursive,cursor,cursory,curst,curstly,cursus,curt,curtail,curtain,curtal,curtate,curtesy,curtly,curtsy,curua,curuba,curule,cururo,curvant,curvate,curve,curved,curver,curvet,curvity,curvous,curvy,cuscus,cusec,cush,cushag,cushat,cushaw,cushion,cushy,cusie,cusk,cusp,cuspal,cuspate,cusped,cuspid,cuspule,cuss,cussed,cusser,cusso,custard,custody,custom,customs,cut,cutaway,cutback,cutch,cutcher,cute,cutely,cutheal,cuticle,cutie,cutin,cutis,cutitis,cutlass,cutler,cutlery,cutlet,cutling,cutlips,cutoff,cutout,cutover,cuttage,cuttail,cutted,cutter,cutting,cuttle,cuttler,cuttoo,cutty,cutup,cutweed,cutwork,cutworm,cuvette,cuvy,cuya,cwierc,cwm,cyan,cyanate,cyanean,cyanic,cyanide,cyanin,cyanine,cyanite,cyanize,cyanol,cyanole,cyanose,cyanus,cyath,cyathos,cyathus,cycad,cyclane,cyclar,cyclas,cycle,cyclene,cycler,cyclian,cyclic,cyclide,cycling,cyclism,cyclist,cyclize,cycloid,cyclone,cyclope,cyclopy,cyclose,cyclus,cyesis,cygnet,cygnine,cyke,cylix,cyma,cymar,cymba,cymbal,cymbalo,cymbate,cyme,cymelet,cymene,cymling,cymoid,cymose,cymous,cymule,cynebot,cynic,cynical,cynipid,cynism,cynoid,cyp,cypre,cypres,cypress,cyprine,cypsela,cyrus,cyst,cystal,cysted,cystic,cystid,cystine,cystis,cystoid,cystoma,cystose,cystous,cytase,cytasic,cytitis,cytode,cytoid,cytoma,cyton,cytost,cytula,czar,czardas,czardom,czarian,czaric,czarina,czarish,czarism,czarist,d,da,daalder,dab,dabb,dabba,dabber,dabble,dabbler,dabby,dablet,daboia,daboya,dabster,dace,dacite,dacitic,dacker,dacoit,dacoity,dacryon,dactyl,dad,dada,dadap,dadder,daddle,daddock,daddy,dade,dado,dae,daedal,daemon,daemony,daer,daff,daffery,daffing,daffish,daffle,daffy,daft,daftly,dag,dagaba,dagame,dagassa,dagesh,dagga,dagger,daggers,daggle,daggly,daggy,daghesh,daglock,dagoba,dags,dah,dahoon,daidle,daidly,daiker,daikon,daily,daimen,daimio,daimon,dain,daincha,dainty,daira,dairi,dairy,dais,daisied,daisy,daitya,daiva,dak,daker,dakir,dal,dalar,dale,daleman,daler,daleth,dali,dalk,dallack,dalle,dalles,dallier,dally,dalt,dalteen,dalton,dam,dama,damage,damager,damages,daman,damask,damasse,dambose,dambrod,dame,damiana,damie,damier,damine,damlike,dammar,damme,dammer,dammish,damn,damned,damner,damnify,damning,damnous,damp,dampang,damped,dampen,damper,damping,dampish,damply,dampy,damsel,damson,dan,danaid,danaide,danaine,danaite,dance,dancer,dancery,dancing,dand,danda,dander,dandify,dandily,dandle,dandler,dandy,dang,danger,dangle,dangler,danglin,danio,dank,dankish,dankly,danli,danner,dannock,dansant,danta,danton,dao,daoine,dap,daphnin,dapicho,dapico,dapifer,dapper,dapple,dappled,dar,darac,daraf,darat,darbha,darby,dardaol,dare,dareall,dareful,darer,daresay,darg,dargah,darger,dargue,dari,daribah,daric,daring,dariole,dark,darken,darkful,darkish,darkle,darkly,darky,darling,darn,darned,darnel,darner,darnex,darning,daroga,daroo,darr,darrein,darst,dart,dartars,darter,darting,dartle,dartman,dartoic,dartoid,dartos,dartre,darts,darzee,das,dash,dashed,dashee,dasheen,dasher,dashing,dashpot,dashy,dasi,dasnt,dassie,dassy,dastard,dastur,dasturi,dasyure,data,datable,datably,dataria,datary,datch,datcha,date,dater,datil,dating,dation,datival,dative,dattock,datum,daturic,daub,daube,dauber,daubery,daubing,dauby,daud,daunch,dauncy,daunt,daunter,daunton,dauphin,daut,dautie,dauw,davach,daven,daver,daverdy,davit,davoch,davy,davyne,daw,dawdle,dawdler,dawdy,dawish,dawkin,dawn,dawning,dawny,dawtet,dawtit,dawut,day,dayal,daybeam,daybook,daydawn,dayfly,dayless,daylit,daylong,dayman,daymare,daymark,dayroom,days,daysman,daystar,daytale,daytide,daytime,dayward,daywork,daywrit,daze,dazed,dazedly,dazy,dazzle,dazzler,de,deacon,dead,deaden,deader,deadeye,deading,deadish,deadly,deadman,deadpan,deadpay,deaf,deafen,deafish,deafly,deair,deal,dealate,dealer,dealing,dealt,dean,deaner,deanery,deaness,dear,dearie,dearly,dearth,deary,deash,deasil,death,deathin,deathly,deathy,deave,deavely,deb,debacle,debadge,debar,debark,debase,debaser,debate,debater,debauch,debby,debeige,deben,debile,debind,debit,debord,debosh,debouch,debride,debrief,debris,debt,debtee,debtful,debtor,debunk,debus,debut,decad,decadal,decade,decadic,decafid,decagon,decal,decamp,decan,decanal,decane,decani,decant,decap,decapod,decarch,decare,decart,decast,decate,decator,decatyl,decay,decayed,decayer,decease,deceit,deceive,decence,decency,decene,decent,decenyl,decern,decess,deciare,decibel,decide,decided,decider,decidua,decil,decile,decima,decimal,deck,decke,decked,deckel,decker,deckie,decking,deckle,declaim,declare,declass,decline,declive,decoat,decoct,decode,decoic,decoke,decolor,decorum,decoy,decoyer,decream,decree,decreer,decreet,decrete,decrew,decrial,decried,decrier,decrown,decry,decuman,decuple,decuria,decurve,decury,decus,decyl,decylic,decyne,dedimus,dedo,deduce,deduct,dee,deed,deedbox,deedeed,deedful,deedily,deedy,deem,deemer,deemie,deep,deepen,deeping,deepish,deeply,deer,deerdog,deerlet,deevey,deface,defacer,defalk,defame,defamed,defamer,defassa,defat,default,defease,defeat,defect,defence,defend,defense,defer,defial,defiant,defiber,deficit,defier,defile,defiled,defiler,define,defined,definer,deflate,deflect,deflesh,deflex,defog,deforce,deform,defoul,defraud,defray,defrock,defrost,deft,deftly,defunct,defuse,defy,deg,degas,degauss,degerm,degged,degger,deglaze,degorge,degrade,degrain,degree,degu,degum,degust,dehair,dehisce,dehorn,dehors,dehort,dehull,dehusk,deice,deicer,deicide,deictic,deific,deifier,deiform,deify,deign,deink,deinos,deiseal,deism,deist,deistic,deity,deject,dejecta,dejeune,dekko,dekle,delaine,delapse,delate,delater,delator,delawn,delay,delayer,dele,delead,delenda,delete,delf,delft,delible,delict,delight,delime,delimit,delint,deliver,dell,deloul,delouse,delta,deltaic,deltal,deltic,deltoid,delude,deluder,deluge,deluxe,delve,delver,demagog,demal,demand,demarch,demark,demast,deme,demean,demency,dement,demerit,demesne,demi,demibob,demidog,demigod,demihag,demiman,demiowl,demiox,demiram,demirep,demise,demiss,demit,demivol,demob,demoded,demoid,demon,demonic,demonry,demos,demote,demotic,demount,demulce,demure,demy,den,denaro,denary,denat,denda,dendral,dendric,dendron,dene,dengue,denial,denier,denim,denizen,dennet,denote,dense,densely,densen,densher,densify,density,dent,dental,dentale,dentary,dentata,dentate,dentel,denter,dentex,dentil,dentile,dentin,dentine,dentist,dentoid,denture,denty,denude,denuder,deny,deodand,deodara,deota,depa,depaint,depark,depart,depas,depass,depend,depeter,dephase,depict,deplane,deplete,deplore,deploy,deplume,deplump,depoh,depone,deport,deposal,depose,deposer,deposit,depot,deprave,depress,deprint,deprive,depside,depth,depthen,depute,deputy,dequeen,derah,deraign,derail,derange,derat,derate,derater,deray,derby,dere,dereism,deric,deride,derider,derival,derive,derived,deriver,derm,derma,dermad,dermal,dermic,dermis,dermoid,dermol,dern,dernier,derout,derrick,derride,derries,derry,dertrum,derust,dervish,desalt,desand,descale,descant,descend,descent,descort,descry,deseed,deseret,desert,deserve,desex,desi,desight,design,desire,desired,desirer,desist,desize,desk,deslime,desma,desman,desmic,desmid,desmine,desmoid,desmoma,desmon,despair,despect,despise,despite,despoil,despond,despot,dess,dessa,dessert,dessil,destain,destine,destiny,destour,destroy,desuete,desugar,desyl,detach,detail,detain,detar,detax,detect,detent,deter,deterge,detest,detin,detinet,detinue,detour,detract,detrain,detrude,detune,detur,deuce,deuced,deul,deuton,dev,deva,devall,devalue,devance,devast,devata,develin,develop,devest,deviant,deviate,device,devil,deviled,deviler,devilet,devilry,devily,devious,devisal,devise,devisee,deviser,devisor,devoice,devoid,devoir,devolve,devote,devoted,devotee,devoter,devour,devout,devow,devvel,dew,dewan,dewanee,dewater,dewax,dewbeam,dewclaw,dewcup,dewdamp,dewdrop,dewer,dewfall,dewily,dewlap,dewless,dewlike,dewool,deworm,dewret,dewtry,dewworm,dewy,dexter,dextrad,dextral,dextran,dextrin,dextro,dey,deyship,dezinc,dha,dhabb,dhai,dhak,dhamnoo,dhan,dhangar,dhanuk,dhanush,dharana,dharani,dharma,dharna,dhaura,dhauri,dhava,dhaw,dheri,dhobi,dhole,dhoni,dhoon,dhoti,dhoul,dhow,dhu,dhunchi,dhurra,dhyal,dhyana,di,diabase,diacid,diacle,diacope,diact,diactin,diadem,diaderm,diaene,diagram,dial,dialect,dialer,dialin,dialing,dialist,dialkyl,diallel,diallyl,dialyze,diamb,diambic,diamide,diamine,diamond,dian,diander,dianite,diapase,diapasm,diaper,diaplex,diapsid,diarch,diarchy,diarial,diarian,diarist,diarize,diary,diastem,diaster,diasyrm,diatom,diaulic,diaulos,diaxial,diaxon,diazide,diazine,diazoic,diazole,diazoma,dib,dibase,dibasic,dibatag,dibber,dibble,dibbler,dibbuk,dibhole,dibrach,dibrom,dibs,dicast,dice,dicebox,dicecup,diceman,dicer,dicetyl,dich,dichas,dichord,dicing,dick,dickens,dicker,dickey,dicky,dicolic,dicolon,dicot,dicotyl,dicta,dictate,dictic,diction,dictum,dicycle,did,didder,diddle,diddler,diddy,didelph,didie,didine,didle,didna,didnt,didromy,didst,didym,didymia,didymus,die,dieb,dieback,diedral,diedric,diehard,dielike,diem,diene,dier,diesel,diesis,diet,dietal,dietary,dieter,diethyl,dietic,dietics,dietine,dietist,diewise,diffame,differ,diffide,difform,diffuse,dig,digamma,digamy,digenic,digeny,digest,digger,digging,dight,dighter,digit,digital,digitus,diglot,diglyph,digmeat,dignify,dignity,digram,digraph,digress,digs,dihalo,diiamb,diiodo,dika,dikage,dike,diker,diketo,dikkop,dilate,dilated,dilater,dilator,dildo,dilemma,dilker,dill,dilli,dillier,dilling,dillue,dilluer,dilly,dilo,dilogy,diluent,dilute,diluted,dilutee,diluter,dilutor,diluvia,dim,dimber,dimble,dime,dimer,dimeran,dimeric,dimeter,dimiss,dimit,dimity,dimly,dimmed,dimmer,dimmest,dimmet,dimmish,dimness,dimoric,dimorph,dimple,dimply,dimps,dimpsy,din,dinar,dinder,dindle,dine,diner,dineric,dinero,dinette,ding,dingar,dingbat,dinge,dingee,dinghee,dinghy,dingily,dingle,dingly,dingo,dingus,dingy,dinic,dinical,dining,dinitro,dink,dinkey,dinkum,dinky,dinmont,dinner,dinnery,dinomic,dinsome,dint,dinus,diobely,diobol,diocese,diode,diodont,dioecy,diol,dionise,dionym,diopter,dioptra,dioptry,diorama,diorite,diose,diosmin,diota,diotic,dioxane,dioxide,dioxime,dioxy,dip,dipetto,diphase,diphead,diplex,diploe,diploic,diploid,diplois,diploma,diplont,diplopy,dipnoan,dipnoid,dipode,dipodic,dipody,dipolar,dipole,diporpa,dipped,dipper,dipping,dipsas,dipsey,dipter,diptote,diptych,dipware,dipygus,dipylon,dipyre,dird,dirdum,dire,direct,direful,direly,dirempt,dirge,dirgler,dirhem,dirk,dirl,dirndl,dirt,dirten,dirtily,dirty,dis,disable,disagio,disally,disarm,disavow,disawa,disazo,disband,disbar,disbark,disbody,disbud,disbury,disc,discage,discal,discard,discase,discept,discern,discerp,discoid,discord,discous,discus,discuss,disdain,disdub,disease,disedge,diseme,disemic,disfame,disfen,disgig,disglut,disgood,disgown,disgulf,disgust,dish,dished,dishelm,disher,dishful,dishome,dishorn,dishpan,dishrag,disject,disjoin,disjune,disk,disleaf,dislike,dislimn,dislink,dislip,disload,dislove,dismain,dismal,disman,dismark,dismask,dismast,dismay,disme,dismiss,disna,disnest,disnew,disobey,disodic,disomic,disomus,disorb,disown,dispark,dispart,dispel,dispend,display,dispone,dispope,disport,dispose,dispost,dispulp,dispute,disrank,disrate,disring,disrobe,disroof,disroot,disrump,disrupt,diss,disseat,dissect,dissent,dissert,dissoul,dissuit,distad,distaff,distain,distal,distale,distant,distend,distent,distich,distill,distome,distort,distune,disturb,disturn,disuse,diswood,disyoke,dit,dita,dital,ditch,ditcher,dite,diter,dither,dithery,dithion,ditolyl,ditone,dittamy,dittany,dittay,dittied,ditto,ditty,diurnal,diurne,div,diva,divan,divata,dive,divel,diver,diverge,divers,diverse,divert,divest,divide,divided,divider,divine,diviner,diving,divinyl,divisor,divorce,divot,divoto,divulge,divulse,divus,divvy,diwata,dixie,dixit,dixy,dizain,dizen,dizoic,dizzard,dizzily,dizzy,djave,djehad,djerib,djersa,do,doab,doable,doarium,doat,doated,doater,doating,doatish,dob,dobbed,dobber,dobbin,dobbing,dobby,dobe,dobla,doblon,dobra,dobrao,dobson,doby,doc,docent,docible,docile,docity,dock,dockage,docken,docker,docket,dockize,dockman,docmac,doctor,doctrix,dod,dodd,doddart,dodded,dodder,doddery,doddie,dodding,doddle,doddy,dodecyl,dodge,dodger,dodgery,dodgily,dodgy,dodkin,dodlet,dodman,dodo,dodoism,dodrans,doe,doebird,doeglic,doer,does,doeskin,doesnt,doest,doff,doffer,dog,dogal,dogate,dogbane,dogbite,dogblow,dogboat,dogbolt,dogbush,dogcart,dogdom,doge,dogedom,dogface,dogfall,dogfish,dogfoot,dogged,dogger,doggery,doggess,doggish,doggo,doggone,doggrel,doggy,doghead,doghole,doghood,dogie,dogless,doglike,dogly,dogma,dogman,dogmata,dogs,dogship,dogskin,dogtail,dogtie,dogtrot,dogvane,dogwood,dogy,doigt,doiled,doily,doina,doing,doings,doit,doited,doitkin,doke,dokhma,dola,dolabra,dolcan,dolcian,dolcino,doldrum,dole,doleful,dolent,doless,doli,dolia,dolina,doline,dolium,doll,dollar,dolldom,dollier,dollish,dollop,dolly,dolman,dolmen,dolor,dolose,dolous,dolphin,dolt,doltish,dom,domain,domal,domba,dome,doment,domer,domett,domic,domical,domine,dominie,domino,dominus,domite,domitic,domn,domnei,domoid,dompt,domy,don,donable,donary,donate,donated,donatee,donator,donax,done,donee,doney,dong,donga,dongon,donjon,donkey,donna,donnert,donnish,donnism,donnot,donor,donship,donsie,dont,donum,doob,doocot,doodab,doodad,doodle,doodler,dooja,dook,dooket,dookit,dool,doolee,dooley,dooli,doolie,dooly,doom,doomage,doomer,doomful,dooms,doon,door,doorba,doorboy,doored,doorman,doorway,dop,dopa,dopatta,dope,doper,dopey,dopper,doppia,dor,dorab,dorad,dorado,doree,dorhawk,doria,dorje,dorlach,dorlot,dorm,dormant,dormer,dormie,dormy,dorn,dorneck,dornic,dornick,dornock,dorp,dorsad,dorsal,dorsale,dorsel,dorser,dorsum,dorter,dorts,dorty,doruck,dory,dos,dosa,dosadh,dosage,dose,doser,dosis,doss,dossal,dossel,dosser,dossier,dossil,dossman,dot,dotage,dotal,dotard,dotardy,dotate,dotchin,dote,doted,doter,doting,dotish,dotkin,dotless,dotlike,dotted,dotter,dottily,dotting,dottle,dottler,dotty,doty,douar,double,doubled,doubler,doublet,doubly,doubt,doubter,douc,douce,doucely,doucet,douche,doucin,doucine,doudle,dough,dought,doughty,doughy,doum,doup,douping,dour,dourine,dourly,douse,douser,dout,douter,doutous,dove,dovecot,dovekey,dovekie,dovelet,dover,dovish,dow,dowable,dowager,dowcet,dowd,dowdily,dowdy,dowed,dowel,dower,doweral,dowery,dowf,dowie,dowily,dowitch,dowl,dowlas,dowless,down,downby,downcry,downcut,downer,downily,downlie,downset,downway,downy,dowp,dowry,dowse,dowser,dowset,doxa,doxy,doze,dozed,dozen,dozener,dozenth,dozer,dozily,dozy,dozzled,drab,drabbet,drabble,drabby,drably,drachm,drachma,dracma,draff,draffy,draft,draftee,drafter,drafty,drag,dragade,dragbar,dragged,dragger,draggle,draggly,draggy,dragman,dragnet,drago,dragon,dragoon,dragsaw,drail,drain,draine,drained,drainer,drake,dram,drama,dramm,dramme,drammed,drammer,drang,drank,drant,drape,draper,drapery,drassid,drastic,drat,drate,dratted,draught,dravya,draw,drawarm,drawbar,drawboy,drawcut,drawee,drawer,drawers,drawing,drawk,drawl,drawler,drawly,drawn,drawnet,drawoff,drawout,drawrod,dray,drayage,drayman,drazel,dread,dreader,dreadly,dream,dreamer,dreamsy,dreamt,dreamy,drear,drearly,dreary,dredge,dredger,dree,dreep,dreepy,dreg,dreggy,dregs,drench,dreng,dress,dressed,dresser,dressy,drest,drew,drewite,drias,drib,dribble,driblet,driddle,dried,drier,driest,drift,drifter,drifty,drill,driller,drillet,dringle,drink,drinker,drinn,drip,dripper,dripple,drippy,drisk,drivage,drive,drivel,driven,driver,driving,drizzle,drizzly,droddum,drogh,drogher,drogue,droit,droll,drolly,drome,dromic,dromond,dromos,drona,dronage,drone,droner,drongo,dronish,drony,drool,droop,drooper,droopt,droopy,drop,droplet,dropman,dropout,dropper,droppy,dropsy,dropt,droshky,drosky,dross,drossel,drosser,drossy,drostdy,droud,drought,drouk,drove,drover,drovy,drow,drown,drowner,drowse,drowsy,drub,drubber,drubbly,drucken,drudge,drudger,druery,drug,drugger,drugget,druggy,drugman,druid,druidic,druidry,druith,drum,drumble,drumlin,drumly,drummer,drummy,drung,drungar,drunk,drunken,drupal,drupe,drupel,druse,drusy,druxy,dry,dryad,dryadic,dryas,drycoal,dryfoot,drying,dryish,dryly,dryness,dryster,dryth,duad,duadic,dual,duali,dualin,dualism,dualist,duality,dualize,dually,duarch,duarchy,dub,dubash,dubb,dubba,dubbah,dubber,dubbing,dubby,dubiety,dubious,dubs,ducal,ducally,ducape,ducat,ducato,ducdame,duces,duchess,duchy,duck,ducker,duckery,duckie,ducking,duckpin,duct,ducted,ductile,duction,ductor,ductule,dud,dudaim,dudder,duddery,duddies,dude,dudeen,dudgeon,dudine,dudish,dudism,dudler,dudley,dudman,due,duel,dueler,dueling,duelist,duello,dueness,duenna,duer,duet,duff,duffel,duffer,duffing,dufoil,dufter,duftery,dug,dugal,dugdug,duggler,dugong,dugout,dugway,duhat,duiker,duim,duit,dujan,duke,dukedom,dukely,dukery,dukhn,dukker,dulbert,dulcet,dulcian,dulcify,dulcose,duledge,duler,dulia,dull,dullard,duller,dullery,dullify,dullish,dullity,dully,dulosis,dulotic,dulse,dult,dultie,duly,dum,duma,dumaist,dumb,dumba,dumbcow,dumbly,dumdum,dummel,dummy,dumose,dump,dumpage,dumper,dumpily,dumping,dumpish,dumple,dumpoke,dumpy,dumsola,dun,dunair,dunal,dunbird,dunce,duncery,dunch,duncify,duncish,dunder,dune,dunfish,dung,dungeon,dunger,dungol,dungon,dungy,dunite,dunk,dunker,dunlin,dunnage,dunne,dunner,dunness,dunnish,dunnite,dunnock,dunny,dunst,dunt,duntle,duny,duo,duodena,duodene,duole,duopod,duopoly,duotone,duotype,dup,dupable,dupe,dupedom,duper,dupery,dupion,dupla,duple,duplet,duplex,duplify,duplone,duppy,dura,durable,durably,durain,dural,duramen,durance,durant,durax,durbar,dure,durene,durenol,duress,durgan,durian,during,durity,durmast,durn,duro,durra,durrie,durrin,durry,durst,durwaun,duryl,dusack,duscle,dush,dusio,dusk,dusken,duskily,duskish,duskly,dusky,dust,dustbin,dustbox,dustee,duster,dustily,dusting,dustman,dustpan,dustuck,dusty,dutch,duteous,dutied,dutiful,dutra,duty,duumvir,duvet,duvetyn,dux,duyker,dvaita,dvandva,dwale,dwalm,dwang,dwarf,dwarfy,dwell,dwelled,dweller,dwelt,dwindle,dwine,dyad,dyadic,dyarchy,dyaster,dyce,dye,dyeable,dyeing,dyer,dyester,dyeware,dyeweed,dyewood,dying,dyingly,dyke,dyker,dynamic,dynamis,dynamo,dynast,dynasty,dyne,dyphone,dyslogy,dysnomy,dyspnea,dystome,dysuria,dysuric,dzeren,e,ea,each,eager,eagerly,eagle,eagless,eaglet,eagre,ean,ear,earache,earbob,earcap,eardrop,eardrum,eared,earful,earhole,earing,earl,earlap,earldom,earless,earlet,earlike,earlish,earlock,early,earmark,earn,earner,earnest,earnful,earning,earpick,earplug,earring,earshot,earsore,eartab,earth,earthed,earthen,earthly,earthy,earwax,earwig,earworm,earwort,ease,easeful,easel,easer,easier,easiest,easily,easing,east,easter,eastern,easting,easy,eat,eatable,eatage,eaten,eater,eatery,eating,eats,eave,eaved,eaver,eaves,ebb,ebbman,eboe,ebon,ebonist,ebonite,ebonize,ebony,ebriate,ebriety,ebrious,ebulus,eburine,ecad,ecanda,ecarte,ecbatic,ecbole,ecbolic,ecdemic,ecderon,ecdysis,ecesic,ecesis,eche,echea,echelon,echidna,echinal,echinid,echinus,echo,echoer,echoic,echoism,echoist,echoize,ecize,ecklein,eclair,eclat,eclegm,eclegma,eclipse,eclogue,ecoid,ecole,ecology,economy,ecotone,ecotype,ecphore,ecru,ecstasy,ectad,ectal,ectally,ectasia,ectasis,ectatic,ectene,ecthyma,ectiris,ectopia,ectopic,ectopy,ectozoa,ectypal,ectype,eczema,edacity,edaphic,edaphon,edder,eddish,eddo,eddy,edea,edeagra,edeitis,edema,edemic,edenite,edental,edestan,edestin,edge,edged,edgeman,edger,edging,edgrew,edgy,edh,edible,edict,edictal,edicule,edifice,edifier,edify,edit,edital,edition,editor,educand,educate,educe,educive,educt,eductor,eegrass,eel,eelboat,eelbob,eelcake,eeler,eelery,eelfare,eelfish,eellike,eelpot,eelpout,eelshop,eelskin,eelware,eelworm,eely,eer,eerie,eerily,effable,efface,effacer,effect,effects,effendi,effete,effigy,efflate,efflux,efform,effort,effulge,effund,effuse,eft,eftest,egad,egality,egence,egeran,egest,egesta,egg,eggcup,egger,eggfish,egghead,egghot,egging,eggler,eggless,egglike,eggnog,eggy,egilops,egipto,egma,ego,egohood,egoism,egoist,egoity,egoize,egoizer,egol,egomism,egotism,egotist,egotize,egress,egret,eh,eheu,ehlite,ehuawa,eident,eider,eidetic,eidolic,eidolon,eight,eighth,eighty,eigne,eimer,einkorn,eisodic,either,eject,ejecta,ejector,ejoo,ekaha,eke,eker,ekerite,eking,ekka,ekphore,ektene,ektenes,el,elaidic,elaidin,elain,elaine,elance,eland,elanet,elapid,elapine,elapoid,elapse,elastic,elastin,elatcha,elate,elated,elater,elation,elative,elator,elb,elbow,elbowed,elbower,elbowy,elcaja,elchee,eld,elder,elderly,eldest,eldin,elding,eldress,elect,electee,electly,elector,electro,elegant,elegiac,elegist,elegit,elegize,elegy,eleidin,element,elemi,elemin,elench,elenchi,elenge,elevate,eleven,elevon,elf,elfhood,elfic,elfin,elfish,elfkin,elfland,elflike,elflock,elfship,elfwife,elfwort,elicit,elide,elision,elisor,elite,elixir,elk,elkhorn,elkslip,elkwood,ell,ellagic,elle,elleck,ellfish,ellipse,ellops,ellwand,elm,elmy,elocute,elod,eloge,elogium,eloign,elope,eloper,elops,els,else,elsehow,elsin,elt,eluate,elude,eluder,elusion,elusive,elusory,elute,elution,elutor,eluvial,eluvium,elvan,elver,elves,elvet,elvish,elysia,elytral,elytrin,elytron,elytrum,em,emanant,emanate,emanium,emarcid,emball,embalm,embank,embar,embargo,embark,embassy,embathe,embay,embed,embelic,ember,embind,embira,emblaze,emblem,emblema,emblic,embody,embog,embole,embolic,embolo,embolum,embolus,emboly,embosom,emboss,embound,embow,embowed,embowel,embower,embox,embrace,embrail,embroil,embrown,embryo,embryon,embuia,embus,embusk,emcee,eme,emeer,emend,emender,emerald,emerge,emerize,emerse,emersed,emery,emesis,emetic,emetine,emgalla,emigree,eminent,emir,emirate,emit,emitter,emma,emmenic,emmer,emmet,emodin,emoloa,emote,emotion,emotive,empall,empanel,empaper,empark,empasm,empathy,emperor,empery,empire,empiric,emplace,emplane,employ,emplume,emporia,empower,empress,emprise,empt,emptier,emptily,emptins,emption,emptor,empty,empyema,emu,emulant,emulate,emulous,emulsin,emulsor,emyd,emydian,en,enable,enabler,enact,enactor,enaena,enage,enalid,enam,enamber,enamdar,enamel,enamor,enapt,enarbor,enarch,enarm,enarme,enate,enatic,enation,enbrave,encage,encake,encamp,encase,encash,encauma,encave,encell,enchain,enchair,enchant,enchase,enchest,encina,encinal,encist,enclasp,enclave,encloak,enclose,encloud,encoach,encode,encoil,encolor,encomia,encomic,encoop,encore,encowl,encraal,encraty,encreel,encrisp,encrown,encrust,encrypt,encup,encurl,encyst,end,endable,endarch,endaze,endear,ended,endemic,ender,endere,enderon,endevil,endew,endgate,ending,endite,endive,endless,endlong,endmost,endogen,endome,endopod,endoral,endore,endorse,endoss,endotys,endow,endower,endozoa,endue,endura,endure,endurer,endways,endwise,endyma,endymal,endysis,enema,enemy,energic,energid,energy,eneuch,eneugh,enface,enfelon,enfeoff,enfever,enfile,enfiled,enflesh,enfoil,enfold,enforce,enfork,enfoul,enframe,enfree,engage,engaged,engager,engaol,engarb,engaud,engaze,engem,engild,engine,engird,engirt,englad,englobe,engloom,englory,englut,englyn,engobe,engold,engore,engorge,engrace,engraff,engraft,engrail,engrain,engram,engrasp,engrave,engreen,engross,enguard,engulf,enhalo,enhance,enhat,enhaunt,enheart,enhedge,enhelm,enherit,enhusk,eniac,enigma,enisle,enjail,enjamb,enjelly,enjewel,enjoin,enjoy,enjoyer,enkraal,enlace,enlard,enlarge,enleaf,enlief,enlife,enlight,enlink,enlist,enliven,enlock,enlodge,enmask,enmass,enmesh,enmist,enmity,enmoss,ennead,ennerve,enniche,ennoble,ennoic,ennomic,ennui,enocyte,enodal,enoil,enol,enolate,enolic,enolize,enomoty,enoplan,enorm,enough,enounce,enow,enplane,enquire,enquiry,enrace,enrage,enraged,enrange,enrank,enrapt,enray,enrib,enrich,enring,enrive,enrobe,enrober,enrol,enroll,enroot,enrough,enruin,enrut,ens,ensaint,ensand,ensate,enscene,ense,enseam,enseat,enseem,enserf,ensete,enshade,enshawl,enshell,ensign,ensile,ensky,enslave,ensmall,ensnare,ensnarl,ensnow,ensoul,enspell,enstamp,enstar,enstate,ensteel,enstool,enstore,ensuant,ensue,ensuer,ensure,ensurer,ensweep,entach,entad,entail,ental,entame,entasia,entasis,entelam,entente,enter,enteral,enterer,enteria,enteric,enteron,entheal,enthral,enthuse,entia,entice,enticer,entify,entire,entiris,entitle,entity,entoil,entomb,entomic,entone,entopic,entotic,entozoa,entrail,entrain,entrant,entrap,entreat,entree,entropy,entrust,entry,entwine,entwist,enure,enurny,envapor,envault,enveil,envelop,envenom,envied,envier,envious,environ,envoy,envy,envying,enwiden,enwind,enwisen,enwoman,enwomb,enwood,enwound,enwrap,enwrite,enzone,enzooty,enzym,enzyme,enzymic,eoan,eolith,eon,eonism,eophyte,eosate,eoside,eosin,eosinic,eozoon,epacme,epacrid,epact,epactal,epagoge,epanody,eparch,eparchy,epaule,epaulet,epaxial,epee,epeeist,epeiric,epeirid,epergne,epha,ephah,ephebe,ephebic,ephebos,ephebus,ephelis,ephetae,ephete,ephetic,ephod,ephor,ephoral,ephoric,ephorus,ephyra,epibole,epiboly,epic,epical,epicarp,epicede,epicele,epicene,epichil,epicism,epicist,epicly,epicure,epicyte,epidemy,epiderm,epidote,epigeal,epigean,epigeic,epigene,epigone,epigram,epigyne,epigyny,epihyal,epikeia,epilate,epilobe,epimer,epimere,epimyth,epinaos,epinine,epiotic,epipial,episode,epistle,epitaph,epitela,epithem,epithet,epitoke,epitome,epiural,epizoa,epizoal,epizoan,epizoic,epizoon,epoch,epocha,epochal,epode,epodic,eponym,eponymy,epopee,epopt,epoptes,epoptic,epos,epsilon,epulary,epulis,epulo,epuloid,epural,epurate,equable,equably,equal,equally,equant,equate,equator,equerry,equid,equine,equinia,equinox,equinus,equip,equiped,equison,equites,equity,equoid,er,era,erade,eral,eranist,erase,erased,eraser,erasion,erasure,erbia,erbium,erd,erdvark,ere,erect,erecter,erectly,erector,erelong,eremic,eremite,erenach,erenow,erepsin,erept,ereptic,erethic,erg,ergal,ergasia,ergates,ergodic,ergoism,ergon,ergot,ergoted,ergotic,ergotin,ergusia,eria,eric,ericad,erical,ericius,ericoid,erika,erikite,erineum,erinite,erinose,eristic,erizo,erlking,ermelin,ermine,ermined,erminee,ermines,erne,erode,eroded,erodent,erogeny,eros,erose,erosely,erosion,erosive,eroteme,erotic,erotica,erotism,err,errable,errancy,errand,errant,errata,erratic,erratum,errhine,erring,errite,error,ers,ersatz,erth,erthen,erthly,eruc,eruca,erucic,erucin,eruct,erudit,erudite,erugate,erupt,eryngo,es,esca,escalan,escalin,escalop,escape,escapee,escaper,escarp,eschar,eschara,escheat,eschew,escoba,escolar,escort,escribe,escrol,escrow,escudo,esculin,esere,eserine,esexual,eshin,esker,esne,esodic,esotery,espadon,esparto,espave,espial,espier,espinal,espino,esplees,espouse,espy,esquire,ess,essang,essay,essayer,essed,essence,essency,essling,essoin,estadal,estadio,estado,estamp,estate,esteem,ester,estevin,estival,estmark,estoc,estoile,estop,estrade,estray,estre,estreat,estrepe,estrin,estriol,estrone,estrous,estrual,estuary,estufa,estuous,estus,eta,etacism,etacist,etalon,etamine,etch,etcher,etching,eternal,etesian,ethal,ethanal,ethane,ethanol,ethel,ethene,ethenic,ethenol,ethenyl,ether,ethered,etheric,etherin,ethic,ethical,ethics,ethid,ethide,ethine,ethiops,ethmoid,ethnal,ethnic,ethnize,ethnos,ethos,ethoxyl,ethrog,ethyl,ethylic,ethylin,ethyne,ethynyl,etiolin,etna,ettle,etua,etude,etui,etym,etymic,etymon,etypic,eu,euaster,eucaine,euchre,euchred,euclase,eucone,euconic,eucrasy,eucrite,euge,eugenic,eugenol,eugeny,eulalia,eulogia,eulogic,eulogy,eumenid,eunicid,eunomy,eunuch,euonym,euonymy,euouae,eupad,eupathy,eupepsy,euphemy,euphon,euphone,euphony,euphory,euphroe,eupione,euploid,eupnea,eureka,euripus,eurite,eurobin,euryon,eusol,eustyle,eutaxic,eutaxy,eutexia,eutony,evacue,evacuee,evade,evader,evalue,evangel,evanish,evase,evasion,evasive,eve,evejar,evelong,even,evener,evening,evenly,evens,event,eveque,ever,evert,evertor,everwho,every,evestar,evetide,eveweed,evict,evictor,evident,evil,evilly,evince,evirate,evisite,evitate,evocate,evoe,evoke,evoker,evolute,evolve,evolver,evovae,evulse,evzone,ewder,ewe,ewer,ewerer,ewery,ewry,ex,exact,exacter,exactly,exactor,exalate,exalt,exalted,exalter,exam,examen,examine,example,exarate,exarch,exarchy,excamb,excave,exceed,excel,except,excerpt,excess,excide,exciple,excise,excisor,excite,excited,exciter,excitor,exclaim,exclave,exclude,excreta,excrete,excurse,excusal,excuse,excuser,excuss,excyst,exdie,exeat,execute,exedent,exedra,exegete,exempt,exequy,exergue,exert,exes,exeunt,exflect,exhale,exhaust,exhibit,exhort,exhume,exhumer,exigent,exile,exiler,exilian,exilic,exility,exist,exister,exit,exite,exition,exitus,exlex,exocarp,exocone,exode,exoderm,exodic,exodist,exodos,exodus,exody,exogamy,exogen,exogeny,exomion,exomis,exon,exoner,exopod,exordia,exormia,exosmic,exostra,exotic,exotism,expand,expanse,expect,expede,expel,expend,expense,expert,expiate,expire,expiree,expirer,expiry,explain,explant,explode,exploit,explore,expone,export,exposal,expose,exposed,exposer,exposit,expound,express,expugn,expulse,expunge,expurge,exradio,exscind,exsect,exsert,exship,exsurge,extant,extend,extense,extent,exter,extern,externe,extima,extinct,extine,extol,extoll,extort,extra,extract,extrait,extreme,extrude,extund,exudate,exude,exult,exultet,exuviae,exuvial,ey,eyah,eyalet,eyas,eye,eyeball,eyebalm,eyebar,eyebeam,eyebolt,eyebree,eyebrow,eyecup,eyed,eyedot,eyedrop,eyeflap,eyeful,eyehole,eyelash,eyeless,eyelet,eyelid,eyelike,eyeline,eyemark,eyen,eyepit,eyer,eyeroot,eyeseed,eyeshot,eyesome,eyesore,eyespot,eyewash,eyewear,eyewink,eyewort,eyey,eying,eyn,eyne,eyot,eyoty,eyra,eyre,eyrie,eyrir,ezba,f,fa,fabella,fabes,fable,fabled,fabler,fabliau,fabling,fabric,fabular,facadal,facade,face,faced,faceman,facer,facet,facete,faceted,facia,facial,faciend,facient,facies,facile,facing,fack,fackins,facks,fact,factful,faction,factish,factive,factor,factory,factrix,factual,factum,facture,facty,facula,facular,faculty,facund,facy,fad,fadable,faddish,faddism,faddist,faddle,faddy,fade,faded,fadedly,faden,fader,fadge,fading,fady,fae,faerie,faery,faff,faffle,faffy,fag,fagald,fage,fager,fagger,faggery,fagging,fagine,fagot,fagoter,fagoty,faham,fahlerz,fahlore,faience,fail,failing,faille,failure,fain,fainly,fains,faint,fainter,faintly,faints,fainty,faipule,fair,fairer,fairily,fairing,fairish,fairly,fairm,fairway,fairy,faith,faitour,fake,faker,fakery,fakir,faky,falbala,falcade,falcate,falcer,falces,falcial,falcon,falcula,faldage,faldfee,fall,fallace,fallacy,fallage,fallen,faller,falling,fallow,fallway,fally,falsary,false,falsely,falsen,falser,falsie,falsify,falsism,faltche,falter,falutin,falx,fam,famble,fame,fameful,familia,family,famine,famish,famous,famulus,fan,fana,fanal,fanam,fanatic,fanback,fancied,fancier,fancify,fancy,fand,fandom,fanega,fanfare,fanfoot,fang,fanged,fangle,fangled,fanglet,fangot,fangy,fanion,fanlike,fanman,fannel,fanner,fannier,fanning,fanon,fant,fantail,fantast,fantasy,fantod,fanweed,fanwise,fanwork,fanwort,faon,far,farad,faraday,faradic,faraway,farce,farcer,farcial,farcied,farcify,farcing,farcist,farcy,farde,fardel,fardh,fardo,fare,farer,farfara,farfel,fargood,farina,faring,farish,farl,farleu,farm,farmage,farmer,farmery,farming,farmost,farmy,farness,faro,farrago,farrand,farrier,farrow,farruca,farse,farseer,farset,farther,fasces,fascet,fascia,fascial,fascine,fascis,fascism,fascist,fash,fasher,fashery,fashion,fass,fast,fasten,faster,fasting,fastish,fastus,fat,fatal,fatally,fatbird,fate,fated,fateful,fathead,father,fathmur,fathom,fatidic,fatigue,fatiha,fatil,fatless,fatling,fatly,fatness,fatsia,fatten,fatter,fattily,fattish,fatty,fatuism,fatuity,fatuoid,fatuous,fatwood,faucal,fauces,faucet,faucial,faucre,faugh,fauld,fault,faulter,faulty,faun,faunal,faunish,faunist,faunule,fause,faust,fautor,fauve,favella,favilla,favism,favissa,favn,favor,favored,favorer,favose,favous,favus,fawn,fawner,fawnery,fawning,fawny,fay,fayles,faze,fazenda,fe,feague,feak,feal,fealty,fear,feared,fearer,fearful,feasor,feast,feasten,feaster,feat,feather,featly,featous,feature,featy,feaze,febrile,fecal,feces,feck,feckful,feckly,fecula,fecund,fed,feddan,federal,fee,feeable,feeble,feebly,feed,feedbin,feedbox,feeder,feeding,feedman,feedway,feedy,feel,feeler,feeless,feeling,feer,feere,feering,feetage,feeze,fegary,fei,feif,feigher,feign,feigned,feigner,feil,feint,feis,feist,feisty,felid,feline,fell,fellage,fellah,fellen,feller,fellic,felling,felloe,fellow,felly,feloid,felon,felonry,felony,fels,felsite,felt,felted,felter,felting,felty,felucca,felwort,female,feme,femic,feminal,feminie,feminin,femora,femoral,femur,fen,fenbank,fence,fencer,fenchyl,fencing,fend,fender,fendy,fenite,fenks,fenland,fenman,fennec,fennel,fennig,fennish,fenny,fensive,fent,fenter,feod,feodal,feodary,feoff,feoffee,feoffor,feower,feral,feralin,ferash,ferdwit,ferfet,feria,ferial,feridgi,ferie,ferine,ferity,ferk,ferling,ferly,fermail,ferme,ferment,fermery,fermila,fern,ferned,fernery,ferny,feroher,ferrado,ferrate,ferrean,ferret,ferrety,ferri,ferric,ferrier,ferrite,ferrous,ferrule,ferrum,ferry,fertile,feru,ferula,ferule,ferulic,fervent,fervid,fervor,fescue,fess,fessely,fest,festal,fester,festine,festive,festoon,festuca,fet,fetal,fetch,fetched,fetcher,fetial,fetid,fetidly,fetish,fetlock,fetlow,fetor,fetter,fettle,fettler,fetus,feu,feuage,feuar,feucht,feud,feudal,feudee,feudist,feued,feuille,fever,feveret,few,fewness,fewsome,fewter,fey,feyness,fez,fezzed,fezzy,fi,fiacre,fiance,fiancee,fiar,fiard,fiasco,fiat,fib,fibber,fibbery,fibdom,fiber,fibered,fibril,fibrin,fibrine,fibroid,fibroin,fibroma,fibrose,fibrous,fibry,fibster,fibula,fibulae,fibular,ficary,fice,ficelle,fiche,fichu,fickle,fickly,fico,ficoid,fictile,fiction,fictive,fid,fidalgo,fidate,fiddle,fiddler,fiddley,fide,fideism,fideist,fidfad,fidge,fidget,fidgety,fiducia,fie,fiefdom,field,fielded,fielder,fieldy,fiend,fiendly,fient,fierce,fiercen,fierily,fiery,fiesta,fife,fifer,fifie,fifish,fifo,fifteen,fifth,fifthly,fifty,fig,figaro,figbird,figent,figged,figgery,figging,figgle,figgy,fight,fighter,figless,figlike,figment,figural,figure,figured,figurer,figury,figworm,figwort,fike,fikie,filace,filacer,filao,filar,filaria,filasse,filate,filator,filbert,filch,filcher,file,filemot,filer,filet,filial,filiate,filibeg,filical,filicic,filicin,filiety,filing,filings,filippo,filite,fill,filled,filler,fillet,filleul,filling,fillip,fillock,filly,film,filmdom,filmet,filmic,filmily,filmish,filmist,filmize,filmy,filo,filose,fils,filter,filth,filthy,fimble,fimbria,fin,finable,finagle,final,finale,finally,finance,finback,finch,finched,find,findal,finder,finding,findjan,fine,fineish,finely,finer,finery,finesse,finetop,finfish,finfoot,fingent,finger,fingery,finial,finical,finick,finific,finify,finikin,fining,finis,finish,finite,finity,finjan,fink,finkel,finland,finless,finlet,finlike,finnac,finned,finner,finnip,finny,fiord,fiorded,fiorin,fiorite,fip,fipenny,fipple,fique,fir,firca,fire,firearm,firebox,fireboy,firebug,fired,firedog,firefly,firelit,fireman,firer,firetop,firing,firk,firker,firkin,firlot,firm,firman,firmer,firmly,firn,firring,firry,first,firstly,firth,fisc,fiscal,fise,fisetin,fish,fishbed,fished,fisher,fishery,fishet,fisheye,fishful,fishgig,fishify,fishily,fishing,fishlet,fishman,fishpot,fishway,fishy,fisnoga,fissate,fissile,fission,fissive,fissure,fissury,fist,fisted,fister,fistful,fistic,fistify,fisting,fistuca,fistula,fistule,fisty,fit,fitch,fitched,fitchee,fitcher,fitchet,fitchew,fitful,fitly,fitment,fitness,fitout,fitroot,fittage,fitted,fitten,fitter,fitters,fittily,fitting,fitty,fitweed,five,fivebar,fiver,fives,fix,fixable,fixage,fixate,fixatif,fixator,fixed,fixedly,fixer,fixing,fixity,fixture,fixure,fizgig,fizz,fizzer,fizzle,fizzy,fjeld,flabby,flabrum,flaccid,flack,flacked,flacker,flacket,flaff,flaffer,flag,flagger,flaggy,flaglet,flagman,flagon,flail,flair,flaith,flak,flakage,flake,flaker,flakily,flaky,flam,flamant,flamb,flame,flamed,flamen,flamer,flamfew,flaming,flamy,flan,flanch,flandan,flane,flange,flanger,flank,flanked,flanker,flanky,flannel,flanque,flap,flapper,flare,flaring,flary,flaser,flash,flasher,flashet,flashly,flashy,flask,flasker,flasket,flasque,flat,flatcap,flatcar,flatdom,flated,flathat,flatlet,flatly,flatman,flatten,flatter,flattie,flattop,flatus,flatway,flaught,flaunt,flaunty,flavedo,flavic,flavid,flavin,flavine,flavo,flavone,flavor,flavory,flavour,flaw,flawed,flawful,flawn,flawy,flax,flaxen,flaxman,flaxy,flay,flayer,flea,fleam,fleay,flebile,fleche,fleck,flecken,flecker,flecky,flector,fled,fledge,fledgy,flee,fleece,fleeced,fleecer,fleech,fleecy,fleer,fleerer,fleet,fleeter,fleetly,flemish,flench,flense,flenser,flerry,flesh,fleshed,fleshen,flesher,fleshly,fleshy,flet,fletch,flether,fleuret,fleury,flew,flewed,flewit,flews,flex,flexed,flexile,flexion,flexor,flexure,fley,flick,flicker,flicky,flidder,flier,fligger,flight,flighty,flimmer,flimp,flimsy,flinch,flinder,fling,flinger,flingy,flint,flinter,flinty,flioma,flip,flipe,flipper,flirt,flirter,flirty,flisk,flisky,flit,flitch,flite,fliting,flitter,flivver,flix,float,floater,floaty,flob,flobby,floc,floccus,flock,flocker,flocky,flocoon,flodge,floe,floey,flog,flogger,flokite,flong,flood,flooded,flooder,floody,floor,floorer,floozy,flop,flopper,floppy,flora,floral,floran,florate,floreal,florent,flores,floret,florid,florin,florist,floroon,florula,flory,flosh,floss,flosser,flossy,flot,flota,flotage,flotant,flotsam,flounce,flour,floury,flouse,flout,flouter,flow,flowage,flower,flowery,flowing,flown,flowoff,flu,fluate,fluavil,flub,flubdub,flucan,flue,flued,flueman,fluency,fluent,fluer,fluey,fluff,fluffer,fluffy,fluible,fluid,fluidal,fluidic,fluidly,fluke,fluked,flukily,fluking,fluky,flume,flummer,flummox,flump,flung,flunk,flunker,flunky,fluor,fluoran,fluoric,fluoryl,flurn,flurr,flurry,flush,flusher,flushy,flusk,flusker,fluster,flute,fluted,fluter,flutina,fluting,flutist,flutter,fluty,fluvial,flux,fluxer,fluxile,fluxion,fly,flyable,flyaway,flyback,flyball,flybane,flybelt,flyblow,flyboat,flyboy,flyer,flyflap,flying,flyleaf,flyless,flyman,flyness,flype,flytail,flytier,flytrap,flyway,flywort,foal,foaly,foam,foambow,foamer,foamily,foaming,foamy,fob,focal,focally,foci,focoids,focsle,focus,focuser,fod,fodda,fodder,foder,fodge,fodgel,fodient,foe,foehn,foeish,foeless,foelike,foeman,foeship,fog,fogbow,fogdog,fogdom,fogey,foggage,fogged,fogger,foggily,foggish,foggy,foghorn,fogle,fogless,fogman,fogo,fogon,fogou,fogram,fogus,fogy,fogydom,fogyish,fogyism,fohat,foible,foil,foiler,foiling,foining,foison,foist,foister,foisty,foiter,fold,foldage,folded,folden,folder,folding,foldure,foldy,fole,folia,foliage,folial,foliar,foliary,foliate,folie,folio,foliole,foliose,foliot,folious,folium,folk,folkmot,folksy,folkway,folky,folles,follis,follow,folly,foment,fomes,fomites,fondak,fondant,fondish,fondle,fondler,fondly,fondu,fondue,fonduk,fonly,fonnish,fono,fons,font,fontal,fonted,fontful,fontlet,foo,food,fooder,foodful,foody,fool,fooldom,foolery,fooless,fooling,foolish,fooner,fooster,foot,footage,footboy,footed,footer,footful,foothot,footing,footle,footler,footman,footpad,foots,footway,footy,foozle,foozler,fop,fopling,foppery,foppish,foppy,fopship,for,fora,forage,forager,foramen,forane,foray,forayer,forb,forbade,forbar,forbear,forbid,forbit,forbled,forblow,forbore,forbow,forby,force,forced,forceps,forcer,forche,forcing,ford,fordays,fording,fordo,fordone,fordy,fore,foreact,forearm,forebay,forecar,foreday,forefin,forefit,forego,foreign,forel,forelay,foreleg,foreman,forepad,forepaw,foreran,forerib,forerun,foresay,foresee,foreset,foresin,forest,foresty,foretop,foreuse,forever,forevow,forfar,forfare,forfars,forfeit,forfend,forge,forged,forger,forgery,forget,forgie,forging,forgive,forgo,forgoer,forgot,forgrow,forhoo,forhooy,forhow,forint,fork,forked,forker,forkful,forkman,forky,forleft,forlet,forlorn,form,formal,formant,format,formate,forme,formed,formee,formel,formene,former,formful,formic,formin,forming,formose,formula,formule,formy,formyl,fornent,fornix,forpet,forpine,forpit,forrad,forrard,forride,forrit,forrue,forsake,forset,forslow,fort,forte,forth,forthgo,forthy,forties,fortify,fortin,fortis,fortlet,fortune,forty,forum,forward,forwean,forwent,fosh,fosie,fossa,fossage,fossane,fosse,fossed,fossick,fossil,fossor,fossula,fossule,fostell,foster,fot,fotch,fother,fotmal,fotui,fou,foud,fouette,fougade,fought,foughty,foujdar,foul,foulage,foulard,fouler,fouling,foulish,foully,foumart,foun,found,founder,foundry,fount,four,fourble,fourche,fourer,fourre,fourth,foussa,foute,fouter,fouth,fovea,foveal,foveate,foveola,foveole,fow,fowk,fowl,fowler,fowlery,fowling,fox,foxbane,foxchop,foxer,foxery,foxfeet,foxfish,foxhole,foxily,foxing,foxish,foxlike,foxship,foxskin,foxtail,foxwood,foxy,foy,foyaite,foyboat,foyer,fozy,fra,frab,frabbit,frabous,fracas,frache,frack,fracted,frae,fraghan,fragile,fraid,fraik,frail,frailly,frailty,fraise,fraiser,frame,framea,framed,framer,framing,frammit,franc,franco,frank,franker,frankly,frantic,franzy,frap,frappe,frasco,frase,frasier,frass,frat,fratch,fratchy,frater,fratery,fratry,fraud,fraught,frawn,fraxin,fray,frayed,fraying,frayn,fraze,frazer,frazil,frazzle,freak,freaky,fream,freath,freck,frecken,frecket,freckle,freckly,free,freed,freedom,freeing,freeish,freely,freeman,freer,freet,freety,freeway,freeze,freezer,freight,freir,freit,freity,fremd,fremdly,frenal,frenate,frenum,frenzy,fresco,fresh,freshen,freshet,freshly,fresnel,fresno,fret,fretful,frett,frette,fretted,fretter,fretty,fretum,friable,friand,friar,friarly,friary,frib,fribble,fribby,fried,friend,frier,frieze,friezer,friezy,frig,frigate,friggle,fright,frighty,frigid,frijol,frike,frill,frilled,friller,frilly,frim,fringe,fringed,fringy,frisca,frisk,frisker,frisket,frisky,frison,frist,frisure,frit,frith,fritt,fritter,frivol,frixion,friz,frize,frizer,frizz,frizzer,frizzle,frizzly,frizzy,fro,frock,froe,frog,frogbit,frogeye,frogged,froggy,frogleg,froglet,frogman,froise,frolic,from,frond,fronded,front,frontad,frontal,fronted,fronter,froom,frore,frory,frosh,frost,frosted,froster,frosty,frot,froth,frother,frothy,frotton,frough,froughy,frounce,frow,froward,frower,frowl,frown,frowner,frowny,frowst,frowsty,frowy,frowze,frowzly,frowzy,froze,frozen,fructed,frugal,fruggan,fruit,fruited,fruiter,fruity,frump,frumple,frumpy,frush,frustum,frutify,fry,fryer,fu,fub,fubby,fubsy,fucate,fuchsin,fuci,fucoid,fucosan,fucose,fucous,fucus,fud,fuddle,fuddler,fuder,fudge,fudger,fudgy,fuel,fueler,fuerte,fuff,fuffy,fugal,fugally,fuggy,fugient,fugle,fugler,fugu,fugue,fuguist,fuidhir,fuji,fulcral,fulcrum,fulfill,fulgent,fulgid,fulgide,fulgor,fulham,fulk,full,fullam,fuller,fullery,fulling,fullish,fullom,fully,fulmar,fulmine,fulsome,fulth,fulvene,fulvid,fulvous,fulwa,fulyie,fulzie,fum,fumado,fumage,fumaric,fumaryl,fumble,fumbler,fume,fumer,fumet,fumette,fumily,fuming,fumose,fumous,fumy,fun,fund,fundal,funded,funder,fundi,fundic,funds,fundus,funeral,funest,fungal,fungate,fungi,fungian,fungic,fungin,fungo,fungoid,fungose,fungous,fungus,fungusy,funicle,funis,funk,funker,funky,funnel,funnily,funny,funori,funt,fur,fural,furan,furazan,furbish,furca,furcal,furcate,furcula,furdel,furfur,furiant,furied,furify,furil,furilic,furiosa,furioso,furious,furison,furl,furler,furless,furlong,furnace,furnage,furner,furnish,furoic,furoid,furoin,furole,furor,furore,furphy,furred,furrier,furrily,furring,furrow,furrowy,furry,further,furtive,fury,furyl,furze,furzed,furzery,furzy,fusain,fusate,fusc,fuscin,fuscous,fuse,fused,fusee,fusht,fusible,fusibly,fusil,fusilly,fusion,fusoid,fuss,fusser,fussify,fussily,fussock,fussy,fust,fustee,fustet,fustian,fustic,fustily,fustin,fustle,fusty,fusuma,fusure,fut,futchel,fute,futhorc,futile,futtock,futural,future,futuric,futwa,fuye,fuze,fuzz,fuzzily,fuzzy,fyke,fylfot,fyrd,g,ga,gab,gabbard,gabber,gabble,gabbler,gabbro,gabby,gabelle,gabgab,gabi,gabion,gable,gablet,gablock,gaby,gad,gadbee,gadbush,gadded,gadder,gaddi,gadding,gaddish,gade,gadfly,gadge,gadger,gadget,gadid,gadling,gadman,gadoid,gadroon,gadsman,gaduin,gadwall,gaen,gaet,gaff,gaffe,gaffer,gaffle,gag,gagate,gage,gagee,gageite,gager,gagger,gaggery,gaggle,gaggler,gagman,gagor,gagroot,gahnite,gaiassa,gaiety,gaily,gain,gainage,gaine,gainer,gainful,gaining,gainly,gains,gainsay,gainset,gainst,gair,gait,gaited,gaiter,gaiting,gaize,gaj,gal,gala,galah,galanas,galanga,galant,galany,galatea,galaxy,galban,gale,galea,galeage,galeate,galee,galeeny,galeid,galena,galenic,galeoid,galera,galerum,galerus,galet,galey,galgal,gali,galilee,galiot,galipot,gall,galla,gallah,gallant,gallate,galled,gallein,galleon,galler,gallery,gallet,galley,gallfly,gallic,galline,galling,gallium,gallnut,gallon,galloon,gallop,gallous,gallows,gally,galoot,galop,galore,galosh,galp,galt,galumph,galuth,galyac,galyak,gam,gamahe,gamasid,gamb,gamba,gambade,gambado,gambang,gambeer,gambet,gambia,gambier,gambist,gambit,gamble,gambler,gamboge,gambol,gambrel,game,gamebag,gameful,gamely,gamene,gametal,gamete,gametic,gamic,gamily,gamin,gaming,gamma,gammer,gammick,gammock,gammon,gammy,gamont,gamori,gamp,gamut,gamy,gan,ganam,ganch,gander,gandul,gandum,gane,ganef,gang,ganga,gangan,gangava,gangdom,gange,ganger,ganging,gangism,ganglia,gangly,gangman,gangrel,gangue,gangway,ganja,ganner,gannet,ganoid,ganoin,ganosis,gansel,gansey,gansy,gant,ganta,gantang,gantlet,ganton,gantry,gantsl,ganza,ganzie,gaol,gaoler,gap,gapa,gape,gaper,gapes,gaping,gapo,gappy,gapy,gar,gara,garad,garage,garance,garava,garawi,garb,garbage,garbel,garbell,garbill,garble,garbler,garboil,garbure,garce,gardant,gardeen,garden,gardeny,gardy,gare,gareh,garetta,garfish,garget,gargety,gargle,gargol,garial,gariba,garish,garland,garle,garlic,garment,garn,garnel,garner,garnet,garnets,garnett,garnetz,garnice,garniec,garnish,garoo,garrafa,garran,garret,garrot,garrote,garrupa,garse,garsil,garston,garten,garter,garth,garum,garvey,garvock,gas,gasbag,gaseity,gaseous,gash,gashes,gashful,gashly,gashy,gasify,gasket,gaskin,gasking,gaskins,gasless,gaslit,gaslock,gasman,gasp,gasper,gasping,gaspy,gasser,gassing,gassy,gast,gaster,gastral,gastric,gastrin,gat,gata,gatch,gate,gateado,gateage,gated,gateman,gater,gateway,gather,gating,gator,gatter,gau,gaub,gauby,gauche,gaud,gaudery,gaudful,gaudily,gaudy,gaufer,gauffer,gauffre,gaufre,gauge,gauger,gauging,gaulin,gault,gaulter,gaum,gaumish,gaumy,gaun,gaunt,gaunted,gauntly,gauntry,gaunty,gaup,gaupus,gaur,gaus,gauss,gauster,gaut,gauze,gauzily,gauzy,gavall,gave,gavel,gaveler,gavial,gavotte,gavyuti,gaw,gawby,gawcie,gawk,gawkily,gawkish,gawky,gawm,gawn,gawney,gawsie,gay,gayal,gayatri,gaybine,gaycat,gayish,gayment,gayness,gaysome,gayyou,gaz,gazabo,gaze,gazebo,gazee,gazel,gazelle,gazer,gazette,gazi,gazing,gazon,gazy,ge,geal,gean,gear,gearbox,geared,gearing,gearman,gearset,gease,geason,geat,gebang,gebanga,gebbie,gebur,geck,gecko,geckoid,ged,gedackt,gedder,gedeckt,gedrite,gee,geebong,geebung,geejee,geek,geelbec,geerah,geest,geet,geezer,gegg,geggee,gegger,geggery,gein,geira,geisha,geison,geitjie,gel,gelable,gelada,gelatin,geld,geldant,gelder,gelding,gelid,gelidly,gelilah,gell,gelly,gelong,gelose,gelosin,gelt,gem,gemauve,gemel,gemeled,gemless,gemlike,gemma,gemmae,gemmate,gemmer,gemmily,gemmoid,gemmula,gemmule,gemmy,gemot,gemsbok,gemul,gemuti,gemwork,gen,gena,genal,genapp,genarch,gender,gene,genear,geneat,geneki,genep,genera,general,generic,genesic,genesis,genet,genetic,geneva,genial,genian,genic,genie,genii,genin,genion,genip,genipa,genipap,genista,genital,genitor,genius,genizah,genoese,genom,genome,genomic,genos,genre,genro,gens,genson,gent,genteel,gentes,gentian,gentile,gentle,gently,gentman,gentry,genty,genu,genua,genual,genuine,genus,genys,geo,geobios,geodal,geode,geodesy,geodete,geodic,geodist,geoduck,geoform,geogeny,geogony,geoid,geoidal,geology,geomaly,geomant,geomyid,geonoma,geopony,georama,georgic,geosid,geoside,geotaxy,geotic,geoty,ger,gerah,geranic,geranyl,gerate,gerated,geratic,geraty,gerb,gerbe,gerbil,gercrow,gerefa,gerenda,gerent,gerenuk,gerim,gerip,germ,germal,german,germane,germen,germin,germina,germing,germon,germule,germy,gernitz,geront,geronto,gers,gersum,gerund,gerusia,gervao,gesith,gesning,gesso,gest,gestant,gestate,geste,gested,gesten,gestic,gestion,gesture,get,geta,getah,getaway,gether,getling,getter,getting,getup,geum,gewgaw,gewgawy,gey,geyan,geyser,gez,ghafir,ghaist,ghalva,gharial,gharnao,gharry,ghastly,ghat,ghatti,ghatwal,ghazi,ghazism,ghebeta,ghee,gheleem,gherkin,ghetti,ghetto,ghizite,ghoom,ghost,ghoster,ghostly,ghosty,ghoul,ghrush,ghurry,giant,giantly,giantry,giardia,giarra,giarre,gib,gibaro,gibbals,gibbed,gibber,gibbet,gibbles,gibbon,gibbose,gibbous,gibbus,gibby,gibe,gibel,giber,gibing,gibleh,giblet,giblets,gibus,gid,giddap,giddea,giddify,giddily,giddy,gidgee,gie,gied,gien,gif,gift,gifted,giftie,gig,gigback,gigeria,gigful,gigger,giggish,giggit,giggle,giggler,giggly,giglet,giglot,gigman,gignate,gigolo,gigot,gigsman,gigster,gigtree,gigunu,gilbert,gild,gilded,gilden,gilder,gilding,gilguy,gilia,gilim,gill,gilled,giller,gillie,gilling,gilly,gilo,gilpy,gilse,gilt,giltcup,gim,gimbal,gimble,gimel,gimlet,gimlety,gimmal,gimmer,gimmick,gimp,gimped,gimper,gimping,gin,ging,ginger,gingery,gingham,gingili,gingiva,gink,ginkgo,ginned,ginner,ginners,ginnery,ginney,ginning,ginnle,ginny,ginseng,ginward,gio,gip,gipon,gipper,gipser,gipsire,giraffe,girasol,girba,gird,girder,girding,girdle,girdler,girl,girleen,girlery,girlie,girling,girlish,girlism,girly,girn,girny,giro,girr,girse,girsh,girsle,girt,girth,gisarme,gish,gisla,gisler,gist,git,gitalin,gith,gitonin,gitoxin,gittern,gittith,give,given,giver,givey,giving,gizz,gizzard,gizzen,gizzern,glace,glaceed,glacial,glacier,glacis,glack,glad,gladden,gladdon,gladdy,glade,gladeye,gladful,gladify,gladii,gladius,gladly,glady,glaga,glaieul,glaik,glaiket,glair,glairy,glaive,glaived,glaked,glaky,glam,glamour,glance,glancer,gland,glandes,glans,glar,glare,glarily,glaring,glarry,glary,glashan,glass,glassen,glasser,glasses,glassie,glassy,glaucin,glaum,glaur,glaury,glaver,glaze,glazed,glazen,glazer,glazier,glazily,glazing,glazy,gleam,gleamy,glean,gleaner,gleary,gleba,glebal,glebe,glebous,glede,gledy,glee,gleed,gleeful,gleek,gleeman,gleet,gleety,gleg,glegly,glen,glenoid,glent,gleyde,glia,gliadin,glial,glib,glibly,glidder,glide,glider,gliding,gliff,glime,glimmer,glimpse,glink,glint,glioma,gliosa,gliosis,glirine,glisk,glisky,glisten,glister,glitter,gloam,gloat,gloater,global,globate,globe,globed,globin,globoid,globose,globous,globule,globy,glochid,glochis,gloea,gloeal,glom,glome,glommox,glomus,glonoin,gloom,gloomth,gloomy,glop,gloppen,glor,glore,glorify,glory,gloss,glossa,glossal,glossed,glosser,glossic,glossy,glost,glottal,glottic,glottid,glottis,glout,glove,glover,glovey,gloving,glow,glower,glowfly,glowing,gloy,gloze,glozing,glub,glucase,glucid,glucide,glucina,glucine,gluck,glucose,glue,glued,gluepot,gluer,gluey,glug,gluish,glum,gluma,glumal,glume,glumly,glummy,glumose,glump,glumpy,glunch,glusid,gluside,glut,glutch,gluteal,gluten,gluteus,glutin,glutoid,glutose,glutter,glutton,glycid,glycide,glycine,glycol,glycose,glycyl,glyoxal,glyoxim,glyoxyl,glyph,glyphic,glyptic,glyster,gnabble,gnar,gnarl,gnarled,gnarly,gnash,gnat,gnathal,gnathic,gnatter,gnatty,gnaw,gnawer,gnawing,gnawn,gneiss,gneissy,gnome,gnomed,gnomic,gnomide,gnomish,gnomist,gnomon,gnosis,gnostic,gnu,go,goa,goad,goaf,goal,goalage,goalee,goalie,goanna,goat,goatee,goateed,goatish,goatly,goaty,goave,gob,goback,goban,gobang,gobbe,gobber,gobbet,gobbin,gobbing,gobble,gobbler,gobby,gobelin,gobi,gobiid,gobioid,goblet,goblin,gobline,gobo,gobony,goburra,goby,gocart,god,goddard,godded,goddess,goddize,gode,godet,godhead,godhood,godkin,godless,godlet,godlike,godlily,godling,godly,godown,godpapa,godsend,godship,godson,godwit,goeduck,goel,goelism,goer,goes,goetia,goetic,goety,goff,goffer,goffle,gog,gogga,goggan,goggle,goggled,goggler,goggly,goglet,gogo,goi,going,goitcho,goiter,goitral,gol,gola,golach,goladar,gold,goldbug,goldcup,golden,golder,goldie,goldin,goldish,goldtit,goldy,golee,golem,golf,golfdom,golfer,goli,goliard,goliath,golland,gollar,golly,goloe,golpe,gomari,gomart,gomavel,gombay,gombeen,gomer,gomeral,gomlah,gomuti,gon,gonad,gonadal,gonadic,gonagra,gonakie,gonal,gonapod,gondang,gondite,gondola,gone,goner,gong,gongman,gonia,goniac,gonial,goniale,gonid,gonidia,gonidic,gonimic,gonion,gonitis,gonium,gonne,gony,gonys,goo,goober,good,gooding,goodish,goodly,goodman,goods,goody,goof,goofer,goofily,goofy,googly,googol,googul,gook,gool,goolah,gools,gooma,goon,goondie,goonie,goose,goosery,goosish,goosy,gopher,gopura,gor,gora,goracco,goral,goran,gorb,gorbal,gorbet,gorble,gorce,gorcock,gorcrow,gore,gorer,gorevan,gorfly,gorge,gorged,gorger,gorget,gorglin,gorhen,goric,gorilla,gorily,goring,gorlin,gorlois,gormaw,gormed,gorra,gorraf,gorry,gorse,gorsedd,gorsy,gory,gos,gosain,goschen,gosh,goshawk,goslet,gosling,gosmore,gospel,gosport,gossan,gossard,gossip,gossipy,gossoon,gossy,got,gotch,gote,gothite,gotra,gotraja,gotten,gouaree,gouge,gouger,goujon,goulash,goumi,goup,gourami,gourd,gourde,gourdy,gourmet,gousty,gout,goutify,goutily,goutish,goutte,gouty,gove,govern,gowan,gowdnie,gowf,gowfer,gowk,gowked,gowkit,gowl,gown,gownlet,gowpen,goy,goyim,goyin,goyle,gozell,gozzard,gra,grab,grabber,grabble,graben,grace,gracer,gracile,grackle,grad,gradal,gradate,graddan,grade,graded,gradely,grader,gradin,gradine,grading,gradual,gradus,graff,graffer,graft,grafted,grafter,graham,grail,grailer,grain,grained,grainer,grainy,graip,graisse,graith,grallic,gram,grama,grame,grammar,gramme,gramp,grampa,grampus,granada,granage,granary,granate,granch,grand,grandam,grandee,grandly,grandma,grandpa,grane,grange,granger,granite,grank,grannom,granny,grano,granose,grant,grantee,granter,grantor,granula,granule,granza,grape,graped,grapery,graph,graphic,graphy,graping,grapnel,grappa,grapple,grapy,grasp,grasper,grass,grassed,grasser,grasset,grassy,grat,grate,grater,grather,gratify,grating,gratis,gratten,graupel,grave,graved,gravel,gravely,graven,graver,gravic,gravid,graving,gravity,gravure,gravy,grawls,gray,grayfly,grayish,graylag,grayly,graze,grazer,grazier,grazing,grease,greaser,greasy,great,greaten,greater,greatly,greave,greaved,greaves,grebe,grece,gree,greed,greedy,green,greener,greeney,greenly,greenth,greenuk,greeny,greet,greeter,gregal,gregale,grege,greggle,grego,greige,grein,greisen,gremial,gremlin,grenade,greund,grew,grey,greyly,gribble,grice,grid,griddle,gride,griece,grieced,grief,grieve,grieved,griever,griff,griffe,griffin,griffon,grift,grifter,grig,grignet,grigri,grike,grill,grille,grilled,griller,grilse,grim,grimace,grime,grimful,grimily,grimly,grimme,grimp,grimy,grin,grinch,grind,grinder,grindle,gringo,grinner,grinny,grip,gripe,griper,griping,gripman,grippal,grippe,gripper,gripple,grippy,gripy,gris,grisard,griskin,grisly,grison,grist,grister,gristle,gristly,gristy,grit,grith,grits,gritten,gritter,grittle,gritty,grivet,grivna,grizzle,grizzly,groan,groaner,groat,groats,grobian,grocer,grocery,groff,grog,groggy,grogram,groin,groined,grommet,groom,groomer,groomy,groop,groose,groot,grooty,groove,groover,groovy,grope,groper,groping,gropple,gros,groser,groset,gross,grossen,grosser,grossly,grosso,grosz,groszy,grot,grotto,grouch,grouchy,grouf,grough,ground,grounds,groundy,group,grouped,grouper,grouse,grouser,grousy,grout,grouter,grouts,grouty,grouze,grove,groved,grovel,grovy,grow,growan,growed,grower,growing,growl,growler,growly,grown,grownup,growse,growth,growthy,grozart,grozet,grr,grub,grubbed,grubber,grubby,grubs,grudge,grudger,grue,gruel,grueler,gruelly,gruff,gruffly,gruffs,gruffy,grufted,grugru,gruine,grum,grumble,grumbly,grume,grumly,grummel,grummet,grumose,grumous,grump,grumph,grumphy,grumpy,grun,grundy,grunion,grunt,grunter,gruntle,grush,grushie,gruss,grutch,grutten,gryde,grylli,gryllid,gryllos,gryllus,grysbok,guaba,guacimo,guacin,guaco,guaiac,guaiol,guaka,guama,guan,guana,guanaco,guanase,guanay,guango,guanine,guanize,guano,guanyl,guao,guapena,guar,guara,guarabu,guarana,guarani,guard,guarded,guarder,guardo,guariba,guarri,guasa,guava,guavina,guayaba,guayabi,guayabo,guayule,guaza,gubbo,gucki,gud,gudame,guddle,gude,gudge,gudgeon,gudget,gudok,gue,guebucu,guemal,guenepe,guenon,guepard,guerdon,guereza,guess,guesser,guest,guesten,guester,gufa,guff,guffaw,guffer,guffin,guffy,gugal,guggle,gugglet,guglet,guglia,guglio,gugu,guhr,guib,guiba,guidage,guide,guider,guidman,guidon,guige,guignol,guijo,guild,guilder,guildic,guildry,guile,guilery,guilt,guilty,guily,guimpe,guinea,guipure,guisard,guise,guiser,guising,guitar,gul,gula,gulae,gulaman,gular,gularis,gulch,gulden,gule,gules,gulf,gulfy,gulgul,gulix,gull,gullery,gullet,gullion,gullish,gully,gulonic,gulose,gulp,gulper,gulpin,gulping,gulpy,gulsach,gum,gumbo,gumboil,gumby,gumdrop,gumihan,gumless,gumlike,gumly,gumma,gummage,gummata,gummed,gummer,gumming,gummite,gummose,gummous,gummy,gump,gumpus,gumshoe,gumweed,gumwood,gun,guna,gunate,gunboat,gundi,gundy,gunebo,gunfire,gunge,gunite,gunj,gunk,gunl,gunless,gunlock,gunman,gunnage,gunne,gunnel,gunner,gunnery,gunnies,gunning,gunnung,gunny,gunong,gunplay,gunrack,gunsel,gunshop,gunshot,gunsman,gunster,gunter,gunwale,gunyah,gunyang,gunyeh,gup,guppy,gur,gurdle,gurge,gurgeon,gurges,gurgle,gurglet,gurgly,gurjun,gurk,gurl,gurly,gurnard,gurnet,gurniad,gurr,gurrah,gurry,gurt,guru,gush,gusher,gushet,gushily,gushing,gushy,gusla,gusle,guss,gusset,gussie,gust,gustful,gustily,gusto,gusty,gut,gutless,gutlike,gutling,gutt,gutta,guttate,gutte,gutter,guttery,gutti,guttide,guttie,guttle,guttler,guttula,guttule,guttus,gutty,gutweed,gutwise,gutwort,guy,guydom,guyer,guz,guze,guzzle,guzzler,gwag,gweduc,gweed,gweeon,gwely,gwine,gwyniad,gyle,gym,gymel,gymnast,gymnic,gymnics,gymnite,gymnure,gympie,gyn,gyne,gynecic,gynic,gynics,gyp,gype,gypper,gyps,gypsine,gypsite,gypsous,gypster,gypsum,gypsy,gypsyfy,gypsyry,gyral,gyrally,gyrant,gyrate,gyrator,gyre,gyrene,gyri,gyric,gyrinid,gyro,gyrocar,gyroma,gyron,gyronny,gyrose,gyrous,gyrus,gyte,gytling,gyve,h,ha,haab,haaf,habble,habeas,habena,habenal,habenar,habile,habille,habit,habitan,habitat,habited,habitue,habitus,habnab,haboob,habu,habutai,hache,hachure,hack,hackbut,hacked,hackee,hacker,hackery,hackin,hacking,hackle,hackler,hacklog,hackly,hackman,hackney,hacksaw,hacky,had,hadbot,hadden,haddie,haddo,haddock,hade,hading,hadj,hadji,hadland,hadrome,haec,haem,haemony,haet,haff,haffet,haffle,hafiz,hafnium,hafnyl,haft,hafter,hag,hagboat,hagborn,hagbush,hagdon,hageen,hagfish,haggada,haggard,hagged,hagger,haggis,haggish,haggle,haggler,haggly,haggy,hagi,hagia,haglet,haglike,haglin,hagride,hagrope,hagseed,hagship,hagweed,hagworm,hah,haik,haikai,haikal,haikwan,hail,hailer,hailse,haily,hain,haine,hair,haircut,hairdo,haire,haired,hairen,hairif,hairlet,hairpin,hairup,hairy,haje,hajib,hajilij,hak,hakam,hakdar,hake,hakeem,hakim,hako,haku,hala,halakah,halakic,halal,halberd,halbert,halch,halcyon,hale,halebi,haler,halerz,half,halfer,halfman,halfway,halibiu,halibut,halide,halidom,halite,halitus,hall,hallage,hallah,hallan,hallel,hallex,halling,hallman,halloo,hallow,hallux,hallway,halma,halo,halogen,haloid,hals,halse,halsen,halt,halter,halting,halurgy,halutz,halvans,halve,halved,halver,halves,halyard,ham,hamal,hamald,hamate,hamated,hamatum,hamble,hame,hameil,hamel,hamfat,hami,hamlah,hamlet,hammada,hammam,hammer,hammock,hammy,hamose,hamous,hamper,hamsa,hamster,hamular,hamule,hamulus,hamus,hamza,han,hanaper,hanbury,hance,hanced,hanch,hand,handbag,handbow,handcar,handed,hander,handful,handgun,handily,handle,handled,handler,handout,handsaw,handsel,handset,handy,hangar,hangby,hangdog,hange,hangee,hanger,hangie,hanging,hangle,hangman,hangout,hangul,hanif,hank,hanker,hankie,hankle,hanky,hanna,hansa,hanse,hansel,hansom,hant,hantle,hao,haole,haoma,haori,hap,hapless,haplite,haploid,haploma,haplont,haply,happen,happier,happify,happily,happing,happy,hapten,haptene,haptere,haptic,haptics,hapu,hapuku,harass,haratch,harbi,harbor,hard,harden,harder,hardily,hardim,hardish,hardly,hardock,hardpan,hardy,hare,harebur,harelip,harem,harfang,haricot,harish,hark,harka,harl,harling,harlock,harlot,harm,harmal,harmala,harman,harmel,harmer,harmful,harmine,harmony,harmost,harn,harness,harnpan,harp,harpago,harper,harpier,harpist,harpoon,harpula,harr,harrier,harrow,harry,harsh,harshen,harshly,hart,hartal,hartin,hartite,harvest,hasan,hash,hashab,hasher,hashish,hashy,hask,hasky,haslet,haslock,hasp,hassar,hassel,hassle,hassock,hasta,hastate,hastati,haste,hasten,haster,hastily,hastish,hastler,hasty,hat,hatable,hatband,hatbox,hatbrim,hatch,hatchel,hatcher,hatchet,hate,hateful,hater,hatful,hath,hathi,hatless,hatlike,hatpin,hatrack,hatrail,hatred,hatress,hatt,hatted,hatter,hattery,hatting,hattock,hatty,hau,hauberk,haugh,haught,haughty,haul,haulage,hauld,hauler,haulier,haulm,haulmy,haunch,haunchy,haunt,haunter,haunty,hause,hausen,hausse,hautboy,hauteur,havage,have,haveage,havel,haven,havener,havenet,havent,haver,haverel,haverer,havers,havier,havoc,haw,hawbuck,hawer,hawk,hawkbit,hawked,hawker,hawkery,hawkie,hawking,hawkish,hawknut,hawky,hawm,hawok,hawse,hawser,hay,haya,hayband,haybird,haybote,haycap,haycart,haycock,hayey,hayfork,haylift,hayloft,haymow,hayrack,hayrake,hayrick,hayseed,haysel,haysuck,haytime,hayward,hayweed,haywire,hayz,hazard,haze,hazel,hazeled,hazelly,hazen,hazer,hazily,hazing,hazle,hazy,hazzan,he,head,headcap,headed,header,headful,headily,heading,headman,headset,headway,heady,heaf,heal,heald,healder,healer,healful,healing,health,healthy,heap,heaper,heaps,heapy,hear,hearer,hearing,hearken,hearsay,hearse,hearst,heart,hearted,hearten,hearth,heartly,hearts,hearty,heat,heater,heatful,heath,heathen,heather,heathy,heating,heaume,heaumer,heave,heaven,heavens,heaver,heavies,heavily,heaving,heavity,heavy,hebamic,hebenon,hebete,hebetic,hech,heck,heckle,heckler,hectare,hecte,hectic,hector,heddle,heddler,hedebo,heder,hederic,hederin,hedge,hedger,hedging,hedgy,hedonic,heed,heeder,heedful,heedily,heedy,heehaw,heel,heelcap,heeled,heeler,heeltap,heer,heeze,heezie,heezy,heft,hefter,heftily,hefty,hegari,hegemon,hegira,hegumen,hei,heiau,heifer,heigh,height,heii,heimin,heinous,heir,heirdom,heiress,heitiki,hekteus,helbeh,helcoid,helder,hele,helenin,heliast,helical,heliced,helices,helicin,helicon,helide,heling,helio,helioid,helium,helix,hell,hellbox,hellcat,helldog,heller,helleri,hellhag,hellier,hellion,hellish,hello,helluo,helly,helm,helmage,helmed,helmet,helodes,heloe,heloma,helonin,helosis,helotry,help,helper,helpful,helping,helply,helve,helvell,helver,helvite,hem,hemad,hemal,hemapod,hemase,hematal,hematic,hematid,hematin,heme,hemen,hemera,hemiamb,hemic,hemin,hemina,hemine,heminee,hemiope,hemipic,heml,hemlock,hemmel,hemmer,hemocry,hemoid,hemol,hemopod,hemp,hempen,hempy,hen,henad,henbane,henbill,henbit,hence,hencoop,hencote,hend,hendly,henfish,henism,henlike,henna,hennery,hennin,hennish,henny,henotic,henpeck,henpen,henry,hent,henter,henware,henwife,henwise,henyard,hep,hepar,heparin,hepatic,hepcat,heppen,hepper,heptace,heptad,heptal,heptane,heptene,heptine,heptite,heptoic,heptose,heptyl,heptyne,her,herald,herb,herbage,herbal,herbane,herbary,herbish,herbist,herblet,herbman,herbose,herbous,herby,herd,herdboy,herder,herdic,herding,here,hereat,hereby,herein,herem,hereof,hereon,heresy,heretic,hereto,herile,heriot,heritor,herl,herling,herma,hermaic,hermit,hern,hernani,hernant,herne,hernia,hernial,hero,heroess,heroic,heroid,heroify,heroin,heroine,heroism,heroize,heron,heroner,heronry,herpes,herring,hers,herse,hersed,herself,hership,hersir,hertz,hessite,hest,hestern,het,hetaera,hetaery,heteric,hetero,hething,hetman,hetter,heuau,heugh,heumite,hevi,hew,hewable,hewel,hewer,hewhall,hewn,hewt,hex,hexa,hexace,hexacid,hexact,hexad,hexadic,hexagon,hexagyn,hexane,hexaped,hexapla,hexapod,hexarch,hexene,hexer,hexerei,hexeris,hexine,hexis,hexitol,hexode,hexogen,hexoic,hexone,hexonic,hexosan,hexose,hexyl,hexylic,hexyne,hey,heyday,hi,hia,hiant,hiatal,hiate,hiation,hiatus,hibbin,hic,hicatee,hiccup,hick,hickey,hickory,hidable,hidage,hidalgo,hidated,hidden,hide,hided,hideous,hider,hidling,hie,hieder,hield,hiemal,hieron,hieros,higdon,higgle,higgler,high,highboy,higher,highest,highish,highly,highman,hight,hightop,highway,higuero,hijack,hike,hiker,hilch,hilding,hill,hiller,hillet,hillman,hillock,hilltop,hilly,hilsa,hilt,hilum,hilus,him,himp,himself,himward,hin,hinau,hinch,hind,hinder,hing,hinge,hinger,hingle,hinney,hinny,hinoid,hinoki,hint,hinter,hiodont,hip,hipbone,hipe,hiper,hiphalt,hipless,hipmold,hipped,hippen,hippian,hippic,hipping,hippish,hipple,hippo,hippoid,hippus,hippy,hipshot,hipwort,hirable,hircine,hire,hired,hireman,hirer,hirmos,hiro,hirple,hirse,hirsel,hirsle,hirsute,his,hish,hisn,hispid,hiss,hisser,hissing,hist,histie,histoid,histon,histone,history,histrio,hit,hitch,hitcher,hitchy,hithe,hither,hitless,hitter,hive,hiver,hives,hizz,ho,hoar,hoard,hoarder,hoarily,hoarish,hoarse,hoarsen,hoary,hoast,hoatzin,hoax,hoaxee,hoaxer,hob,hobber,hobbet,hobbil,hobble,hobbler,hobbly,hobby,hoblike,hobnail,hobnob,hobo,hoboism,hocco,hock,hocker,hocket,hockey,hocky,hocus,hod,hodden,hodder,hoddle,hoddy,hodful,hodman,hoe,hoecake,hoedown,hoeful,hoer,hog,hoga,hogan,hogback,hogbush,hogfish,hogged,hogger,hoggery,hogget,hoggie,hoggin,hoggish,hoggism,hoggy,hogherd,hoghide,hoghood,hoglike,hogling,hogmace,hognose,hognut,hogpen,hogship,hogskin,hogsty,hogward,hogwash,hogweed,hogwort,hogyard,hoi,hoick,hoin,hoise,hoist,hoister,hoit,hoju,hokey,hokum,holard,holcad,hold,holdall,holden,holder,holding,holdout,holdup,hole,holeman,holer,holey,holia,holiday,holily,holing,holism,holl,holla,holler,hollin,hollo,hollock,hollong,hollow,holly,holm,holmia,holmic,holmium,holmos,holour,holster,holt,holy,holyday,homage,homager,home,homelet,homely,homelyn,homeoid,homer,homey,homily,hominal,hominid,hominy,homish,homo,homodox,homogen,homonym,homrai,homy,honda,hondo,hone,honest,honesty,honey,honeyed,hong,honied,honily,honk,honker,honor,honoree,honorer,hontish,hontous,hooch,hood,hoodcap,hooded,hoodful,hoodie,hoodlum,hoodman,hoodoo,hoodshy,hooey,hoof,hoofed,hoofer,hoofish,hooflet,hoofrot,hoofs,hoofy,hook,hookah,hooked,hooker,hookers,hookish,hooklet,hookman,hooktip,hookum,hookup,hooky,hoolock,hooly,hoon,hoop,hooped,hooper,hooping,hoopla,hoople,hoopman,hoopoe,hoose,hoosh,hoot,hootay,hooter,hoove,hooven,hoovey,hop,hopbine,hopbush,hope,hoped,hopeful,hopeite,hoper,hopi,hoplite,hopoff,hopped,hopper,hoppers,hoppet,hoppity,hopple,hoppy,hoptoad,hopvine,hopyard,hora,horal,horary,hordary,horde,hordein,horizon,horme,hormic,hormigo,hormion,hormist,hormone,hormos,horn,horned,horner,hornet,hornety,hornful,hornify,hornily,horning,hornish,hornist,hornito,hornlet,horntip,horny,horrent,horreum,horrid,horrify,horror,horse,horser,horsify,horsily,horsing,horst,horsy,hortite,hory,hosanna,hose,hosed,hosel,hoseman,hosier,hosiery,hospice,host,hostage,hostel,hoster,hostess,hostie,hostile,hosting,hostler,hostly,hostry,hot,hotbed,hotbox,hotch,hotel,hotfoot,hothead,hoti,hotly,hotness,hotspur,hotter,hottery,hottish,houbara,hough,hougher,hounce,hound,hounder,houndy,hour,hourful,houri,hourly,housage,housal,house,housel,houser,housing,housty,housy,houtou,houvari,hove,hovel,hoveler,hoven,hover,hoverer,hoverly,how,howadji,howbeit,howdah,howder,howdie,howdy,howe,howel,however,howff,howish,howk,howkit,howl,howler,howlet,howling,howlite,howso,hox,hoy,hoyden,hoyle,hoyman,huaca,huaco,huarizo,hub,hubb,hubba,hubber,hubble,hubbly,hubbub,hubby,hubshi,huchen,hucho,huck,huckle,hud,huddle,huddler,huddock,huddup,hue,hued,hueful,hueless,huer,huff,huffier,huffily,huffish,huffle,huffler,huffy,hug,huge,hugely,hugeous,hugger,hugging,huggle,hugsome,huh,huia,huipil,huitain,huke,hula,huldee,hulk,hulkage,hulking,hulky,hull,huller,hullock,hulloo,hulsite,hulster,hulu,hulver,hum,human,humane,humanly,humate,humble,humbler,humblie,humbly,humbo,humbug,humbuzz,humdrum,humect,humeral,humeri,humerus,humet,humetty,humhum,humic,humid,humidly,humidor,humific,humify,humin,humite,humlie,hummel,hummer,hummie,humming,hummock,humor,humoral,humous,hump,humped,humph,humpty,humpy,humus,hunch,hunchet,hunchy,hundi,hundred,hung,hunger,hungry,hunh,hunk,hunker,hunkers,hunkies,hunks,hunky,hunt,hunting,hup,hura,hurdies,hurdis,hurdle,hurdler,hurds,hure,hureek,hurgila,hurkle,hurl,hurled,hurler,hurley,hurling,hurlock,hurly,huron,hurr,hurrah,hurried,hurrier,hurrock,hurroo,hurry,hurst,hurt,hurted,hurter,hurtful,hurting,hurtle,hurty,husband,huse,hush,hushaby,husheen,hushel,husher,hushful,hushing,hushion,husho,husk,husked,husker,huskily,husking,husky,huso,huspil,huss,hussar,hussy,husting,hustle,hustler,hut,hutch,hutcher,hutchet,huthold,hutia,hutlet,hutment,huvelyk,huzoor,huzz,huzza,huzzard,hyaena,hyaline,hyalite,hyaloid,hybosis,hybrid,hydatid,hydnoid,hydrant,hydrate,hydrazo,hydria,hydric,hydride,hydro,hydroa,hydroid,hydrol,hydrome,hydrone,hydrops,hydrous,hydroxy,hydrula,hyena,hyenic,hyenine,hyenoid,hyetal,hygeist,hygiene,hygric,hygrine,hygroma,hying,hyke,hyle,hyleg,hylic,hylism,hylist,hyloid,hymen,hymenal,hymenic,hymn,hymnal,hymnary,hymner,hymnic,hymnist,hymnode,hymnody,hynde,hyne,hyoid,hyoidal,hyoidan,hyoides,hyp,hypate,hypaton,hyper,hypha,hyphal,hyphema,hyphen,hypho,hypnody,hypnoid,hypnone,hypo,hypogee,hypoid,hyponym,hypopus,hyporit,hyppish,hypural,hyraces,hyracid,hyrax,hyson,hyssop,i,iamb,iambi,iambic,iambist,iambize,iambus,iao,iatric,iba,iberite,ibex,ibices,ibid,ibidine,ibis,ibolium,ibota,icaco,ice,iceberg,iceboat,icebone,icebox,icecap,iced,icefall,icefish,iceland,iceleaf,iceless,icelike,iceman,iceroot,icework,ich,ichnite,icho,ichor,ichthus,ichu,icica,icicle,icicled,icily,iciness,icing,icon,iconic,iconism,icosian,icotype,icteric,icterus,ictic,ictuate,ictus,icy,id,idalia,idant,iddat,ide,idea,ideaed,ideaful,ideal,ideally,ideate,ideist,identic,ides,idgah,idiasm,idic,idiocy,idiom,idiot,idiotcy,idiotic,idiotry,idite,iditol,idle,idleful,idleman,idler,idleset,idlety,idlish,idly,idol,idola,idolify,idolism,idolist,idolize,idolous,idolum,idoneal,idorgan,idose,idryl,idyl,idyler,idylism,idylist,idylize,idyllic,ie,if,ife,iffy,igloo,ignatia,ignavia,igneous,ignify,ignite,igniter,ignitor,ignoble,ignobly,ignore,ignorer,ignote,iguana,iguanid,ihi,ihleite,ihram,iiwi,ijma,ijolite,ikat,ikey,ikona,ikra,ileac,ileitis,ileon,ilesite,ileum,ileus,ilex,ilia,iliac,iliacus,iliahi,ilial,iliau,ilicic,ilicin,ilima,ilium,ilk,ilka,ilkane,ill,illapse,illeck,illegal,illeism,illeist,illess,illfare,illicit,illish,illium,illness,illocal,illogic,illoyal,illth,illude,illuder,illume,illumer,illupi,illure,illusor,illy,ilot,ilvaite,image,imager,imagery,imagine,imagism,imagist,imago,imam,imamah,imamate,imamic,imaret,imban,imband,imbarge,imbark,imbarn,imbased,imbat,imbauba,imbe,imbed,imber,imbibe,imbiber,imbondo,imbosom,imbower,imbrex,imbrue,imbrute,imbue,imburse,imi,imide,imidic,imine,imino,imitant,imitate,immane,immask,immense,immerd,immerge,immerit,immerse,immew,immi,immit,immix,immoral,immound,immund,immune,immure,immute,imonium,imp,impack,impact,impages,impaint,impair,impala,impale,impaler,impall,impalm,impalsy,impane,impanel,impar,impark,imparl,impart,impasse,impaste,impasto,impave,impavid,impawn,impeach,impearl,impede,impeder,impel,impen,impend,impent,imperia,imperil,impest,impetre,impetus,imphee,impi,impiety,impinge,impious,impish,implant,implate,implead,implete,implex,implial,impling,implode,implore,implume,imply,impofo,impone,impoor,import,imposal,impose,imposer,impost,impot,impound,impreg,impregn,impresa,imprese,impress,imprest,imprime,imprint,improof,improve,impship,impubic,impugn,impulse,impure,impute,imputer,impy,imshi,imsonic,imu,in,inachid,inadept,inagile,inaja,inane,inanely,inanga,inanity,inapt,inaptly,inarch,inarm,inaugur,inaxon,inbe,inbeing,inbent,inbirth,inblow,inblown,inboard,inbond,inborn,inbound,inbread,inbreak,inbred,inbreed,inbring,inbuilt,inburnt,inburst,inby,incarn,incase,incast,incense,incept,incest,inch,inched,inchpin,incide,incisal,incise,incisor,incite,inciter,incivic,incline,inclip,inclose,include,inclusa,incluse,incog,income,incomer,inconnu,incrash,increep,increst,incross,incrust,incubi,incubus,incudal,incudes,incult,incur,incurse,incurve,incus,incuse,incut,indaba,indan,indane,indart,indazin,indazol,inde,indebt,indeed,indeedy,indene,indent,index,indexed,indexer,indic,indican,indices,indicia,indict,indign,indigo,indite,inditer,indium,indogen,indole,indoles,indolyl,indoor,indoors,indorse,indoxyl,indraft,indrawn,indri,induce,induced,inducer,induct,indue,indulge,indult,indulto,induna,indwell,indy,indyl,indylic,inearth,inept,ineptly,inequal,inerm,inert,inertia,inertly,inesite,ineunt,inexact,inexist,inface,infall,infame,infamy,infancy,infand,infang,infant,infanta,infante,infarct,infare,infaust,infect,infeed,infeft,infelt,infer,infern,inferno,infest,infidel,infield,infill,infilm,infirm,infit,infix,inflame,inflate,inflect,inflex,inflict,inflood,inflow,influx,infold,inform,infra,infract,infula,infuse,infuser,ing,ingate,ingenit,ingenue,ingest,ingesta,ingiver,ingle,inglobe,ingoing,ingot,ingraft,ingrain,ingrate,ingress,ingross,ingrow,ingrown,inguen,ingulf,inhabit,inhale,inhaler,inhaul,inhaust,inhere,inherit,inhiate,inhibit,inhuman,inhume,inhumer,inial,iniome,inion,initial,initis,initive,inject,injelly,injunct,injure,injured,injurer,injury,ink,inkbush,inken,inker,inket,inkfish,inkhorn,inkish,inkle,inkless,inklike,inkling,inknot,inkosi,inkpot,inkroot,inks,inkshed,inkweed,inkwell,inkwood,inky,inlaid,inlaik,inlake,inland,inlaut,inlaw,inlawry,inlay,inlayer,inleak,inlet,inlier,inlook,inly,inlying,inmate,inmeats,inmost,inn,innate,inneity,inner,innerly,innerve,inness,innest,innet,inning,innless,innyard,inocyte,inogen,inoglia,inolith,inoma,inone,inopine,inorb,inosic,inosin,inosite,inower,inphase,inport,inpour,inpush,input,inquest,inquiet,inquire,inquiry,inring,inro,inroad,inroll,inrub,inrun,inrush,insack,insane,insculp,insea,inseam,insect,insee,inseer,insense,insert,inset,inshave,inshell,inship,inshoe,inshoot,inshore,inside,insider,insight,insigne,insipid,insist,insnare,insofar,insole,insolid,insooth,insorb,insoul,inspan,inspeak,inspect,inspire,inspoke,install,instant,instar,instate,instead,insteam,insteep,instep,instill,insula,insular,insulin,insulse,insult,insunk,insure,insured,insurer,insurge,inswamp,inswell,inswept,inswing,intact,intake,intaker,integer,inteind,intend,intense,intent,inter,interim,intern,intext,inthrow,intil,intima,intimal,intine,into,intoed,intone,intoner,intort,intown,intrada,intrait,intrant,intreat,intrine,introit,intrude,intruse,intrust,intube,intue,intuent,intuit,inturn,intwist,inula,inulase,inulin,inuloid,inunct,inure,inured,inurn,inutile,invade,invader,invalid,inveigh,inveil,invein,invent,inverse,invert,invest,invigor,invised,invital,invite,invitee,inviter,invivid,invoice,invoke,invoker,involve,inwale,inwall,inward,inwards,inweave,inweed,inwick,inwind,inwit,inwith,inwood,inwork,inworn,inwound,inwoven,inwrap,inwrit,inyoite,inyoke,io,iodate,iodic,iodide,iodine,iodism,iodite,iodize,iodizer,iodo,iodol,iodoso,iodous,iodoxy,iolite,ion,ionic,ionium,ionize,ionizer,ionogen,ionone,iota,iotize,ipecac,ipid,ipil,ipomea,ipseand,ipseity,iracund,irade,irate,irately,ire,ireful,ireless,irene,irenic,irenics,irian,irid,iridal,iridate,irides,iridial,iridian,iridic,iridin,iridine,iridite,iridium,iridize,iris,irised,irisin,iritic,iritis,irk,irksome,irok,iroko,iron,irone,ironer,ironice,ironish,ironism,ironist,ironize,ironly,ironman,irony,irrisor,irrupt,is,isagoge,isagon,isamine,isatate,isatic,isatide,isatin,isazoxy,isba,ischiac,ischial,ischium,ischury,iserine,iserite,isidium,isidoid,island,islandy,islay,isle,islet,isleted,islot,ism,ismal,ismatic,ismdom,ismy,iso,isoamyl,isobar,isobare,isobase,isobath,isochor,isocola,isocrat,isodont,isoflor,isogamy,isogen,isogeny,isogon,isogram,isohel,isohyet,isolate,isology,isomer,isomere,isomery,isoneph,isonomy,isonym,isonymy,isopag,isopod,isopoly,isoptic,isopyre,isotac,isotely,isotome,isotony,isotope,isotopy,isotron,isotype,isoxime,issei,issite,issuant,issue,issuer,issuing,ist,isthmi,isthmic,isthmus,istle,istoke,isuret,isuroid,it,itacism,itacist,italics,italite,itch,itching,itchy,itcze,item,iteming,itemize,itemy,iter,iterant,iterate,ither,itmo,itoubou,its,itself,iturite,itzebu,iva,ivied,ivin,ivoried,ivorine,ivorist,ivory,ivy,ivylike,ivyweed,ivywood,ivywort,iwa,iwaiwa,iwis,ixodian,ixodic,ixodid,iyo,izar,izard,izle,izote,iztle,izzard,j,jab,jabbed,jabber,jabbing,jabble,jabers,jabia,jabiru,jabot,jabul,jacal,jacamar,jacami,jacamin,jacana,jacare,jacate,jacchus,jacent,jacinth,jack,jackal,jackass,jackbox,jackboy,jackdaw,jackeen,jacker,jacket,jackety,jackleg,jackman,jacko,jackrod,jacksaw,jacktan,jacobus,jacoby,jaconet,jactant,jacu,jacuaru,jadder,jade,jaded,jadedly,jadeite,jadery,jadish,jady,jaeger,jag,jagat,jager,jagged,jagger,jaggery,jaggy,jagir,jagla,jagless,jagong,jagrata,jagua,jaguar,jail,jailage,jaildom,jailer,jailish,jajman,jake,jakes,jako,jalap,jalapa,jalapin,jalkar,jalopy,jalouse,jam,jama,jaman,jamb,jambeau,jambo,jambone,jambool,jambosa,jamdani,jami,jamlike,jammer,jammy,jampan,jampani,jamwood,janapa,janapan,jane,jangada,jangkar,jangle,jangler,jangly,janitor,jank,janker,jann,jannock,jantu,janua,jaob,jap,japan,jape,japer,japery,japing,japish,jaquima,jar,jara,jaragua,jarbird,jarble,jarbot,jarfly,jarful,jarg,jargon,jarkman,jarl,jarldom,jarless,jarnut,jarool,jarra,jarrah,jarring,jarry,jarvey,jasey,jaseyed,jasmine,jasmone,jasper,jaspery,jaspis,jaspoid,jass,jassid,jassoid,jatha,jati,jato,jaudie,jauk,jaun,jaunce,jaunder,jaunt,jauntie,jaunty,jaup,javali,javelin,javer,jaw,jawab,jawbone,jawed,jawfall,jawfish,jawfoot,jawless,jawy,jay,jayhawk,jaypie,jaywalk,jazz,jazzer,jazzily,jazzy,jealous,jean,jeans,jecoral,jecorin,jed,jedcock,jedding,jeddock,jeel,jeep,jeer,jeerer,jeering,jeery,jeff,jehu,jehup,jejunal,jejune,jejunum,jelab,jelick,jell,jellica,jellico,jellied,jellify,jellily,jelloid,jelly,jemadar,jemmily,jemmy,jenkin,jenna,jennet,jennier,jenny,jeofail,jeopard,jerboa,jereed,jerez,jerib,jerk,jerker,jerkily,jerkin,jerkish,jerky,jerl,jerm,jerque,jerquer,jerry,jersey,jert,jervia,jervina,jervine,jess,jessamy,jessant,jessed,jessur,jest,jestee,jester,jestful,jesting,jet,jetbead,jete,jetsam,jettage,jetted,jetter,jettied,jetton,jetty,jetware,jewbird,jewbush,jewel,jeweler,jewelry,jewely,jewfish,jezail,jeziah,jharal,jheel,jhool,jhow,jib,jibbah,jibber,jibby,jibe,jibhead,jibi,jibman,jiboa,jibstay,jicama,jicara,jiff,jiffle,jiffy,jig,jigger,jiggers,jigget,jiggety,jiggish,jiggle,jiggly,jiggy,jiglike,jigman,jihad,jikungu,jillet,jilt,jiltee,jilter,jiltish,jimbang,jimjam,jimmy,jimp,jimply,jina,jing,jingal,jingle,jingled,jingler,jinglet,jingly,jingo,jinja,jinjili,jink,jinker,jinket,jinkle,jinks,jinn,jinni,jinny,jinriki,jinx,jipper,jiqui,jirble,jirga,jiti,jitneur,jitney,jitro,jitter,jitters,jittery,jiva,jive,jixie,jo,job,jobade,jobarbe,jobber,jobbery,jobbet,jobbing,jobbish,jobble,jobless,jobman,jobo,joch,jock,jocker,jockey,jocko,jocoque,jocose,jocote,jocu,jocular,jocum,jocuma,jocund,jodel,jodelr,joe,joebush,joewood,joey,jog,jogger,joggle,joggler,joggly,johnin,join,joinant,joinder,joiner,joinery,joining,joint,jointed,jointer,jointly,jointy,joist,jojoba,joke,jokelet,joker,jokish,jokist,jokul,joky,joll,jollier,jollify,jollily,jollity,jollop,jolly,jolt,jolter,jolting,jolty,jonque,jonquil,joola,joom,jordan,joree,jorum,joseite,josh,josher,joshi,josie,joskin,joss,josser,jostle,jostler,jot,jota,jotisi,jotter,jotting,jotty,joubarb,joug,jough,jouk,joule,joulean,jounce,journal,journey,jours,joust,jouster,jovial,jow,jowar,jowari,jowel,jower,jowery,jowl,jowler,jowlish,jowlop,jowly,jowpy,jowser,jowter,joy,joyance,joyancy,joyant,joyful,joyhop,joyleaf,joyless,joylet,joyous,joysome,joyweed,juba,jubate,jubbah,jubbe,jube,jubilee,jubilus,juck,juckies,jud,judcock,judex,judge,judger,judices,judo,jufti,jug,jugal,jugale,jugate,jugated,juger,jugerum,jugful,jugger,juggins,juggle,juggler,juglone,jugular,jugulum,jugum,juice,juicily,juicy,jujitsu,juju,jujube,jujuism,jujuist,juke,jukebox,julep,julid,julidan,julio,juloid,julole,julolin,jumart,jumba,jumble,jumbler,jumbly,jumbo,jumbuck,jumby,jumelle,jument,jumfru,jumma,jump,jumper,jumpy,juncite,juncous,june,jungle,jungled,jungli,jungly,juniata,junior,juniper,junk,junker,junket,junking,junkman,junt,junta,junto,jupati,jupe,jupon,jural,jurally,jurant,jurara,jurat,jurator,jure,jurel,juridic,juring,jurist,juror,jury,juryman,jussel,jussion,jussive,jussory,just,justen,justice,justify,justly,justo,jut,jute,jutka,jutting,jutty,juvenal,juvia,juvite,jyngine,jynx,k,ka,kabaya,kabel,kaberu,kabiet,kabuki,kachin,kadaya,kadein,kados,kaffir,kafir,kafirin,kafiz,kafta,kago,kagu,kaha,kahar,kahau,kahili,kahu,kahuna,kai,kaid,kaik,kaikara,kail,kainga,kainite,kainsi,kainyn,kairine,kaiser,kaitaka,kaiwi,kajawah,kaka,kakapo,kakar,kaki,kakkak,kakke,kala,kalasie,kale,kalema,kalends,kali,kalian,kalium,kallah,kallege,kalo,kalon,kalong,kalpis,kamahi,kamala,kamansi,kamao,kamas,kamassi,kambal,kamboh,kame,kamerad,kamias,kamichi,kamik,kampong,kan,kana,kanae,kanagi,kanap,kanara,kanari,kanat,kanchil,kande,kandol,kaneh,kang,kanga,kangani,kankie,kannume,kanoon,kans,kantele,kanten,kaolin,kapa,kapai,kapeika,kapok,kapp,kappa,kappe,kapur,kaput,karagan,karaka,karakul,karamu,karaoke,karate,karaya,karbi,karch,kareao,kareeta,karela,karite,karma,karmic,karo,kaross,karou,karree,karri,karroo,karsha,karst,karstic,kartel,kartos,karwar,karyon,kasa,kasbah,kasbeke,kasher,kashga,kashi,kashima,kasida,kasm,kassu,kastura,kat,katar,katcina,kath,katha,kathal,katipo,katmon,katogle,katsup,katuka,katun,katurai,katydid,kauri,kava,kavaic,kavass,kawaka,kawika,kay,kayak,kayaker,kayles,kayo,kazi,kazoo,kea,keach,keacorn,keawe,keb,kebab,kebbie,kebbuck,kechel,keck,keckle,kecksy,kecky,ked,keddah,kedge,kedger,kedlock,keech,keek,keeker,keel,keelage,keeled,keeler,keelfat,keelie,keeling,keelman,keelson,keen,keena,keened,keener,keenly,keep,keeper,keeping,keest,keet,keeve,kef,keffel,kefir,kefiric,keg,kegler,kehaya,keita,keitloa,kekuna,kelchin,keld,kele,kelebe,keleh,kelek,kelep,kelk,kell,kella,kellion,kelly,keloid,kelp,kelper,kelpie,kelpy,kelt,kelter,kelty,kelvin,kemb,kemp,kempite,kemple,kempt,kempy,ken,kenaf,kenareh,kench,kend,kendir,kendyr,kenlore,kenmark,kennel,kenner,kenning,kenno,keno,kenosis,kenotic,kenspac,kent,kenyte,kep,kepi,kept,kerana,kerasin,kerat,keratin,keratto,kerchoo,kerchug,kerel,kerf,kerflap,kerflop,kermes,kermis,kern,kernel,kerner,kernish,kernite,kernos,kerogen,kerrie,kerril,kerrite,kerry,kersey,kerslam,kerugma,kerwham,kerygma,kestrel,ket,keta,ketal,ketch,ketchup,keten,ketene,ketipic,keto,ketogen,ketol,ketole,ketone,ketonic,ketose,ketosis,kette,ketting,kettle,kettler,ketty,ketuba,ketupa,ketyl,keup,kevalin,kevel,kewpie,kex,kexy,key,keyage,keyed,keyhole,keyless,keylet,keylock,keynote,keyway,khaddar,khadi,khahoon,khaiki,khair,khaja,khajur,khaki,khakied,khalifa,khalsa,khamsin,khan,khanate,khanda,khanjar,khanjee,khankah,khanum,khar,kharaj,kharua,khass,khat,khatib,khatri,khediva,khedive,khepesh,khet,khilat,khir,khirka,khoja,khoka,khot,khu,khubber,khula,khutbah,khvat,kiack,kiaki,kialee,kiang,kiaugh,kibber,kibble,kibbler,kibe,kibei,kibitka,kibitz,kiblah,kibosh,kiby,kick,kickee,kicker,kicking,kickish,kickoff,kickout,kickup,kidder,kiddier,kiddish,kiddush,kiddy,kidhood,kidlet,kidling,kidnap,kidney,kidskin,kidsman,kiekie,kiel,kier,kieye,kikar,kike,kiki,kiku,kikuel,kikumon,kil,kiladja,kilah,kilan,kildee,kileh,kilerg,kiley,kilhig,kiliare,kilim,kill,killas,killcu,killeen,killer,killick,killing,killy,kiln,kilneye,kilnman,kilnrib,kilo,kilobar,kiloton,kilovar,kilp,kilt,kilter,kiltie,kilting,kim,kimbang,kimnel,kimono,kin,kina,kinah,kinase,kinbote,kinch,kinchin,kincob,kind,kindle,kindler,kindly,kindred,kinepox,kinesic,kinesis,kinetic,king,kingcob,kingcup,kingdom,kinglet,kingly,kingpin,kingrow,kink,kinkhab,kinkily,kinkle,kinkled,kinkly,kinky,kinless,kino,kinship,kinsman,kintar,kioea,kiosk,kiotome,kip,kipage,kipe,kippeen,kipper,kippy,kipsey,kipskin,kiri,kirimon,kirk,kirker,kirkify,kirking,kirkman,kirmew,kirn,kirombo,kirsch,kirtle,kirtled,kirve,kirver,kischen,kish,kishen,kishon,kishy,kismet,kisra,kiss,kissage,kissar,kisser,kissing,kissy,kist,kistful,kiswa,kit,kitab,kitabis,kitar,kitcat,kitchen,kite,kith,kithe,kitish,kitling,kittel,kitten,kitter,kittle,kittles,kittly,kittock,kittul,kitty,kiva,kiver,kivu,kiwi,kiyas,kiyi,klafter,klam,klavern,klaxon,klepht,kleptic,klicket,klip,klipbok,klipdas,klippe,klippen,klister,klom,klop,klops,klosh,kmet,knab,knabble,knack,knacker,knacky,knag,knagged,knaggy,knap,knape,knappan,knapper,knar,knark,knarred,knarry,knave,knavery,knavess,knavish,knawel,knead,kneader,knee,kneecap,kneed,kneel,kneeler,kneelet,kneepad,kneepan,knell,knelt,knet,knew,knez,knezi,kniaz,kniazi,knick,knicker,knife,knifer,knight,knit,knitch,knitted,knitter,knittle,knived,knivey,knob,knobbed,knobber,knobble,knobbly,knobby,knock,knocker,knockup,knoll,knoller,knolly,knop,knopite,knopped,knopper,knoppy,knosp,knosped,knot,knotted,knotter,knotty,knout,know,knowe,knower,knowing,known,knub,knubbly,knubby,knublet,knuckle,knuckly,knur,knurl,knurled,knurly,knut,knutty,knyaz,knyazi,ko,koa,koae,koala,koali,kob,koban,kobi,kobird,kobold,kobong,kobu,koda,kodak,kodaker,kodakry,kodro,koel,koff,koft,koftgar,kohemp,kohl,kohua,koi,koil,koila,koilon,koine,koinon,kojang,kokako,kokam,kokan,kokil,kokio,koklas,koklass,koko,kokoon,kokowai,kokra,koku,kokum,kokumin,kola,kolach,kolea,kolhoz,kolkhos,kolkhoz,kollast,koller,kolo,kolobus,kolsun,komatik,kombu,kommos,kompeni,kon,kona,konak,kongoni,kongu,konini,konjak,kooka,kookery,kookri,koolah,koombar,koomkie,kootcha,kop,kopeck,koph,kopi,koppa,koppen,koppite,kor,kora,koradji,korait,korakan,korari,kore,korec,koreci,korero,kori,korin,korona,korova,korrel,koruna,korzec,kos,kosher,kosin,kosong,koswite,kotal,koto,kotuku,kotwal,kotyle,kotylos,kou,koulan,kouza,kovil,kowhai,kowtow,koyan,kozo,kra,kraal,kraft,krait,kraken,kral,krama,kran,kras,krasis,krausen,kraut,kreis,krelos,kremlin,krems,kreng,krieker,krimmer,krina,krocket,krome,krona,krone,kronen,kroner,kronor,kronur,kroon,krosa,krypsis,kryptic,kryptol,krypton,kuan,kuba,kubba,kuchen,kudize,kudos,kudu,kudzu,kuei,kuge,kugel,kuichua,kukri,kuku,kukui,kukupa,kula,kulack,kulah,kulaite,kulak,kulang,kulimit,kulm,kulmet,kumbi,kumhar,kumiss,kummel,kumquat,kumrah,kunai,kung,kunk,kunkur,kunzite,kuphar,kupper,kurbash,kurgan,kuruma,kurung,kurus,kurvey,kusa,kusam,kusha,kuskite,kuskos,kuskus,kusti,kusum,kutcha,kuttab,kuttar,kuttaur,kuvasz,kvass,kvint,kvinter,kwamme,kwan,kwarta,kwazoku,kyack,kyah,kyar,kyat,kyaung,kyl,kyle,kylite,kylix,kyrine,kyte,l,la,laager,laang,lab,labara,labarum,labba,labber,labefy,label,labeler,labella,labia,labial,labiate,labile,labiose,labis,labium,lablab,labor,labored,laborer,labour,labra,labral,labret,labroid,labrose,labrum,labrys,lac,lacca,laccaic,laccase,laccol,lace,laced,laceman,lacepod,lacer,lacery,lacet,lache,laches,lachsa,lacily,lacing,lacinia,lacis,lack,lacker,lackey,lackwit,lacmoid,lacmus,laconic,lacquer,lacrym,lactam,lactant,lactary,lactase,lactate,lacteal,lactean,lactic,lactid,lactide,lactify,lactim,lacto,lactoid,lactol,lactone,lactose,lactyl,lacuna,lacunae,lacunal,lacunar,lacune,lacwork,lacy,lad,ladakin,ladanum,ladder,laddery,laddess,laddie,laddish,laddock,lade,lademan,laden,lader,ladhood,ladies,ladify,lading,ladkin,ladle,ladler,ladrone,lady,ladybug,ladydom,ladyfly,ladyfy,ladyish,ladyism,ladykin,ladyly,laet,laeti,laetic,lag,lagan,lagarto,lagen,lagena,lagend,lager,lagetto,laggar,laggard,lagged,laggen,lagger,laggin,lagging,laglast,lagna,lagoon,lagwort,lai,laic,laical,laich,laicism,laicity,laicize,laid,laigh,lain,laine,laiose,lair,lairage,laird,lairdie,lairdly,lairman,lairy,laity,lak,lakatoi,lake,lakelet,laker,lakie,laking,lakish,lakism,lakist,laky,lalang,lall,lalling,lalo,lam,lama,lamaic,lamany,lamb,lamba,lambale,lambda,lambeau,lambent,lamber,lambert,lambie,lambish,lambkin,lambly,lamboys,lamby,lame,lamedh,lamel,lamella,lamely,lament,lameter,lametta,lamia,lamiger,lamiid,lamin,lamina,laminae,laminar,lamish,lamiter,lammas,lammer,lammock,lammy,lamnid,lamnoid,lamp,lampad,lampas,lamper,lampern,lampers,lampfly,lampful,lamping,lampion,lampist,lamplet,lamplit,lampman,lampoon,lamprey,lan,lanas,lanate,lanated,lanaz,lance,lanced,lancely,lancer,lances,lancet,lancha,land,landau,landed,lander,landing,landman,landmil,lane,lanete,laneway,laney,langaha,langca,langi,langite,langle,langoon,langsat,langued,languet,languid,languor,langur,laniary,laniate,lanific,lanioid,lanista,lank,lanket,lankily,lankish,lankly,lanky,lanner,lanolin,lanose,lansat,lanseh,lanson,lant,lantaca,lantern,lantum,lanugo,lanum,lanx,lanyard,lap,lapacho,lapcock,lapel,lapeler,lapful,lapillo,lapon,lappage,lapped,lapper,lappet,lapping,lapse,lapsed,lapser,lapsi,lapsing,lapwing,lapwork,laquear,laqueus,lar,larceny,larch,larchen,lard,larder,lardite,lardon,lardy,large,largely,largen,largess,largish,largo,lari,lariat,larick,larid,larigo,larigot,lariid,larin,larine,larixin,lark,larker,larking,larkish,larky,larmier,larnax,laroid,larrup,larry,larva,larvae,larval,larvate,larve,larvule,larynx,las,lasa,lascar,laser,lash,lasher,lask,lasket,lasque,lass,lasset,lassie,lasso,lassock,lassoer,last,lastage,laster,lasting,lastly,lastre,lasty,lat,lata,latah,latch,latcher,latchet,late,latebra,lated,lateen,lately,laten,latence,latency,latent,later,latera,laterad,lateral,latest,latex,lath,lathe,lathee,lathen,lather,lathery,lathing,lathy,latices,latigo,lation,latish,latitat,latite,latomy,latrant,latria,latrine,latro,latrobe,latron,latten,latter,lattice,latus,lauan,laud,lauder,laudist,laugh,laughee,laugher,laughy,lauia,laun,launce,launch,laund,launder,laundry,laur,laura,laurate,laurel,lauric,laurin,laurite,laurone,lauryl,lava,lavable,lavabo,lavacre,lavage,lavanga,lavant,lavaret,lavatic,lave,laveer,laver,lavic,lavish,lavolta,law,lawbook,lawful,lawing,lawish,lawk,lawless,lawlike,lawman,lawn,lawned,lawner,lawnlet,lawny,lawsuit,lawter,lawyer,lawyery,lawzy,lax,laxate,laxism,laxist,laxity,laxly,laxness,lay,layaway,layback,layboy,layer,layered,layery,layette,laying,layland,layman,layne,layoff,layout,layover,layship,laystow,lazar,lazaret,lazarly,laze,lazily,lazule,lazuli,lazy,lazyish,lea,leach,leacher,leachy,lead,leadage,leaded,leaden,leader,leadin,leading,leadman,leadoff,leadout,leadway,leady,leaf,leafage,leafboy,leafcup,leafdom,leafed,leafen,leafer,leafery,leafit,leaflet,leafy,league,leaguer,leak,leakage,leaker,leaky,leal,lealand,leally,lealty,leam,leamer,lean,leaner,leaning,leanish,leanly,leant,leap,leaper,leaping,leapt,lear,learn,learned,learner,learnt,lease,leaser,leash,leasing,leasow,least,leat,leath,leather,leatman,leave,leaved,leaven,leaver,leaves,leaving,leavy,leawill,leban,lebbek,lecama,lech,lecher,lechery,lechwe,leck,lecker,lectern,lection,lector,lectual,lecture,lecyth,led,lede,leden,ledge,ledged,ledger,ledging,ledgy,ledol,lee,leech,leecher,leeches,leed,leefang,leek,leekish,leeky,leep,leepit,leer,leerily,leerish,leery,lees,leet,leetman,leewan,leeward,leeway,leewill,left,leftish,leftism,leftist,leg,legacy,legal,legally,legate,legatee,legato,legator,legend,legenda,leger,leges,legged,legger,legging,leggy,leghorn,legible,legibly,legific,legion,legist,legit,legitim,leglen,legless,leglet,leglike,legman,legoa,legpull,legrope,legua,leguan,legume,legumen,legumin,lehr,lehrman,lehua,lei,leister,leisure,lek,lekach,lekane,lekha,leman,lemel,lemma,lemmata,lemming,lemnad,lemon,lemony,lempira,lemur,lemures,lemurid,lenad,lenard,lench,lend,lendee,lender,lene,length,lengthy,lenient,lenify,lenis,lenitic,lenity,lennow,leno,lens,lensed,lent,lenth,lentigo,lentil,lentisc,lentisk,lento,lentoid,lentor,lentous,lenvoi,lenvoy,leonine,leonite,leopard,leotard,lepa,leper,lepered,leporid,lepra,lepric,leproid,leproma,leprose,leprosy,leprous,leptid,leptite,leptome,lepton,leptus,lerot,lerp,lerret,lesche,lesion,lesiy,less,lessee,lessen,lesser,lessive,lessn,lesson,lessor,lest,lestrad,let,letch,letchy,letdown,lete,lethal,letoff,letten,letter,lettrin,lettuce,letup,leu,leuch,leucine,leucism,leucite,leuco,leucoid,leucoma,leucon,leucous,leucyl,leud,leuk,leuma,lev,levance,levant,levator,levee,level,leveler,levelly,lever,leverer,leveret,levers,levier,levin,levir,levity,levo,levulic,levulin,levy,levyist,lew,lewd,lewdly,lewis,lewth,lexia,lexical,lexicon,ley,leyland,leysing,li,liable,liaison,liana,liang,liar,liard,libant,libate,libber,libbet,libbra,libel,libelee,libeler,liber,liberal,liberty,libido,libken,libra,libral,library,librate,licca,license,lich,licham,lichen,licheny,lichi,licit,licitly,lick,licker,licking,licorn,licorne,lictor,lid,lidded,lidder,lidgate,lidless,lie,lied,lief,liege,liegely,lieger,lien,lienal,lienee,lienic,lienor,lier,lierne,lierre,liesh,lieu,lieue,lieve,life,lifeday,lifeful,lifelet,lifer,lifey,lifo,lift,lifter,lifting,liftman,ligable,ligas,ligate,ligator,ligger,light,lighten,lighter,lightly,ligne,lignify,lignin,lignite,lignone,lignose,lignum,ligula,ligular,ligule,ligulin,ligure,liin,lija,likable,like,likely,liken,liker,likin,liking,liknon,lilac,lilacin,lilacky,lile,lilied,lill,lilt,lily,lilyfy,lim,limacel,limacon,liman,limb,limbal,limbat,limbate,limbeck,limbed,limber,limbers,limbic,limbie,limbo,limbous,limbus,limby,lime,limeade,limeman,limen,limer,limes,limetta,limey,liminal,liming,limit,limital,limited,limiter,limma,limmer,limmock,limmu,limn,limner,limnery,limniad,limnite,limoid,limonin,limose,limous,limp,limper,limpet,limpid,limpily,limpin,limping,limpish,limpkin,limply,limpsy,limpy,limsy,limu,limulid,limy,lin,lina,linable,linaga,linage,linaloa,linalol,linch,linchet,linctus,lindane,linden,linder,lindo,line,linea,lineage,lineal,linear,lineate,linecut,lined,linelet,lineman,linen,liner,ling,linga,linge,lingel,linger,lingo,lingtow,lingua,lingual,linguet,lingula,lingy,linha,linhay,linie,linin,lining,linitis,liniya,linja,linje,link,linkage,linkboy,linked,linker,linking,linkman,links,linky,linn,linnet,lino,linolic,linolin,linon,linous,linoxin,linoxyn,linpin,linseed,linsey,lint,lintel,linten,linter,lintern,lintie,linty,linwood,liny,lion,lioncel,lionel,lioness,lionet,lionism,lionize,lionly,lip,lipa,liparid,lipase,lipemia,lipide,lipin,lipless,liplet,liplike,lipoid,lipoma,lipopod,liposis,lipped,lippen,lipper,lipping,lippy,lipuria,lipwork,liquate,liquefy,liqueur,liquid,liquidy,liquor,lira,lirate,lire,lirella,lis,lisere,lish,lisk,lisle,lisp,lisper,lispund,liss,lissom,lissome,list,listed,listel,listen,lister,listing,listred,lit,litany,litas,litch,litchi,lite,liter,literal,lith,lithe,lithely,lithi,lithia,lithic,lithify,lithite,lithium,litho,lithoid,lithous,lithy,litmus,litotes,litra,litster,litten,litter,littery,little,lituite,liturgy,litus,lituus,litz,livable,live,lived,livedo,lively,liven,liver,livered,livery,livid,lividly,livier,living,livor,livre,liwan,lixive,lizard,llama,llano,llautu,llyn,lo,loa,loach,load,loadage,loaded,loaden,loader,loading,loaf,loafer,loafing,loaflet,loam,loamily,loaming,loamy,loan,loaner,loanin,loath,loathe,loather,loathly,loave,lob,lobal,lobar,lobate,lobated,lobber,lobbish,lobby,lobbyer,lobcock,lobe,lobed,lobelet,lobelin,lobfig,lobing,lobiped,lobo,lobola,lobose,lobster,lobtail,lobular,lobule,lobworm,loca,locable,local,locale,locally,locanda,locate,locator,loch,lochage,lochan,lochia,lochial,lochus,lochy,loci,lock,lockage,lockbox,locked,locker,locket,lockful,locking,lockjaw,locklet,lockman,lockout,lockpin,lockram,lockup,locky,loco,locoism,locular,locule,loculus,locum,locus,locust,locusta,locutor,lod,lode,lodge,lodged,lodger,lodging,loess,loessal,loessic,lof,loft,lofter,loftily,lofting,loftman,lofty,log,loganin,logbook,logcock,loge,logeion,logeum,loggat,logged,logger,loggia,loggin,logging,loggish,loghead,logia,logic,logical,logie,login,logion,logium,loglet,loglike,logman,logoi,logos,logroll,logway,logwise,logwood,logwork,logy,lohan,lohoch,loimic,loin,loined,loir,loiter,loka,lokao,lokaose,loke,loket,lokiec,loll,loller,lollop,lollopy,lolly,loma,lombard,lomboy,loment,lomita,lommock,lone,lonely,long,longa,longan,longbow,longe,longear,longer,longfin,longful,longing,longish,longjaw,longly,longs,longue,longway,lontar,loo,looby,lood,loof,loofah,loofie,look,looker,looking,lookout,lookum,loom,loomer,loomery,looming,loon,loonery,looney,loony,loop,looper,loopful,looping,loopist,looplet,loopy,loose,loosely,loosen,looser,loosing,loosish,loot,looten,looter,lootie,lop,lope,loper,lophiid,lophine,loppard,lopper,loppet,lopping,loppy,lopseed,loquat,loquent,lora,loral,loran,lorate,lorcha,lord,lording,lordkin,lordlet,lordly,lordy,lore,loreal,lored,lori,loric,lorica,lorilet,lorimer,loriot,loris,lormery,lorn,loro,lorry,lors,lorum,lory,losable,lose,losel,loser,losh,losing,loss,lost,lot,lota,lotase,lote,lotic,lotion,lotment,lotrite,lots,lotter,lottery,lotto,lotus,lotusin,louch,loud,louden,loudish,loudly,louey,lough,louk,loukoum,loulu,lounder,lounge,lounger,loungy,loup,loupe,lour,lourdy,louse,lousily,louster,lousy,lout,louter,louther,loutish,louty,louvar,louver,lovable,lovably,lovage,love,loveful,lovely,loveman,lover,lovered,loverly,loving,low,lowa,lowan,lowbell,lowborn,lowboy,lowbred,lowdah,lowder,loweite,lower,lowerer,lowery,lowish,lowland,lowlily,lowly,lowmen,lowmost,lown,lowness,lownly,lowth,lowwood,lowy,lox,loxia,loxic,loxotic,loy,loyal,loyally,loyalty,lozenge,lozengy,lubber,lube,lubra,lubric,lubrify,lucanid,lucarne,lucban,luce,lucence,lucency,lucent,lucern,lucerne,lucet,lucible,lucid,lucida,lucidly,lucifee,lucific,lucigen,lucivee,luck,lucken,luckful,luckie,luckily,lucky,lucre,lucrify,lucule,lucumia,lucy,ludden,ludibry,ludo,lue,lues,luetic,lufbery,luff,lug,luge,luger,luggage,luggar,lugged,lugger,luggie,lugmark,lugsail,lugsome,lugworm,luhinga,luigino,luke,lukely,lulab,lull,lullaby,luller,lulu,lum,lumbago,lumbang,lumbar,lumber,lumen,luminal,lumine,lummox,lummy,lump,lumper,lumpet,lumpily,lumping,lumpish,lumpkin,lumpman,lumpy,luna,lunacy,lunar,lunare,lunary,lunate,lunatic,lunatum,lunch,luncher,lune,lunes,lunette,lung,lunge,lunged,lunger,lungful,lungi,lungie,lungis,lungy,lunn,lunoid,lunt,lunula,lunular,lunule,lunulet,lupe,lupeol,lupeose,lupine,lupinin,lupis,lupoid,lupous,lupulic,lupulin,lupulus,lupus,lura,lural,lurch,lurcher,lurdan,lure,lureful,lurer,lurg,lurid,luridly,lurk,lurker,lurky,lurrier,lurry,lush,lusher,lushly,lushy,lusk,lusky,lusory,lust,luster,lustful,lustily,lustra,lustral,lustrum,lusty,lut,lutany,lute,luteal,lutecia,lutein,lutelet,luteo,luteoma,luteous,luter,luteway,lutfisk,luthern,luthier,luting,lutist,lutose,lutrin,lutrine,lux,luxate,luxe,luxury,luxus,ly,lyam,lyard,lyceal,lyceum,lycid,lycopin,lycopod,lycosid,lyctid,lyddite,lydite,lye,lyery,lygaeid,lying,lyingly,lymph,lymphad,lymphy,lyncean,lynch,lyncher,lyncine,lynx,lyra,lyrate,lyrated,lyraway,lyre,lyreman,lyric,lyrical,lyrism,lyrist,lys,lysate,lyse,lysin,lysine,lysis,lysogen,lyssa,lyssic,lytic,lytta,lyxose,m,ma,maam,mabi,mabolo,mac,macabre,macaco,macadam,macan,macana,macao,macaque,macaw,macco,mace,maceman,macer,machan,machar,machete,machi,machila,machin,machine,machree,macies,mack,mackins,mackle,macle,macled,maco,macrame,macro,macron,macuca,macula,macular,macule,macuta,mad,madam,madame,madcap,madden,madder,madding,maddish,maddle,made,madefy,madhuca,madid,madling,madly,madman,madnep,madness,mado,madoqua,madrier,madrona,madship,maduro,madweed,madwort,mae,maenad,maestri,maestro,maffia,maffick,maffle,mafflin,mafic,mafoo,mafura,mag,magadis,magani,magas,mage,magenta,magged,maggle,maggot,maggoty,magi,magic,magical,magiric,magma,magnate,magnes,magnet,magneta,magneto,magnify,magnum,magot,magpie,magpied,magsman,maguari,maguey,maha,mahaleb,mahalla,mahant,mahar,maharao,mahatma,mahmal,mahmudi,mahoe,maholi,mahone,mahout,mahseer,mahua,mahuang,maid,maidan,maiden,maidish,maidism,maidkin,maidy,maiefic,maigre,maiid,mail,mailbag,mailbox,mailed,mailer,mailie,mailman,maim,maimed,maimer,maimon,main,mainly,mainour,mainpin,mains,maint,maintop,maioid,maire,maize,maizer,majagua,majesty,majo,majoon,major,makable,make,makedom,maker,makhzan,maki,making,makluk,mako,makuk,mal,mala,malacia,malacon,malady,malagma,malaise,malakin,malambo,malanga,malapi,malar,malaria,malarin,malate,malati,malax,malduck,male,malease,maleate,maleic,malella,maleo,malfed,mali,malic,malice,malicho,malign,malik,maline,malines,malism,malison,malist,malkin,mall,mallard,malleal,mallear,mallee,mallein,mallet,malleus,mallow,mallum,mallus,malm,malmsey,malmy,malo,malodor,malonic,malonyl,malouah,malpais,malt,maltase,malter,maltha,malting,maltman,maltose,malty,mamba,mambo,mamma,mammal,mammary,mammate,mammee,mammer,mammock,mammon,mammoth,mammula,mammy,mamo,man,mana,manacle,manage,managee,manager,manaism,manakin,manal,manas,manatee,manavel,manbird,manbot,manche,manchet,mancono,mancus,mand,mandala,mandant,mandate,mandil,mandola,mandom,mandora,mandore,mandra,mandrel,mandrin,mandua,mandyas,mane,maned,manege,manei,manent,manes,maness,maney,manful,mang,manga,mangal,mange,mangeao,mangel,manger,mangi,mangily,mangle,mangler,mango,mangona,mangue,mangy,manhead,manhole,manhood,mani,mania,maniac,manic,manid,manify,manikin,manila,manilla,manille,manioc,maniple,manism,manist,manito,maniu,manjak,mank,mankin,mankind,manless,manlet,manlike,manlily,manling,manly,manna,mannan,manner,manners,manness,mannide,mannie,mannify,manning,mannish,mannite,mannose,manny,mano,manoc,manomin,manor,manque,manred,manrent,manroot,manrope,mansard,manse,manship,mansion,manso,mant,manta,mantal,manteau,mantel,manter,mantes,mantic,mantid,mantis,mantle,mantled,mantlet,manto,mantoid,mantra,mantrap,mantua,manual,manuao,manuka,manul,manuma,manumea,manumit,manure,manurer,manus,manward,manway,manweed,manwise,many,manzana,manzil,mao,maomao,map,mapach,mapau,mapland,maple,mapo,mapper,mappist,mappy,mapwise,maqui,maquis,mar,marabou,maraca,maracan,marae,maral,marang,marara,mararie,marasca,maraud,marble,marbled,marbler,marbles,marbly,marc,marcel,march,marcher,marcid,marco,marconi,marcor,mardy,mare,maremma,marengo,marfire,margay,marge,margent,margin,margosa,marhala,maria,marid,marimba,marina,marine,mariner,mariola,maris,marish,marital,mark,marka,marked,marker,market,markhor,marking,markka,markman,markup,marl,marled,marler,marli,marlin,marline,marlite,marlock,marlpit,marly,marm,marmit,marmite,marmose,marmot,maro,marok,maroon,marplot,marque,marquee,marquis,marrano,marree,marrer,married,marrier,marron,marrot,marrow,marrowy,marry,marryer,marsh,marshal,marshy,marsoon,mart,martel,marten,martext,martial,martin,martite,martlet,martyr,martyry,maru,marvel,marver,mary,marybud,mas,masa,mascara,mascled,mascot,masculy,masdeu,mash,masha,mashal,masher,mashie,mashing,mashman,mashru,mashy,masjid,mask,masked,masker,maskoid,maslin,mason,masoned,masoner,masonic,masonry,masooka,masoola,masque,masquer,mass,massa,massage,masse,massel,masser,masseur,massier,massif,massily,massive,massoy,massula,massy,mast,mastaba,mastage,mastax,masted,master,mastery,mastful,mastic,mastiff,masting,mastman,mastoid,masty,masu,mat,mataco,matador,matai,matalan,matanza,matapan,matapi,matara,matax,match,matcher,matchy,mate,mately,mater,matey,math,mathes,matico,matin,matinal,matinee,mating,matins,matipo,matka,matless,matlow,matra,matral,matrass,matreed,matric,matris,matrix,matron,matross,matsu,matsuri,matta,mattaro,matte,matted,matter,mattery,matti,matting,mattock,mattoid,mattoir,mature,maturer,matweed,maty,matzo,matzoon,matzos,matzoth,mau,maud,maudle,maudlin,mauger,maugh,maul,mauler,mauley,mauling,maumet,maun,maund,maunder,maundy,maunge,mauther,mauve,mauvine,maux,mavis,maw,mawk,mawkish,mawky,mawp,maxilla,maxim,maxima,maximal,maximed,maximum,maximus,maxixe,maxwell,may,maya,maybe,maybush,maycock,mayday,mayfish,mayhap,mayhem,maynt,mayor,mayoral,maypop,maysin,mayten,mayweed,maza,mazame,mazard,maze,mazed,mazedly,mazeful,mazer,mazic,mazily,mazuca,mazuma,mazurka,mazut,mazy,mazzard,mbalolo,mbori,me,meable,mead,meader,meadow,meadowy,meager,meagre,meak,meal,mealer,mealies,mealily,mealman,mealy,mean,meander,meaned,meaner,meaning,meanish,meanly,meant,mease,measle,measled,measles,measly,measure,meat,meatal,meated,meatily,meatman,meatus,meaty,mecate,mecon,meconic,meconin,medal,medaled,medalet,meddle,meddler,media,mediacy,mediad,medial,median,mediant,mediate,medic,medical,medico,mediety,medimn,medimno,medino,medio,medium,medius,medlar,medley,medrick,medulla,medusal,medusan,meebos,meece,meed,meek,meeken,meekly,meered,meerkat,meese,meet,meeten,meeter,meeting,meetly,megabar,megaerg,megafog,megapod,megaron,megaton,megerg,megilp,megmho,megohm,megrim,mehalla,mehari,mehtar,meile,mein,meinie,meio,meiobar,meiosis,meiotic,meith,mel,mela,melada,melagra,melam,melamed,melange,melanic,melanin,melano,melasma,melch,meld,melder,meldrop,mele,melee,melena,melene,melenic,melic,melilot,meline,melisma,melitis,mell,mellate,mellay,meller,mellit,mellite,mellon,mellow,mellowy,melodia,melodic,melody,meloe,meloid,melon,melonry,melos,melosa,melt,meltage,melted,melter,melters,melting,melton,mem,member,membral,memento,meminna,memo,memoir,memoria,memory,men,menace,menacer,menacme,menage,menald,mend,mendee,mender,mending,mendole,mends,menfolk,meng,menhir,menial,meninx,menkind,mennom,mensa,mensal,mense,menses,mensk,mensual,mental,mentary,menthol,menthyl,mention,mentor,mentum,menu,meny,menyie,menzie,merbaby,mercal,mercer,mercery,merch,merchet,mercy,mere,merel,merely,merfold,merfolk,merge,merger,mergh,meriah,merice,meril,merism,merist,merit,merited,meriter,merk,merkhet,merkin,merl,merle,merlin,merlon,mermaid,merman,mero,merop,meropia,meros,merrily,merrow,merry,merse,mesa,mesad,mesail,mesal,mesally,mesange,mesarch,mescal,mese,mesem,mesenna,mesh,meshed,meshy,mesiad,mesial,mesian,mesic,mesilla,mesion,mesityl,mesne,meso,mesobar,mesode,mesodic,mesole,meson,mesonic,mesopic,mespil,mess,message,messan,messe,messer,messet,messily,messin,messing,messman,messor,messrs,messtin,messy,mestee,mester,mestiza,mestizo,mestome,met,meta,metad,metage,metal,metaler,metamer,metanym,metate,metayer,mete,metel,meteor,meter,methane,methene,mether,methid,methide,methine,method,methyl,metic,metier,metis,metochy,metonym,metope,metopic,metopon,metra,metreta,metrete,metria,metric,metrics,metrify,metrist,mettar,mettle,mettled,metusia,metze,meuse,meute,mew,meward,mewer,mewl,mewler,mezcal,mezuzah,mezzo,mho,mi,miamia,mian,miaow,miaower,mias,miasm,miasma,miasmal,miasmic,miaul,miauler,mib,mica,micate,mice,micelle,miche,micher,miching,micht,mick,mickle,mico,micrify,micro,microbe,microhm,micron,miction,mid,midday,midden,middle,middler,middy,mide,midge,midget,midgety,midgy,midiron,midland,midleg,midmain,midmorn,midmost,midnoon,midpit,midrash,midrib,midriff,mids,midship,midst,midtap,midvein,midward,midway,midweek,midwife,midwise,midyear,mien,miff,miffy,mig,might,mightnt,mighty,miglio,mignon,migrant,migrate,mihrab,mijl,mikado,mike,mikie,mil,mila,milady,milch,milcher,milchy,mild,milden,milder,mildew,mildewy,mildish,mildly,mile,mileage,miler,mileway,milfoil,milha,miliary,milieu,militia,milium,milk,milken,milker,milkily,milking,milkman,milksop,milky,mill,milla,millage,milldam,mille,milled,miller,millet,millful,milliad,millile,milline,milling,million,millman,milner,milo,milord,milpa,milreis,milsey,milsie,milt,milter,milty,milvine,mim,mima,mimbar,mimble,mime,mimeo,mimer,mimesis,mimetic,mimic,mimical,mimicry,mimine,mimly,mimmest,mimmock,mimmood,mimmoud,mimosis,mimp,mimsey,min,mina,minable,minar,minaret,minaway,mince,mincer,mincing,mind,minded,minder,mindful,minding,mine,miner,mineral,minery,mines,minette,ming,minge,mingle,mingler,mingy,minhag,minhah,miniate,minibus,minicam,minify,minikin,minim,minima,minimal,minimum,minimus,mining,minion,minish,minium,miniver,minivet,mink,minkery,minkish,minnie,minning,minnow,minny,mino,minoize,minor,minot,minster,mint,mintage,minter,mintman,minty,minuend,minuet,minus,minute,minuter,minutia,minx,minxish,miny,minyan,miqra,mir,mirach,miracle,mirador,mirage,miragy,mirate,mirbane,mird,mirdaha,mire,mirid,mirific,mirish,mirk,miro,mirror,mirrory,mirth,miry,mirza,misact,misadd,misaim,misally,misbias,misbill,misbind,misbode,misborn,misbusy,miscall,miscast,mischio,miscoin,miscook,miscrop,miscue,miscut,misdate,misdaub,misdeal,misdeed,misdeem,misdiet,misdo,misdoer,misdraw,mise,misease,misedit,miser,miserly,misery,misfare,misfile,misfire,misfit,misfond,misform,misgive,misgo,misgrow,mishap,mishmee,misjoin,miskeep,misken,miskill,misknow,misky,mislay,mislead,mislear,misled,mislest,mislike,mislive,mismade,mismake,mismate,mismove,misname,misobey,mispage,mispart,mispay,mispick,misplay,misput,misrate,misread,misrule,miss,missal,missay,misseem,missel,misset,missile,missing,mission,missis,missish,missive,misstay,misstep,missy,mist,mistake,mistbow,misted,mistell,mistend,mister,misterm,mistful,mistic,mistide,mistify,mistily,mistime,mistle,mistone,mistook,mistral,mistry,misturn,misty,misura,misuse,misuser,miswed,miswish,misword,misyoke,mite,miter,mitered,miterer,mitis,mitome,mitosis,mitotic,mitra,mitral,mitrate,mitre,mitrer,mitt,mitten,mitty,mity,miurus,mix,mixable,mixed,mixedly,mixen,mixer,mixhill,mixible,mixite,mixtion,mixture,mixy,mizmaze,mizzen,mizzle,mizzler,mizzly,mizzy,mneme,mnemic,mnesic,mnestic,mnioid,mo,moan,moanful,moaning,moat,mob,mobable,mobber,mobbish,mobbism,mobbist,mobby,mobcap,mobed,mobile,moble,moblike,mobship,mobsman,mobster,mocha,mochras,mock,mockado,mocker,mockery,mockful,mocmain,mocuck,modal,modally,mode,model,modeler,modena,modern,modest,modesty,modicum,modify,modish,modist,modiste,modius,modular,module,modulo,modulus,moellon,mofette,moff,mog,mogador,mogdad,moggan,moggy,mogo,moguey,moha,mohabat,mohair,mohar,mohel,moho,mohr,mohur,moider,moidore,moieter,moiety,moil,moiler,moiles,moiley,moiling,moineau,moio,moire,moise,moist,moisten,moistly,moisty,moit,moity,mojarra,mojo,moke,moki,moko,moksha,mokum,moky,mola,molal,molar,molary,molassy,molave,mold,molder,moldery,molding,moldy,mole,moleism,moler,molest,molimen,moline,molka,molland,molle,mollie,mollify,mollusk,molly,molman,moloid,moloker,molompi,molosse,molpe,molt,molten,molter,moly,mombin,momble,mome,moment,momenta,momism,momme,mommet,mommy,momo,mon,mona,monad,monadic,monaene,monal,monarch,monas,monase,monaxon,mone,monel,monepic,moner,moneral,moneran,moneric,moneron,monesia,money,moneyed,moneyer,mong,monger,mongery,mongler,mongrel,mongst,monial,moniker,monism,monist,monitor,monk,monkdom,monkery,monkess,monkey,monkish,monkism,monkly,monny,mono,monoazo,monocle,monocot,monodic,monody,monoid,monomer,mononch,monont,mononym,monose,monotic,monsoon,monster,montage,montana,montane,montant,monte,montem,month,monthly,monthon,montjoy,monton,monture,moo,mooch,moocha,moocher,mood,mooder,moodily,moodish,moodle,moody,mooing,mool,moolet,mools,moolum,moon,moonack,mooned,mooner,moonery,mooneye,moonily,mooning,moonish,moonite,moonja,moonjah,moonlet,moonlit,moonman,moonset,moonway,moony,moop,moor,moorage,mooring,moorish,moorman,moorn,moorpan,moors,moorup,moory,moosa,moose,moosey,moost,moot,mooter,mooth,mooting,mootman,mop,mopane,mope,moper,moph,mophead,moping,mopish,mopla,mopper,moppet,moppy,mopsy,mopus,mor,mora,moraine,moral,morale,morally,morals,morass,morassy,morat,morate,moray,morbid,morbify,mordant,mordent,mordore,more,moreen,moreish,morel,morella,morello,mores,morfrey,morg,morga,morgan,morgay,morgen,morglay,morgue,moric,moriche,morin,morinel,morion,morkin,morlop,mormaor,mormo,mormon,mormyr,mormyre,morn,morne,morned,morning,moro,moroc,morocco,moron,moroncy,morong,moronic,moronry,morose,morosis,morph,morphea,morphew,morphia,morphic,morphon,morris,morrow,morsal,morse,morsel,morsing,morsure,mort,mortal,mortar,mortary,morth,mortier,mortify,mortise,morula,morular,morule,morvin,morwong,mosaic,mosaist,mosette,mosey,mosker,mosque,moss,mossed,mosser,mossery,mossful,mossy,most,moste,mostly,mot,mote,moted,motel,moter,motet,motey,moth,mothed,mother,mothery,mothy,motif,motific,motile,motion,motive,motley,motmot,motor,motored,motoric,motory,mott,motte,mottle,mottled,mottler,motto,mottoed,motyka,mou,mouche,moud,moudie,moudy,mouflon,mouille,moujik,moul,mould,moulded,moule,moulin,mouls,moulter,mouly,mound,moundy,mount,mounted,mounter,moup,mourn,mourner,mouse,mouser,mousery,mousey,mousily,mousing,mousle,mousmee,mousse,moustoc,mousy,mout,moutan,mouth,mouthed,mouther,mouthy,mouton,mouzah,movable,movably,movant,move,mover,movie,moving,mow,mowable,mowana,mowburn,mowch,mowcht,mower,mowha,mowie,mowing,mowland,mown,mowra,mowrah,mowse,mowt,mowth,moxa,moy,moyen,moyenne,moyite,moyle,moyo,mozing,mpret,mu,muang,mubarat,mucago,mucaro,mucedin,much,muchly,mucic,mucid,mucific,mucigen,mucin,muck,mucker,mucket,muckite,muckle,muckman,muckna,mucksy,mucky,mucluc,mucoid,muconic,mucopus,mucor,mucosa,mucosal,mucose,mucous,mucro,mucus,mucusin,mud,mudar,mudbank,mudcap,mudd,mudde,mudden,muddify,muddily,mudding,muddish,muddle,muddler,muddy,mudee,mudfish,mudflow,mudhead,mudhole,mudir,mudiria,mudland,mudlark,mudless,mudra,mudsill,mudweed,mudwort,muermo,muezzin,muff,muffed,muffet,muffin,muffish,muffle,muffled,muffler,mufflin,muffy,mufti,mufty,mug,muga,mugful,mugg,mugger,mugget,muggily,muggins,muggish,muggles,muggy,mugient,mugweed,mugwort,mugwump,muid,muir,muist,mukluk,muktar,mukti,mulatta,mulatto,mulch,mulcher,mulct,mulder,mule,muleman,muleta,muletta,muley,mulga,mulier,mulish,mulism,mulita,mulk,mull,mulla,mullah,mullar,mullein,muller,mullet,mullets,mulley,mullid,mullion,mullite,mullock,mulloid,mulmul,mulse,mulsify,mult,multum,multure,mum,mumble,mumbler,mummer,mummery,mummick,mummied,mummify,mumming,mummy,mumness,mump,mumper,mumpish,mumps,mun,munch,muncher,munchet,mund,mundane,mundic,mundify,mundil,mundle,mung,munga,munge,mungey,mungo,mungofa,munguba,mungy,munific,munity,munj,munjeet,munnion,munshi,munt,muntin,muntjac,mura,murage,mural,muraled,murally,murchy,murder,murdrum,mure,murex,murexan,murga,murgavi,murgeon,muriate,muricid,murid,murine,murinus,muriti,murium,murk,murkily,murkish,murkly,murky,murlin,murly,murmur,murphy,murra,murrain,murre,murrey,murrina,murshid,muruxi,murva,murza,musal,musang,musar,muscade,muscat,muscid,muscle,muscled,muscly,muscoid,muscone,muscose,muscot,muscovy,muscule,muse,mused,museful,museist,muser,musery,musette,museum,mush,musha,mushaa,mushed,musher,mushily,mushla,mushru,mushy,music,musical,musico,musie,musily,musimon,musing,musk,muskat,muskeg,musket,muskie,muskish,muskrat,musky,muslin,musnud,musquaw,musrol,muss,mussal,mussel,mussily,mussuk,mussy,must,mustang,mustard,mustee,muster,mustify,mustily,mustnt,musty,muta,mutable,mutably,mutage,mutant,mutase,mutate,mutch,mute,mutedly,mutely,muth,mutic,mutiny,mutism,mutist,mutive,mutsje,mutt,mutter,mutton,muttony,mutual,mutuary,mutule,mutuum,mux,muyusa,muzhik,muzz,muzzily,muzzle,muzzler,muzzy,my,myal,myalgia,myalgic,myalism,myall,myarian,myatony,mycele,mycelia,mycoid,mycose,mycosin,mycosis,mycotic,mydine,myelic,myelin,myeloic,myeloid,myeloma,myelon,mygale,mygalid,myiasis,myiosis,myitis,mykiss,mymarid,myna,myocele,myocyte,myogen,myogram,myoid,myology,myoma,myomere,myoneme,myope,myophan,myopia,myopic,myops,myopy,myosin,myosis,myosote,myotic,myotome,myotomy,myotony,myowun,myoxine,myrcene,myrcia,myriad,myriare,myrica,myricin,myricyl,myringa,myron,myronic,myrosin,myrrh,myrrhed,myrrhic,myrrhol,myrrhy,myrtal,myrtle,myrtol,mysel,myself,mysell,mysid,mysoid,mysost,myst,mystax,mystery,mystes,mystic,mystify,myth,mythify,mythism,mythist,mythize,mythos,mythus,mytilid,myxa,myxemia,myxo,myxoid,myxoma,myxopod,myzont,n,na,naa,naam,nab,nabak,nabber,nabk,nabla,nable,nabob,nabobry,nabs,nacarat,nace,nacelle,nach,nachani,nacket,nacre,nacred,nacrine,nacrite,nacrous,nacry,nadder,nadir,nadiral,nae,naebody,naegate,nael,naether,nag,naga,nagaika,nagana,nagara,nagger,naggin,nagging,naggish,naggle,naggly,naggy,naght,nagmaal,nagman,nagnag,nagnail,nagor,nagsman,nagster,nagual,naiad,naiant,naid,naif,naifly,naig,naigie,naik,nail,nailbin,nailer,nailery,nailing,nailrod,naily,nain,nainsel,naio,naipkin,nairy,nais,naish,naither,naive,naively,naivete,naivety,nak,nake,naked,nakedly,naker,nakhod,nakhoda,nako,nakong,nakoo,nallah,nam,namable,namaqua,namaz,namda,name,namely,namer,naming,nammad,nan,nana,nancy,nandi,nandine,nandow,nandu,nane,nanes,nanga,nanism,nankeen,nankin,nanny,nanoid,nanpie,nant,nantle,naology,naos,nap,napa,napal,napalm,nape,napead,naperer,napery,naphtha,naphtho,naphtol,napkin,napless,napoo,nappe,napped,napper,napping,nappy,napron,napu,nar,narcism,narcist,narcoma,narcose,narcous,nard,nardine,nardoo,nares,nargil,narial,naric,narica,narine,nark,narky,narr,narra,narras,narrate,narrow,narrowy,narthex,narwhal,nary,nasab,nasal,nasalis,nasally,nasard,nascent,nasch,nash,nashgab,nashgob,nasi,nasial,nasion,nasitis,nasrol,nast,nastic,nastika,nastily,nasty,nasus,nasute,nasutus,nat,nataka,natal,natals,natant,natator,natch,nates,nathe,nather,nation,native,natr,natrium,natron,natter,nattily,nattle,natty,natuary,natural,nature,naucrar,nauger,naught,naughty,naumk,naunt,nauntle,nausea,naut,nautch,nauther,nautic,nautics,naval,navally,navar,navarch,nave,navel,naveled,navet,navette,navew,navite,navvy,navy,naw,nawab,nawt,nay,nayaur,naysay,nayward,nayword,naze,nazim,nazir,ne,nea,neal,neanic,neap,neaped,nearby,nearest,nearish,nearly,neat,neaten,neath,neatify,neatly,neb,neback,nebbed,nebbuck,nebbuk,nebby,nebel,nebris,nebula,nebulae,nebular,nebule,neck,neckar,necked,necker,neckful,necking,necklet,necktie,necrose,nectar,nectary,nedder,neddy,nee,neebor,neebour,need,needer,needful,needham,needily,needing,needle,needled,needler,needles,needly,needs,needy,neeger,neeld,neele,neem,neep,neepour,neer,neese,neet,neetup,neeze,nef,nefast,neffy,neftgil,negate,negator,neger,neglect,negrine,negro,negus,nei,neif,neigh,neigher,neiper,neist,neither,nekton,nelson,nema,nematic,nemeses,nemesic,nemoral,nenta,neo,neocyte,neogamy,neolith,neology,neon,neonate,neorama,neossin,neoteny,neotype,neoza,nep,neper,nephele,nephesh,nephew,nephria,nephric,nephron,nephros,nepman,nepotal,nepote,nepotic,nereite,nerine,neritic,nerval,nervate,nerve,nerver,nervid,nervily,nervine,nerving,nervish,nervism,nervose,nervous,nervule,nervure,nervy,nese,nesh,neshly,nesiote,ness,nest,nestage,nester,nestful,nestle,nestler,nesty,net,netball,netbush,netcha,nete,neter,netful,neth,nether,neti,netleaf,netlike,netman,netop,netsman,netsuke,netted,netter,netting,nettle,nettler,nettly,netty,netwise,network,neuma,neume,neumic,neurad,neural,neurale,neuric,neurin,neurine,neurism,neurite,neuroid,neuroma,neuron,neurone,neurula,neuter,neutral,neutron,neve,nevel,never,nevo,nevoid,nevoy,nevus,new,newcal,newcome,newel,newelty,newing,newings,newish,newly,newness,news,newsboy,newsful,newsman,newsy,newt,newtake,newton,nexal,next,nextly,nexum,nexus,neyanda,ngai,ngaio,ngapi,ni,niacin,niata,nib,nibbana,nibbed,nibber,nibble,nibbler,nibby,niblick,niblike,nibong,nibs,nibsome,nice,niceish,nicely,nicety,niche,nicher,nick,nickel,nicker,nickey,nicking,nickle,nicky,nicolo,nicotia,nicotic,nictate,nid,nidal,nidana,niddick,niddle,nide,nidge,nidget,nidgety,nidi,nidify,niding,nidor,nidulus,nidus,niece,nielled,niello,niepa,nieve,nieveta,nife,niffer,nific,nifle,nifling,nifty,nig,niggard,nigger,niggery,niggle,niggler,niggly,nigh,nighly,night,nighted,nightie,nightly,nights,nignay,nignye,nigori,nigre,nigrify,nigrine,nigrous,nigua,nikau,nil,nilgai,nim,nimb,nimbed,nimbi,nimble,nimbly,nimbose,nimbus,nimiety,niminy,nimious,nimmer,nimshi,nincom,nine,ninepin,nineted,ninety,ninny,ninon,ninth,ninthly,nintu,ninut,niobate,niobic,niobite,niobium,niobous,niog,niota,nip,nipa,nipper,nippers,nippily,nipping,nipple,nippy,nipter,nirles,nirvana,nisei,nishiki,nisnas,nispero,nisse,nisus,nit,nitch,nitency,niter,nitered,nither,nithing,nitid,nito,niton,nitrate,nitric,nitride,nitrify,nitrile,nitrite,nitro,nitrous,nitryl,nitter,nitty,nitwit,nival,niveous,nix,nixie,niyoga,nizam,nizamut,nizy,njave,no,noa,nob,nobber,nobbily,nobble,nobbler,nobbut,nobby,noble,nobley,nobly,nobody,nobs,nocake,nocent,nock,nocket,nocktat,noctuid,noctule,nocturn,nocuity,nocuous,nod,nodal,nodated,nodder,nodding,noddle,noddy,node,noded,nodi,nodiak,nodical,nodose,nodous,nodular,nodule,noduled,nodulus,nodus,noel,noetic,noetics,nog,nogada,nogal,noggen,noggin,nogging,noghead,nohow,noil,noilage,noiler,noily,noint,noir,noise,noisily,noisome,noisy,nokta,noll,nolle,nolo,noma,nomad,nomadic,nomancy,nomarch,nombril,nome,nomial,nomic,nomina,nominal,nominee,nominy,nomism,nomisma,nomos,non,nonacid,nonact,nonage,nonagon,nonaid,nonair,nonane,nonary,nonbase,nonce,noncock,noncom,noncome,noncon,nonda,nondo,none,nonego,nonene,nonent,nonepic,nones,nonet,nonevil,nonfact,nonfarm,nonfat,nonfood,nonform,nonfrat,nongas,nongod,nongold,nongray,nongrey,nonhero,nonic,nonion,nonius,nonjury,nonlife,nonly,nonnant,nonnat,nonoic,nonoily,nonomad,nonpaid,nonpar,nonpeak,nonplus,nonpoet,nonport,nonrun,nonsale,nonsane,nonself,nonsine,nonskid,nonslip,nonstop,nonsuit,nontan,nontax,nonterm,nonuple,nonuse,nonuser,nonwar,nonya,nonyl,nonylic,nonzero,noodle,nook,nooked,nookery,nooking,nooklet,nooky,noology,noon,noonday,nooning,noonlit,noop,noose,nooser,nopal,nopalry,nope,nor,norard,norate,noreast,norelin,norgine,nori,noria,norie,norimon,norite,norland,norm,norma,normal,norsel,north,norther,norward,norwest,nose,nosean,nosed,nosegay,noser,nosey,nosine,nosing,nosism,nostic,nostril,nostrum,nosy,not,notable,notably,notaeal,notaeum,notal,notan,notary,notate,notator,notch,notched,notchel,notcher,notchy,note,noted,notedly,notekin,notelet,noter,nother,nothing,nothous,notice,noticer,notify,notion,notitia,notour,notself,notum,nougat,nought,noun,nounal,nounize,noup,nourice,nourish,nous,nouther,nova,novalia,novate,novator,novcic,novel,novelet,novella,novelly,novelry,novelty,novem,novena,novene,novice,novity,now,nowaday,noway,noways,nowed,nowel,nowhat,nowhen,nowhere,nowhit,nowise,nowness,nowt,nowy,noxa,noxal,noxally,noxious,noy,noyade,noyau,nozzle,nozzler,nth,nu,nuance,nub,nubbin,nubble,nubbly,nubby,nubia,nubile,nucal,nucha,nuchal,nucin,nucleal,nuclear,nuclei,nuclein,nucleon,nucleus,nuclide,nucule,nuculid,nudate,nuddle,nude,nudely,nudge,nudger,nudiped,nudish,nudism,nudist,nudity,nugator,nuggar,nugget,nuggety,nugify,nuke,nul,null,nullah,nullify,nullism,nullity,nullo,numb,number,numbing,numble,numbles,numbly,numda,numdah,numen,numeral,numero,nummary,nummi,nummus,numud,nun,nunatak,nunbird,nunch,nuncio,nuncle,nundine,nunhood,nunky,nunlet,nunlike,nunnari,nunnery,nunni,nunnify,nunnish,nunship,nuptial,nuque,nuraghe,nurhag,nurly,nurse,nurser,nursery,nursing,nursle,nursy,nurture,nusfiah,nut,nutant,nutate,nutcake,nutgall,nuthook,nutlet,nutlike,nutmeg,nutpick,nutria,nutrice,nutrify,nutseed,nutted,nutter,nuttery,nuttily,nutting,nuttish,nutty,nuzzer,nuzzle,nyanza,nye,nylast,nylon,nymil,nymph,nympha,nymphae,nymphal,nymphet,nymphic,nymphid,nymphly,nyxis,o,oadal,oaf,oafdom,oafish,oak,oaken,oaklet,oaklike,oakling,oakum,oakweb,oakwood,oaky,oam,oar,oarage,oarcock,oared,oarfish,oarhole,oarial,oaric,oaritic,oaritis,oarium,oarless,oarlike,oarlock,oarlop,oarman,oarsman,oarweed,oary,oasal,oasean,oases,oasis,oasitic,oast,oat,oatbin,oatcake,oatear,oaten,oatfowl,oath,oathay,oathed,oathful,oathlet,oatland,oatlike,oatmeal,oatseed,oaty,oban,obclude,obe,obeah,obeche,obeism,obelia,obeliac,obelial,obelion,obelisk,obelism,obelize,obelus,obese,obesely,obesity,obex,obey,obeyer,obi,obispo,obit,obitual,object,objure,oblate,obley,oblige,obliged,obligee,obliger,obligor,oblique,oblong,obloquy,oboe,oboist,obol,obolary,obole,obolet,obolus,oboval,obovate,obovoid,obscene,obscure,obsede,obsequy,observe,obsess,obtain,obtect,obtest,obtrude,obtund,obtuse,obverse,obvert,obviate,obvious,obvolve,ocarina,occamy,occiput,occlude,occluse,occult,occupy,occur,ocean,oceaned,oceanet,oceanic,ocellar,ocelli,ocellus,oceloid,ocelot,och,ochava,ochavo,ocher,ochery,ochone,ochrea,ochro,ochroid,ochrous,ocht,ock,oclock,ocote,ocque,ocracy,ocrea,ocreate,octad,octadic,octagon,octan,octane,octant,octapla,octarch,octary,octaval,octave,octavic,octavo,octene,octet,octic,octine,octoad,octoate,octofid,octoic,octoid,octonal,octoon,octoped,octopi,octopod,octopus,octose,octoyl,octroi,octroy,octuor,octuple,octuply,octyl,octyne,ocuby,ocular,oculary,oculate,oculist,oculus,od,oda,odacoid,odal,odalisk,odaller,odalman,odd,oddish,oddity,oddlegs,oddly,oddman,oddment,oddness,odds,oddsman,ode,odel,odelet,odeon,odeum,odic,odinite,odious,odist,odium,odology,odontic,odoom,odor,odorant,odorate,odored,odorful,odorize,odorous,odso,odum,odyl,odylic,odylism,odylist,odylize,oe,oecist,oecus,oenin,oenolin,oenomel,oer,oersted,oes,oestrid,oestrin,oestrum,oestrus,of,off,offal,offbeat,offcast,offcome,offcut,offend,offense,offer,offeree,offerer,offeror,offhand,office,officer,offing,offish,offlet,offlook,offscum,offset,offtake,offtype,offward,oflete,oft,often,oftens,ofter,oftest,oftly,oftness,ofttime,ogaire,ogam,ogamic,ogdoad,ogdoas,ogee,ogeed,ogham,oghamic,ogival,ogive,ogived,ogle,ogler,ogmic,ogre,ogreish,ogreism,ogress,ogrish,ogrism,ogtiern,ogum,oh,ohelo,ohia,ohm,ohmage,ohmic,oho,ohoy,oidioid,oii,oil,oilbird,oilcan,oilcoat,oilcup,oildom,oiled,oiler,oilery,oilfish,oilhole,oilily,oilless,oillet,oillike,oilman,oilseed,oilskin,oilway,oily,oilyish,oime,oinomel,oint,oisin,oitava,oka,okapi,okee,okenite,oket,oki,okia,okonite,okra,okrug,olam,olamic,old,olden,older,oldish,oldland,oldness,oldster,oldwife,oleana,olease,oleate,olefin,olefine,oleic,olein,olena,olenid,olent,oleo,oleose,oleous,olfact,olfacty,oliban,olid,oligist,olio,olitory,oliva,olivary,olive,olived,olivet,olivil,olivile,olivine,olla,ollamh,ollapod,ollock,olm,ologist,ology,olomao,olona,oloroso,olpe,oltonde,oltunna,olycook,olykoek,om,omagra,omalgia,omao,omasum,omber,omega,omegoid,omelet,omen,omened,omental,omentum,omer,omicron,omina,ominous,omit,omitis,omitter,omlah,omneity,omniana,omnibus,omnific,omnify,omnist,omnium,on,ona,onager,onagra,onanism,onanist,onca,once,oncetta,oncia,oncin,oncome,oncosis,oncost,ondatra,ondine,ondy,one,onefold,onegite,onehow,oneiric,oneism,onement,oneness,oner,onerary,onerous,onery,oneself,onetime,oneyer,onfall,onflow,ongaro,ongoing,onicolo,onion,onionet,oniony,onium,onkos,onlay,onlepy,onliest,onlook,only,onmarch,onrush,ons,onset,onshore,onside,onsight,onstand,onstead,onsweep,ontal,onto,onus,onward,onwards,onycha,onychia,onychin,onym,onymal,onymity,onymize,onymous,onymy,onyx,onyxis,onza,ooblast,oocyst,oocyte,oodles,ooecial,ooecium,oofbird,ooftish,oofy,oogamy,oogeny,ooglea,oogone,oograph,ooid,ooidal,oolak,oolemma,oolite,oolitic,oolly,oologic,oology,oolong,oomancy,oometer,oometry,oons,oont,oopak,oophore,oophyte,ooplasm,ooplast,oopod,oopodal,oorali,oord,ooscope,ooscopy,oosperm,oospore,ootheca,ootid,ootype,ooze,oozily,oozooid,oozy,opacate,opacify,opacite,opacity,opacous,opah,opal,opaled,opaline,opalish,opalize,opaloid,opaque,ope,opelet,open,opener,opening,openly,opera,operae,operand,operant,operate,opercle,operose,ophic,ophioid,ophite,ophitic,ophryon,opianic,opianyl,opiate,opiatic,opiism,opinant,opine,opiner,opinion,opium,opossum,oppidan,oppose,opposed,opposer,opposit,oppress,oppugn,opsonic,opsonin,opsy,opt,optable,optably,optant,optate,optic,optical,opticon,optics,optimal,optime,optimum,option,optive,opulent,opulus,opus,oquassa,or,ora,orach,oracle,orad,orage,oral,oraler,oralism,oralist,orality,oralize,orally,oralogy,orang,orange,oranger,orangey,orant,orarian,orarion,orarium,orary,orate,oration,orator,oratory,oratrix,orb,orbed,orbic,orbical,orbicle,orbific,orbit,orbital,orbitar,orbite,orbless,orblet,orby,orc,orcanet,orcein,orchard,orchat,orchel,orchic,orchid,orchil,orcin,orcinol,ordain,ordeal,order,ordered,orderer,orderly,ordinal,ordinar,ordinee,ordines,ordu,ordure,ore,oread,orectic,orellin,oreman,orenda,oreweed,orewood,orexis,orf,orfgild,organ,organal,organdy,organer,organic,organon,organry,organum,orgasm,orgeat,orgia,orgiac,orgiacs,orgiasm,orgiast,orgic,orgue,orgy,orgyia,oribi,oriel,oriency,orient,orifice,oriform,origan,origin,orignal,orihon,orillon,oriole,orison,oristic,orle,orlean,orlet,orlo,orlop,ormer,ormolu,orna,ornate,ornery,ornis,ornoite,oroanal,orogen,orogeny,oroide,orology,oronoco,orotund,orphan,orpheon,orpheum,orphrey,orpine,orrery,orrhoid,orris,orsel,orselle,ort,ortalid,ortet,orthal,orthian,orthic,orthid,orthite,ortho,orthose,orthron,ortiga,ortive,ortolan,ortygan,ory,oryssid,os,osamin,osamine,osazone,oscella,oscheal,oscin,oscine,oscnode,oscular,oscule,osculum,ose,osela,oshac,oside,osier,osiered,osiery,osmate,osmatic,osmesis,osmetic,osmic,osmin,osmina,osmious,osmium,osmose,osmosis,osmotic,osmous,osmund,osone,osophy,osprey,ossal,osse,ossein,osselet,osseous,ossicle,ossific,ossify,ossuary,osteal,ostein,ostemia,ostent,osteoid,osteoma,ostial,ostiary,ostiate,ostiole,ostitis,ostium,ostmark,ostosis,ostrich,otalgia,otalgic,otalgy,otarian,otarine,otary,otate,other,othmany,otiant,otiatry,otic,otidine,otidium,otiose,otitic,otitis,otkon,otocyst,otolite,otolith,otology,otosis,ototomy,ottar,otter,otterer,otto,oturia,ouabain,ouabaio,ouabe,ouakari,ouch,ouenite,ouf,ough,ought,oughtnt,oukia,oulap,ounce,ounds,ouphe,ouphish,our,ourie,ouroub,ours,ourself,oust,ouster,out,outact,outage,outarde,outask,outawe,outback,outbake,outban,outbar,outbark,outbawl,outbeam,outbear,outbeg,outbent,outbid,outblot,outblow,outbond,outbook,outborn,outbow,outbowl,outbox,outbrag,outbray,outbred,outbud,outbulk,outburn,outbuy,outbuzz,outby,outcant,outcase,outcast,outcity,outcome,outcrop,outcrow,outcry,outcull,outcure,outcut,outdare,outdate,outdo,outdoer,outdoor,outdraw,outdure,outeat,outecho,outed,outedge,outen,outer,outerly,outeye,outeyed,outface,outfall,outfame,outfast,outfawn,outfeat,outfish,outfit,outflow,outflue,outflux,outfly,outfold,outfool,outfoot,outform,outfort,outgain,outgame,outgang,outgas,outgate,outgaze,outgive,outglad,outglow,outgnaw,outgo,outgoer,outgone,outgrin,outgrow,outgun,outgush,outhaul,outhear,outheel,outher,outhire,outhiss,outhit,outhold,outhowl,outhue,outhunt,outhurl,outhut,outhymn,outing,outish,outjazz,outjest,outjet,outjinx,outjump,outjut,outkick,outkill,outking,outkiss,outknee,outlaid,outland,outlash,outlast,outlaw,outlay,outlean,outleap,outler,outlet,outlie,outlier,outlimb,outlimn,outline,outlip,outlive,outlook,outlord,outlove,outlung,outly,outman,outmate,outmode,outmost,outmove,outname,outness,outnook,outoven,outpace,outpage,outpart,outpass,outpath,outpay,outpeal,outpeep,outpeer,outpick,outpipe,outpity,outplan,outplay,outplod,outplot,outpoll,outpomp,outpop,outport,outpost,outpour,outpray,outpry,outpull,outpurl,outpush,output,outrace,outrage,outrail,outrank,outrant,outrap,outrate,outrave,outray,outre,outread,outrede,outrick,outride,outrig,outring,outroar,outroll,outroot,outrove,outrow,outrun,outrush,outsail,outsay,outsea,outseam,outsee,outseek,outsell,outsert,outset,outshot,outshow,outshut,outside,outsift,outsigh,outsin,outsing,outsit,outsize,outskip,outsoar,outsole,outspan,outspin,outspit,outspue,outstay,outstep,outsuck,outsulk,outsum,outswim,outtalk,outtask,outtear,outtell,outtire,outtoil,outtop,outtrot,outturn,outvie,outvier,outvote,outwait,outwake,outwale,outwalk,outwall,outwar,outward,outwash,outwave,outwear,outweed,outweep,outwell,outwent,outwick,outwile,outwill,outwind,outwing,outwish,outwit,outwith,outwoe,outwood,outword,outwore,outwork,outworn,outyard,outyell,outyelp,outzany,ouzel,ova,oval,ovalish,ovalize,ovally,ovaloid,ovant,ovarial,ovarian,ovarin,ovarium,ovary,ovate,ovated,ovately,ovation,oven,ovenful,ovenly,ovenman,over,overact,overage,overall,overapt,overarm,overawe,overawn,overbet,overbid,overbig,overbit,overbow,overbuy,overby,overcap,overcow,overcoy,overcry,overcup,overcut,overdo,overdry,overdue,overdye,overeat,overegg,overeye,overfag,overfar,overfat,overfed,overfee,overfew,overfit,overfix,overfly,overget,overgo,overgod,overgun,overhit,overhot,overink,overjob,overjoy,overlap,overlax,overlay,overleg,overlie,overlip,overlow,overly,overman,overmix,overnet,overnew,overpay,overpet,overply,overpot,overrim,overrun,oversad,oversea,oversee,overset,oversew,oversot,oversow,overt,overtax,overtip,overtly,overtoe,overtop,overuse,overway,overweb,overwet,overwin,ovest,ovey,ovicell,ovicide,ovicyst,oviduct,oviform,ovigerm,ovile,ovine,ovinia,ovipara,ovisac,ovism,ovist,ovistic,ovocyte,ovoid,ovoidal,ovolo,ovology,ovular,ovulary,ovulate,ovule,ovulist,ovum,ow,owd,owe,owelty,ower,owerby,owght,owing,owk,owl,owldom,owler,owlery,owlet,owlhead,owling,owlish,owlism,owllike,owly,own,owner,ownhood,ownness,ownself,owrehip,owrelay,owse,owsen,owser,owtchah,ox,oxacid,oxalan,oxalate,oxalic,oxalite,oxalyl,oxamate,oxamic,oxamid,oxamide,oxan,oxanate,oxane,oxanic,oxazine,oxazole,oxbane,oxberry,oxbird,oxbiter,oxblood,oxbow,oxboy,oxbrake,oxcart,oxcheek,oxea,oxeate,oxen,oxeote,oxer,oxetone,oxeye,oxfly,oxgang,oxgoad,oxhead,oxheal,oxheart,oxhide,oxhoft,oxhorn,oxhouse,oxhuvud,oxidant,oxidase,oxidate,oxide,oxidic,oxidize,oximate,oxime,oxland,oxlike,oxlip,oxman,oxonic,oxonium,oxozone,oxphony,oxreim,oxshoe,oxskin,oxtail,oxter,oxwort,oxy,oxyacid,oxygas,oxygen,oxyl,oxymel,oxyntic,oxyopia,oxysalt,oxytone,oyapock,oyer,oyster,ozena,ozonate,ozone,ozoned,ozonic,ozonide,ozonify,ozonize,ozonous,ozophen,ozotype,p,pa,paal,paar,paauw,pabble,pablo,pabouch,pabular,pabulum,pac,paca,pacable,pacate,pacay,pacaya,pace,paced,pacer,pachak,pachisi,pacific,pacify,pack,package,packer,packery,packet,packly,packman,packway,paco,pact,paction,pad,padder,padding,paddle,paddled,paddler,paddock,paddy,padella,padfoot,padge,padle,padlike,padlock,padnag,padre,padtree,paean,paegel,paegle,paenula,paeon,paeonic,paga,pagan,paganic,paganly,paganry,page,pageant,pagedom,pageful,pager,pagina,paginal,pagoda,pagrus,pagurid,pagus,pah,paha,pahi,pahlavi,pahmi,paho,pahutan,paigle,paik,pail,pailful,pailou,pain,pained,painful,paining,paint,painted,painter,painty,paip,pair,paired,pairer,pais,paisa,paiwari,pajama,pajock,pakchoi,pakeha,paktong,pal,palace,palaced,paladin,palaite,palama,palame,palanka,palar,palas,palatal,palate,palated,palatic,palaver,palay,palazzi,palch,pale,palea,paleate,paled,palely,paleola,paler,palet,paletot,palette,paletz,palfrey,palgat,pali,palikar,palila,palinal,paling,palisfy,palish,palkee,pall,palla,pallae,pallah,pallall,palled,pallet,palli,pallial,pallid,pallion,pallium,pallone,pallor,pally,palm,palma,palmad,palmar,palmary,palmate,palmed,palmer,palmery,palmful,palmist,palmite,palmito,palmo,palmula,palmus,palmy,palmyra,palolo,palp,palpal,palpate,palped,palpi,palpon,palpus,palsied,palster,palsy,palt,palter,paltry,paludal,paludic,palule,palulus,palus,paly,pam,pament,pamment,pampas,pampean,pamper,pampero,pampre,pan,panace,panacea,panache,panada,panade,panama,panaris,panary,panax,pancake,pand,panda,pandal,pandan,pandect,pandemy,pander,pandita,pandle,pandora,pandour,pandrop,pandura,pandy,pane,paned,paneity,panel,panela,paneler,panfil,panfish,panful,pang,pangamy,pangane,pangen,pangene,pangful,pangi,panhead,panic,panical,panicky,panicle,panisc,panisca,panisic,pank,pankin,panman,panmixy,panmug,pannade,pannage,pannam,panne,pannel,panner,pannery,pannier,panning,pannose,pannum,pannus,panocha,panoche,panoply,panoram,panse,panside,pansied,pansy,pant,pantas,panter,panther,pantie,panties,pantile,panting,pantle,pantler,panto,pantod,panton,pantoon,pantoum,pantry,pants,pantun,panty,panung,panurgy,panyar,paolo,paon,pap,papa,papable,papabot,papacy,papain,papal,papally,papalty,papane,papaw,papaya,papboat,pape,paper,papered,paperer,papern,papery,papess,papey,papilla,papion,papish,papism,papist,papize,papless,papmeat,papoose,pappi,pappose,pappox,pappus,pappy,papreg,paprica,paprika,papula,papular,papule,papyr,papyral,papyri,papyrin,papyrus,paquet,par,para,parable,paracme,parade,parader,parado,parados,paradox,parafle,parage,paragon,parah,paraiba,parale,param,paramo,parang,parao,parapet,paraph,parapod,pararek,parasol,paraspy,parate,paraxon,parbake,parboil,parcel,parch,parcher,parchy,parcook,pard,pardao,parded,pardesi,pardine,pardner,pardo,pardon,pare,parel,parella,paren,parent,parer,paresis,paretic,parfait,pargana,parge,parget,pargo,pari,pariah,parial,parian,paries,parify,parilla,parine,paring,parish,parisis,parison,parity,park,parka,parkee,parker,parkin,parking,parkish,parkway,parky,parlay,parle,parley,parling,parlish,parlor,parlous,parly,parma,parmak,parnas,parnel,paroch,parode,parodic,parodos,parody,paroecy,parol,parole,parolee,paroli,paronym,parotic,parotid,parotis,parous,parpal,parquet,parr,parrel,parrier,parrock,parrot,parroty,parry,parse,parsec,parser,parsley,parsnip,parson,parsony,part,partake,partan,parted,parter,partial,partile,partite,partlet,partly,partner,parto,partook,parture,party,parulis,parure,paruria,parvenu,parvis,parvule,pasan,pasang,paschal,pascual,pash,pasha,pashm,pasi,pasmo,pasquil,pasquin,pass,passade,passado,passage,passant,passe,passee,passen,passer,passewa,passing,passion,passir,passive,passkey,passman,passo,passout,passus,passway,past,paste,pasted,pastel,paster,pastern,pasteur,pastil,pastile,pastime,pasting,pastor,pastose,pastry,pasture,pasty,pasul,pat,pata,pataca,patacao,pataco,patagon,pataka,patamar,patao,patapat,pataque,patas,patball,patch,patcher,patchy,pate,patefy,patel,patella,paten,patency,patener,patent,pater,patera,patesi,path,pathed,pathema,pathic,pathlet,pathos,pathway,pathy,patible,patient,patina,patine,patined,patio,patly,patness,pato,patois,patola,patonce,patria,patrial,patrice,patrico,patrin,patriot,patrist,patrix,patrol,patron,patroon,patta,patte,pattee,patten,patter,pattern,pattu,patty,patu,patwari,paty,pau,paucify,paucity,paughty,paukpan,paular,paulie,paulin,paunch,paunchy,paup,pauper,pausal,pause,pauser,paussid,paut,pauxi,pavage,pavan,pavane,pave,paver,pavid,pavier,paving,pavior,paviour,pavis,paviser,pavisor,pavy,paw,pawdite,pawer,pawing,pawk,pawkery,pawkily,pawkrie,pawky,pawl,pawn,pawnage,pawnee,pawner,pawnie,pawnor,pawpaw,pax,paxilla,paxiuba,paxwax,pay,payable,payably,payday,payed,payee,payeny,payer,paying,payment,paynim,payoff,payong,payor,payroll,pea,peace,peach,peachen,peacher,peachy,peacoat,peacock,peacod,peafowl,peag,peage,peahen,peai,peaiism,peak,peaked,peaker,peakily,peaking,peakish,peaky,peal,pealike,pean,peanut,pear,pearl,pearled,pearler,pearlet,pearlin,pearly,peart,pearten,peartly,peasant,peasen,peason,peasy,peat,peatery,peatman,peaty,peavey,peavy,peba,pebble,pebbled,pebbly,pebrine,pecan,peccant,peccary,peccavi,pech,pecht,pecite,peck,pecked,pecker,pecket,peckful,peckish,peckle,peckled,peckly,pecky,pectase,pectate,pecten,pectic,pectin,pectize,pectora,pectose,pectous,pectus,ped,peda,pedage,pedagog,pedal,pedaler,pedant,pedary,pedate,pedated,pedder,peddle,peddler,pedee,pedes,pedesis,pedicab,pedicel,pedicle,pedion,pedlar,pedlary,pedocal,pedrail,pedrero,pedro,pedule,pedum,pee,peed,peek,peel,peele,peeled,peeler,peeling,peelman,peen,peenge,peeoy,peep,peeper,peepeye,peepy,peer,peerage,peerdom,peeress,peerie,peerly,peery,peesash,peeve,peeved,peever,peevish,peewee,peg,pega,pegall,pegasid,pegbox,pegged,pegger,pegging,peggle,peggy,pegless,peglet,peglike,pegman,pegwood,peho,peine,peisage,peise,peiser,peixere,pekan,pekin,pekoe,peladic,pelage,pelagic,pelamyd,pelanos,pelean,pelecan,pelf,pelican,pelick,pelike,peliom,pelioma,pelisse,pelite,pelitic,pell,pellage,pellar,pellard,pellas,pellate,peller,pellet,pellety,pellile,pellock,pelmet,pelon,peloria,peloric,pelorus,pelota,peloton,pelt,pelta,peltast,peltate,pelter,pelting,peltry,pelu,peludo,pelves,pelvic,pelvis,pembina,pemican,pen,penal,penally,penalty,penance,penang,penates,penbard,pence,pencel,pencil,pend,penda,pendant,pendent,pending,pendle,pendom,pendule,penfold,penful,pengo,penguin,penhead,penial,penide,penile,penis,penk,penlike,penman,penna,pennae,pennage,pennant,pennate,penner,pennet,penni,pennia,pennied,pennill,penning,pennon,penny,penrack,penship,pensile,pension,pensive,penster,pensum,pensy,pent,penta,pentace,pentad,pentail,pentane,pentene,pentine,pentit,pentite,pentode,pentoic,pentol,pentose,pentrit,pentyl,pentyne,penuchi,penult,penury,peon,peonage,peonism,peony,people,peopler,peoplet,peotomy,pep,pepful,pepino,peplos,peplum,peplus,pepo,pepper,peppery,peppily,peppin,peppy,pepsin,pepsis,peptic,peptide,peptize,peptone,per,peracid,peract,perbend,percale,percent,percept,perch,percha,percher,percid,percoct,percoid,percur,percuss,perdu,perdure,pereion,pereira,peres,perfect,perfidy,perform,perfume,perfumy,perfuse,pergola,perhaps,peri,periapt,peridot,perigee,perigon,peril,perine,period,periost,perique,perish,perit,perite,periwig,perjink,perjure,perjury,perk,perkily,perkin,perking,perkish,perky,perle,perlid,perlite,perloir,perm,permit,permute,pern,pernine,pernor,pernyi,peroba,peropod,peropus,peroral,perosis,perotic,peroxy,peroxyl,perpend,perpera,perplex,perrier,perron,perry,persalt,perse,persico,persis,persist,person,persona,pert,pertain,perten,pertish,pertly,perturb,pertuse,perty,peruke,perula,perule,perusal,peruse,peruser,pervade,pervert,pes,pesa,pesade,pesage,peseta,peshkar,peshwa,peskily,pesky,peso,pess,pessary,pest,peste,pester,pestful,pestify,pestle,pet,petal,petaled,petalon,petaly,petard,petary,petasos,petasus,petcock,pete,peteca,peteman,peter,petful,petiole,petit,petite,petitor,petkin,petling,peto,petrary,petre,petrean,petrel,petrie,petrify,petrol,petrosa,petrous,petted,petter,pettily,pettish,pettle,petty,petune,petwood,petzite,peuhl,pew,pewage,pewdom,pewee,pewful,pewing,pewit,pewless,pewmate,pewter,pewtery,pewy,peyote,peyotl,peyton,peytrel,pfennig,pfui,pfund,phacoid,phaeism,phaeton,phage,phalanx,phalera,phallic,phallin,phallus,phanic,phano,phantom,phare,pharmic,pharos,pharynx,phase,phaseal,phasemy,phases,phasic,phasis,phasm,phasma,phasmid,pheal,phellem,phemic,phenate,phene,phenene,phenic,phenin,phenol,phenyl,pheon,phew,phi,phial,phiale,philter,philtra,phit,phiz,phizes,phizog,phlegm,phlegma,phlegmy,phloem,phloxin,pho,phobiac,phobic,phobism,phobist,phoby,phoca,phocal,phocid,phocine,phocoid,phoebe,phoenix,phoh,pholad,pholcid,pholido,phon,phonal,phonate,phone,phoneme,phonic,phonics,phonism,phono,phony,phoo,phoresy,phoria,phorid,phorone,phos,phose,phosis,phospho,phossy,phot,photal,photic,photics,photism,photo,photoma,photon,phragma,phrasal,phrase,phraser,phrasy,phrator,phratry,phrenic,phrynid,phrynin,phthor,phu,phugoid,phulwa,phut,phycite,phyla,phyle,phylic,phyllin,phylon,phylum,phyma,phymata,physic,physics,phytase,phytic,phytin,phytoid,phytol,phytoma,phytome,phyton,phytyl,pi,pia,piaba,piacaba,piacle,piaffe,piaffer,pial,pialyn,pian,pianic,pianino,pianism,pianist,piannet,piano,pianola,piaster,piastre,piation,piazine,piazza,pibcorn,pibroch,pic,pica,picador,pical,picamar,picara,picarel,picaro,picary,piccolo,pice,picene,piceous,pichi,picine,pick,pickage,pickax,picked,pickee,pickeer,picker,pickery,picket,pickle,pickler,pickman,pickmaw,pickup,picky,picnic,pico,picoid,picot,picotah,picotee,picra,picrate,picric,picrite,picrol,picryl,pict,picture,pictury,picuda,picudo,picul,piculet,pidan,piddle,piddler,piddock,pidgin,pie,piebald,piece,piecen,piecer,piecing,pied,piedly,pieless,pielet,pielum,piemag,pieman,pien,piend,piepan,pier,pierage,pierce,pierced,piercel,piercer,pierid,pierine,pierrot,pieshop,piet,pietas,pietic,pietism,pietist,pietose,piety,piewife,piewipe,piezo,piff,piffle,piffler,pifine,pig,pigdan,pigdom,pigeon,pigface,pigfish,pigfoot,pigful,piggery,piggin,pigging,piggish,piggle,piggy,pighead,pigherd,pightle,pigless,piglet,pigling,pigly,pigman,pigment,pignon,pignus,pignut,pigpen,pigroot,pigskin,pigsney,pigsty,pigtail,pigwash,pigweed,pigyard,piitis,pik,pika,pike,piked,pikel,pikelet,pikeman,piker,pikey,piki,piking,pikle,piky,pilage,pilapil,pilar,pilary,pilau,pilaued,pilch,pilcher,pilcorn,pilcrow,pile,pileata,pileate,piled,pileous,piler,piles,pileus,pilfer,pilger,pilgrim,pili,pilifer,piligan,pilikai,pilin,piline,piling,pilkins,pill,pillage,pillar,pillary,pillas,pillbox,pilled,pillet,pilleus,pillion,pillory,pillow,pillowy,pilm,pilmy,pilon,pilori,pilose,pilosis,pilot,pilotee,pilotry,pilous,pilpul,piltock,pilula,pilular,pilule,pilum,pilus,pily,pimaric,pimelic,pimento,pimlico,pimola,pimp,pimpery,pimping,pimpish,pimple,pimpled,pimplo,pimploe,pimply,pin,pina,pinaces,pinacle,pinacol,pinang,pinax,pinball,pinbone,pinbush,pincase,pincer,pincers,pinch,pinche,pinched,pinchem,pincher,pind,pinda,pinder,pindy,pine,pineal,pined,pinene,piner,pinery,pinesap,pinetum,piney,pinfall,pinfish,pinfold,ping,pingle,pingler,pingue,pinguid,pinguin,pinhead,pinhold,pinhole,pinhook,pinic,pining,pinion,pinite,pinitol,pinjane,pinjra,pink,pinked,pinkeen,pinken,pinker,pinkeye,pinkie,pinkify,pinkily,pinking,pinkish,pinkly,pinky,pinless,pinlock,pinna,pinnace,pinnae,pinnal,pinnate,pinned,pinnel,pinner,pinnet,pinning,pinnock,pinnula,pinnule,pinny,pino,pinole,pinolia,pinolin,pinon,pinonic,pinrail,pinsons,pint,pinta,pintado,pintail,pintano,pinte,pintle,pinto,pintura,pinulus,pinweed,pinwing,pinwork,pinworm,piny,pinyl,pinyon,pioneer,pioted,piotine,piotty,pioury,pious,piously,pip,pipa,pipage,pipal,pipe,pipeage,piped,pipeful,pipeman,piper,piperic,piperly,piperno,pipery,pipet,pipette,pipi,piping,pipiri,pipit,pipkin,pipless,pipped,pipper,pippin,pippy,piprine,piproid,pipy,piquant,pique,piquet,piquia,piqure,pir,piracy,piragua,piranha,pirate,piraty,pirl,pirn,pirner,pirnie,pirny,pirogue,pirol,pirr,pirrmaw,pisaca,pisang,pisay,piscary,piscian,piscina,piscine,pisco,pise,pish,pishaug,pishu,pisk,pisky,pismire,piso,piss,pissant,pist,pistic,pistil,pistle,pistol,pistole,piston,pistrix,pit,pita,pitanga,pitapat,pitarah,pitau,pitaya,pitch,pitcher,pitchi,pitchy,piteous,pitfall,pith,pithful,pithily,pithole,pithos,pithy,pitier,pitiful,pitless,pitlike,pitman,pitmark,pitmirk,pitpan,pitpit,pitside,pitted,pitter,pittine,pitting,pittite,pittoid,pituite,pituri,pitwood,pitwork,pity,pitying,piuri,pivalic,pivot,pivotal,pivoter,pix,pixie,pixy,pize,pizza,pizzle,placard,placate,place,placebo,placer,placet,placid,plack,placket,placode,placoid,placula,plaga,plagal,plagate,plage,plagium,plagose,plague,plagued,plaguer,plaguy,plaice,plaid,plaided,plaidie,plaidy,plain,plainer,plainly,plaint,plait,plaited,plaiter,plak,plakat,plan,planaea,planar,planate,planch,plandok,plane,planer,planet,planeta,planful,plang,plangor,planish,planity,plank,planker,planky,planner,plant,planta,plantad,plantal,plantar,planter,planula,planury,planxty,plap,plaque,plash,plasher,plashet,plashy,plasm,plasma,plasmic,plasome,plass,plasson,plaster,plastic,plastid,plastin,plat,platan,platane,platano,platch,plate,platea,plateau,plated,platen,plater,platery,platic,platina,plating,platode,platoid,platoon,platted,platten,platter,platty,platy,plaud,plaudit,play,playa,playbox,playboy,playday,player,playful,playlet,playman,playock,playpen,plaza,plea,pleach,plead,pleader,please,pleaser,pleat,pleater,pleb,plebe,plebify,plebs,pleck,plectre,pled,pledge,pledgee,pledger,pledget,pledgor,pleion,plenary,plenipo,plenish,plenism,plenist,plenty,plenum,pleny,pleon,pleonal,pleonic,pleopod,pleroma,plerome,plessor,pleura,pleural,pleuric,pleuron,pleurum,plew,plex,plexal,plexor,plexure,plexus,pliable,pliably,pliancy,pliant,plica,plical,plicate,plied,plier,plies,pliers,plight,plim,plinth,pliskie,plisky,ploat,ploce,plock,plod,plodder,plodge,plomb,plook,plop,plosion,plosive,plot,plote,plotful,plotted,plotter,plotty,plough,plouk,plouked,plouky,plounce,plout,plouter,plover,plovery,plow,plowboy,plower,plowing,plowman,ploy,pluck,plucked,plucker,plucky,plud,pluff,pluffer,pluffy,plug,plugged,plugger,pluggy,plugman,plum,pluma,plumach,plumade,plumage,plumate,plumb,plumber,plumbet,plumbic,plumbog,plumbum,plumcot,plume,plumed,plumer,plumery,plumet,plumier,plumify,plumist,plumlet,plummer,plummet,plummy,plumose,plumous,plump,plumpen,plumper,plumply,plumps,plumpy,plumula,plumule,plumy,plunder,plunge,plunger,plunk,plup,plural,pluries,plurify,plus,plush,plushed,plushy,pluteal,plutean,pluteus,pluvial,pluvian,pluvine,ply,plyer,plying,plywood,pneuma,po,poach,poacher,poachy,poalike,pob,pobby,pobs,pochade,pochard,pochay,poche,pock,pocket,pockety,pockily,pocky,poco,pocosin,pod,podagra,podal,podalic,podatus,podded,podder,poddish,poddle,poddy,podeon,podesta,podex,podge,podger,podgily,podgy,podial,podical,podices,podite,poditic,poditti,podium,podler,podley,podlike,podogyn,podsol,poduran,podurid,podware,podzol,poe,poem,poemet,poemlet,poesie,poesis,poesy,poet,poetdom,poetess,poetic,poetics,poetito,poetize,poetly,poetry,pogge,poggy,pogonip,pogrom,pogy,poh,poha,pohna,poi,poietic,poignet,poil,poilu,poind,poinder,point,pointed,pointel,pointer,pointy,poise,poised,poiser,poison,poitrel,pokable,poke,poked,pokeful,pokeout,poker,pokey,pokily,poking,pokomoo,pokunt,poky,pol,polacca,polack,polacre,polar,polaric,polarly,polaxis,poldavy,polder,pole,polearm,poleax,poleaxe,polecat,poleman,polemic,polenta,poler,poley,poliad,police,policed,policy,poligar,polio,polis,polish,polite,politic,polity,polk,polka,poll,pollack,polladz,pollage,pollam,pollan,pollard,polled,pollen,pollent,poller,pollex,polling,pollock,polloi,pollute,pollux,polo,poloist,polony,polos,polska,polt,poltina,poly,polyact,polyad,polygam,polygon,polygyn,polymer,polyose,polyp,polyped,polypi,polypod,polypus,pom,pomace,pomade,pomane,pomate,pomato,pomatum,pombe,pombo,pome,pomelo,pomey,pomfret,pomme,pommee,pommel,pommet,pommey,pommy,pomonal,pomonic,pomp,pompa,pompal,pompano,pompey,pomphus,pompier,pompion,pompist,pompon,pompous,pomster,pon,ponce,ponceau,poncho,pond,pondage,ponder,pondful,pondlet,pondman,pondok,pondus,pondy,pone,ponent,ponerid,poney,pong,ponga,pongee,poniard,ponica,ponier,ponja,pont,pontage,pontal,pontee,pontes,pontic,pontiff,pontify,pontil,pontile,pontin,pontine,pontist,ponto,ponton,pontoon,pony,ponzite,pooa,pooch,pooder,poodle,poof,poogye,pooh,pook,pooka,pookaun,pookoo,pool,pooler,pooli,pooly,poon,poonac,poonga,poop,pooped,poor,poorish,poorly,poot,pop,popadam,popal,popcorn,popdock,pope,popedom,popeism,popeler,popely,popery,popess,popeye,popeyed,popgun,popify,popinac,popish,popjoy,poplar,poplin,popover,poppa,poppean,poppel,popper,poppet,poppied,poppin,popple,popply,poppy,popshop,popular,populin,popweed,poral,porcate,porch,porched,porcine,pore,pored,porer,porge,porger,porgy,poring,porism,porite,pork,porker,porkery,porket,porkish,porkman,porkpie,porky,porogam,poroma,poros,porose,porosis,porotic,porous,porr,porrect,porret,porrigo,porry,port,porta,portage,portail,portal,portass,ported,portend,portent,porter,portia,portico,portify,portio,portion,portlet,portly,portman,porto,portray,portway,porty,porule,porus,pory,posca,pose,poser,poseur,posey,posh,posing,posit,positor,positum,posnet,posole,poss,posse,possess,posset,possum,post,postage,postal,postbag,postbox,postboy,posted,posteen,poster,postern,postfix,postic,postil,posting,postman,posture,postwar,posy,pot,potable,potamic,potash,potass,potassa,potate,potato,potator,potbank,potboil,potboy,potch,potcher,potdar,pote,poteen,potence,potency,potent,poter,poteye,potful,potgirl,potgun,pothead,potheen,pother,potherb,pothery,pothole,pothook,pothunt,potifer,potion,potleg,potlid,potlike,potluck,potman,potong,potoo,potoroo,potpie,potrack,pott,pottage,pottagy,pottah,potted,potter,pottery,potting,pottle,pottled,potto,potty,potware,potwork,potwort,pouce,poucer,poucey,pouch,pouched,pouchy,pouf,poulard,poulp,poulpe,poult,poulter,poultry,pounamu,pounce,pounced,pouncer,pouncet,pound,poundal,pounder,pour,pourer,pourie,pouring,pouser,pout,pouter,poutful,pouting,pouty,poverty,pow,powder,powdery,powdike,powdry,power,powered,powitch,pownie,powwow,pox,poxy,poy,poyou,praam,prabble,prabhu,practic,prad,praecox,praetor,prairie,praise,praiser,prajna,praline,pram,prana,prance,prancer,prancy,prank,pranked,pranker,prankle,pranky,prase,prasine,prasoid,prastha,prat,pratal,prate,prater,pratey,prating,prattle,prattly,prau,pravity,prawn,prawner,prawny,praxis,pray,praya,prayer,prayful,praying,preach,preachy,preacid,preact,preaged,preally,preanal,prearm,preaver,prebake,prebend,prebid,prebill,preboil,preborn,preburn,precant,precary,precast,precava,precede,precent,precept,preces,precess,precipe,precis,precise,precite,precoil,precook,precool,precopy,precox,precure,precut,precyst,predamn,predark,predata,predate,predawn,preday,predefy,predeny,predial,predict,prediet,predine,predoom,predraw,predry,predusk,preen,preener,preeze,prefab,preface,prefect,prefer,prefine,prefix,prefool,preform,pregain,pregust,prehaps,preheal,preheat,prehend,preidea,preknit,preknow,prelacy,prelate,prelect,prelim,preloan,preloss,prelude,premake,premate,premial,premier,premise,premiss,premium,premix,premold,premove,prename,prender,prendre,preomit,preopen,preoral,prep,prepare,prepave,prepay,prepink,preplan,preplot,prepose,prepuce,prepupa,prerent,prerich,prerupt,presage,presay,preseal,presee,presell,present,preses,preset,preship,preshow,preside,presift,presign,prespur,press,pressel,presser,pressor,prest,prester,presto,presume,pretan,pretell,pretend,pretest,pretext,pretire,pretone,pretry,pretty,pretzel,prevail,prevene,prevent,preverb,preveto,previde,preview,previse,prevoid,prevote,prevue,prewar,prewarn,prewash,prewhip,prewire,prewrap,prexy,prey,preyer,preyful,prezone,price,priced,pricer,prich,prick,pricked,pricker,pricket,prickle,prickly,pricks,pricky,pride,pridian,priding,pridy,pried,prier,priest,prig,prigdom,prigger,prigman,prill,prim,prima,primacy,primage,primal,primar,primary,primate,prime,primely,primer,primero,primine,priming,primly,primost,primp,primsie,primula,primus,primy,prince,princox,prine,pringle,prink,prinker,prinkle,prinky,print,printed,printer,prion,prionid,prior,prioral,priorly,priory,prisage,prisal,priscan,prism,prismal,prismed,prismy,prison,priss,prissy,pritch,prithee,prius,privacy,privant,private,privet,privily,privity,privy,prize,prizer,prizery,pro,proa,proal,proarmy,prob,probabl,probal,probang,probant,probate,probe,probeer,prober,probity,problem,procarp,proceed,process,proctal,proctor,procure,prod,prodder,proddle,prodigy,produce,product,proem,proetid,prof,profane,profert,profess,proffer,profile,profit,profuse,prog,progeny,progger,progne,program,project,proke,proker,prolan,prolate,proleg,prolify,proline,prolix,prolong,prolyl,promic,promise,promote,prompt,pronaos,pronate,pronavy,prone,pronely,proneur,prong,pronged,pronger,pronic,pronoun,pronpl,pronto,pronuba,proo,proof,proofer,proofy,prop,propago,propale,propane,propend,propene,proper,prophet,propine,proplex,propone,propons,propose,propoxy,propper,props,propupa,propyl,propyne,prorata,prorate,prore,prorean,prorsad,prorsal,prosaic,prosar,prose,prosect,proser,prosify,prosily,prosing,prosish,prosist,proso,prosode,prosody,prosoma,prosper,pross,prossy,prosy,protax,prote,protea,protead,protean,protect,protege,proteic,protein,protend,protest,protext,prothyl,protide,protist,protium,proto,protoma,protome,proton,protone,protore,protyl,protyle,protype,proudly,provand,provant,prove,provect,proved,proven,prover,proverb,provide,provine,proving,proviso,provoke,provost,prow,prowar,prowed,prowess,prowl,prowler,proxeny,proximo,proxy,proxysm,prozone,prude,prudely,prudent,prudery,prudish,prudist,prudity,pruh,prunase,prune,prunell,pruner,pruning,prunt,prunted,prurigo,prussic,prut,prutah,pry,pryer,prying,pryler,pryse,prytany,psalis,psalm,psalmic,psalmy,psaloid,psalter,psaltes,pschent,pseudo,psha,pshaw,psi,psiloi,psoadic,psoas,psoatic,psocid,psocine,psoitis,psora,psoric,psoroid,psorous,pst,psych,psychal,psyche,psychic,psychid,psychon,psykter,psylla,psyllid,ptarmic,ptereal,pteric,pterion,pteroid,pteroma,pteryla,ptinid,ptinoid,ptisan,ptomain,ptosis,ptotic,ptyalin,ptyxis,pu,pua,puan,pub,pubal,pubble,puberal,puberty,pubes,pubian,pubic,pubis,public,publish,puccoon,puce,pucelle,puchero,puck,pucka,pucker,puckery,puckish,puckle,puckrel,pud,puddee,pudder,pudding,puddle,puddled,puddler,puddly,puddock,puddy,pudency,pudenda,pudent,pudge,pudgily,pudgy,pudiano,pudic,pudical,pudsey,pudsy,pudu,pueblo,puerer,puerile,puerman,puff,puffed,puffer,puffery,puffily,puffin,puffing,pufflet,puffwig,puffy,pug,pugged,pugger,puggi,pugging,puggish,puggle,puggree,puggy,pugh,pugil,pugman,pugmill,puisne,puist,puistie,puja,puka,pukatea,puke,pukeko,puker,pukish,pukras,puku,puky,pul,pulahan,pulasan,pule,pulegol,puler,puli,pulicat,pulicid,puling,pulish,pulk,pulka,pull,pulldoo,pullen,puller,pullery,pullet,pulley,pulli,pullus,pulp,pulpal,pulper,pulpify,pulpily,pulpit,pulpous,pulpy,pulque,pulsant,pulsate,pulse,pulsion,pulsive,pulton,pulu,pulvic,pulvil,pulvino,pulwar,puly,puma,pumice,pumiced,pumicer,pummel,pummice,pump,pumpage,pumper,pumpkin,pumple,pumpman,pun,puna,punaise,punalua,punatoo,punch,puncher,punchy,punct,punctal,punctum,pundit,pundita,pundum,puneca,pung,punga,pungar,pungent,punger,pungey,pungi,pungle,pungled,punicin,punily,punish,punjum,punk,punkah,punkie,punky,punless,punlet,punnage,punner,punnet,punnic,punster,punt,punta,puntal,puntel,punter,punti,puntil,puntist,punto,puntout,punty,puny,punyish,punyism,pup,pupa,pupal,pupate,pupelo,pupil,pupilar,pupiled,pupoid,puppet,puppify,puppily,puppy,pupulo,pupunha,pur,purana,puranic,puraque,purdah,purdy,pure,pured,puree,purely,purer,purfle,purfled,purfler,purfly,purga,purge,purger,purgery,purging,purify,purine,puriri,purism,purist,purity,purl,purler,purlieu,purlin,purlman,purloin,purpart,purple,purply,purport,purpose,purpura,purpure,purr,purre,purree,purreic,purrel,purrer,purring,purrone,purry,purse,pursed,purser,pursily,purslet,pursley,pursual,pursue,pursuer,pursuit,pursy,purusha,purvey,purview,purvoe,pus,push,pusher,pushful,pushing,pushpin,puss,pusscat,pussley,pussy,pustule,put,putage,putamen,putback,putchen,putcher,puteal,putelee,puther,puthery,putid,putidly,putlog,putois,putrefy,putrid,putt,puttee,putter,puttier,puttock,putty,puture,puxy,puzzle,puzzled,puzzler,pya,pyal,pyche,pycnia,pycnial,pycnid,pycnite,pycnium,pyelic,pyemia,pyemic,pygal,pygarg,pygidid,pygmoid,pygmy,pygofer,pygopod,pyic,pyin,pyjama,pyke,pyknic,pyla,pylar,pylic,pylon,pyloric,pylorus,pyocele,pyocyst,pyocyte,pyoid,pyosis,pyr,pyral,pyralid,pyralis,pyramid,pyran,pyranyl,pyre,pyrena,pyrene,pyrenic,pyrenin,pyretic,pyrex,pyrexia,pyrexic,pyrgom,pyridic,pyridyl,pyrite,pyrites,pyritic,pyro,pyrogen,pyroid,pyrone,pyrope,pyropen,pyropus,pyrosis,pyrotic,pyrrhic,pyrrol,pyrrole,pyrroyl,pyrryl,pyruvic,pyruvil,pyruvyl,python,pyuria,pyvuril,pyx,pyxides,pyxie,pyxis,q,qasida,qere,qeri,qintar,qoph,qua,quab,quabird,quachil,quack,quackle,quacky,quad,quadded,quaddle,quadra,quadral,quadrat,quadric,quadrum,quaedam,quaff,quaffer,quag,quagga,quaggle,quaggy,quahog,quail,quaily,quaint,quake,quaker,quaking,quaky,quale,qualify,quality,qualm,qualmy,quan,quandy,quannet,quant,quanta,quantic,quantum,quar,quare,quark,quarl,quarle,quarred,quarrel,quarry,quart,quartan,quarter,quartet,quartic,quarto,quartz,quartzy,quash,quashey,quashy,quasi,quasky,quassin,quat,quata,quatch,quatern,quaters,quatral,quatre,quatrin,quattie,quatuor,quauk,quave,quaver,quavery,quaw,quawk,quay,quayage,quayful,quayman,qubba,queach,queachy,queak,queal,quean,queasom,queasy,quedful,queechy,queen,queenly,queer,queerer,queerly,queery,queest,queet,queeve,quegh,quei,quelch,quell,queller,quemado,queme,quemely,quench,quercic,quercin,querent,querier,querist,querken,querl,quern,quernal,query,quest,quester,questor,quet,quetch,quetzal,queue,quey,quiapo,quib,quibble,quiblet,quica,quick,quicken,quickie,quickly,quid,quidder,quiddit,quiddle,quiesce,quiet,quieten,quieter,quietly,quietus,quiff,quila,quiles,quilkin,quill,quillai,quilled,quiller,quillet,quilly,quilt,quilted,quilter,quin,quina,quinary,quinate,quince,quinch,quinia,quinic,quinin,quinina,quinine,quinism,quinite,quinize,quink,quinnat,quinnet,quinoa,quinoid,quinol,quinone,quinova,quinoyl,quinse,quinsy,quint,quintad,quintal,quintan,quinte,quintet,quintic,quintin,quinto,quinton,quintus,quinyl,quinze,quip,quipful,quipo,quipper,quippy,quipu,quira,quire,quirk,quirky,quirl,quirt,quis,quisby,quiscos,quisle,quit,quitch,quite,quits,quitted,quitter,quittor,quiver,quivery,quiz,quizzee,quizzer,quizzy,quo,quod,quoin,quoined,quoit,quoiter,quoits,quondam,quoniam,quop,quorum,quot,quota,quote,quotee,quoter,quoth,quotha,quotity,quotum,r,ra,raad,raash,rab,raband,rabanna,rabat,rabatte,rabbet,rabbi,rabbin,rabbit,rabbity,rabble,rabbler,rabboni,rabic,rabid,rabidly,rabies,rabific,rabinet,rabitic,raccoon,raccroc,race,raceme,racemed,racemic,racer,raceway,rach,rache,rachial,rachis,racial,racily,racing,racism,racist,rack,rackan,racker,racket,rackett,rackety,rackful,racking,rackle,rackway,racloir,racon,racoon,racy,rad,rada,radar,raddle,radial,radiale,radian,radiant,radiate,radical,radicel,radices,radicle,radii,radio,radiode,radish,radium,radius,radix,radman,radome,radon,radula,raff,raffe,raffee,raffery,raffia,raffing,raffish,raffle,raffler,raft,raftage,rafter,raftman,rafty,rag,raga,rage,rageful,rageous,rager,ragfish,ragged,raggedy,raggee,ragger,raggery,raggety,raggil,raggily,ragging,raggle,raggled,raggy,raging,raglan,raglet,raglin,ragman,ragout,ragshag,ragtag,ragtime,ragule,raguly,ragweed,ragwort,rah,rahdar,raia,raid,raider,rail,railage,railer,railing,railly,railman,railway,raiment,rain,rainbow,rainer,rainful,rainily,rainy,raioid,rais,raise,raised,raiser,raisin,raising,raisiny,raj,raja,rajah,rakan,rake,rakeage,rakeful,raker,rakery,rakh,raki,rakily,raking,rakish,rakit,raku,rallier,ralline,rally,ralph,ram,ramada,ramage,ramal,ramanas,ramass,ramate,rambeh,ramble,rambler,rambong,rame,rameal,ramed,ramekin,rament,rameous,ramet,ramex,ramhead,ramhood,rami,ramie,ramify,ramlike,ramline,rammack,rammel,rammer,rammish,rammy,ramose,ramous,ramp,rampage,rampant,rampart,ramped,ramper,rampick,rampike,ramping,rampion,rampire,rampler,ramplor,ramrace,ramrod,ramsch,ramson,ramstam,ramtil,ramular,ramule,ramulus,ramus,ran,rana,ranal,rance,rancel,rancer,ranch,ranche,rancher,rancho,rancid,rancor,rand,randan,randem,rander,randing,randir,randle,random,randy,rane,rang,range,ranged,ranger,rangey,ranging,rangle,rangler,rangy,rani,ranid,ranine,rank,ranked,ranker,rankish,rankle,rankly,rann,rannel,ranny,ransack,ransel,ransom,rant,rantan,ranter,ranting,rantock,ranty,ranula,ranular,rap,rape,rapeful,raper,raphany,raphe,raphide,raphis,rapic,rapid,rapidly,rapier,rapillo,rapine,rapiner,raping,rapinic,rapist,raploch,rappage,rappe,rappel,rapper,rapping,rappist,rapport,rapt,raptly,raptor,raptril,rapture,raptury,raptus,rare,rarebit,rarefy,rarely,rarish,rarity,ras,rasa,rasant,rascal,rasceta,rase,rasen,raser,rasgado,rash,rasher,rashful,rashing,rashly,rasion,rasp,rasped,rasper,rasping,raspish,raspite,raspy,rasse,rassle,raster,rastik,rastle,rasure,rat,rata,ratable,ratably,ratafee,ratafia,ratal,ratbite,ratch,ratchel,ratcher,ratchet,rate,rated,ratel,rater,ratfish,rath,rathe,rathed,rathely,rather,rathest,rathite,rathole,ratify,ratine,rating,ratio,ration,ratite,ratlike,ratline,ratoon,rattage,rattail,rattan,ratteen,ratten,ratter,rattery,ratti,rattish,rattle,rattled,rattler,rattles,rattly,ratton,rattrap,ratty,ratwa,ratwood,raucid,raucity,raucous,raught,rauk,raukle,rauli,raun,raunge,raupo,rauque,ravage,ravager,rave,ravel,raveler,ravelin,ravelly,raven,ravener,ravenry,ravens,raver,ravin,ravine,ravined,raviney,raving,ravioli,ravish,ravison,raw,rawhead,rawhide,rawish,rawness,rax,ray,raya,rayage,rayed,rayful,rayless,raylet,rayon,raze,razee,razer,razoo,razor,razz,razzia,razzly,re,rea,reaal,reabuse,reach,reacher,reachy,react,reactor,read,readapt,readd,reader,readily,reading,readmit,readopt,readorn,ready,reagent,reagin,reagree,reak,real,realarm,reales,realest,realgar,realign,realism,realist,reality,realive,realize,reallot,reallow,really,realm,realter,realtor,realty,ream,reamage,reamass,reamend,reamer,reamuse,reamy,reannex,reannoy,reanvil,reap,reaper,reapply,rear,rearer,reargue,rearise,rearm,rearray,reask,reason,reassay,reasty,reasy,reatus,reaudit,reavail,reave,reaver,reavoid,reavow,reawait,reawake,reaward,reaware,reb,rebab,reback,rebag,rebait,rebake,rebale,reban,rebar,rebase,rebasis,rebate,rebater,rebathe,rebato,rebawl,rebear,rebeat,rebec,rebeck,rebed,rebeg,rebeget,rebegin,rebel,rebelly,rebend,rebeset,rebia,rebias,rebid,rebill,rebind,rebirth,rebite,reblade,reblame,reblast,reblend,rebless,reblock,rebloom,reblot,reblow,reblue,rebluff,reboant,reboard,reboast,rebob,reboil,reboise,rebold,rebolt,rebone,rebook,rebop,rebore,reborn,rebound,rebox,rebrace,rebraid,rebrand,rebreed,rebrew,rebribe,rebrick,rebring,rebrown,rebrush,rebud,rebuff,rebuild,rebuilt,rebuke,rebuker,rebulk,rebunch,rebuoy,reburn,reburst,rebury,rebus,rebush,rebusy,rebut,rebute,rebuy,recable,recage,recalk,recall,recant,recap,recarry,recart,recarve,recase,recash,recast,recatch,recce,recco,reccy,recede,receder,receipt,receive,recency,recense,recent,recept,recess,rechafe,rechain,rechal,rechant,rechaos,rechar,rechase,rechaw,recheat,recheck,recheer,rechew,rechip,rechuck,rechurn,recipe,recital,recite,reciter,reck,reckla,reckon,reclaim,reclama,reclang,reclasp,reclass,reclean,reclear,reclimb,recline,reclose,recluse,recoach,recoal,recoast,recoat,recock,recoct,recode,recoil,recoin,recoke,recolor,recomb,recon,recook,recool,recopy,record,recork,recount,recoup,recover,recramp,recrank,recrate,recrew,recroon,recrop,recross,recrowd,recrown,recruit,recrush,rect,recta,rectal,recti,rectify,rection,recto,rector,rectory,rectrix,rectum,rectus,recur,recure,recurl,recurse,recurve,recuse,recut,recycle,red,redact,redan,redare,redarn,redart,redate,redaub,redawn,redback,redbait,redbill,redbird,redbone,redbuck,redbud,redcap,redcoat,redd,redden,redder,redding,reddish,reddock,reddy,rede,redeal,redebit,redeck,redeed,redeem,redefer,redefy,redeify,redelay,redeny,redeye,redfin,redfish,redfoot,redhead,redhoop,redia,redient,redig,redip,redive,redleg,redlegs,redly,redness,redo,redock,redoom,redoubt,redound,redowa,redox,redpoll,redraft,redrag,redrape,redraw,redream,redress,redrill,redrive,redroot,redry,redsear,redskin,redtab,redtail,redtop,redub,reduce,reduced,reducer,reduct,redue,redux,redward,redware,redweed,redwing,redwood,redye,ree,reechy,reed,reeded,reeden,reeder,reedily,reeding,reedish,reedman,reedy,reef,reefer,reefing,reefy,reek,reeker,reeky,reel,reeled,reeler,reem,reeming,reemish,reen,reenge,reeper,reese,reeshle,reesk,reesle,reest,reester,reestle,reesty,reet,reetam,reetle,reeve,ref,reface,refall,refan,refavor,refect,refeed,refeel,refeign,refel,refence,refer,referee,refetch,refight,refill,refilm,refind,refine,refined,refiner,refire,refit,refix,reflag,reflame,reflash,reflate,reflect,reflee,reflex,refling,refloat,reflog,reflood,refloor,reflow,reflush,reflux,refly,refocus,refold,refont,refool,refoot,reforce,reford,reforge,reform,refound,refract,refrain,reframe,refresh,refront,reft,refuel,refuge,refugee,refulge,refund,refurl,refusal,refuse,refuser,refutal,refute,refuter,reg,regain,regal,regale,regaler,regalia,regally,regard,regatta,regauge,regency,regent,reges,reget,regia,regift,regild,regill,regime,regimen,regin,reginal,region,regive,reglair,reglaze,regle,reglet,regloss,reglove,reglow,reglue,regma,regnal,regnant,regorge,regrade,regraft,regrant,regrasp,regrass,regrate,regrede,regreen,regreet,regress,regret,regrind,regrip,regroup,regrow,reguard,reguide,regula,regular,reguli,regulus,regur,regurge,regush,reh,rehair,rehale,rehang,reharm,rehash,rehaul,rehead,reheal,reheap,rehear,reheat,rehedge,reheel,rehoe,rehoist,rehonor,rehood,rehook,rehoop,rehouse,rehung,reif,reify,reign,reim,reimage,reimpel,reimply,rein,reina,reincur,reindue,reinfer,reins,reinter,reis,reissue,reit,reitbok,reiter,reiver,rejail,reject,rejerk,rejoice,rejoin,rejolt,rejudge,rekick,rekill,reking,rekiss,reknit,reknow,rel,relabel,relace,relade,reladen,relais,relamp,reland,relap,relapse,relast,relata,relatch,relate,related,relater,relator,relatum,relax,relaxed,relaxer,relay,relbun,relead,releap,relearn,release,relend,relent,relet,relevel,relevy,reliant,relic,relick,relict,relief,relier,relieve,relievo,relift,relight,relime,relimit,reline,reliner,relink,relish,relishy,relist,relive,reload,reloan,relock,relodge,relook,relose,relost,relot,relove,relower,reluct,relume,rely,remade,remail,remain,remains,remake,remaker,reman,remand,remanet,remap,remarch,remark,remarry,remask,remass,remast,rematch,remble,remeant,remede,remedy,remeet,remelt,remend,remerge,remetal,remex,remica,remicle,remiges,remill,remimic,remind,remint,remiped,remise,remiss,remit,remix,remnant,remock,remodel,remold,remop,remora,remord,remorse,remote,remould,remount,removal,remove,removed,remover,renable,renably,renail,renal,rename,rend,render,reneg,renege,reneger,renegue,renerve,renes,renet,renew,renewal,renewer,renin,renish,renk,renky,renne,rennet,rennin,renown,rent,rentage,rental,rented,rentee,renter,renvoi,renvoy,reoccur,reoffer,reoil,reomit,reopen,reorder,reown,rep,repace,repack,repage,repaint,repair,repale,repand,repanel,repaper,repark,repass,repast,repaste,repatch,repave,repawn,repay,repayal,repeal,repeat,repeg,repel,repen,repent,repew,rephase,repic,repick,repiece,repile,repin,repine,repiner,repipe,repique,repitch,repkie,replace,replait,replan,replane,replant,replate,replay,replead,repleat,replete,replevy,replica,replier,replod,replot,replow,replum,replume,reply,repoint,repoll,repolon,repone,repope,report,reposal,repose,reposed,reposer,reposit,repost,repot,repound,repour,repp,repped,repray,repress,reprice,reprime,reprint,reprise,reproof,reprove,reprune,reps,reptant,reptile,repuff,repugn,repulse,repump,repurge,repute,reputed,requeen,request,requiem,requin,require,requit,requite,requiz,requote,rerack,rerail,reraise,rerake,rerank,rerate,reread,reredos,reree,rereel,rereeve,rereign,rerent,rerig,rering,rerise,rerival,rerivet,rerob,rerobe,reroll,reroof,reroot,rerope,reroute,rerow,rerub,rerun,resaca,resack,resail,resale,resalt,resaw,resawer,resay,rescan,rescind,rescore,rescrub,rescue,rescuer,reseal,reseam,reseat,resect,reseda,resee,reseed,reseek,reseise,reseize,reself,resell,resend,resene,resent,reserve,reset,resever,resew,resex,resh,reshake,reshape,reshare,reshave,reshear,reshift,reshine,reship,reshoe,reshoot,reshun,reshunt,reshut,reside,resider,residua,residue,resift,resigh,resign,resile,resin,resina,resiner,resing,resinic,resink,resinol,resiny,resist,resize,resizer,reskin,reslash,reslate,reslay,reslide,reslot,resmell,resmelt,resmile,resnap,resnub,resoak,resoap,resoil,resole,resolve,resorb,resort,resound,resow,resp,respace,respade,respan,respeak,respect,respell,respin,respire,respite,resplit,respoke,respond,respot,respray,respue,ressala,ressaut,rest,restack,restaff,restain,restake,restamp,restant,restart,restate,restaur,resteal,resteel,resteep,restem,restep,rester,restes,restful,restiad,restiff,resting,restir,restis,restive,restock,restore,restow,restrap,restrip,restudy,restuff,resty,restyle,resuck,resue,resuing,resuit,result,resume,resumer,resun,resup,resurge,reswage,resward,reswarm,reswear,resweat,resweep,reswell,reswill,reswim,ret,retable,retack,retag,retail,retain,retake,retaker,retalk,retama,retame,retan,retape,retard,retare,retaste,retax,retch,reteach,retell,retem,retempt,retene,retent,retest,rethank,rethaw,rethe,rethink,rethrow,retia,retial,retiary,reticle,retie,retier,retile,retill,retime,retin,retina,retinal,retinol,retinue,retip,retiral,retire,retired,retirer,retoast,retold,retomb,retook,retool,retooth,retort,retoss,retotal,retouch,retour,retrace,retrack,retract,retrad,retrade,retrain,retral,retramp,retread,retreat,retree,retrial,retrim,retrip,retrot,retrude,retrue,retrust,retry,retted,retter,rettery,retting,rettory,retube,retuck,retune,returf,return,retuse,retwine,retwist,retying,retype,retzian,reune,reunify,reunion,reunite,reurge,reuse,reutter,rev,revalue,revamp,revary,reve,reveal,reveil,revel,reveler,revelly,revelry,revend,revenge,revent,revenue,rever,reverb,revere,revered,reverer,reverie,revers,reverse,reversi,reverso,revert,revery,revest,revet,revete,revie,review,revile,reviler,revisal,revise,revisee,reviser,revisit,revisor,revival,revive,reviver,revivor,revoice,revoke,revoker,revolt,revolve,revomit,revote,revue,revuist,rewade,rewager,rewake,rewaken,rewall,reward,rewarm,rewarn,rewash,rewater,rewave,rewax,rewayle,rewear,reweave,rewed,reweigh,reweld,rewend,rewet,rewhelp,rewhirl,rewiden,rewin,rewind,rewire,rewish,rewood,reword,rework,rewound,rewove,rewoven,rewrap,rewrite,rex,rexen,reyield,reyoke,reyouth,rhabdom,rhabdos,rhabdus,rhagite,rhagon,rhagose,rhamn,rhamnal,rhason,rhatany,rhe,rhea,rhebok,rheeboc,rheebok,rheen,rheic,rhein,rheinic,rhema,rheme,rhenium,rheotan,rhesian,rhesus,rhetor,rheum,rheumed,rheumic,rheumy,rhexis,rhinal,rhine,rhinion,rhino,rhizine,rhizoid,rhizoma,rhizome,rhizote,rho,rhodic,rhoding,rhodite,rhodium,rhomb,rhombic,rhombos,rhombus,rhubarb,rhumb,rhumba,rhyme,rhymer,rhymery,rhymic,rhymist,rhymy,rhyptic,rhythm,rhyton,ria,rial,riancy,riant,riantly,riata,rib,ribald,riband,ribat,ribband,ribbed,ribber,ribbet,ribbing,ribble,ribbon,ribbony,ribby,ribe,ribless,riblet,riblike,ribonic,ribose,ribskin,ribwork,ribwort,rice,ricer,ricey,rich,richdom,richen,riches,richly,richt,ricin,ricine,ricinic,ricinus,rick,ricker,rickets,rickety,rickey,rickle,ricksha,ricrac,rictal,rictus,rid,ridable,ridably,riddam,riddel,ridden,ridder,ridding,riddle,riddler,ride,rideau,riden,rident,rider,ridered,ridge,ridged,ridgel,ridger,ridgil,ridging,ridgy,riding,ridotto,rie,riem,riempie,rier,rife,rifely,riff,riffle,riffler,rifle,rifler,riflery,rifling,rift,rifter,rifty,rig,rigbane,riggald,rigger,rigging,riggish,riggite,riggot,right,righten,righter,rightle,rightly,righto,righty,rigid,rigidly,rigling,rignum,rigol,rigor,rigsby,rikisha,rikk,riksha,rikshaw,rilawa,rile,riley,rill,rillet,rillett,rillock,rilly,rim,rima,rimal,rimate,rimbase,rime,rimer,rimfire,rimland,rimless,rimmed,rimmer,rimose,rimous,rimpi,rimple,rimrock,rimu,rimula,rimy,rinceau,rinch,rincon,rind,rinded,rindle,rindy,rine,ring,ringe,ringed,ringent,ringer,ringeye,ringing,ringite,ringle,ringlet,ringman,ringtaw,ringy,rink,rinka,rinker,rinkite,rinner,rinse,rinser,rinsing,rio,riot,rioter,rioting,riotist,riotous,riotry,rip,ripa,ripal,ripcord,ripe,ripely,ripen,ripener,riper,ripgut,ripieno,ripier,ripost,riposte,ripper,rippet,rippier,ripping,rippit,ripple,rippler,ripplet,ripply,rippon,riprap,ripsack,ripsaw,ripup,risala,risberm,rise,risen,riser,rishi,risible,risibly,rising,risk,risker,riskful,riskily,riskish,risky,risp,risper,risque,risquee,rissel,risser,rissle,rissoid,rist,ristori,rit,rita,rite,ritling,ritual,ritzy,riva,rivage,rival,rivalry,rive,rivel,rivell,riven,river,rivered,riverly,rivery,rivet,riveter,riving,rivose,rivulet,rix,rixy,riyal,rizzar,rizzle,rizzom,roach,road,roadbed,roaded,roader,roading,roadite,roadman,roadway,roam,roamage,roamer,roaming,roan,roanoke,roar,roarer,roaring,roast,roaster,rob,robalo,roband,robber,robbery,robbin,robbing,robe,rober,roberd,robin,robinet,robing,robinin,roble,robomb,robot,robotry,robur,robust,roc,rocher,rochet,rock,rockaby,rocker,rockery,rocket,rockety,rocking,rockish,rocklay,rocklet,rockman,rocky,rococo,rocta,rod,rodd,roddin,rodding,rode,rodent,rodeo,rodge,rodham,roding,rodless,rodlet,rodlike,rodman,rodney,rodsman,rodster,rodwood,roe,roebuck,roed,roelike,roer,roey,rog,rogan,roger,roggle,rogue,roguery,roguing,roguish,rohan,rohob,rohun,rohuna,roi,roid,roil,roily,roister,roit,roka,roke,rokeage,rokee,rokelay,roker,rokey,roky,role,roleo,roll,rolled,roller,rolley,rollick,rolling,rollix,rollmop,rollock,rollway,roloway,romaika,romaine,romal,romance,romancy,romanza,romaunt,rombos,romeite,romero,rommack,romp,romper,romping,rompish,rompu,rompy,roncet,ronco,rond,ronde,rondeau,rondel,rondino,rondle,rondo,rondure,rone,rongeur,ronquil,rontgen,ronyon,rood,roodle,roof,roofage,roofer,roofing,rooflet,roofman,roofy,rooibok,rooinek,rook,rooker,rookery,rookie,rookish,rooklet,rooky,rool,room,roomage,roomed,roomer,roomful,roomie,roomily,roomlet,roomth,roomthy,roomy,roon,roosa,roost,roosted,rooster,root,rootage,rootcap,rooted,rooter,rootery,rootle,rootlet,rooty,roove,ropable,rope,ropeman,roper,ropery,ropes,ropeway,ropily,roping,ropish,ropp,ropy,roque,roquer,roquet,roquist,roral,roric,rorqual,rorty,rory,rosal,rosario,rosary,rosated,roscid,rose,roseal,roseate,rosebay,rosebud,rosed,roseine,rosel,roselet,rosella,roselle,roseola,roseous,rosery,roset,rosetan,rosette,rosetty,rosetum,rosety,rosied,rosier,rosilla,rosillo,rosily,rosin,rosiny,rosland,rosoli,rosolic,rosolio,ross,rosser,rossite,rostel,roster,rostra,rostral,rostrum,rosular,rosy,rot,rota,rotal,rotaman,rotan,rotang,rotary,rotate,rotated,rotator,rotch,rote,rotella,roter,rotge,rotgut,rother,rotifer,roto,rotor,rottan,rotten,rotter,rotting,rottle,rottock,rottolo,rotula,rotulad,rotular,rotulet,rotulus,rotund,rotunda,rotundo,roub,roucou,roud,roue,rouelle,rouge,rougeau,rougeot,rough,roughen,rougher,roughet,roughie,roughly,roughy,rougy,rouille,rouky,roulade,rouleau,roun,rounce,rouncy,round,rounded,roundel,rounder,roundly,roundup,roundy,roup,rouper,roupet,roupily,roupit,roupy,rouse,rouser,rousing,roust,rouster,rout,route,router,routh,routhie,routhy,routine,routing,routous,rove,rover,rovet,rovetto,roving,row,rowable,rowan,rowboat,rowdily,rowdy,rowed,rowel,rowen,rower,rowet,rowing,rowlet,rowlock,rowport,rowty,rowy,rox,roxy,royal,royale,royalet,royally,royalty,royet,royt,rozum,ruach,ruana,rub,rubasse,rubato,rubbed,rubber,rubbers,rubbery,rubbing,rubbish,rubble,rubbler,rubbly,rubdown,rubelet,rubella,rubelle,rubeola,rubiate,rubican,rubidic,rubied,rubific,rubify,rubine,rubious,ruble,rublis,rubor,rubric,rubrica,rubrify,ruby,ruche,ruching,ruck,rucker,ruckle,rucksey,ruckus,rucky,ruction,rud,rudas,rudd,rudder,ruddied,ruddily,ruddle,ruddock,ruddy,rude,rudely,ruderal,rudesby,rudge,rudish,rudity,rue,rueful,ruelike,ruelle,ruen,ruer,ruesome,ruewort,ruff,ruffed,ruffer,ruffian,ruffin,ruffle,ruffled,ruffler,ruffly,rufous,rufter,rufus,rug,ruga,rugate,rugged,rugging,ruggle,ruggy,ruglike,rugosa,rugose,rugous,ruin,ruinate,ruined,ruiner,ruing,ruinous,rukh,rulable,rule,ruledom,ruler,ruling,rull,ruller,rullion,rum,rumal,rumble,rumbler,rumbly,rumbo,rumen,ruminal,rumkin,rumless,rumly,rummage,rummagy,rummer,rummily,rummish,rummy,rumness,rumney,rumor,rumorer,rump,rumpad,rumpade,rumple,rumply,rumpus,rumshop,run,runaway,runback,runby,runch,rundale,rundle,rundlet,rune,runed,runer,runfish,rung,runic,runite,runkle,runkly,runless,runlet,runman,runnel,runner,runnet,running,runny,runoff,runout,runover,runrig,runt,runted,runtee,runtish,runty,runway,rupa,rupee,rupia,rupiah,rupial,rupie,rupitic,ruptile,ruption,ruptive,rupture,rural,rurally,rurban,ruru,ruse,rush,rushed,rushen,rusher,rushing,rushlit,rushy,rusine,rusk,ruskin,rusky,rusma,rusot,ruspone,russel,russet,russety,russia,russud,rust,rustful,rustic,rustily,rustle,rustler,rustly,rustre,rustred,rusty,ruswut,rut,rutate,rutch,ruth,ruther,ruthful,rutic,rutile,rutin,ruttee,rutter,ruttish,rutty,rutyl,ruvid,rux,ryal,ryania,rybat,ryder,rye,ryen,ryme,rynd,rynt,ryot,ryotwar,rype,rypeck,s,sa,saa,sab,sabalo,sabanut,sabbat,sabbath,sabe,sabeca,sabella,saber,sabered,sabicu,sabina,sabine,sabino,sable,sably,sabora,sabot,saboted,sabra,sabulum,saburra,sabutan,sabzi,sac,sacaton,sacatra,saccade,saccate,saccos,saccule,saccus,sachem,sachet,sack,sackage,sackbag,sackbut,sacked,sacken,sacker,sackful,sacking,sackman,saclike,saco,sacope,sacque,sacra,sacrad,sacral,sacred,sacring,sacrist,sacro,sacrum,sad,sadden,saddik,saddish,saddle,saddled,saddler,sade,sadh,sadhe,sadhu,sadic,sadiron,sadism,sadist,sadly,sadness,sado,sadr,saecula,saeter,saeume,safari,safe,safely,safen,safener,safety,saffian,safflor,safflow,saffron,safrole,saft,sag,saga,sagaie,sagaman,sagathy,sage,sagely,sagene,sagger,sagging,saggon,saggy,saging,sagitta,sagless,sago,sagoin,saguaro,sagum,saguran,sagwire,sagy,sah,sahh,sahib,sahme,sahukar,sai,saic,said,saiga,sail,sailage,sailed,sailer,sailing,sailor,saily,saim,saimiri,saimy,sain,saint,sainted,saintly,saip,sair,sairly,sairve,sairy,saithe,saj,sajou,sake,sakeber,sakeen,saker,sakeret,saki,sakieh,sakulya,sal,salaam,salable,salably,salacot,salad,salago,salal,salamo,salar,salary,salat,salay,sale,salele,salema,salep,salfern,salic,salicin,salicyl,salient,salify,saligot,salina,saline,salite,salited,saliva,salival,salix,salle,sallee,sallet,sallier,salloo,sallow,sallowy,sally,salma,salmiac,salmine,salmis,salmon,salol,salomon,salon,saloon,saloop,salp,salpa,salpian,salpinx,salpoid,salse,salsify,salt,salta,saltant,saltary,saltate,saltcat,salted,saltee,salten,salter,saltern,saltery,saltfat,saltier,saltine,salting,saltish,saltly,saltman,saltpan,saltus,salty,saluki,salung,salute,saluter,salvage,salve,salver,salviol,salvo,salvor,salvy,sam,samadh,samadhi,samaj,saman,samara,samaria,samarra,samba,sambal,sambar,sambo,sambuk,sambuke,same,samekh,samel,samely,samen,samh,samhita,samiel,samiri,samisen,samite,samkara,samlet,sammel,sammer,sammier,sammy,samovar,samp,sampan,sampi,sample,sampler,samsara,samshu,samson,samurai,san,sanable,sanai,sancho,sanct,sancta,sanctum,sand,sandak,sandal,sandan,sandbag,sandbin,sandbox,sandboy,sandbur,sanded,sander,sanders,sandhi,sanding,sandix,sandman,sandust,sandy,sane,sanely,sang,sanga,sangar,sangei,sanger,sangha,sangley,sangrel,sangsue,sanicle,sanies,sanify,sanious,sanity,sanjak,sank,sankha,sannup,sans,sansei,sansi,sant,santal,santene,santimi,santims,santir,santon,sao,sap,sapa,sapajou,sapan,sapbush,sapek,sapful,saphead,saphena,saphie,sapid,sapient,sapin,sapinda,saple,sapless,sapling,sapo,saponin,sapor,sapota,sapote,sappare,sapper,sapphic,sapping,sapples,sappy,saprine,sapsago,sapsuck,sapwood,sapwort,sar,saraad,saraf,sarangi,sarcasm,sarcast,sarcine,sarcle,sarcler,sarcode,sarcoid,sarcoma,sarcous,sard,sardel,sardine,sardius,sare,sargo,sargus,sari,sarif,sarigue,sarinda,sarip,sark,sarkar,sarkful,sarkine,sarking,sarkit,sarlak,sarlyk,sarment,sarna,sarod,saron,sarong,saronic,saros,sarpler,sarpo,sarra,sarraf,sarsa,sarsen,sart,sartage,sartain,sartor,sarus,sarwan,sasa,sasan,sasani,sash,sashay,sashery,sashing,sasin,sasine,sassaby,sassy,sat,satable,satan,satang,satanic,satara,satchel,sate,sateen,satiate,satient,satiety,satin,satine,satined,satiny,satire,satiric,satisfy,satlijk,satrap,satrapy,satron,sattle,sattva,satura,satyr,satyric,sauce,saucer,saucily,saucy,sauf,sauger,saugh,saughen,sauld,saulie,sault,saulter,saum,saumon,saumont,sauna,saunter,sauqui,saur,saurel,saurian,saury,sausage,saut,saute,sauteur,sauty,sauve,savable,savacu,savage,savanna,savant,savarin,save,saved,saveloy,saver,savin,saving,savior,savola,savor,savored,savorer,savory,savour,savoy,savoyed,savssat,savvy,saw,sawah,sawali,sawarra,sawback,sawbill,sawbuck,sawbwa,sawder,sawdust,sawed,sawer,sawfish,sawfly,sawing,sawish,sawlike,sawman,sawmill,sawmon,sawmont,sawn,sawney,sawt,sawway,sawwort,sawyer,sax,saxhorn,saxten,saxtie,saxtuba,say,saya,sayable,sayer,sayette,sayid,saying,sazen,sblood,scab,scabbed,scabble,scabby,scabid,scabies,scabish,scabrid,scad,scaddle,scads,scaff,scaffer,scaffie,scaffle,scaglia,scala,scalage,scalar,scalare,scald,scalded,scalder,scaldic,scaldy,scale,scaled,scalena,scalene,scaler,scales,scaling,scall,scalled,scallom,scallop,scalma,scaloni,scalp,scalpel,scalper,scalt,scaly,scam,scamble,scamell,scamler,scamles,scamp,scamper,scan,scandal,scandia,scandic,scanmag,scanner,scant,scantle,scantly,scanty,scap,scape,scapel,scapha,scapoid,scapose,scapple,scapula,scapus,scar,scarab,scarce,scarcen,scare,scarer,scarf,scarfed,scarfer,scarfy,scarid,scarify,scarily,scarlet,scarman,scarn,scaroid,scarp,scarred,scarrer,scarry,scart,scarth,scarus,scarved,scary,scase,scasely,scat,scatch,scathe,scatter,scatty,scatula,scaul,scaum,scaup,scauper,scaur,scaurie,scaut,scavage,scavel,scaw,scawd,scawl,scazon,sceat,scena,scenary,scend,scene,scenery,scenic,scenist,scenite,scent,scented,scenter,scepsis,scepter,sceptic,sceptry,scerne,schanz,schappe,scharf,schelly,schema,scheme,schemer,schemy,schene,schepel,schepen,scherm,scherzi,scherzo,schesis,schism,schisma,schist,schloop,schmelz,scho,schola,scholae,scholar,scholia,schone,school,schoon,schorl,schorly,schout,schtoff,schuh,schuhe,schuit,schule,schuss,schute,schwa,schwarz,sciapod,sciarid,sciatic,scibile,science,scient,scincid,scind,sciniph,scintle,scion,scious,scirrhi,scissel,scissor,sciurid,sclaff,sclate,sclater,sclaw,scler,sclera,scleral,sclere,scliff,sclim,sclimb,scoad,scob,scobby,scobs,scoff,scoffer,scog,scoggan,scogger,scoggin,scoke,scolb,scold,scolder,scolex,scolia,scoliid,scolion,scolite,scollop,scolog,sconce,sconcer,scone,scoon,scoop,scooped,scooper,scoot,scooter,scopa,scopate,scope,scopet,scopic,scopine,scopola,scops,scopula,scorch,score,scored,scorer,scoria,scoriac,scoriae,scorify,scoring,scorn,scorned,scorner,scorny,scorper,scorse,scot,scotale,scotch,scote,scoter,scotia,scotino,scotoma,scotomy,scouch,scouk,scoup,scour,scoured,scourer,scourge,scoury,scouse,scout,scouter,scouth,scove,scovel,scovy,scow,scowder,scowl,scowler,scowman,scrab,scrabe,scrae,scrag,scraggy,scraily,scram,scran,scranch,scrank,scranky,scranny,scrap,scrape,scraped,scraper,scrapie,scrappy,scrapy,scrat,scratch,scrath,scrauch,scraw,scrawk,scrawl,scrawly,scrawm,scrawny,scray,scraze,screak,screaky,scream,screamy,scree,screech,screed,screek,screel,screen,screeny,screet,screeve,screich,screigh,screve,screver,screw,screwed,screwer,screwy,scribal,scribe,scriber,scride,scrieve,scrike,scrim,scrime,scrimer,scrimp,scrimpy,scrin,scrinch,scrine,scringe,scrip,scripee,script,scritch,scrive,scriven,scriver,scrob,scrobe,scrobis,scrod,scroff,scrog,scroggy,scrolar,scroll,scrolly,scroo,scrooch,scrooge,scroop,scrota,scrotal,scrotum,scrouge,scrout,scrow,scroyle,scrub,scrubby,scruf,scruff,scruffy,scruft,scrum,scrump,scrunch,scrunge,scrunt,scruple,scrush,scruto,scruze,scry,scryer,scud,scudder,scuddle,scuddy,scudi,scudler,scudo,scuff,scuffed,scuffer,scuffle,scuffly,scuffy,scuft,scufter,scug,sculch,scull,sculler,scullog,sculp,sculper,sculpin,sculpt,sculsh,scum,scumber,scumble,scummed,scummer,scummy,scun,scunder,scunner,scup,scupful,scupper,scuppet,scur,scurdy,scurf,scurfer,scurfy,scurry,scurvy,scuse,scut,scuta,scutage,scutal,scutate,scutch,scute,scutel,scutter,scuttle,scutty,scutula,scutum,scybala,scye,scypha,scyphae,scyphi,scyphoi,scyphus,scyt,scytale,scythe,sdeath,se,sea,seadog,seafare,seafolk,seafowl,seagirt,seagoer,seah,seak,seal,sealant,sealch,sealed,sealer,sealery,sealess,sealet,sealike,sealine,sealing,seam,seaman,seamark,seamed,seamer,seaming,seamlet,seamost,seamrog,seamy,seance,seaport,sear,searce,searcer,search,seared,searer,searing,seary,seasick,seaside,season,seat,seatang,seated,seater,seathe,seating,seatron,seave,seavy,seawant,seaward,seaware,seaway,seaweed,seawife,seaworn,seax,sebacic,sebait,sebate,sebific,sebilla,sebkha,sebum,sebundy,sec,secable,secalin,secancy,secant,secede,seceder,secern,secesh,sech,seck,seclude,secluse,secohm,second,seconde,secos,secpar,secque,secre,secrecy,secret,secreta,secrete,secreto,sect,sectary,sectile,section,sectism,sectist,sective,sector,secular,secund,secure,securer,sedan,sedate,sedent,sedge,sedged,sedging,sedgy,sedile,sedilia,seduce,seducee,seducer,seduct,sedum,see,seeable,seech,seed,seedage,seedbed,seedbox,seeded,seeder,seedful,seedily,seedkin,seedlet,seedlip,seedman,seedy,seege,seeing,seek,seeker,seeking,seel,seelful,seely,seem,seemer,seeming,seemly,seen,seenie,seep,seepage,seeped,seepy,seer,seeress,seerpaw,seesaw,seesee,seethe,seg,seggar,seggard,segged,seggrom,segment,sego,segol,seiche,seidel,seine,seiner,seise,seism,seismal,seismic,seit,seity,seize,seizer,seizin,seizing,seizor,seizure,sejant,sejoin,sejunct,sekos,selah,selamin,seldom,seldor,sele,select,selenic,self,selfdom,selfful,selfish,selfism,selfist,selfly,selion,sell,sella,sellar,sellate,seller,sellie,selling,sellout,selly,selsyn,selt,selva,selvage,semarum,sematic,semball,semble,seme,semeed,semeia,semeion,semen,semence,semese,semi,semiape,semiarc,semibay,semic,semicup,semidry,semiegg,semifib,semifit,semify,semigod,semihot,seminal,seminar,semiorb,semiped,semipro,semiraw,semis,semita,semitae,semital,semiurn,semmet,semmit,semola,semsem,sen,senaite,senam,senary,senate,senator,sence,sencion,send,sendal,sendee,sender,sending,senega,senegin,senesce,senile,senior,senna,sennet,sennit,sennite,sensa,sensal,sensate,sense,sensed,sensify,sensile,sension,sensism,sensist,sensive,sensize,senso,sensor,sensory,sensual,sensum,sensyne,sent,sentry,sepad,sepal,sepaled,sephen,sepia,sepian,sepiary,sepic,sepioid,sepion,sepiost,sepium,sepone,sepoy,seppuku,seps,sepsine,sepsis,sept,septa,septal,septan,septane,septate,septave,septet,septic,septier,septile,septime,septoic,septole,septum,septuor,sequa,sequel,sequela,sequent,sequest,sequin,ser,sera,serab,seragli,serai,serail,seral,serang,serape,seraph,serau,seraw,sercial,serdab,sere,sereh,serene,serf,serfage,serfdom,serfish,serfism,serge,serger,serging,serial,seriary,seriate,sericea,sericin,seriema,series,serif,serific,serin,serine,seringa,serio,serious,serment,sermo,sermon,sero,serolin,seron,seroon,seroot,seropus,serosa,serous,serow,serpent,serphid,serpigo,serpula,serra,serrage,serran,serrana,serrano,serrate,serried,serry,sert,serta,sertule,sertum,serum,serumal,serut,servage,serval,servant,serve,server,servery,servet,service,servile,serving,servist,servo,sesame,sesma,sesqui,sess,sessile,session,sestet,sesti,sestiad,sestina,sestine,sestole,sestuor,set,seta,setae,setal,setback,setbolt,setdown,setfast,seth,sethead,setier,setline,setness,setoff,seton,setose,setous,setout,setover,setsman,sett,settee,setter,setting,settle,settled,settler,settlor,setula,setule,setup,setwall,setwise,setwork,seugh,seven,sevener,seventh,seventy,sever,several,severe,severer,severy,sew,sewable,sewage,sewan,sewed,sewen,sewer,sewered,sewery,sewing,sewless,sewn,sex,sexed,sexern,sexfid,sexfoil,sexhood,sexifid,sexiped,sexless,sexlike,sexly,sext,sextain,sextan,sextans,sextant,sextar,sextary,sextern,sextet,sextic,sextile,sexto,sextole,sexton,sextry,sextula,sexual,sexuale,sexuous,sexy,sey,sfoot,sh,sha,shab,shabash,shabbed,shabble,shabby,shachle,shachly,shack,shackle,shackly,shacky,shad,shade,shaded,shader,shadily,shadine,shading,shadkan,shadoof,shadow,shadowy,shady,shaffle,shaft,shafted,shafter,shafty,shag,shagbag,shagged,shaggy,shaglet,shagrag,shah,shahdom,shahi,shahin,shaikh,shaitan,shake,shaken,shaker,shakers,shakha,shakily,shaking,shako,shakti,shaku,shaky,shale,shall,shallal,shallon,shallop,shallot,shallow,shallu,shalom,shalt,shalwar,shaly,sham,shama,shamal,shamalo,shaman,shamba,shamble,shame,shamed,shamer,shamir,shammed,shammer,shammy,shampoo,shan,shandry,shandy,shangan,shank,shanked,shanker,shanna,shanny,shansa,shant,shanty,shap,shape,shaped,shapely,shapen,shaper,shaping,shaps,shapy,shard,sharded,shardy,share,sharer,shargar,shark,sharky,sharn,sharny,sharp,sharpen,sharper,sharpie,sharply,sharps,sharpy,sharrag,sharry,shaster,shastra,shastri,shat,shatan,shatter,shaugh,shaul,shaup,shauri,shauwe,shave,shaved,shavee,shaven,shaver,shavery,shaving,shaw,shawl,shawled,shawm,shawny,shawy,shay,she,shea,sheaf,sheafy,sheal,shear,sheard,shearer,shears,sheat,sheath,sheathe,sheathy,sheave,sheaved,shebang,shebeen,shed,shedded,shedder,sheder,shedman,shee,sheely,sheen,sheenly,sheeny,sheep,sheepy,sheer,sheered,sheerly,sheet,sheeted,sheeter,sheety,sheik,sheikly,shekel,shela,sheld,shelder,shelf,shelfy,shell,shellac,shelled,sheller,shellum,shelly,shelta,shelter,shelty,shelve,shelver,shelvy,shend,sheng,sheolic,sheppey,sher,sherbet,sheriat,sherif,sherifa,sheriff,sherifi,sherify,sherry,sheth,sheugh,sheva,shevel,shevri,shewa,shewel,sheyle,shi,shibah,shibar,shice,shicer,shicker,shide,shied,shiel,shield,shier,shies,shiest,shift,shifter,shifty,shigram,shih,shikar,shikara,shikari,shikimi,shikken,shiko,shikra,shilf,shilfa,shill,shilla,shillet,shilloo,shilpit,shim,shimal,shimmer,shimmy,shimose,shimper,shin,shindig,shindle,shindy,shine,shiner,shingle,shingly,shinily,shining,shinner,shinny,shinty,shiny,shinza,ship,shipboy,shipful,shiplap,shiplet,shipman,shipped,shipper,shippo,shippon,shippy,shipway,shire,shirk,shirker,shirky,shirl,shirpit,shirr,shirt,shirty,shish,shisham,shisn,shita,shither,shittah,shittim,shiv,shive,shiver,shivery,shivey,shivoo,shivy,sho,shoad,shoader,shoal,shoaler,shoaly,shoat,shock,shocker,shod,shodden,shoddy,shode,shoder,shoe,shoeboy,shoeing,shoeman,shoer,shoful,shog,shogaol,shoggie,shoggle,shoggly,shogi,shogun,shohet,shoji,shola,shole,shone,shoneen,shoo,shood,shoofa,shoofly,shooi,shook,shool,shooler,shoop,shoor,shoot,shootee,shooter,shop,shopboy,shopful,shophar,shoplet,shopman,shoppe,shopper,shoppy,shoq,shor,shoran,shore,shored,shorer,shoring,shorn,short,shorten,shorter,shortly,shorts,shot,shote,shotgun,shotman,shott,shotted,shotten,shotter,shotty,shou,should,shout,shouter,shoval,shove,shovel,shover,show,showdom,shower,showery,showily,showing,showish,showman,shown,showup,showy,shoya,shrab,shradh,shraf,shrag,shram,shrank,shrap,shrave,shravey,shred,shreddy,shree,shreeve,shrend,shrew,shrewd,shrewdy,shrewly,shriek,shrieky,shrift,shrike,shrill,shrilly,shrimp,shrimpi,shrimpy,shrinal,shrine,shrink,shrinky,shrip,shrite,shrive,shrivel,shriven,shriver,shroff,shrog,shroud,shroudy,shrove,shrover,shrub,shrubby,shruff,shrug,shrunk,shrups,shuba,shuck,shucker,shucks,shudder,shuff,shuffle,shug,shul,shuler,shumac,shun,shune,shunner,shunt,shunter,shure,shurf,shush,shusher,shut,shutoff,shutout,shutten,shutter,shuttle,shy,shyer,shyish,shyly,shyness,shyster,si,siak,sial,sialic,sialid,sialoid,siamang,sib,sibbed,sibbens,sibber,sibby,sibilus,sibling,sibness,sibrede,sibship,sibyl,sibylic,sibylla,sic,sicca,siccant,siccate,siccity,sice,sick,sickbed,sicken,sicker,sickish,sickle,sickled,sickler,sickly,sicsac,sicula,sicular,sidder,siddur,side,sideage,sidearm,sidecar,sided,sider,sideral,siderin,sides,sideway,sidhe,sidi,siding,sidle,sidler,sidling,sidth,sidy,sie,siege,sieger,sienna,sier,siering,sierra,sierran,siesta,sieve,siever,sievy,sifac,sifaka,sife,siffle,sifflet,sifflot,sift,siftage,sifted,sifter,sifting,sig,sigger,sigh,sigher,sighful,sighing,sight,sighted,sighten,sighter,sightly,sighty,sigil,sigla,siglos,sigma,sigmate,sigmoid,sign,signal,signary,signate,signee,signer,signet,signify,signior,signist,signman,signory,signum,sika,sikar,sikatch,sike,sikerly,siket,sikhara,sikhra,sil,silage,silane,sile,silen,silence,silency,sileni,silenic,silent,silenus,silesia,silex,silica,silicam,silicic,silicle,silico,silicon,silicyl,siliqua,silique,silk,silked,silken,silker,silkie,silkily,silkman,silky,sill,sillar,siller,sillily,sillock,sillon,silly,silo,siloist,silphid,silt,siltage,silting,silty,silurid,silva,silvan,silver,silvern,silvery,silvics,silyl,sima,simal,simar,simball,simbil,simblin,simblot,sime,simiad,simial,simian,similar,simile,similor,simioid,simious,simity,simkin,simlin,simling,simmer,simmon,simnel,simony,simool,simoom,simoon,simous,simp,simpai,simper,simple,simpler,simplex,simply,simsim,simson,simular,simuler,sin,sina,sinaite,sinal,sinamay,sinapic,sinapis,sinawa,since,sincere,sind,sinder,sindle,sindoc,sindon,sindry,sine,sinew,sinewed,sinewy,sinful,sing,singe,singed,singer,singey,singh,singing,single,singled,singler,singles,singlet,singly,singult,sinh,sink,sinkage,sinker,sinking,sinky,sinless,sinlike,sinnen,sinner,sinnet,sinopia,sinople,sinsion,sinsyne,sinter,sintoc,sinuate,sinuose,sinuous,sinus,sinusal,sinward,siol,sion,sip,sipage,sipe,siper,siphoid,siphon,sipid,siping,sipling,sipper,sippet,sippio,sir,sircar,sirdar,sire,siren,sirene,sirenic,sireny,siress,sirgang,sirian,siricid,sirih,siris,sirkeer,sirki,sirky,sirloin,siroc,sirocco,sirpea,sirple,sirpoon,sirrah,sirree,sirship,sirup,siruped,siruper,sirupy,sis,sisal,sise,sisel,sish,sisham,sisi,siskin,siss,sissify,sissoo,sissy,sist,sister,sistern,sistle,sistrum,sit,sitao,sitar,sitch,site,sitfast,sith,sithe,sithens,sitient,sitio,sittee,sitten,sitter,sittine,sitting,situal,situate,situla,situlae,situs,siva,siver,sivvens,siwash,six,sixain,sixer,sixfoil,sixfold,sixsome,sixte,sixteen,sixth,sixthet,sixthly,sixty,sizable,sizably,sizal,sizar,size,sized,sizeman,sizer,sizes,sizing,sizy,sizygia,sizz,sizzard,sizzing,sizzle,sjambok,skaddle,skaff,skaffie,skag,skair,skal,skance,skart,skasely,skat,skate,skater,skatiku,skating,skatist,skatole,skaw,skean,skedge,skee,skeed,skeeg,skeel,skeely,skeen,skeer,skeered,skeery,skeet,skeeter,skeezix,skeg,skegger,skeif,skeigh,skeily,skein,skeiner,skeipp,skel,skelder,skelf,skelic,skell,skellat,skeller,skellum,skelly,skelp,skelper,skelpin,skelter,skemmel,skemp,sken,skene,skeo,skeough,skep,skepful,skeptic,sker,skere,skerret,skerry,sketch,sketchy,skete,skevish,skew,skewed,skewer,skewl,skewly,skewy,skey,ski,skiapod,skibby,skice,skid,skidded,skidder,skiddoo,skiddy,skidpan,skidway,skied,skieppe,skier,skies,skiff,skift,skiing,skijore,skil,skilder,skill,skilled,skillet,skilly,skilpot,skilts,skim,skime,skimmed,skimmer,skimp,skimpy,skin,skinch,skinful,skink,skinker,skinkle,skinned,skinner,skinny,skip,skipman,skippel,skipper,skippet,skipple,skippy,skirl,skirp,skirr,skirreh,skirret,skirt,skirted,skirter,skirty,skit,skite,skiter,skither,skitter,skittle,skitty,skiv,skive,skiver,skiving,sklate,sklater,sklent,skoal,skoo,skookum,skoptsy,skout,skraigh,skrike,skrupul,skua,skulk,skulker,skull,skulled,skully,skulp,skun,skunk,skunky,skuse,sky,skybal,skyey,skyful,skyish,skylark,skyless,skylike,skylook,skyman,skyphoi,skyphos,skyre,skysail,skyugle,skyward,skyway,sla,slab,slabbed,slabber,slabby,slabman,slack,slacked,slacken,slacker,slackly,slad,sladang,slade,slae,slag,slagger,slaggy,slagman,slain,slainte,slait,slake,slaker,slaking,slaky,slam,slamp,slander,slane,slang,slangy,slank,slant,slantly,slap,slape,slapper,slare,slart,slarth,slash,slashed,slasher,slashy,slat,slatch,slate,slater,slath,slather,slatify,slating,slatish,slatted,slatter,slaty,slaum,slave,slaved,slaver,slavery,slavey,slaving,slavish,slaw,slay,slayer,slaying,sleathy,sleave,sleaved,sleazy,sleck,sled,sledded,sledder,sledful,sledge,sledger,slee,sleech,sleechy,sleek,sleeken,sleeker,sleekit,sleekly,sleeky,sleep,sleeper,sleepry,sleepy,sleer,sleet,sleety,sleeve,sleeved,sleever,sleigh,sleight,slender,slent,slepez,slept,slete,sleuth,slew,slewed,slewer,slewing,sley,sleyer,slice,sliced,slicer,slich,slicht,slicing,slick,slicken,slicker,slickly,slid,slidage,slidden,slidder,slide,slided,slider,sliding,slifter,slight,slighty,slim,slime,slimer,slimily,slimish,slimly,slimpsy,slimsy,slimy,sline,sling,slinge,slinger,slink,slinker,slinky,slip,slipe,slipman,slipped,slipper,slippy,slipway,slirt,slish,slit,slitch,slite,slither,slithy,slitted,slitter,slitty,slive,sliver,slivery,sliving,sloan,slob,slobber,slobby,slock,slocken,slod,slodder,slodge,slodger,sloe,slog,slogan,slogger,sloka,sloke,slon,slone,slonk,sloo,sloom,sloomy,sloop,sloosh,slop,slope,sloped,slopely,sloper,sloping,slopped,sloppy,slops,slopy,slorp,slosh,slosher,sloshy,slot,slote,sloted,sloth,slotted,slotter,slouch,slouchy,slough,sloughy,slour,sloush,sloven,slow,slowish,slowly,slowrie,slows,sloyd,slub,slubber,slubby,slud,sludder,sludge,sludged,sludger,sludgy,slue,sluer,slug,slugged,slugger,sluggy,sluice,sluicer,sluicy,sluig,sluit,slum,slumber,slumdom,slumgum,slummer,slummy,slump,slumpy,slung,slunge,slunk,slunken,slur,slurbow,slurp,slurry,slush,slusher,slushy,slut,slutch,slutchy,sluther,slutter,slutty,sly,slyish,slyly,slyness,slype,sma,smack,smackee,smacker,smaik,small,smallen,smaller,smalls,smally,smalm,smalt,smalter,smalts,smaragd,smarm,smarmy,smart,smarten,smartly,smarty,smash,smasher,smashup,smatter,smaze,smear,smeared,smearer,smeary,smectic,smectis,smeddum,smee,smeech,smeek,smeeky,smeer,smeeth,smegma,smell,smelled,smeller,smelly,smelt,smelter,smeth,smethe,smeuse,smew,smich,smicker,smicket,smiddie,smiddum,smidge,smidgen,smilax,smile,smiler,smilet,smiling,smily,smirch,smirchy,smiris,smirk,smirker,smirkle,smirkly,smirky,smirtle,smit,smitch,smite,smiter,smith,smitham,smither,smithy,smiting,smitten,smock,smocker,smog,smoke,smoked,smoker,smokery,smokily,smoking,smokish,smoky,smolder,smolt,smooch,smoochy,smoodge,smook,smoot,smooth,smopple,smore,smote,smother,smotter,smouch,smous,smouse,smouser,smout,smriti,smudge,smudged,smudger,smudgy,smug,smuggle,smugism,smugly,smuisty,smur,smurr,smurry,smuse,smush,smut,smutch,smutchy,smutted,smutter,smutty,smyth,smytrie,snab,snabbie,snabble,snack,snackle,snaff,snaffle,snafu,snag,snagged,snagger,snaggy,snagrel,snail,snails,snaily,snaith,snake,snaker,snakery,snakily,snaking,snakish,snaky,snap,snapbag,snape,snaper,snapped,snapper,snapps,snappy,snaps,snapy,snare,snarer,snark,snarl,snarler,snarly,snary,snaste,snatch,snatchy,snath,snathe,snavel,snavvle,snaw,snead,sneak,sneaker,sneaky,sneap,sneath,sneathe,sneb,sneck,snecker,snecket,sned,snee,sneer,sneerer,sneery,sneesh,sneest,sneesty,sneeze,sneezer,sneezy,snell,snelly,snerp,snew,snib,snibble,snibel,snicher,snick,snicker,snicket,snickey,snickle,sniddle,snide,sniff,sniffer,sniffle,sniffly,sniffy,snift,snifter,snifty,snig,snigger,sniggle,snip,snipe,sniper,sniping,snipish,snipper,snippet,snippy,snipy,snirl,snirt,snirtle,snitch,snite,snithe,snithy,snittle,snivel,snively,snivy,snob,snobber,snobby,snobdom,snocher,snock,snocker,snod,snodly,snoek,snog,snoga,snoke,snood,snooded,snook,snooker,snoop,snooper,snoopy,snoose,snoot,snooty,snoove,snooze,snoozer,snoozle,snoozy,snop,snore,snorer,snoring,snork,snorkel,snorker,snort,snorter,snortle,snorty,snot,snotter,snotty,snouch,snout,snouted,snouter,snouty,snow,snowcap,snowie,snowily,snowish,snowk,snowl,snowy,snozzle,snub,snubbed,snubbee,snubber,snubby,snuck,snudge,snuff,snuffer,snuffle,snuffly,snuffy,snug,snugger,snuggle,snugify,snugly,snum,snup,snupper,snur,snurl,snurly,snurp,snurt,snuzzle,sny,snying,so,soak,soakage,soaked,soaken,soaker,soaking,soakman,soaky,soally,soam,soap,soapbox,soaper,soapery,soapily,soapsud,soapy,soar,soarer,soaring,soary,sob,sobber,sobbing,sobby,sobeit,sober,soberer,soberly,sobful,soboles,soc,socage,socager,soccer,soce,socht,social,society,socii,socius,sock,socker,socket,sockeye,socky,socle,socman,soco,sod,soda,sodaic,sodded,sodden,sodding,soddite,soddy,sodic,sodio,sodium,sodless,sodoku,sodomic,sodomy,sodwork,sody,soe,soekoe,soever,sofa,sofane,sofar,soffit,soft,softa,soften,softish,softly,softner,softy,sog,soger,soget,soggily,sogging,soggy,soh,soho,soil,soilage,soiled,soiling,soilure,soily,soiree,soja,sojourn,sok,soka,soke,sokeman,soken,sol,sola,solace,solacer,solan,solanal,solanum,solar,solate,solatia,solay,sold,soldado,soldan,solder,soldi,soldier,soldo,sole,solea,soleas,soleil,solely,solemn,solen,solent,soler,soles,soleus,soleyn,soli,solicit,solid,solidi,solidly,solidum,solidus,solio,soliped,solist,sollar,solo,solod,solodi,soloist,solon,soloth,soluble,solubly,solum,solute,solvate,solve,solvend,solvent,solver,soma,somal,somata,somatic,somber,sombre,some,someday,somehow,someone,somers,someway,somewhy,somital,somite,somitic,somma,somnial,somnify,somnus,sompay,sompne,sompner,son,sonable,sonance,sonancy,sonant,sonar,sonata,sond,sondeli,soneri,song,songful,songish,songle,songlet,songman,songy,sonhood,sonic,soniou,sonk,sonless,sonlike,sonly,sonnet,sonny,sonoric,sons,sonship,sonsy,sontag,soodle,soodly,sook,sooky,sool,sooloos,soon,sooner,soonish,soonly,soorawn,soord,soorkee,soot,sooter,sooth,soothe,soother,sootily,sooty,sop,sope,soph,sophia,sophic,sophism,sophy,sopite,sopor,sopper,sopping,soppy,soprani,soprano,sora,sorage,soral,sorb,sorbate,sorbent,sorbic,sorbile,sorbin,sorbite,sorbose,sorbus,sorcer,sorcery,sorchin,sorda,sordes,sordid,sordine,sordino,sordor,sore,soredia,soree,sorehon,sorely,sorema,sorgho,sorghum,sorgo,sori,soricid,sorite,sorites,sorn,sornare,sornari,sorner,sorning,soroban,sororal,sorose,sorosis,sorra,sorrel,sorrily,sorroa,sorrow,sorrowy,sorry,sort,sortal,sorted,sorter,sortie,sortly,sorty,sorus,sorva,sory,sosh,soshed,soso,sosoish,soss,sossle,sot,sotie,sotnia,sotnik,sotol,sots,sottage,sotted,sotter,sottish,sou,souari,soubise,soucar,souchet,souchy,soud,souffle,sough,sougher,sought,soul,soulack,souled,soulful,soulish,souly,soum,sound,sounder,soundly,soup,soupcon,souper,souple,soupy,sour,source,soured,souren,sourer,souring,sourish,sourly,sourock,soursop,sourtop,soury,souse,souser,souslik,soutane,souter,south,souther,sov,soviet,sovite,sovkhoz,sovran,sow,sowable,sowan,sowans,sowar,sowarry,sowback,sowbane,sowel,sowens,sower,sowfoot,sowing,sowins,sowl,sowle,sowlike,sowlth,sown,sowse,sowt,sowte,soy,soya,soybean,sozin,sozolic,sozzle,sozzly,spa,space,spaced,spacer,spacing,spack,spacy,spad,spade,spaded,spader,spadger,spading,spadix,spadone,spae,spaedom,spaeman,spaer,spahi,spaid,spaik,spairge,spak,spald,spalder,spale,spall,spaller,spalt,span,spancel,spandle,spandy,spane,spanemy,spang,spangle,spangly,spaniel,spaning,spank,spanker,spanky,spann,spannel,spanner,spanule,spar,sparada,sparch,spare,sparely,sparer,sparge,sparger,sparid,sparing,spark,sparked,sparker,sparkle,sparkly,sparks,sparky,sparm,sparoid,sparred,sparrer,sparrow,sparry,sparse,spart,sparth,spartle,sparver,spary,spasm,spasmed,spasmic,spastic,spat,spate,spatha,spathal,spathe,spathed,spathic,spatial,spatted,spatter,spattle,spatula,spatule,spave,spaver,spavie,spavied,spaviet,spavin,spawn,spawner,spawny,spay,spayad,spayard,spaying,speak,speaker,speal,spean,spear,spearer,speary,spec,spece,special,specie,species,specify,speck,specked,speckle,speckly,specks,specky,specs,specter,spectra,spectry,specula,specus,sped,speech,speed,speeder,speedy,speel,speen,speer,speiss,spelder,spelk,spell,speller,spelt,spelter,speltz,spelunk,spence,spencer,spend,spender,spense,spent,speos,sperate,sperity,sperket,sperm,sperma,spermic,spermy,sperone,spet,spetch,spew,spewer,spewing,spewy,spex,sphacel,sphecid,spheges,sphegid,sphene,sphenic,spheral,sphere,spheric,sphery,sphinx,spica,spical,spicant,spicate,spice,spiced,spicer,spicery,spicily,spicing,spick,spicket,spickle,spicose,spicous,spicula,spicule,spicy,spider,spidery,spidger,spied,spiegel,spiel,spieler,spier,spiff,spiffed,spiffy,spig,spignet,spigot,spike,spiked,spiker,spikily,spiking,spiky,spile,spiler,spiling,spilite,spill,spiller,spillet,spilly,spiloma,spilt,spilth,spilus,spin,spina,spinach,spinae,spinage,spinal,spinate,spinder,spindle,spindly,spine,spined,spinel,spinet,spingel,spink,spinner,spinney,spinoid,spinose,spinous,spinule,spiny,spionid,spiral,spirale,spiran,spirant,spirate,spire,spirea,spired,spireme,spiring,spirit,spirity,spirket,spiro,spiroid,spirous,spirt,spiry,spise,spit,spital,spitbox,spite,spitful,spitish,spitted,spitten,spitter,spittle,spitz,spiv,spivery,splash,splashy,splat,splatch,splay,splayed,splayer,spleen,spleeny,spleet,splenic,splet,splice,splicer,spline,splint,splinty,split,splodge,splodgy,splore,splosh,splotch,splunge,splurge,splurgy,splurt,spoach,spode,spodium,spoffle,spoffy,spogel,spoil,spoiled,spoiler,spoilt,spoke,spoken,spoky,spole,spolia,spolium,spondee,spondyl,spong,sponge,sponged,sponger,spongin,spongy,sponsal,sponson,sponsor,spoof,spoofer,spook,spooky,spool,spooler,spoom,spoon,spooner,spoony,spoor,spoorer,spoot,spor,sporal,spore,spored,sporid,sporoid,sporont,sporous,sporran,sport,sporter,sportly,sports,sporty,sporule,sposh,sposhy,spot,spotted,spotter,spottle,spotty,spousal,spouse,spousy,spout,spouter,spouty,sprack,sprad,sprag,spraich,sprain,spraint,sprang,sprank,sprat,spratty,sprawl,sprawly,spray,sprayer,sprayey,spread,spready,spreath,spree,spreeuw,spreng,sprent,spret,sprew,sprewl,spried,sprier,spriest,sprig,spriggy,spring,springe,springy,sprink,sprint,sprit,sprite,spritty,sproat,sprod,sprogue,sproil,sprong,sprose,sprout,sprowsy,spruce,sprue,spruer,sprug,spruit,sprung,sprunny,sprunt,spry,spryly,spud,spudder,spuddle,spuddy,spuffle,spug,spuke,spume,spumone,spumose,spumous,spumy,spun,spung,spunk,spunkie,spunky,spunny,spur,spurge,spuriae,spurl,spurlet,spurn,spurner,spurred,spurrer,spurry,spurt,spurter,spurtle,spurway,sput,sputa,sputter,sputum,spy,spyboat,spydom,spyer,spyhole,spyism,spyship,squab,squabby,squacco,squad,squaddy,squail,squalid,squall,squally,squalm,squalor,squam,squama,squamae,squame,square,squared,squarer,squark,squary,squash,squashy,squat,squatly,squatty,squaw,squawk,squawky,squdge,squdgy,squeak,squeaky,squeal,squeald,squeam,squeamy,squeege,squeeze,squeezy,squelch,squench,squib,squid,squidge,squidgy,squiffy,squilla,squin,squinch,squinny,squinsy,squint,squinty,squire,squiret,squirk,squirm,squirmy,squirr,squirt,squirty,squish,squishy,squit,squitch,squoze,squush,squushy,sraddha,sramana,sri,sruti,ssu,st,staab,stab,stabber,stabile,stable,stabler,stably,staboy,stacher,stachys,stack,stacker,stacte,stadda,staddle,stade,stadia,stadic,stadion,stadium,staff,staffed,staffer,stag,stage,staged,stager,stagery,stagese,stagger,staggie,staggy,stagily,staging,stagnum,stagy,staia,staid,staidly,stain,stainer,staio,stair,staired,stairy,staith,staiver,stake,staker,stale,stalely,staling,stalk,stalked,stalker,stalko,stalky,stall,stallar,staller,stam,stambha,stamen,stamin,stamina,stammel,stammer,stamnos,stamp,stampee,stamper,stample,stance,stanch,stand,standee,standel,stander,stane,stang,stanine,stanjen,stank,stankie,stannel,stanner,stannic,stanno,stannum,stannyl,stanza,stanze,stap,stapes,staple,stapled,stapler,star,starch,starchy,stardom,stare,staree,starer,starets,starful,staring,stark,starken,starkly,starky,starlet,starlit,starn,starnel,starnie,starost,starred,starry,start,starter,startle,startly,startor,starty,starve,starved,starver,starvy,stary,stases,stash,stashie,stasis,statal,statant,state,stated,stately,stater,static,statics,station,statism,statist,stative,stator,statue,statued,stature,status,statute,stauk,staumer,staun,staunch,staup,stauter,stave,staver,stavers,staving,staw,stawn,staxis,stay,stayed,stayer,staynil,stays,stchi,stead,steady,steak,steal,stealed,stealer,stealth,stealy,steam,steamer,steamy,stean,stearic,stearin,stearyl,steatin,stech,steddle,steed,steek,steel,steeler,steely,steen,steenth,steep,steepen,steeper,steeple,steeply,steepy,steer,steerer,steeve,steever,steg,steid,steigh,stein,stekan,stela,stelae,stelai,stelar,stele,stell,stella,stellar,stem,stema,stemlet,stemma,stemmed,stemmer,stemmy,stemple,stemson,sten,stenar,stench,stenchy,stencil,stend,steng,stengah,stenion,steno,stenog,stent,stenter,stenton,step,steppe,stepped,stepper,stepson,stept,stepway,stere,stereo,steri,steric,sterics,steride,sterile,sterin,sterk,sterlet,stern,sterna,sternad,sternal,sterned,sternly,sternum,stero,steroid,sterol,stert,stertor,sterve,stet,stetch,stevel,steven,stevia,stew,steward,stewed,stewpan,stewpot,stewy,stey,sthenia,sthenic,stib,stibial,stibic,stibine,stibium,stich,stichic,stichid,stick,sticked,sticker,stickit,stickle,stickly,sticks,stickum,sticky,stid,stiddy,stife,stiff,stiffen,stiffly,stifle,stifler,stigma,stigmai,stigmal,stigme,stile,stilet,still,stiller,stilly,stilt,stilted,stilter,stilty,stim,stime,stimuli,stimy,stine,sting,stinge,stinger,stingo,stingy,stink,stinker,stint,stinted,stinter,stinty,stion,stionic,stipe,stiped,stipel,stipend,stipes,stippen,stipple,stipply,stipula,stipule,stir,stirk,stirp,stirps,stirra,stirrer,stirrup,stitch,stite,stith,stithy,stive,stiver,stivy,stoa,stoach,stoat,stoater,stob,stocah,stock,stocker,stocks,stocky,stod,stodge,stodger,stodgy,stoep,stof,stoff,stog,stoga,stogie,stogy,stoic,stoical,stoke,stoker,stola,stolae,stole,stoled,stolen,stolid,stolist,stollen,stolon,stoma,stomach,stomata,stomate,stomium,stomp,stomper,stond,stone,stoned,stonen,stoner,stong,stonied,stonify,stonily,stoning,stonish,stonker,stony,stood,stooded,stooden,stoof,stooge,stook,stooker,stookie,stool,stoon,stoond,stoop,stooper,stoory,stoot,stop,stopa,stope,stoper,stopgap,stoping,stopped,stopper,stoppit,stopple,storage,storax,store,storeen,storer,storge,storied,storier,storify,stork,storken,storm,stormer,stormy,story,stosh,stoss,stot,stotter,stoun,stound,stoup,stour,stoury,stoush,stout,stouten,stouth,stoutly,stouty,stove,stoven,stover,stow,stowage,stowce,stower,stowing,stra,strack,stract,strad,strade,stradl,stradld,strae,strafe,strafer,strag,straik,strain,straint,strait,strake,straked,straky,stram,stramp,strand,strang,strange,strany,strap,strass,strata,stratal,strath,strati,stratic,stratum,stratus,strave,straw,strawen,strawer,strawy,stray,strayer,stre,streak,streaky,stream,streamy,streck,stree,streek,streel,streen,streep,street,streets,streite,streke,stremma,streng,strent,strenth,strepen,strepor,stress,stret,stretch,strette,stretti,stretto,strew,strewer,strewn,strey,streyne,stria,striae,strial,striate,strich,striche,strick,strict,strid,stride,strider,stridor,strife,strig,striga,strigae,strigal,stright,strigil,strike,striker,strind,string,stringy,striola,strip,stripe,striped,striper,stript,stripy,strit,strive,strived,striven,striver,strix,stroam,strobic,strode,stroil,stroke,stroker,stroky,strold,stroll,strolld,strom,stroma,stromal,stromb,strome,strone,strong,strook,stroot,strop,strophe,stroth,stroud,stroup,strove,strow,strowd,strown,stroy,stroyer,strub,struck,strudel,strue,strum,struma,strumae,strung,strunt,strut,struth,struv,strych,stub,stubb,stubbed,stubber,stubble,stubbly,stubboy,stubby,stuber,stuboy,stucco,stuck,stud,studder,studdie,studdle,stude,student,studia,studied,studier,studio,studium,study,stue,stuff,stuffed,stuffer,stuffy,stug,stuggy,stuiver,stull,stuller,stulm,stum,stumble,stumbly,stumer,stummer,stummy,stump,stumper,stumpy,stun,stung,stunk,stunner,stunsle,stunt,stunted,stunter,stunty,stupa,stupe,stupefy,stupend,stupent,stupex,stupid,stupor,stupose,stupp,stuprum,sturdy,sturine,sturk,sturt,sturtan,sturtin,stuss,stut,stutter,sty,styan,styca,styful,stylar,stylate,style,styler,stylet,styline,styling,stylish,stylist,stylite,stylize,stylo,styloid,stylops,stylus,stymie,stypsis,styptic,styrax,styrene,styrol,styrone,styryl,stythe,styward,suable,suably,suade,suaharo,suant,suantly,suasion,suasive,suasory,suave,suavely,suavify,suavity,sub,subacid,subact,subage,subah,subaid,subanal,subarch,subarea,subatom,subaud,subband,subbank,subbase,subbass,subbeau,subbias,subbing,subcase,subcash,subcast,subcell,subcity,subclan,subcool,subdate,subdean,subdeb,subdial,subdie,subdual,subduce,subduct,subdue,subdued,subduer,subecho,subedit,suber,suberic,suberin,subface,subfeu,subfief,subfix,subform,subfusc,subfusk,subgape,subgens,subget,subgit,subgod,subgrin,subgyre,subhall,subhead,subherd,subhero,subicle,subidar,subidea,subitem,subjack,subject,subjee,subjoin,subking,sublate,sublet,sublid,sublime,sublong,sublot,submaid,submain,subman,submind,submiss,submit,subnect,subness,subnex,subnote,subnude,suboral,suborn,suboval,subpart,subpass,subpial,subpimp,subplat,subplot,subplow,subpool,subport,subrace,subrent,subroot,subrule,subsale,subsalt,subsea,subsect,subsept,subset,subside,subsidy,subsill,subsist,subsoil,subsult,subsume,subtack,subtend,subtext,subtile,subtill,subtle,subtly,subtone,subtype,subunit,suburb,subvein,subvene,subvert,subvola,subway,subwink,subzone,succade,succeed,succent,success,succi,succin,succise,succor,succory,succous,succub,succuba,succube,succula,succumb,succuss,such,suck,suckage,sucken,sucker,sucking,suckle,suckler,suclat,sucrate,sucre,sucrose,suction,sucuri,sucuriu,sud,sudamen,sudary,sudate,sudd,sudden,sudder,suddle,suddy,sudoral,sudoric,suds,sudsman,sudsy,sue,suede,suer,suet,suety,suff,suffect,suffer,suffete,suffice,suffix,sufflue,suffuse,sugamo,sugan,sugar,sugared,sugarer,sugary,sugent,suggest,sugh,sugi,suguaro,suhuaro,suicide,suid,suidian,suiform,suimate,suine,suing,suingly,suint,suist,suit,suite,suiting,suitor,suity,suji,sulcal,sulcar,sulcate,sulcus,suld,sulea,sulfa,sulfato,sulfion,sulfury,sulk,sulka,sulker,sulkily,sulky,sull,sulla,sullage,sullen,sullow,sully,sulpha,sulpho,sulphur,sultam,sultan,sultana,sultane,sultone,sultry,sulung,sum,sumac,sumatra,sumbul,sumless,summage,summand,summar,summary,summate,summed,summer,summery,summist,summit,summity,summon,summons,summula,summut,sumner,sump,sumpage,sumper,sumph,sumphy,sumpit,sumple,sumpman,sumpter,sun,sunbeam,sunbird,sunbow,sunburn,suncup,sundae,sundang,sundari,sundek,sunder,sundew,sundial,sundik,sundog,sundown,sundra,sundri,sundry,sune,sunfall,sunfast,sunfish,sung,sungha,sunglo,sunglow,sunk,sunken,sunket,sunlamp,sunland,sunless,sunlet,sunlike,sunlit,sunn,sunnily,sunnud,sunny,sunray,sunrise,sunroom,sunset,sunsmit,sunspot,sunt,sunup,sunward,sunway,sunways,sunweed,sunwise,sunyie,sup,supa,supari,supawn,supe,super,superb,supine,supper,supping,supple,supply,support,suppose,suppost,supreme,sur,sura,surah,surahi,sural,suranal,surat,surbase,surbate,surbed,surcoat,surcrue,surculi,surd,surdent,surdity,sure,surely,sures,surette,surety,surf,surface,surfacy,surfeit,surfer,surfle,surfman,surfuse,surfy,surge,surgent,surgeon,surgery,surging,surgy,suriga,surlily,surly,surma,surmark,surmise,surname,surnap,surnay,surpass,surplus,surra,surrey,surtax,surtout,survey,survive,suscept,susi,suslik,suspect,suspend,suspire,sustain,susu,susurr,suther,sutile,sutler,sutlery,sutor,sutra,suttee,sutten,suttin,suttle,sutural,suture,suum,suwarro,suwe,suz,svelte,swa,swab,swabber,swabble,swack,swacken,swad,swaddle,swaddy,swag,swage,swager,swagger,swaggie,swaggy,swagman,swain,swaird,swale,swaler,swaling,swallet,swallo,swallow,swam,swami,swamp,swamper,swampy,swan,swang,swangy,swank,swanker,swanky,swanner,swanny,swap,swape,swapper,swaraj,swarbie,sward,swardy,sware,swarf,swarfer,swarm,swarmer,swarmy,swarry,swart,swarth,swarthy,swartly,swarty,swarve,swash,swasher,swashy,swat,swatch,swath,swathe,swather,swathy,swatter,swattle,swaver,sway,swayed,swayer,swayful,swaying,sweal,swear,swearer,sweat,sweated,sweater,sweath,sweaty,swedge,sweeny,sweep,sweeper,sweepy,sweer,sweered,sweet,sweeten,sweetie,sweetly,sweety,swego,swell,swelled,sweller,swelly,swelp,swelt,swelter,swelth,sweltry,swelty,swep,swept,swerd,swerve,swerver,swick,swidge,swift,swiften,swifter,swifty,swig,swigger,swiggle,swile,swill,swiller,swim,swimmer,swimmy,swimy,swindle,swine,swinely,swinery,swiney,swing,swinge,swinger,swingle,swingy,swinish,swink,swinney,swipe,swiper,swipes,swiple,swipper,swipy,swird,swire,swirl,swirly,swish,swisher,swishy,swiss,switch,switchy,swith,swithe,swithen,swither,swivel,swivet,swiz,swizzle,swob,swollen,swom,swonken,swoon,swooned,swoony,swoop,swooper,swoosh,sword,swore,sworn,swosh,swot,swotter,swounds,swow,swum,swung,swungen,swure,syagush,sybotic,syce,sycee,sycock,sycoma,syconid,syconus,sycosis,sye,syenite,sylid,syllab,syllabe,syllabi,sylloge,sylph,sylphic,sylphid,sylphy,sylva,sylvae,sylvage,sylvan,sylvate,sylvic,sylvine,sylvite,symbion,symbiot,symbol,sympode,symptom,synacme,synacmy,synange,synapse,synapte,synaxar,synaxis,sync,syncarp,synch,synchro,syncope,syndic,syndoc,syne,synema,synergy,synesis,syngamy,synod,synodal,synoecy,synonym,synopsy,synovia,syntan,syntax,synthol,syntomy,syntone,syntony,syntype,synusia,sypher,syre,syringa,syringe,syrinx,syrma,syrphid,syrt,syrtic,syrup,syruped,syruper,syrupy,syssel,system,systole,systyle,syzygy,t,ta,taa,taar,tab,tabacin,tabacum,tabanid,tabard,tabaret,tabaxir,tabber,tabby,tabefy,tabella,taberna,tabes,tabet,tabetic,tabic,tabid,tabidly,tabific,tabinet,tabla,table,tableau,tabled,tabler,tables,tablet,tabling,tabloid,tabog,taboo,taboot,tabor,taborer,taboret,taborin,tabour,tabret,tabu,tabula,tabular,tabule,tabut,taccada,tach,tache,tachiol,tacit,tacitly,tack,tacker,tacket,tackety,tackey,tacking,tackle,tackled,tackler,tacky,tacnode,tacso,tact,tactful,tactic,tactics,tactile,taction,tactite,tactive,tactor,tactual,tactus,tad,tade,tadpole,tae,tael,taen,taenia,taenial,taenian,taenite,taennin,taffeta,taffety,taffle,taffy,tafia,taft,tafwiz,tag,tagetol,tagged,tagger,taggle,taggy,taglet,taglike,taglock,tagrag,tagsore,tagtail,tagua,taguan,tagwerk,taha,taheen,tahil,tahin,tahr,tahsil,tahua,tai,taiaha,taich,taiga,taigle,taihoa,tail,tailage,tailed,tailer,tailet,tailge,tailing,taille,taillie,tailor,tailory,tailpin,taily,tailzee,tailzie,taimen,tain,taint,taintor,taipan,taipo,tairge,tairger,tairn,taisch,taise,taissle,tait,taiver,taivers,taivert,taj,takable,takar,take,takeful,taken,taker,takin,taking,takings,takosis,takt,taky,takyr,tal,tala,talabon,talahib,talaje,talak,talao,talar,talari,talaria,talaric,talayot,talbot,talc,talcer,talcky,talcoid,talcose,talcous,talcum,tald,tale,taled,taleful,talent,taler,tales,tali,taliage,taliera,talion,talipat,taliped,talipes,talipot,talis,talisay,talite,talitol,talk,talker,talkful,talkie,talking,talky,tall,tallage,tallboy,taller,tallero,talles,tallet,talliar,tallier,tallis,tallish,tallit,tallith,talloel,tallote,tallow,tallowy,tally,tallyho,talma,talon,taloned,talonic,talonid,talose,talpid,talpify,talpine,talpoid,talthib,taluk,taluka,talus,taluto,talwar,talwood,tam,tamable,tamably,tamale,tamandu,tamanu,tamara,tamarao,tamarin,tamas,tamasha,tambac,tamber,tambo,tamboo,tambor,tambour,tame,tamein,tamely,tamer,tamis,tamise,tamlung,tammie,tammock,tammy,tamp,tampala,tampan,tampang,tamper,tampin,tamping,tampion,tampon,tampoon,tan,tana,tanach,tanager,tanaist,tanak,tanan,tanbark,tanbur,tancel,tandan,tandem,tandle,tandour,tane,tang,tanga,tanged,tangelo,tangent,tanger,tangham,tanghan,tanghin,tangi,tangie,tangka,tanglad,tangle,tangler,tangly,tango,tangram,tangs,tangue,tangum,tangun,tangy,tanh,tanha,tania,tanica,tanier,tanist,tanjib,tanjong,tank,tanka,tankage,tankah,tankard,tanked,tanker,tankert,tankful,tankle,tankman,tanling,tannage,tannaic,tannaim,tannase,tannate,tanned,tanner,tannery,tannic,tannide,tannin,tanning,tannoid,tannyl,tanoa,tanquam,tanquen,tanrec,tansy,tantara,tanti,tantivy,tantle,tantra,tantric,tantrik,tantrum,tantum,tanwood,tanyard,tanzeb,tanzib,tanzy,tao,taotai,taoyin,tap,tapa,tapalo,tapas,tapasvi,tape,tapeman,tapen,taper,tapered,taperer,taperly,tapet,tapetal,tapete,tapeti,tapetum,taphole,tapia,tapioca,tapir,tapis,tapism,tapist,taplash,taplet,tapmost,tapnet,tapoa,tapoun,tappa,tappall,tappaul,tappen,tapper,tappet,tapping,tappoon,taproom,taproot,taps,tapster,tapu,tapul,taqua,tar,tara,taraf,tarage,tarairi,tarand,taraph,tarapin,tarata,taratah,tarau,tarbet,tarboy,tarbush,tardily,tardive,tardle,tardy,tare,tarea,tarefa,tarente,tarfa,targe,targer,target,tarhood,tari,tarie,tariff,tarin,tariric,tarish,tarkhan,tarlike,tarmac,tarman,tarn,tarnal,tarnish,taro,taroc,tarocco,tarok,tarot,tarp,tarpan,tarpon,tarpot,tarpum,tarr,tarrack,tarras,tarrass,tarred,tarrer,tarri,tarrie,tarrier,tarrify,tarrily,tarrish,tarrock,tarrow,tarry,tars,tarsal,tarsale,tarse,tarsi,tarsia,tarsier,tarsome,tarsus,tart,tartago,tartan,tartana,tartane,tartar,tarten,tartish,tartle,tartlet,tartly,tartro,tartryl,tarve,tarweed,tarwood,taryard,tasajo,tascal,tasco,tash,tashie,tashlik,tashrif,task,taskage,tasker,taskit,taslet,tass,tassago,tassah,tassal,tassard,tasse,tassel,tassely,tasser,tasset,tassie,tassoo,taste,tasted,tasten,taster,tastily,tasting,tasty,tasu,tat,tataupa,tatbeb,tatchy,tate,tater,tath,tatie,tatinek,tatler,tatou,tatouay,tatsman,tatta,tatter,tattery,tatther,tattied,tatting,tattle,tattler,tattoo,tattva,tatty,tatu,tau,taught,taula,taum,taun,taunt,taunter,taupe,taupo,taupou,taur,taurean,taurian,tauric,taurine,taurite,tauryl,taut,tautaug,tauted,tauten,tautit,tautly,tautog,tav,tave,tavell,taver,tavern,tavers,tavert,tavola,taw,tawa,tawdry,tawer,tawery,tawie,tawite,tawkee,tawkin,tawn,tawney,tawnily,tawnle,tawny,tawpi,tawpie,taws,tawse,tawtie,tax,taxable,taxably,taxator,taxed,taxeme,taxemic,taxer,taxi,taxibus,taxicab,taximan,taxine,taxing,taxis,taxite,taxitic,taxless,taxman,taxon,taxor,taxpaid,taxwax,taxy,tay,tayer,tayir,tayra,taysaam,tazia,tch,tchai,tcharik,tchast,tche,tchick,tchu,tck,te,tea,teabox,teaboy,teacake,teacart,teach,teache,teacher,teachy,teacup,tead,teadish,teaer,teaey,teagle,teaish,teaism,teak,teal,tealery,tealess,team,teaman,teameo,teamer,teaming,teamman,tean,teanal,teap,teapot,teapoy,tear,tearage,tearcat,tearer,tearful,tearing,tearlet,tearoom,tearpit,teart,teary,tease,teasel,teaser,teashop,teasing,teasler,teasy,teat,teated,teathe,teather,teatime,teatman,teaty,teave,teaware,teaze,teazer,tebbet,tec,teca,tecali,tech,techily,technic,techous,techy,teck,tecomin,tecon,tectal,tectum,tecum,tecuma,ted,tedder,tedge,tedious,tedium,tee,teedle,teel,teem,teemer,teemful,teeming,teems,teen,teenage,teenet,teens,teensy,teenty,teeny,teer,teerer,teest,teet,teetan,teeter,teeth,teethe,teethy,teeting,teety,teevee,teff,teg,tegmen,tegmina,tegua,tegula,tegular,tegumen,tehseel,tehsil,teicher,teil,teind,teinder,teioid,tejon,teju,tekiah,tekke,tekken,tektite,tekya,telamon,telang,telar,telary,tele,teledu,telega,teleost,teleran,telergy,telesia,telesis,teleuto,televox,telfer,telford,teli,telial,telic,telical,telium,tell,tellach,tellee,teller,telling,tellt,telome,telomic,telpath,telpher,telson,telt,telurgy,telyn,temacha,teman,tembe,temblor,temenos,temiak,temin,temp,temper,tempera,tempery,tempest,tempi,templar,temple,templed,templet,tempo,tempora,tempre,tempt,tempter,temse,temser,ten,tenable,tenably,tenace,tenai,tenancy,tenant,tench,tend,tendant,tendent,tender,tending,tendon,tendour,tendril,tendron,tenebra,tenent,teneral,tenet,tenfold,teng,tengere,tengu,tenible,tenio,tenline,tenne,tenner,tennis,tennisy,tenon,tenoner,tenor,tenpin,tenrec,tense,tensely,tensify,tensile,tension,tensity,tensive,tenson,tensor,tent,tentage,tented,tenter,tentful,tenth,tenthly,tentigo,tention,tentlet,tenture,tenty,tenuate,tenues,tenuis,tenuity,tenuous,tenure,teopan,tepache,tepal,tepee,tepefy,tepid,tepidly,tepor,tequila,tera,terap,teras,terbia,terbic,terbium,tercel,tercer,tercet,tercia,tercine,tercio,terebic,terebra,teredo,terek,terete,tereu,terfez,tergal,tergant,tergite,tergum,term,terma,termage,termen,termer,termin,termine,termini,termino,termite,termly,termon,termor,tern,terna,ternal,ternar,ternary,ternate,terne,ternery,ternion,ternize,ternlet,terp,terpane,terpene,terpin,terpine,terrace,terrage,terrain,terral,terrane,terrar,terrene,terret,terrier,terrify,terrine,terron,terror,terry,terse,tersely,tersion,tertia,tertial,tertian,tertius,terton,tervee,terzina,terzo,tesack,teskere,tessara,tessel,tessera,test,testa,testacy,testar,testata,testate,teste,tested,testee,tester,testes,testify,testily,testing,testis,teston,testone,testoon,testor,testril,testudo,testy,tetanic,tetanus,tetany,tetard,tetch,tetchy,tete,tetel,teth,tether,tethery,tetra,tetract,tetrad,tetrane,tetrazo,tetric,tetrode,tetrole,tetrose,tetryl,tetter,tettery,tettix,teucrin,teufit,teuk,teviss,tew,tewel,tewer,tewit,tewly,tewsome,text,textile,textlet,textman,textual,texture,tez,tezkere,th,tha,thack,thacker,thakur,thalami,thaler,thalli,thallic,thallus,thameng,than,thana,thanage,thanan,thane,thank,thankee,thanker,thanks,thapes,thapsia,thar,tharf,tharm,that,thatch,thatchy,thatn,thats,thaught,thave,thaw,thawer,thawn,thawy,the,theah,theasum,theat,theater,theatry,theave,theb,theca,thecae,thecal,thecate,thecia,thecium,thecla,theclan,thecoid,thee,theek,theeker,theelin,theelol,theer,theet,theezan,theft,thegn,thegnly,theine,their,theirn,theirs,theism,theist,thelium,them,thema,themata,theme,themer,themis,themsel,then,thenal,thenar,thence,theody,theorbo,theorem,theoria,theoric,theorum,theory,theow,therapy,there,thereas,thereat,thereby,therein,thereof,thereon,theres,therese,thereto,thereup,theriac,therial,therm,thermae,thermal,thermic,thermit,thermo,thermos,theroid,these,theses,thesial,thesis,theta,thetch,thetic,thetics,thetin,thetine,theurgy,thew,thewed,thewy,they,theyll,theyre,thiamin,thiasi,thiasoi,thiasos,thiasus,thick,thicken,thicket,thickly,thief,thienyl,thieve,thiever,thig,thigger,thigh,thighed,thight,thilk,thill,thiller,thilly,thimber,thimble,thin,thine,thing,thingal,thingly,thingum,thingy,think,thinker,thinly,thinner,thio,thiol,thiolic,thionic,thionyl,thir,third,thirdly,thirl,thirst,thirsty,thirt,thirty,this,thishow,thisn,thissen,thistle,thistly,thither,thiuram,thivel,thixle,tho,thob,thocht,thof,thoft,thoke,thokish,thole,tholi,tholoi,tholos,tholus,thon,thonder,thone,thong,thonged,thongy,thoo,thooid,thoom,thoral,thorax,thore,thoria,thoric,thorina,thorite,thorium,thorn,thorned,thornen,thorny,thoro,thoron,thorp,thort,thorter,those,thou,though,thought,thouse,thow,thowel,thowt,thrack,thraep,thrail,thrain,thrall,thram,thrang,thrap,thrash,thrast,thrave,thraver,thraw,thrawn,thread,thready,threap,threat,three,threne,threnos,threose,thresh,threw,thrice,thrift,thrifty,thrill,thrilly,thrimp,thring,thrip,thripel,thrips,thrive,thriven,thriver,thro,throat,throaty,throb,throck,throddy,throe,thronal,throne,throng,throu,throuch,through,throve,throw,thrower,thrown,thrum,thrummy,thrush,thrushy,thrust,thrutch,thruv,thrymsa,thud,thug,thugdom,thuggee,thujene,thujin,thujone,thujyl,thulia,thulir,thulite,thulium,thulr,thuluth,thumb,thumbed,thumber,thumble,thumby,thump,thumper,thunder,thung,thunge,thuoc,thurify,thurl,thurm,thurmus,thurse,thurt,thus,thusly,thutter,thwack,thwaite,thwart,thwite,thy,thyine,thymate,thyme,thymele,thymene,thymic,thymine,thymol,thymoma,thymus,thymy,thymyl,thynnid,thyroid,thyrse,thyrsus,thysel,thyself,thysen,ti,tiang,tiao,tiar,tiara,tib,tibby,tibet,tibey,tibia,tibiad,tibiae,tibial,tibiale,tiburon,tic,tical,ticca,tice,ticer,tick,ticked,ticken,ticker,ticket,tickey,tickie,ticking,tickle,tickled,tickler,tickly,tickney,ticky,ticul,tid,tidal,tidally,tidbit,tiddle,tiddler,tiddley,tiddy,tide,tided,tideful,tidely,tideway,tidily,tiding,tidings,tidley,tidy,tidyism,tie,tieback,tied,tien,tiepin,tier,tierce,tierced,tiered,tierer,tietick,tiewig,tiff,tiffany,tiffie,tiffin,tiffish,tiffle,tiffy,tift,tifter,tig,tige,tigella,tigelle,tiger,tigerly,tigery,tigger,tight,tighten,tightly,tights,tiglic,tignum,tigress,tigrine,tigroid,tigtag,tikka,tikker,tiklin,tikor,tikur,til,tilaite,tilaka,tilbury,tilde,tile,tiled,tiler,tilery,tilikum,tiling,till,tillage,tiller,tilley,tillite,tillot,tilly,tilmus,tilpah,tilt,tilter,tilth,tilting,tiltup,tilty,tilyer,timable,timar,timarau,timawa,timbal,timbale,timbang,timbe,timber,timbern,timbery,timbo,timbre,timbrel,time,timed,timeful,timely,timeous,timer,times,timid,timidly,timing,timish,timist,timon,timor,timothy,timpani,timpano,tin,tinamou,tincal,tinchel,tinclad,tinct,tind,tindal,tindalo,tinder,tindery,tine,tinea,tineal,tinean,tined,tineid,tineine,tineman,tineoid,tinety,tinful,ting,tinge,tinged,tinger,tingi,tingid,tingle,tingler,tingly,tinguy,tinhorn,tinily,tining,tink,tinker,tinkle,tinkler,tinkly,tinlet,tinlike,tinman,tinned,tinner,tinnery,tinnet,tinnily,tinning,tinnock,tinny,tinosa,tinsel,tinsman,tint,tinta,tintage,tinted,tinter,tintie,tinting,tintist,tinty,tintype,tinwald,tinware,tinwork,tiny,tip,tipburn,tipcart,tipcat,tipe,tipful,tiphead,tipiti,tiple,tipless,tiplet,tipman,tipmost,tiponi,tipped,tippee,tipper,tippet,tipping,tipple,tippler,tipply,tippy,tipsify,tipsily,tipster,tipsy,tiptail,tiptilt,tiptoe,tiptop,tipulid,tipup,tirade,tiralee,tire,tired,tiredly,tiredom,tireman,tirer,tiriba,tiring,tirl,tirma,tirr,tirret,tirrlie,tirve,tirwit,tisane,tisar,tissual,tissue,tissued,tissuey,tiswin,tit,titania,titanic,titano,titanyl,titar,titbit,tite,titer,titfish,tithal,tithe,tither,tithing,titi,titian,titien,titlark,title,titled,titler,titlike,titling,titlist,titmal,titman,titoki,titrate,titre,titter,tittery,tittie,tittle,tittler,tittup,tittupy,titty,titular,titule,titulus,tiver,tivoli,tivy,tiza,tizeur,tizzy,tji,tjosite,tlaco,tmema,tmesis,to,toa,toad,toadeat,toader,toadery,toadess,toadier,toadish,toadlet,toady,toast,toastee,toaster,toasty,toat,toatoa,tobacco,tobe,tobine,tobira,toby,tobyman,toccata,tocher,tock,toco,tocome,tocsin,tocusso,tod,today,todder,toddick,toddite,toddle,toddler,toddy,tode,tody,toe,toecap,toed,toeless,toelike,toenail,toetoe,toff,toffee,toffing,toffish,toffy,toft,tofter,toftman,tofu,tog,toga,togaed,togata,togate,togated,toggel,toggery,toggle,toggler,togless,togs,togt,togue,toher,toheroa,toho,tohunga,toi,toil,toiled,toiler,toilet,toilful,toiling,toise,toit,toitish,toity,tokay,toke,token,tokened,toko,tokopat,tol,tolan,tolane,told,toldo,tole,tolite,toll,tollage,toller,tollery,tolling,tollman,tolly,tolsey,tolt,tolter,tolu,toluate,toluene,toluic,toluide,toluido,toluol,toluyl,tolyl,toman,tomato,tomb,tombac,tombal,tombe,tombic,tomblet,tombola,tombolo,tomboy,tomcat,tomcod,tome,tomeful,tomelet,toment,tomfool,tomial,tomin,tomish,tomium,tomjohn,tomkin,tommy,tomnoup,tomorn,tomosis,tompon,tomtate,tomtit,ton,tonal,tonally,tonant,tondino,tone,toned,toneme,toner,tonetic,tong,tonga,tonger,tongman,tongs,tongue,tongued,tonguer,tonguey,tonic,tonify,tonight,tonish,tonite,tonjon,tonk,tonkin,tonlet,tonnage,tonneau,tonner,tonnish,tonous,tonsil,tonsor,tonsure,tontine,tonus,tony,too,toodle,took,tooken,tool,toolbox,tooler,tooling,toolman,toom,toomly,toon,toop,toorie,toorock,tooroo,toosh,toot,tooter,tooth,toothed,toother,toothy,tootle,tootler,tootsy,toozle,toozoo,top,toparch,topass,topaz,topazy,topcap,topcast,topcoat,tope,topee,topeng,topepo,toper,topfull,toph,tophus,topi,topia,topiary,topic,topical,topknot,topless,toplike,topline,topman,topmast,topmost,topo,toponym,topped,topper,topping,topple,toppler,topply,toppy,toprail,toprope,tops,topsail,topside,topsl,topsman,topsoil,toptail,topwise,toque,tor,tora,torah,toral,toran,torc,torcel,torch,torcher,torchon,tore,tored,torero,torfel,torgoch,toric,torii,torma,tormen,torment,tormina,torn,tornade,tornado,tornal,tornese,torney,tornote,tornus,toro,toroid,torose,torous,torpedo,torpent,torpid,torpify,torpor,torque,torqued,torques,torrefy,torrent,torrid,torsade,torse,torsel,torsile,torsion,torsive,torsk,torso,tort,torta,torteau,tortile,tortive,tortula,torture,toru,torula,torulin,torulus,torus,torve,torvid,torvity,torvous,tory,tosh,tosher,toshery,toshly,toshy,tosily,toss,tosser,tossily,tossing,tosspot,tossup,tossy,tost,toston,tosy,tot,total,totally,totara,totchka,tote,totem,totemic,totemy,toter,tother,totient,toto,totora,totquot,totter,tottery,totting,tottle,totty,totuava,totum,toty,totyman,tou,toucan,touch,touched,toucher,touchy,toug,tough,toughen,toughly,tought,tould,toumnah,toup,toupee,toupeed,toupet,tour,touraco,tourer,touring,tourism,tourist,tourize,tourn,tournay,tournee,tourney,tourte,tousche,touse,touser,tousle,tously,tousy,tout,touter,tovar,tow,towable,towage,towai,towan,toward,towards,towboat,towcock,towd,towel,towelry,tower,towered,towery,towght,towhead,towhee,towing,towkay,towlike,towline,towmast,town,towned,townee,towner,townet,townful,townify,townish,townist,townlet,townly,townman,towny,towpath,towrope,towser,towy,tox,toxa,toxamin,toxcatl,toxemia,toxemic,toxic,toxical,toxicum,toxifer,toxin,toxity,toxoid,toxon,toxone,toxosis,toxotae,toy,toydom,toyer,toyful,toying,toyish,toyland,toyless,toylike,toyman,toyon,toyshop,toysome,toytown,toywort,toze,tozee,tozer,tra,trabal,trabant,trabea,trabeae,trabuch,trace,tracer,tracery,trachea,trachle,tracing,track,tracked,tracker,tract,tractor,tradal,trade,trader,trading,tradite,traduce,trady,traffic,trag,tragal,tragedy,tragi,tragic,tragus,trah,traheen,traik,trail,trailer,traily,train,trained,trainee,trainer,trainy,traipse,trait,traitor,traject,trajet,tralira,tram,trama,tramal,tramcar,trame,tramful,tramman,trammel,trammer,trammon,tramp,tramper,trample,trampot,tramway,trance,tranced,traneen,trank,tranka,tranker,trankum,tranky,transit,transom,trant,tranter,trap,trapes,trapeze,trapped,trapper,trappy,traps,trash,traship,trashy,trass,trasy,trauma,travail,travale,trave,travel,travis,travois,travoy,trawl,trawler,tray,trayful,treacle,treacly,tread,treader,treadle,treason,treat,treatee,treater,treator,treaty,treble,trebly,treddle,tree,treed,treeful,treeify,treelet,treeman,treen,treetop,treey,tref,trefle,trefoil,tregerg,tregohm,trehala,trek,trekker,trellis,tremble,trembly,tremie,tremolo,tremor,trenail,trench,trend,trendle,trental,trepan,trepang,trepid,tress,tressed,tresson,tressy,trest,trestle,tret,trevet,trews,trey,tri,triable,triace,triacid,triact,triad,triadic,triaene,triage,trial,triamid,triarch,triarii,triatic,triaxon,triazin,triazo,tribade,tribady,tribal,tribase,tribble,tribe,triblet,tribrac,tribual,tribuna,tribune,tribute,trica,tricae,tricar,trice,triceps,trichi,trichia,trichy,trick,tricker,trickle,trickly,tricksy,tricky,triclad,tricorn,tricot,trident,triduan,triduum,tried,triedly,triene,triens,trier,trifa,trifid,trifle,trifler,triflet,trifoil,trifold,trifoly,triform,trig,trigamy,trigger,triglid,triglot,trigly,trigon,trigone,trigram,trigyn,trikaya,trike,triker,triketo,trikir,trilabe,trilby,trilit,trilite,trilith,trill,trillet,trilli,trillo,trilobe,trilogy,trim,trimer,trimly,trimmer,trin,trinal,trinary,trindle,trine,trinely,tringle,trinity,trink,trinket,trinkle,trinode,trinol,trintle,trio,triobol,triode,triodia,triole,triolet,trionym,trior,triose,trip,tripal,tripara,tripart,tripe,tripel,tripery,triple,triplet,triplex,triplum,triply,tripod,tripody,tripoli,tripos,tripper,trippet,tripple,tripsis,tripy,trireme,trisalt,trisazo,trisect,triseme,trishna,trismic,trismus,trisome,trisomy,trist,trisul,trisula,tritaph,trite,tritely,tritish,tritium,tritolo,triton,tritone,tritor,trityl,triumph,triunal,triune,triurid,trivant,trivet,trivia,trivial,trivium,trivvet,trizoic,trizone,troat,troca,trocar,trochal,troche,trochee,trochi,trochid,trochus,trock,troco,trod,trodden,trode,troft,trog,trogger,troggin,trogon,trogs,trogue,troika,troke,troker,troll,troller,trolley,trollol,trollop,trolly,tromba,trombe,trommel,tromp,trompe,trompil,tromple,tron,trona,tronage,tronc,trone,troner,troolie,troop,trooper,troot,tropal,tropary,tropate,trope,tropeic,troper,trophal,trophi,trophic,trophy,tropic,tropine,tropism,tropist,tropoyl,tropyl,trot,troth,trotlet,trotol,trotter,trottie,trotty,trotyl,trouble,troubly,trough,troughy,trounce,troupe,trouper,trouse,trouser,trout,trouter,trouty,trove,trover,trow,trowel,trowing,trowman,trowth,troy,truancy,truant,trub,trubu,truce,trucial,truck,trucker,truckle,trucks,truddo,trudge,trudgen,trudger,true,truer,truff,truffle,trug,truish,truism,trull,truller,trullo,truly,trummel,trump,trumper,trumpet,trumph,trumpie,trun,truncal,trunch,trundle,trunk,trunked,trunnel,trush,trusion,truss,trussed,trusser,trust,trustee,trusten,truster,trustle,trusty,truth,truthy,truvat,try,trygon,trying,tryma,tryout,tryp,trypa,trypan,trypsin,tryptic,trysail,tryst,tryster,tryt,tsadik,tsamba,tsantsa,tsar,tsardom,tsarina,tsatlee,tsere,tsetse,tsia,tsine,tst,tsuba,tsubo,tsun,tsunami,tsungtu,tu,tua,tuan,tuarn,tuart,tuatara,tuatera,tuath,tub,tuba,tubae,tubage,tubal,tubar,tubate,tubba,tubbal,tubbeck,tubber,tubbie,tubbing,tubbish,tubboe,tubby,tube,tubeful,tubelet,tubeman,tuber,tuberin,tubfish,tubful,tubicen,tubifer,tubig,tubik,tubing,tublet,tublike,tubman,tubular,tubule,tubulet,tubuli,tubulus,tuchit,tuchun,tuck,tucker,tucket,tucking,tuckner,tucktoo,tucky,tucum,tucuma,tucuman,tudel,tue,tueiron,tufa,tufan,tuff,tuffet,tuffing,tuft,tufted,tufter,tuftily,tufting,tuftlet,tufty,tug,tugboat,tugger,tuggery,tugging,tughra,tugless,tuglike,tugman,tugrik,tugui,tui,tuik,tuille,tuilyie,tuism,tuition,tuitive,tuke,tukra,tula,tulare,tulasi,tulchan,tulchin,tule,tuliac,tulip,tulipy,tulisan,tulle,tulsi,tulwar,tum,tumasha,tumbak,tumble,tumbled,tumbler,tumbly,tumbrel,tume,tumefy,tumid,tumidly,tummals,tummel,tummer,tummock,tummy,tumor,tumored,tump,tumtum,tumular,tumuli,tumult,tumulus,tun,tuna,tunable,tunably,tunca,tund,tunder,tundish,tundra,tundun,tune,tuned,tuneful,tuner,tunful,tung,tungate,tungo,tunhoof,tunic,tunicin,tunicle,tuning,tunish,tunist,tunk,tunket,tunlike,tunmoot,tunna,tunnel,tunner,tunnery,tunnor,tunny,tuno,tunu,tuny,tup,tupara,tupek,tupelo,tupik,tupman,tupuna,tuque,tur,turacin,turb,turban,turbary,turbeh,turbid,turbine,turbit,turbith,turbo,turbot,turco,turd,turdine,turdoid,tureen,turf,turfage,turfdom,turfed,turfen,turfing,turfite,turfman,turfy,turgent,turgid,turgite,turgoid,turgor,turgy,turio,turion,turjite,turk,turken,turkey,turkis,turkle,turm,turma,turment,turmit,turmoil,turn,turncap,turndun,turned,turnel,turner,turnery,turney,turning,turnip,turnipy,turnix,turnkey,turnoff,turnout,turnpin,turnrow,turns,turnup,turp,turpeth,turpid,turps,turr,turret,turse,tursio,turtle,turtler,turtlet,turtosa,tururi,turus,turwar,tusche,tush,tushed,tusher,tushery,tusk,tuskar,tusked,tusker,tuskish,tusky,tussah,tussal,tusser,tussis,tussive,tussle,tussock,tussore,tussur,tut,tutania,tutball,tute,tutee,tutela,tutelar,tutenag,tuth,tutin,tutly,tutman,tutor,tutorer,tutorly,tutory,tutoyer,tutress,tutrice,tutrix,tuts,tutsan,tutster,tutti,tutty,tutu,tutulus,tutwork,tuwi,tux,tuxedo,tuyere,tuza,tuzzle,twa,twaddle,twaddly,twaddy,twae,twagger,twain,twaite,twal,twale,twalt,twang,twanger,twangle,twangy,twank,twanker,twankle,twanky,twant,twarly,twas,twasome,twat,twattle,tway,twazzy,tweag,tweak,tweaker,tweaky,twee,tweed,tweeded,tweedle,tweedy,tweeg,tweel,tween,tweeny,tweesh,tweesht,tweest,tweet,tweeter,tweeze,tweezer,tweil,twelfth,twelve,twenty,twere,twerp,twibil,twice,twicer,twicet,twick,twiddle,twiddly,twifoil,twifold,twig,twigful,twigged,twiggen,twigger,twiggy,twiglet,twilit,twill,twilled,twiller,twilly,twilt,twin,twindle,twine,twiner,twinge,twingle,twinism,twink,twinkle,twinkly,twinly,twinned,twinner,twinter,twiny,twire,twirk,twirl,twirler,twirly,twiscar,twisel,twist,twisted,twister,twistle,twisty,twit,twitch,twitchy,twite,twitten,twitter,twitty,twixt,twizzle,two,twofold,twoling,twoness,twosome,tychism,tychite,tycoon,tyddyn,tydie,tye,tyee,tyg,tying,tyke,tyken,tykhana,tyking,tylarus,tylion,tyloma,tylopod,tylose,tylosis,tylote,tylotic,tylotus,tylus,tymp,tympan,tympana,tympani,tympany,tynd,typal,type,typer,typeset,typhia,typhic,typhlon,typhoid,typhoon,typhose,typhous,typhus,typic,typica,typical,typicon,typicum,typify,typist,typo,typobar,typonym,typp,typy,tyranny,tyrant,tyre,tyro,tyroma,tyrone,tyronic,tyrosyl,tyste,tyt,tzolkin,tzontle,u,uang,uayeb,uberant,uberous,uberty,ubi,ubiety,ubiquit,ubussu,uckia,udal,udaler,udaller,udalman,udasi,udder,uddered,udell,udo,ug,ugh,uglify,uglily,ugly,ugsome,uhlan,uhllo,uhtsong,uily,uinal,uintjie,uitspan,uji,ukase,uke,ukiyoye,ukulele,ula,ulcer,ulcered,ulcery,ule,ulema,uletic,ulex,ulexine,ulexite,ulitis,ull,ulla,ullage,ullaged,uller,ulling,ulluco,ulmic,ulmin,ulminic,ulmo,ulmous,ulna,ulnad,ulnae,ulnar,ulnare,ulnaria,uloid,uloncus,ulster,ultima,ultimo,ultimum,ultra,ulu,ulua,uluhi,ululant,ululate,ululu,um,umbel,umbeled,umbella,umber,umbilic,umble,umbo,umbonal,umbone,umbones,umbonic,umbra,umbrae,umbrage,umbral,umbrel,umbril,umbrine,umbrose,umbrous,ume,umiak,umiri,umlaut,ump,umph,umpire,umpirer,umpteen,umpty,umu,un,unable,unably,unact,unacted,unacute,unadapt,unadd,unadded,unadopt,unadorn,unadult,unafire,unaflow,unaged,unagile,unaging,unaided,unaimed,unaired,unakin,unakite,unal,unalarm,unalert,unalike,unalist,unalive,unallow,unalone,unaloud,unamend,unamiss,unamo,unample,unamply,unangry,unannex,unapart,unapt,unaptly,unarch,unark,unarm,unarmed,unarray,unarted,unary,unasked,unau,unavian,unawake,unaware,unaway,unawed,unawful,unawned,unaxled,unbag,unbain,unbait,unbaked,unbale,unbank,unbar,unbarb,unbare,unbark,unbase,unbased,unbaste,unbated,unbay,unbe,unbear,unbeard,unbeast,unbed,unbefit,unbeget,unbegot,unbegun,unbeing,unbell,unbelt,unbench,unbend,unbent,unberth,unbeset,unbesot,unbet,unbias,unbid,unbind,unbit,unbitt,unblade,unbled,unblent,unbless,unblest,unblind,unbliss,unblock,unbloom,unblown,unblued,unblush,unboat,unbody,unbog,unboggy,unbokel,unbold,unbolt,unbone,unboned,unbonny,unboot,unbored,unborn,unborne,unbosom,unbound,unbow,unbowed,unbowel,unbox,unboxed,unboy,unbrace,unbraid,unbran,unbrand,unbrave,unbraze,unbred,unbrent,unbrick,unbrief,unbroad,unbroke,unbrown,unbrute,unbud,unbuild,unbuilt,unbulky,unbung,unburly,unburn,unburnt,unburst,unbury,unbush,unbusk,unbusy,unbuxom,unca,uncage,uncaged,uncake,uncalk,uncall,uncalm,uncaned,uncanny,uncap,uncart,uncase,uncased,uncask,uncast,uncaste,uncate,uncave,unceded,unchain,unchair,uncharm,unchary,uncheat,uncheck,unchid,unchild,unchurn,unci,uncia,uncial,uncinal,uncinch,uncinct,uncini,uncinus,uncite,uncited,uncity,uncivic,uncivil,unclad,unclamp,unclasp,unclay,uncle,unclead,unclean,unclear,uncleft,unclew,unclick,unclify,unclimb,uncling,unclip,uncloak,unclog,unclose,uncloud,unclout,unclub,unco,uncoach,uncoat,uncock,uncoded,uncoif,uncoil,uncoin,uncoked,uncolt,uncoly,uncome,uncomfy,uncomic,uncoop,uncope,uncord,uncore,uncored,uncork,uncost,uncouch,uncous,uncouth,uncover,uncowed,uncowl,uncoy,uncram,uncramp,uncream,uncrest,uncrib,uncried,uncrime,uncrisp,uncrook,uncropt,uncross,uncrown,uncrude,uncruel,unction,uncubic,uncular,uncurb,uncurd,uncured,uncurl,uncurse,uncurst,uncus,uncut,uncuth,undaily,undam,undamn,undared,undark,undate,undated,undaub,undazed,unde,undead,undeaf,undealt,undean,undear,undeck,undecyl,undeep,undeft,undeify,undelve,unden,under,underdo,underer,undergo,underly,undern,undevil,undewed,undewy,undid,undies,undig,undight,undiked,undim,undine,undined,undirk,undo,undock,undoer,undog,undoing,undomed,undon,undone,undoped,undose,undosed,undowny,undrab,undrag,undrape,undraw,undrawn,undress,undried,undrunk,undry,undub,unducal,undue,undug,unduke,undular,undull,unduly,unduped,undust,unduty,undwelt,undy,undye,undyed,undying,uneager,unearly,unearth,unease,uneasy,uneaten,uneath,unebbed,unedge,unedged,unelect,unempt,unempty,unended,unepic,unequal,unerect,unethic,uneven,unevil,unexact,uneye,uneyed,unface,unfaced,unfact,unfaded,unfain,unfaint,unfair,unfaith,unfaked,unfalse,unfamed,unfancy,unfar,unfast,unfeary,unfed,unfeed,unfele,unfelon,unfelt,unfence,unfeted,unfeued,unfew,unfiber,unfiend,unfiery,unfight,unfile,unfiled,unfill,unfilm,unfine,unfined,unfired,unfirm,unfit,unfitly,unfitty,unfix,unfixed,unflag,unflaky,unflank,unflat,unflead,unflesh,unflock,unfloor,unflown,unfluid,unflush,unfoggy,unfold,unfond,unfool,unfork,unform,unfoul,unfound,unfoxy,unfrail,unframe,unfrank,unfree,unfreed,unfret,unfried,unfrill,unfrizz,unfrock,unfrost,unfroze,unfull,unfully,unfumed,unfunny,unfur,unfurl,unfused,unfussy,ungag,ungaged,ungain,ungaite,ungaro,ungaudy,ungear,ungelt,unget,ungiant,ungiddy,ungild,ungill,ungilt,ungird,ungirt,ungirth,ungive,ungiven,ungka,unglad,unglaze,unglee,unglobe,ungloom,unglory,ungloss,unglove,unglue,unglued,ungnaw,ungnawn,ungod,ungodly,ungold,ungone,ungood,ungored,ungorge,ungot,ungouty,ungown,ungrace,ungraft,ungrain,ungrand,ungrasp,ungrave,ungreat,ungreen,ungrip,ungripe,ungross,ungrow,ungrown,ungruff,ungual,unguard,ungueal,unguent,ungues,unguis,ungula,ungulae,ungular,unguled,ungull,ungulp,ungum,unguyed,ungyve,ungyved,unhabit,unhad,unhaft,unhair,unhairy,unhand,unhandy,unhang,unhap,unhappy,unhard,unhardy,unharsh,unhasp,unhaste,unhasty,unhat,unhate,unhated,unhaunt,unhave,unhayed,unhazed,unhead,unheady,unheal,unheard,unheart,unheavy,unhedge,unheed,unheedy,unheld,unhele,unheler,unhelm,unherd,unhero,unhewed,unhewn,unhex,unhid,unhide,unhigh,unhinge,unhired,unhit,unhitch,unhive,unhoard,unhoary,unhoed,unhoist,unhold,unholy,unhome,unhoned,unhood,unhook,unhoop,unhoped,unhorny,unhorse,unhose,unhosed,unhot,unhouse,unhull,unhuman,unhumid,unhung,unhurt,unhusk,uniat,uniate,uniaxal,unible,unice,uniced,unicell,unicism,unicist,unicity,unicorn,unicum,unideal,unidle,unidly,unie,uniface,unific,unified,unifier,uniflow,uniform,unify,unilobe,unimped,uninked,uninn,unio,unioid,union,unioned,unionic,unionid,unioval,unipara,uniped,unipod,unique,unireme,unisoil,unison,unit,unitage,unital,unitary,unite,united,uniter,uniting,unition,unitism,unitive,unitize,unitude,unity,univied,unjaded,unjam,unjewel,unjoin,unjoint,unjolly,unjoyed,unjudge,unjuicy,unjust,unkamed,unked,unkempt,unken,unkept,unket,unkey,unkeyed,unkid,unkill,unkin,unkind,unking,unkink,unkirk,unkiss,unkist,unknave,unknew,unknit,unknot,unknow,unknown,unlace,unlaced,unlade,unladen,unlaid,unlame,unlamed,unland,unlap,unlarge,unlash,unlatch,unlath,unlaugh,unlaved,unlaw,unlawed,unlawly,unlay,unlead,unleaf,unleaky,unleal,unlean,unlearn,unleash,unleave,unled,unleft,unlegal,unlent,unless,unlet,unlevel,unlid,unlie,unlight,unlike,unliked,unliken,unlimb,unlime,unlimed,unlimp,unline,unlined,unlink,unlist,unlisty,unlit,unlive,unload,unloath,unlobed,unlocal,unlock,unlodge,unlofty,unlogic,unlook,unloop,unloose,unlord,unlost,unlousy,unlove,unloved,unlowly,unloyal,unlucid,unluck,unlucky,unlunar,unlured,unlust,unlusty,unlute,unluted,unlying,unmad,unmade,unmagic,unmaid,unmail,unmake,unmaker,unman,unmaned,unmanly,unmarch,unmarry,unmask,unmast,unmate,unmated,unmaze,unmeant,unmeek,unmeet,unmerge,unmerry,unmesh,unmet,unmeted,unmew,unmewed,unmind,unmined,unmired,unmiry,unmist,unmiter,unmix,unmixed,unmodel,unmoist,unmold,unmoldy,unmoor,unmoral,unmount,unmoved,unmowed,unmown,unmuddy,unmuted,unnail,unnaked,unname,unnamed,unneat,unneedy,unnegro,unnerve,unnest,unneth,unnethe,unnew,unnewly,unnice,unnigh,unnoble,unnobly,unnose,unnosed,unnoted,unnovel,unoared,unobese,unode,unoften,unogled,unoil,unoiled,unoily,unold,unoped,unopen,unorbed,unorder,unorn,unornly,unovert,unowed,unowing,unown,unowned,unpaced,unpack,unpagan,unpaged,unpaid,unpaint,unpale,unpaled,unpanel,unpapal,unpaper,unparch,unpared,unpark,unparty,unpass,unpaste,unpave,unpaved,unpawed,unpawn,unpeace,unpeel,unpeg,unpen,unpenal,unpent,unperch,unpetal,unpick,unpiece,unpiety,unpile,unpiled,unpin,unpious,unpiped,unplace,unplaid,unplain,unplait,unplan,unplank,unplant,unplat,unpleat,unplied,unplow,unplug,unplumb,unplume,unplump,unpoise,unpoled,unpope,unposed,unpot,unpower,unpray,unprim,unprime,unprint,unprop,unproud,unpure,unpurse,unput,unqueen,unquick,unquiet,unquit,unquote,unraced,unrack,unrainy,unrake,unraked,unram,unrank,unraped,unrare,unrash,unrated,unravel,unray,unrayed,unrazed,unread,unready,unreal,unreave,unrebel,unred,unreel,unreeve,unregal,unrein,unrent,unrest,unresty,unrhyme,unrich,unricht,unrid,unride,unrife,unrig,unright,unrigid,unrind,unring,unrip,unripe,unriped,unrisen,unrisky,unrived,unriven,unrivet,unroast,unrobe,unrobed,unroll,unroof,unroomy,unroost,unroot,unrope,unroped,unrosed,unroted,unrough,unround,unrove,unroved,unrow,unrowed,unroyal,unrule,unruled,unruly,unrun,unrung,unrural,unrust,unruth,unsack,unsad,unsafe,unsage,unsaid,unsaint,unsalt,unsane,unsappy,unsash,unsated,unsatin,unsaved,unsawed,unsawn,unsay,unscale,unscaly,unscarb,unscent,unscrew,unseal,unseam,unseat,unsee,unseen,unself,unsense,unsent,unset,unsew,unsewed,unsewn,unsex,unsexed,unshade,unshady,unshape,unsharp,unshawl,unsheaf,unshed,unsheet,unshell,unship,unshod,unshoe,unshoed,unshop,unshore,unshorn,unshort,unshot,unshown,unshowy,unshrew,unshut,unshy,unshyly,unsick,unsided,unsiege,unsight,unsilly,unsin,unsinew,unsing,unsized,unskin,unslack,unslain,unslate,unslave,unsleek,unslept,unsling,unslip,unslit,unslot,unslow,unslung,unsly,unsmart,unsmoky,unsmote,unsnaky,unsnap,unsnare,unsnarl,unsneck,unsnib,unsnow,unsober,unsoft,unsoggy,unsoil,unsolar,unsold,unsole,unsoled,unsolid,unsome,unson,unsonsy,unsooty,unsore,unsorry,unsort,unsoul,unsound,unsour,unsowed,unsown,unspan,unspar,unspeak,unsped,unspeed,unspell,unspelt,unspent,unspicy,unspied,unspike,unspin,unspit,unsplit,unspoil,unspot,unspun,unstack,unstagy,unstaid,unstain,unstar,unstate,unsteck,unsteel,unsteep,unstep,unstern,unstick,unstill,unsting,unstock,unstoic,unstone,unstony,unstop,unstore,unstout,unstow,unstrap,unstrip,unstuck,unstuff,unstung,unsty,unsued,unsuit,unsulky,unsun,unsung,unsunk,unsunny,unsure,unswear,unsweat,unsweet,unswell,unswept,unswing,unsworn,unswung,untack,untaint,untaken,untall,untame,untamed,untap,untaped,untar,untaste,untasty,untaut,untawed,untax,untaxed,unteach,unteam,unteem,untell,untense,untent,untenty,untewed,unthank,unthaw,unthick,unthink,unthorn,unthrid,unthrob,untidal,untidy,untie,untied,untight,until,untile,untiled,untill,untilt,untimed,untin,untinct,untine,untipt,untire,untired,unto,untold,untomb,untone,untoned,untooth,untop,untorn,untouch,untough,untown,untrace,untrain,untread,untreed,untress,untried,untrig,untrill,untrim,untripe,untrite,untrod,untruck,untrue,untruly,untruss,untrust,untruth,untuck,untumid,untune,untuned,unturf,unturn,untwine,untwirl,untwist,untying,untz,unugly,unultra,unupset,unurban,unurged,unurn,unurned,unuse,unused,unusual,unvain,unvalid,unvalue,unveil,unvenom,unvest,unvexed,unvicar,unvisor,unvital,unvivid,unvocal,unvoice,unvote,unvoted,unvowed,unwaded,unwaged,unwaked,unwall,unwan,unware,unwarm,unwarn,unwarp,unwary,unwater,unwaved,unwax,unwaxed,unwayed,unweal,unweary,unweave,unweb,unwed,unwedge,unweel,unweft,unweld,unwell,unwept,unwet,unwheel,unwhig,unwhip,unwhite,unwield,unwifed,unwig,unwild,unwill,unwily,unwind,unwindy,unwiped,unwire,unwired,unwise,unwish,unwist,unwitch,unwitty,unwive,unwived,unwoful,unwoman,unwomb,unwon,unwooed,unwoof,unwooly,unwordy,unwork,unworld,unwormy,unworn,unworth,unwound,unwoven,unwrap,unwrit,unwrite,unwrung,unyoke,unyoked,unyoung,unze,unzen,unzone,unzoned,up,upaisle,upalley,upalong,uparch,uparise,uparm,uparna,upas,upattic,upbank,upbar,upbay,upbear,upbeat,upbelch,upbelt,upbend,upbid,upbind,upblast,upblaze,upblow,upboil,upbolt,upboost,upborne,upbotch,upbound,upbrace,upbraid,upbray,upbreak,upbred,upbreed,upbrim,upbring,upbrook,upbrow,upbuild,upbuoy,upburn,upburst,upbuy,upcall,upcanal,upcarry,upcast,upcatch,upchoke,upchuck,upcity,upclimb,upclose,upcoast,upcock,upcoil,upcome,upcover,upcrane,upcrawl,upcreek,upcreep,upcrop,upcrowd,upcry,upcurl,upcurve,upcut,updart,update,updeck,updelve,updive,updo,updome,updraft,updrag,updraw,updrink,updry,upeat,upend,upeygan,upfeed,upfield,upfill,upflame,upflare,upflash,upflee,upfling,upfloat,upflood,upflow,upflung,upfly,upfold,upframe,upfurl,upgale,upgang,upgape,upgaze,upget,upgird,upgirt,upgive,upglean,upglide,upgo,upgorge,upgrade,upgrave,upgrow,upgully,upgush,uphand,uphang,uphasp,upheal,upheap,upheave,upheld,uphelm,uphelya,upher,uphill,uphoard,uphoist,uphold,uphung,uphurl,upjerk,upjet,upkeep,upknell,upknit,upla,uplaid,uplake,upland,uplane,uplay,uplead,upleap,upleg,uplick,uplift,uplight,uplimb,upline,uplock,uplong,uplook,uploom,uploop,uplying,upmast,upmix,upmost,upmount,upmove,upness,upo,upon,uppard,uppent,upper,upperch,upperer,uppers,uppile,upping,uppish,uppity,upplow,uppluck,uppoint,uppoise,uppop,uppour,uppowoc,upprick,upprop,uppuff,uppull,uppush,upraise,upreach,uprear,uprein,uprend,uprest,uprid,upridge,upright,uprip,uprisal,uprise,uprisen,upriser,uprist,uprive,upriver,uproad,uproar,uproom,uproot,uprose,uprouse,uproute,uprun,uprush,upscale,upscrew,upseal,upseek,upseize,upsend,upset,upsey,upshaft,upshear,upshoot,upshore,upshot,upshove,upshut,upside,upsides,upsilon,upsit,upslant,upslip,upslope,upsmite,upsoak,upsoar,upsolve,upspeak,upspear,upspeed,upspew,upspin,upspire,upspout,upspurt,upstaff,upstage,upstair,upstamp,upstand,upstare,upstart,upstate,upstay,upsteal,upsteam,upstem,upstep,upstick,upstir,upsuck,upsun,upsup,upsurge,upswarm,upsway,upsweep,upswell,upswing,uptable,uptake,uptaker,uptear,uptend,upthrow,uptide,uptie,uptill,uptilt,uptorn,uptoss,uptower,uptown,uptrace,uptrack,uptrail,uptrain,uptree,uptrend,uptrill,uptrunk,uptruss,uptube,uptuck,upturn,uptwist,upupoid,upvomit,upwaft,upwall,upward,upwards,upwarp,upwax,upway,upways,upwell,upwent,upwheel,upwhelm,upwhir,upwhirl,upwind,upwith,upwork,upwound,upwrap,upwring,upyard,upyoke,ur,ura,urachal,urachus,uracil,uraemic,uraeus,ural,urali,uraline,uralite,uralium,uramido,uramil,uramino,uran,uranate,uranic,uraniid,uranin,uranine,uranion,uranism,uranist,uranite,uranium,uranous,uranyl,urao,urare,urari,urase,urate,uratic,uratoma,urazine,urazole,urban,urbane,urbian,urbic,urbify,urceole,urceoli,urceus,urchin,urd,urde,urdee,ure,urea,ureal,urease,uredema,uredine,uredo,ureic,ureid,ureide,ureido,uremia,uremic,urent,uresis,uretal,ureter,urethan,urethra,uretic,urf,urge,urgence,urgency,urgent,urger,urging,urheen,urial,uric,urinal,urinant,urinary,urinate,urine,urinose,urinous,urite,urlar,urled,urling,urluch,urman,urn,urna,urnae,urnal,urnful,urning,urnism,urnlike,urocele,urocyst,urodele,urogram,urohyal,urolith,urology,uromere,uronic,uropod,urosis,urosome,urostea,urotoxy,uroxin,ursal,ursine,ursoid,ursolic,urson,ursone,ursuk,urtica,urtite,urubu,urucu,urucuri,uruisg,urunday,urus,urushi,urushic,urva,us,usable,usage,usager,usance,usar,usara,usaron,usation,use,used,usedly,usednt,usee,useful,usehold,useless,usent,user,ush,ushabti,usher,usherer,usings,usitate,usnea,usneoid,usnic,usninic,usque,usself,ussels,ust,uster,ustion,usual,usually,usuary,usucapt,usure,usurer,usuress,usurp,usurper,usurpor,usury,usward,uswards,ut,uta,utahite,utai,utas,utch,utchy,utees,utensil,uteri,uterine,uterus,utick,utile,utility,utilize,utinam,utmost,utopia,utopian,utopism,utopist,utricle,utricul,utrubi,utrum,utsuk,utter,utterer,utterly,utu,utum,uva,uval,uvalha,uvanite,uvate,uvea,uveal,uveitic,uveitis,uveous,uvic,uvid,uviol,uvitic,uvito,uvrou,uvula,uvulae,uvular,uvver,uxorial,uzan,uzara,uzarin,uzaron,v,vaagmer,vaalite,vacancy,vacant,vacate,vacatur,vaccary,vaccina,vaccine,vache,vacoa,vacona,vacoua,vacouf,vacual,vacuate,vacuefy,vacuist,vacuity,vacuole,vacuome,vacuous,vacuum,vacuuma,vade,vadium,vadose,vady,vag,vagal,vagary,vagas,vage,vagile,vagina,vaginal,vagitus,vagrant,vagrate,vagrom,vague,vaguely,vaguish,vaguity,vagus,vahine,vail,vain,vainful,vainly,vair,vairagi,vaire,vairy,vaivode,vajra,vakass,vakia,vakil,valance,vale,valence,valency,valent,valeral,valeric,valerin,valeryl,valet,valeta,valetry,valeur,valgoid,valgus,valhall,vali,valiant,valid,validly,valine,valise,vall,vallar,vallary,vallate,valley,vallis,vallum,valonia,valor,valse,valsoid,valuate,value,valued,valuer,valuta,valva,valval,valvate,valve,valved,valvula,valvule,valyl,vamfont,vamoose,vamp,vamped,vamper,vampire,van,vanadic,vanadyl,vane,vaned,vanfoss,vang,vangee,vangeli,vanglo,vanilla,vanille,vanish,vanity,vanman,vanmost,vanner,vannet,vansire,vantage,vanward,vapid,vapidly,vapor,vapored,vaporer,vapory,vara,varahan,varan,varanid,vardy,vare,varec,vareuse,vari,variant,variate,varical,varices,varied,varier,variety,variola,variole,various,varisse,varix,varlet,varment,varna,varnish,varsha,varsity,varus,varve,varved,vary,vas,vasa,vasal,vase,vaseful,vaselet,vassal,vast,vastate,vastily,vastity,vastly,vasty,vasu,vat,vatful,vatic,vatman,vatter,vau,vaudy,vault,vaulted,vaulter,vaulty,vaunt,vaunted,vaunter,vaunty,vauxite,vavasor,vaward,veal,vealer,vealy,vection,vectis,vector,vecture,vedana,vedette,vedika,vedro,veduis,vee,veen,veep,veer,veery,vegetal,vegete,vehicle,vei,veigle,veil,veiled,veiler,veiling,veily,vein,veinage,veinal,veined,veiner,veinery,veining,veinlet,veinous,veinule,veiny,vejoces,vela,velal,velamen,velar,velaric,velary,velate,velated,veldman,veldt,velic,veliger,vell,vellala,velleda,vellon,vellum,vellumy,velo,velours,velte,velum,velumen,velure,velvet,velvety,venada,venal,venally,venatic,venator,vencola,vend,vendace,vendee,vender,vending,vendor,vendue,veneer,venene,veneral,venerer,venery,venesia,venger,venial,venie,venin,venison,vennel,venner,venom,venomed,venomer,venomly,venomy,venosal,venose,venous,vent,ventage,ventail,venter,ventil,ventose,ventrad,ventral,ventric,venture,venue,venula,venular,venule,venust,vera,veranda,verb,verbal,verbate,verbena,verbene,verbid,verbify,verbile,verbose,verbous,verby,verchok,verd,verdant,verdea,verdet,verdict,verdin,verdoy,verdun,verdure,verek,verge,vergent,verger,vergery,vergi,verglas,veri,veridic,verify,verily,verine,verism,verist,verite,verity,vermeil,vermian,vermin,verminy,vermis,vermix,vernal,vernant,vernier,vernile,vernin,vernine,verre,verrel,verruca,verruga,versal,versant,versate,verse,versed,verser,verset,versify,versine,version,verso,versor,verst,versta,versual,versus,vert,vertex,vertigo,veruled,vervain,verve,vervel,vervet,very,vesania,vesanic,vesbite,vesicae,vesical,vesicle,veskit,vespal,vesper,vespers,vespery,vespid,vespine,vespoid,vessel,vest,vestal,vestee,vester,vestige,vesting,vestlet,vestral,vestry,vesture,vet,veta,vetanda,vetch,vetchy,veteran,vetiver,veto,vetoer,vetoism,vetoist,vetust,vetusty,veuve,vex,vexable,vexed,vexedly,vexer,vexful,vexil,vext,via,viable,viaduct,viagram,viajaca,vial,vialful,viand,viander,viatic,viatica,viator,vibex,vibgyor,vibix,vibrant,vibrate,vibrato,vibrion,vicar,vicarly,vice,viceroy,vicety,vicilin,vicinal,vicine,vicious,vicoite,victim,victor,victory,victrix,victual,vicuna,viddui,video,vidette,vidonia,vidry,viduage,vidual,viduate,viduine,viduity,viduous,vidya,vie,vielle,vier,viertel,view,viewer,viewly,viewy,vifda,viga,vigia,vigil,vignin,vigonia,vigor,vihara,vihuela,vijao,viking,vila,vilayet,vile,vilely,vilify,vility,vill,villa,village,villain,villar,villate,ville,villein,villoid,villose,villous,villus,vim,vimana,vimen,vimful,viminal,vina,vinage,vinal,vinasse,vinata,vincent,vindex,vine,vinea,vineal,vined,vinegar,vineity,vinelet,viner,vinery,vinic,vinny,vino,vinose,vinous,vint,vinta,vintage,vintem,vintner,vintry,viny,vinyl,vinylic,viol,viola,violal,violate,violent,violer,violet,violety,violin,violina,violine,violist,violon,violone,viper,viperan,viperid,vipery,viqueen,viragin,virago,viral,vire,virelay,viremia,viremic,virent,vireo,virga,virgal,virgate,virgin,virgula,virgule,virial,virid,virific,virify,virile,virl,virole,viroled,viron,virose,virosis,virous,virtu,virtual,virtue,virtued,viruela,virus,vis,visa,visage,visaged,visarga,viscera,viscid,viscin,viscose,viscous,viscus,vise,viseman,visible,visibly,visie,visile,vision,visit,visita,visite,visitee,visiter,visitor,visive,visne,vison,visor,vista,vistaed,vistal,visto,visual,vita,vital,vitalic,vitally,vitals,vitamer,vitamin,vitasti,vitiate,vitium,vitrage,vitrail,vitrain,vitraux,vitreal,vitrean,vitreum,vitric,vitrics,vitrify,vitrine,vitriol,vitrite,vitrous,vitta,vittate,vitular,viuva,viva,vivary,vivax,vive,vively,vivency,viver,vivers,vives,vivid,vividly,vivific,vivify,vixen,vixenly,vizard,vizier,vlei,voar,vocable,vocably,vocal,vocalic,vocally,vocate,vocular,vocule,vodka,voe,voet,voeten,vog,voglite,vogue,voguey,voguish,voice,voiced,voicer,voicing,void,voided,voidee,voider,voiding,voidly,voile,voivode,vol,volable,volage,volant,volar,volata,volatic,volcan,volcano,vole,volency,volent,volery,volet,volley,volost,volt,voltage,voltaic,voltize,voluble,volubly,volume,volumed,volupt,volupty,voluta,volute,voluted,volutin,volva,volvate,volvent,vomer,vomica,vomit,vomiter,vomito,vomitus,voodoo,vorago,vorant,vorhand,vorpal,vortex,vota,votable,votal,votally,votary,vote,voteen,voter,voting,votive,votress,vouch,vouchee,voucher,vouge,vow,vowed,vowel,vowely,vower,vowess,vowless,voyage,voyager,voyance,voyeur,vraic,vrbaite,vriddhi,vrother,vug,vuggy,vulgar,vulgare,vulgate,vulgus,vuln,vulnose,vulpic,vulpine,vulture,vulturn,vulva,vulval,vulvar,vulvate,vum,vying,vyingly,w,wa,waag,waapa,waar,wab,wabber,wabble,wabbly,wabby,wabe,wabeno,wabster,wacago,wace,wachna,wack,wacke,wacken,wacker,wacky,wad,waddent,wadder,wadding,waddler,waddly,waddy,wade,wader,wadi,wading,wadlike,wadmal,wadmeal,wadna,wadset,wae,waeg,waer,waesome,waesuck,wafer,waferer,wafery,waff,waffle,waffly,waft,waftage,wafter,wafture,wafty,wag,wagaun,wage,waged,wagedom,wager,wagerer,wages,waggel,wagger,waggery,waggie,waggish,waggle,waggly,waggy,waglike,wagling,wagon,wagoner,wagonry,wagsome,wagtail,wagwag,wagwit,wah,wahahe,wahine,wahoo,waiata,waif,waik,waikly,wail,wailer,wailful,waily,wain,wainage,wainer,wainful,wainman,waipiro,wairch,waird,wairepo,wairsh,waise,waist,waisted,waister,wait,waiter,waiting,waive,waiver,waivery,waivod,waiwode,wajang,waka,wakan,wake,wakeel,wakeful,waken,wakener,waker,wakes,wakf,wakif,wakiki,waking,wakiup,wakken,wakon,wakonda,waky,walahee,wale,waled,waler,wali,waling,walk,walker,walking,walkist,walkout,walkway,wall,wallaba,wallaby,wallah,walled,waller,wallet,walleye,wallful,walling,wallise,wallman,walloon,wallop,wallow,wally,walnut,walrus,walsh,walt,walter,walth,waltz,waltzer,wamara,wambais,wamble,wambly,wame,wamefou,wamel,wamp,wampee,wample,wampum,wampus,wamus,wan,wand,wander,wandery,wandle,wandoo,wandy,wane,waned,wang,wanga,wangala,wangan,wanghee,wangle,wangler,wanhope,wanhorn,wanigan,waning,wankle,wankly,wanle,wanly,wanner,wanness,wannish,wanny,wanrufe,want,wantage,wanter,wantful,wanting,wanton,wantwit,wanty,wany,wap,wapacut,wapatoo,wapiti,wapp,wapper,wapping,war,warabi,waratah,warble,warbled,warbler,warblet,warbly,warch,ward,wardage,warday,warded,warden,warder,warding,wardite,wardman,ware,warehou,wareman,warf,warfare,warful,warily,warish,warison,wark,warl,warless,warlike,warlock,warluck,warly,warm,warman,warmed,warmer,warmful,warming,warmish,warmly,warmth,warmus,warn,warnel,warner,warning,warnish,warnoth,warnt,warp,warpage,warped,warper,warping,warple,warran,warrand,warrant,warree,warren,warrer,warrin,warrior,warrok,warsaw,warse,warsel,warship,warsle,warsler,warst,wart,warted,wartern,warth,wartime,wartlet,warty,warve,warwolf,warworn,wary,was,wasabi,wase,wasel,wash,washday,washed,washen,washer,washery,washin,washing,washman,washoff,washout,washpot,washrag,washtub,washway,washy,wasnt,wasp,waspen,waspily,waspish,waspy,wassail,wassie,wast,wastage,waste,wasted,wastel,waster,wasting,wastrel,wasty,wat,watap,watch,watched,watcher,water,watered,waterer,waterie,watery,wath,watt,wattage,wattape,wattle,wattled,wattman,wauble,wauch,wauchle,waucht,wauf,waugh,waughy,wauken,waukit,waul,waumle,wauner,wauns,waup,waur,wauve,wavable,wavably,wave,waved,wavelet,waver,waverer,wavery,waveson,wavey,wavicle,wavily,waving,wavy,waw,wawa,wawah,wax,waxbill,waxbird,waxbush,waxen,waxer,waxily,waxing,waxlike,waxman,waxweed,waxwing,waxwork,waxy,way,wayaka,wayang,wayback,waybill,waybird,waybook,waybung,wayfare,waygang,waygate,waygone,waying,waylaid,waylay,wayless,wayman,waymark,waymate,waypost,ways,wayside,wayward,waywode,wayworn,waywort,we,weak,weaken,weakish,weakly,weaky,weal,weald,wealth,wealthy,weam,wean,weanel,weaner,weanyer,weapon,wear,wearer,wearied,wearier,wearily,wearing,wearish,weary,weasand,weasel,weaser,weason,weather,weave,weaved,weaver,weaving,weazen,weazeny,web,webbed,webber,webbing,webby,weber,webeye,webfoot,webless,weblike,webster,webwork,webworm,wecht,wed,wedana,wedbed,wedded,wedder,wedding,wede,wedge,wedged,wedger,wedging,wedgy,wedlock,wedset,wee,weeble,weed,weeda,weedage,weeded,weeder,weedery,weedful,weedish,weedow,weedy,week,weekday,weekend,weekly,weekwam,weel,weemen,ween,weeness,weening,weenong,weeny,weep,weeper,weepful,weeping,weeps,weepy,weesh,weeshy,weet,weever,weevil,weevily,weewow,weeze,weft,weftage,wefted,wefty,weigh,weighed,weigher,weighin,weight,weighty,weir,weird,weirdly,weiring,weism,wejack,weka,wekau,wekeen,weki,welcome,weld,welder,welding,weldor,welfare,welk,welkin,well,wellat,welling,wellish,wellman,welly,wels,welsh,welsher,welsium,welt,welted,welter,welting,wem,wemless,wen,wench,wencher,wend,wende,wene,wennish,wenny,went,wenzel,wept,wer,were,werefox,werent,werf,wergil,weri,wert,wervel,wese,weskit,west,weste,wester,western,westing,westy,wet,weta,wetback,wetbird,wetched,wetchet,wether,wetly,wetness,wetted,wetter,wetting,wettish,weve,wevet,wey,wha,whabby,whack,whacker,whacky,whale,whaler,whalery,whaling,whalish,whally,whalm,whalp,whaly,wham,whamble,whame,whammle,whamp,whampee,whample,whan,whand,whang,whangam,whangee,whank,whap,whappet,whapuka,whapuku,whar,whare,whareer,wharf,wharl,wharp,wharry,whart,wharve,whase,whasle,what,whata,whatkin,whatna,whatnot,whats,whatso,whatten,whau,whauk,whaup,whaur,whauve,wheal,whealy,wheam,wheat,wheaten,wheaty,whedder,whee,wheedle,wheel,wheeled,wheeler,wheely,wheem,wheen,wheenge,wheep,wheeple,wheer,wheesht,wheetle,wheeze,wheezer,wheezle,wheezy,wheft,whein,whekau,wheki,whelk,whelked,whelker,whelky,whelm,whelp,whelve,whemmel,when,whenas,whence,wheneer,whenso,where,whereas,whereat,whereby,whereer,wherein,whereof,whereon,whereso,whereto,whereup,wherret,wherrit,wherry,whet,whether,whetile,whetter,whew,whewer,whewl,whewt,whey,wheyey,wheyish,whiba,which,whick,whicken,whicker,whid,whidah,whidder,whiff,whiffer,whiffet,whiffle,whiffy,whift,whig,while,whileen,whilere,whiles,whilie,whilk,whill,whilly,whilock,whilom,whils,whilst,whilter,whim,whimble,whimmy,whimper,whimsey,whimsic,whin,whincow,whindle,whine,whiner,whing,whinge,whinger,whinnel,whinner,whinny,whiny,whip,whipcat,whipman,whippa,whipped,whipper,whippet,whippy,whipsaw,whipt,whir,whirken,whirl,whirled,whirler,whirley,whirly,whirret,whirrey,whirroo,whirry,whirtle,whish,whisk,whisker,whiskey,whisky,whisp,whisper,whissle,whist,whister,whistle,whistly,whit,white,whited,whitely,whiten,whites,whither,whiting,whitish,whitlow,whits,whittaw,whitten,whitter,whittle,whity,whiz,whizgig,whizzer,whizzle,who,whoa,whoever,whole,wholly,whom,whomble,whomso,whone,whoo,whoof,whoop,whoopee,whooper,whoops,whoosh,whop,whopper,whorage,whore,whorish,whorl,whorled,whorly,whort,whortle,whose,whosen,whud,whuff,whuffle,whulk,whulter,whummle,whun,whup,whush,whuskie,whussle,whute,whuther,whutter,whuz,why,whyever,whyfor,whyness,whyo,wi,wice,wicht,wichtje,wick,wicked,wicken,wicker,wicket,wicking,wickiup,wickup,wicky,wicopy,wid,widbin,widder,widdle,widdy,wide,widegab,widely,widen,widener,widgeon,widish,widow,widowed,widower,widowly,widowy,width,widu,wield,wielder,wieldy,wiener,wienie,wife,wifedom,wifeism,wifekin,wifelet,wifely,wifie,wifish,wifock,wig,wigan,wigdom,wigful,wigged,wiggen,wigger,wiggery,wigging,wiggish,wiggism,wiggle,wiggler,wiggly,wiggy,wight,wightly,wigless,wiglet,wiglike,wigtail,wigwag,wigwam,wiikite,wild,wildcat,wilded,wilder,wilding,wildish,wildly,wile,wileful,wilga,wilgers,wilily,wilk,wilkin,will,willawa,willed,willer,willet,willey,willful,willie,willier,willies,willing,willock,willow,willowy,willy,willyer,wilsome,wilt,wilter,wily,wim,wimble,wimbrel,wime,wimick,wimple,win,wince,wincer,wincey,winch,wincher,wincing,wind,windage,windbag,winddog,winded,winder,windigo,windily,winding,windle,windles,windlin,windock,windore,window,windowy,windrow,windup,windway,windy,wine,wined,winemay,winepot,winer,winery,winesop,winevat,winful,wing,wingcut,winged,winger,wingle,winglet,wingman,wingy,winish,wink,winkel,winker,winking,winkle,winklet,winly,winna,winnard,winnel,winner,winning,winnle,winnow,winrace,winrow,winsome,wint,winter,wintle,wintry,winy,winze,wipe,wiper,wippen,wips,wir,wirable,wirble,wird,wire,wirebar,wired,wireman,wirer,wireway,wirily,wiring,wirl,wirling,wirr,wirra,wirrah,wiry,wis,wisdom,wise,wisely,wiseman,wisen,wisent,wiser,wish,wisha,wished,wisher,wishful,wishing,wishly,wishmay,wisht,wisket,wisp,wispish,wispy,wiss,wisse,wissel,wist,wiste,wistful,wistit,wistiti,wit,witan,witch,witched,witchen,witchet,witchy,wite,witess,witful,with,withal,withe,withen,wither,withers,withery,within,without,withy,witjar,witless,witlet,witling,witloof,witness,witney,witship,wittal,witted,witter,wittily,witting,wittol,witty,witwall,wive,wiver,wivern,wiz,wizard,wizen,wizened,wizier,wizzen,wloka,wo,woad,woader,woadman,woady,woak,woald,woan,wob,wobble,wobbler,wobbly,wobster,wod,woddie,wode,wodge,wodgy,woe,woeful,woesome,woevine,woeworn,woffler,woft,wog,wogiet,woibe,wokas,woke,wokowi,wold,woldy,wolf,wolfdom,wolfen,wolfer,wolfish,wolfkin,wolfram,wollop,wolter,wolve,wolver,woman,womanly,womb,wombat,wombed,womble,womby,womera,won,wonder,wone,wonegan,wong,wonga,wongen,wongshy,wongsky,woning,wonky,wonna,wonned,wonner,wonning,wonnot,wont,wonted,wonting,woo,wooable,wood,woodbin,woodcut,wooded,wooden,woodeny,woodine,wooding,woodish,woodlet,woodly,woodman,woodrow,woodsy,woodwax,woody,wooer,woof,woofed,woofell,woofer,woofy,woohoo,wooing,wool,woold,woolder,wooled,woolen,wooler,woolert,woolly,woolman,woolsey,woom,woomer,woon,woons,woorali,woorari,woosh,wootz,woozle,woozy,wop,woppish,wops,worble,word,wordage,worded,worder,wordily,wording,wordish,wordle,wordman,wordy,wore,work,workbag,workbox,workday,worked,worker,working,workman,workout,workpan,works,worky,world,worlded,worldly,worldy,worm,wormed,wormer,wormil,worming,wormy,worn,wornil,worral,worried,worrier,worrit,worry,worse,worsen,worser,worset,worship,worst,worsted,wort,worth,worthy,wosbird,wot,wote,wots,wottest,wotteth,woubit,wouch,wouf,wough,would,wouldnt,wouldst,wound,wounded,wounder,wounds,woundy,wourali,wourari,wournil,wove,woven,wow,wowser,wowsery,wowt,woy,wrack,wracker,wraggle,wraith,wraithe,wraithy,wraitly,wramp,wran,wrang,wrangle,wranny,wrap,wrapped,wrapper,wrasse,wrastle,wrath,wrathy,wraw,wrawl,wrawler,wraxle,wreak,wreat,wreath,wreathe,wreathy,wreck,wrecker,wrecky,wren,wrench,wrenlet,wrest,wrester,wrestle,wretch,wricht,wrick,wride,wried,wrier,wriest,wrig,wriggle,wriggly,wright,wring,wringer,wrinkle,wrinkly,wrist,wristed,wrister,writ,write,writee,writer,writh,writhe,writhed,writhen,writher,writhy,writing,written,writter,wrive,wro,wrocht,wroke,wroken,wrong,wronged,wronger,wrongly,wrossle,wrote,wroth,wrothly,wrothy,wrought,wrox,wrung,wry,wrybill,wryly,wryneck,wryness,wrytail,wud,wuddie,wudge,wudu,wugg,wulk,wull,wullcat,wulliwa,wumble,wumman,wummel,wun,wungee,wunna,wunner,wunsome,wup,wur,wurley,wurmal,wurrus,wurset,wurzel,wush,wusp,wuss,wusser,wust,wut,wuther,wuzu,wuzzer,wuzzle,wuzzy,wy,wyde,wye,wyke,wyle,wymote,wyn,wynd,wyne,wynn,wype,wyson,wyss,wyve,wyver,x,xanthic,xanthin,xanthyl,xarque,xebec,xenia,xenial,xenian,xenium,xenon,xenyl,xerafin,xerarch,xerasia,xeric,xeriff,xerogel,xeroma,xeronic,xerosis,xerotes,xerotic,xi,xiphias,xiphiid,xiphoid,xoana,xoanon,xurel,xyla,xylan,xylate,xylem,xylene,xylenol,xylenyl,xyletic,xylic,xylidic,xylinid,xylite,xylitol,xylogen,xyloid,xylol,xyloma,xylon,xylonic,xylose,xyloyl,xylyl,xylylic,xyphoid,xyrid,xyst,xyster,xysti,xystos,xystum,xystus,y,ya,yaba,yabber,yabbi,yabble,yabby,yabu,yacal,yacca,yachan,yacht,yachter,yachty,yad,yade,yaff,yaffle,yagger,yagi,yagua,yaguaza,yah,yahan,yahoo,yair,yaird,yaje,yajeine,yak,yakalo,yakamik,yakin,yakka,yakman,yalb,yale,yali,yalla,yallaer,yallow,yam,yamamai,yamanai,yamen,yamilke,yammer,yamp,yampa,yamph,yamshik,yan,yander,yang,yangtao,yank,yanking,yanky,yaoort,yaourti,yap,yapa,yaply,yapness,yapok,yapp,yapped,yapper,yapping,yappish,yappy,yapster,yar,yarak,yaray,yarb,yard,yardage,yardang,yardarm,yarder,yardful,yarding,yardman,yare,yareta,yark,yarke,yarl,yarly,yarm,yarn,yarnen,yarner,yarpha,yarr,yarran,yarrow,yarth,yarthen,yarwhip,yas,yashiro,yashmak,yat,yate,yati,yatter,yaud,yauld,yaupon,yautia,yava,yaw,yawl,yawler,yawn,yawner,yawney,yawnful,yawnily,yawning,yawnups,yawny,yawp,yawper,yawroot,yaws,yawweed,yawy,yaxche,yaya,ycie,yday,ye,yea,yeah,yealing,yean,year,yeara,yeard,yearday,yearful,yearly,yearn,yearock,yearth,yeast,yeasty,yeat,yeather,yed,yede,yee,yeel,yees,yegg,yeggman,yeguita,yeld,yeldrin,yelk,yell,yeller,yelling,yelloch,yellow,yellows,yellowy,yelm,yelmer,yelp,yelper,yelt,yen,yender,yeni,yenite,yeo,yeoman,yep,yer,yerb,yerba,yercum,yerd,yere,yerga,yerk,yern,yerth,yes,yese,yeso,yesso,yest,yester,yestern,yesty,yet,yeta,yetapa,yeth,yether,yetlin,yeuk,yeuky,yeven,yew,yex,yez,yezzy,ygapo,yield,yielden,yielder,yieldy,yigh,yill,yilt,yin,yince,yinst,yip,yird,yirk,yirm,yirn,yirr,yirth,yis,yite,ym,yn,ynambu,yo,yobi,yocco,yochel,yock,yockel,yodel,yodeler,yodh,yoe,yoga,yogh,yoghurt,yogi,yogin,yogism,yogist,yogoite,yohimbe,yohimbi,yoi,yoick,yoicks,yojan,yojana,yok,yoke,yokeage,yokel,yokelry,yoker,yoking,yoky,yolden,yolk,yolked,yolky,yom,yomer,yon,yond,yonder,yonner,yonside,yont,yook,yoop,yor,yore,york,yorker,yot,yote,you,youd,youden,youdith,youff,youl,young,younger,youngly,youngun,younker,youp,your,yourn,yours,yoursel,youse,youth,youthen,youthy,youve,youward,youze,yoven,yow,yowie,yowl,yowler,yowley,yowt,yox,yoy,yperite,yr,yttria,yttric,yttrium,yuan,yuca,yucca,yuck,yuckel,yucker,yuckle,yucky,yuft,yugada,yuh,yukkel,yulan,yule,yummy,yungan,yurt,yurta,yus,yusdrum,yutu,yuzlik,yuzluk,z,za,zabeta,zabra,zabti,zabtie,zac,zacate,zacaton,zachun,zad,zadruga,zaffar,zaffer,zafree,zag,zagged,zain,zak,zakkeu,zaman,zamang,zamarra,zamarro,zambo,zamorin,zamouse,zander,zanella,zant,zante,zany,zanyish,zanyism,zanze,zapas,zaphara,zapota,zaptiah,zaptieh,zapupe,zaqqum,zar,zareba,zarf,zarnich,zarp,zat,zati,zattare,zax,zayat,zayin,zeal,zealful,zealot,zealous,zebra,zebraic,zebrass,zebrine,zebroid,zebrula,zebrule,zebu,zebub,zeburro,zechin,zed,zedoary,zee,zeed,zehner,zein,zeism,zeist,zel,zelator,zemeism,zemi,zemmi,zemni,zemstvo,zenana,zendik,zenick,zenith,zenu,zeolite,zephyr,zephyry,zequin,zer,zerda,zero,zeroize,zest,zestful,zesty,zeta,zetetic,zeugma,ziamet,ziara,ziarat,zibet,zibetum,ziega,zieger,ziffs,zig,ziganka,zigzag,zihar,zikurat,zillah,zimarra,zimb,zimbi,zimme,zimmi,zimmis,zimocca,zinc,zincate,zincic,zincide,zincify,zincing,zincite,zincize,zincke,zincky,zinco,zincous,zincum,zing,zingel,zink,zinsang,zip,ziphian,zipper,zipping,zippy,zira,zirai,zircite,zircon,zither,zizz,zloty,zo,zoa,zoacum,zoaria,zoarial,zoarium,zobo,zocco,zoccolo,zodiac,zoea,zoeal,zoeform,zoetic,zogan,zogo,zoic,zoid,zoisite,zoism,zoist,zoistic,zokor,zoll,zolle,zombi,zombie,zonal,zonally,zonar,zonary,zonate,zonated,zone,zoned,zonelet,zonic,zoning,zonite,zonitid,zonoid,zonular,zonule,zonulet,zonure,zonurid,zoo,zoocarp,zoocyst,zooecia,zoogamy,zoogene,zoogeny,zoogony,zooid,zooidal,zooks,zoolite,zoolith,zoology,zoom,zoon,zoonal,zoonic,zoonist,zoonite,zoonomy,zoons,zoonule,zoopery,zoopsia,zoosis,zootaxy,zooter,zootic,zootomy,zootype,zoozoo,zorgite,zoril,zorilla,zorillo,zorro,zoster,zounds,zowie,zudda,zuisin,zumatic,zunyite,zuza,zwitter,zyga,zygal,zygion,zygite,zygoma,zygon,zygose,zygosis,zygote,zygotic,zygous,zymase,zyme,zymic,zymin,zymite,zymogen,zymoid,zymome,zymomin,zymosis,zymotic,zymurgy,zythem,zythum diff --git a/app/src/main/java/cy/agorise/graphenej/crypto/AndroidRandomSource.java b/app/src/main/java/cy/agorise/graphenej/crypto/AndroidRandomSource.java deleted file mode 100644 index d98486b..0000000 --- a/app/src/main/java/cy/agorise/graphenej/crypto/AndroidRandomSource.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2013, 2014 Megion Research and Development GmbH - * - * Licensed under the Microsoft Reference Source License (MS-RSL) - * - * This license governs use of the accompanying software. If you use the software, you accept this license. - * If you do not accept the license, do not use the software. - * - * 1. Definitions - * The terms "reproduce," "reproduction," and "distribution" have the same meaning here as under U.S. copyright law. - * "You" means the licensee of the software. - * "Your company" means the company you worked for when you downloaded the software. - * "Reference use" means use of the software within your company as a reference, in read only form, for the sole purposes - * of debugging your products, maintaining your products, or enhancing the interoperability of your products with the - * software, and specifically excludes the right to distribute the software outside of your company. - * "Licensed patents" means any Licensor patent claims which read directly on the software as distributed by the Licensor - * under this license. - * - * 2. Grant of Rights - * (A) Copyright Grant- Subject to the terms of this license, the Licensor grants you a non-transferable, non-exclusive, - * worldwide, royalty-free copyright license to reproduce the software for reference use. - * (B) Patent Grant- Subject to the terms of this license, the Licensor grants you a non-transferable, non-exclusive, - * worldwide, royalty-free patent license under licensed patents for reference use. - * - * 3. Limitations - * (A) No Trademark License- This license does not grant you any rights to use the Licensor’s name, logo, or trademarks. - * (B) If you begin patent litigation against the Licensor over patents that you think may apply to the software - * (including a cross-claim or counterclaim in a lawsuit), your license to the software ends automatically. - * (C) The software is licensed "as-is." You bear the risk of using it. The Licensor gives no express warranties, - * guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot - * change. To the extent permitted under your local laws, the Licensor excludes the implied warranties of merchantability, - * fitness for a particular purpose and non-infringement. - */ - -package cy.agorise.graphenej.crypto; - -import java.io.DataInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.nio.ByteBuffer; - - -public class AndroidRandomSource implements RandomSource, EntropySource { - - @Override - public synchronized void nextBytes(byte[] bytes) { - // On Android we use /dev/urandom for providing random data - File file = new File("/dev/urandom"); - if (!file.exists()) { - throw new RuntimeException("Unable to generate random bytes on this Android device"); - } - try { - FileInputStream stream = new FileInputStream(file); - DataInputStream dis = new DataInputStream(stream); - dis.readFully(bytes); - dis.close(); - } catch (IOException e) { - throw new RuntimeException("Unable to generate random bytes on this Android device", e); - } - } - - @Override - public ByteBuffer provideEntropy() { - byte[] buffer = new byte[ 256 / 8]; - nextBytes(buffer); - ByteBuffer byteBuffer = ByteBuffer.allocate(buffer.length); - byteBuffer.put(buffer, 0, buffer.length); - return byteBuffer; - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/crypto/EntropySource.java b/app/src/main/java/cy/agorise/graphenej/crypto/EntropySource.java deleted file mode 100644 index 04d4d18..0000000 --- a/app/src/main/java/cy/agorise/graphenej/crypto/EntropySource.java +++ /dev/null @@ -1,19 +0,0 @@ -package cy.agorise.graphenej.crypto; - -import java.nio.ByteBuffer; - -/** - * A simple interface that can be used to retrieve entropy from any source. - * - * @author owlstead - */ -public interface EntropySource { - /** - * Retrieves the entropy. - * The position of the ByteBuffer must be advanced to the limit by any users calling this method. - * The values of the bytes between the position and limit should be set to zero by any users calling this method. - * - * @return entropy within the position and limit of the given buffer - */ - ByteBuffer provideEntropy(); -} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/graphenej/crypto/RandomSource.java b/app/src/main/java/cy/agorise/graphenej/crypto/RandomSource.java deleted file mode 100644 index 117714d..0000000 --- a/app/src/main/java/cy/agorise/graphenej/crypto/RandomSource.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2013, 2014 Megion Research & Development GmbH - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package cy.agorise.graphenej.crypto; - -public interface RandomSource { - /** - * Generates a user specified number of random bytes - * - * @param bytes - * The array to fill with random bytes - */ - void nextBytes(byte[] bytes); -} diff --git a/app/src/main/java/cy/agorise/graphenej/crypto/SecureRandomGenerator.java b/app/src/main/java/cy/agorise/graphenej/crypto/SecureRandomGenerator.java deleted file mode 100644 index 6cbb960..0000000 --- a/app/src/main/java/cy/agorise/graphenej/crypto/SecureRandomGenerator.java +++ /dev/null @@ -1,15 +0,0 @@ -package cy.agorise.graphenej.crypto; - -import java.security.SecureRandom; - -/** - * Created by nelson on 12/20/16. - */ -public class SecureRandomGenerator { - - public static SecureRandom getSecureRandom(){ - SecureRandomStrengthener randomStrengthener = SecureRandomStrengthener.getInstance(); -// randomStrengthener.addEntropySource(new AndroidRandomSource()); - return randomStrengthener.generateAndSeedRandomNumberGenerator(); - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/crypto/SecureRandomStrengthener.java b/app/src/main/java/cy/agorise/graphenej/crypto/SecureRandomStrengthener.java deleted file mode 100644 index e35d2ff..0000000 --- a/app/src/main/java/cy/agorise/graphenej/crypto/SecureRandomStrengthener.java +++ /dev/null @@ -1,162 +0,0 @@ -package cy.agorise.graphenej.crypto; - -import java.nio.ByteBuffer; -import java.security.DigestException; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.security.SecureRandom; -import java.util.LinkedList; -import java.util.List; - -/** - * A strengthener that can be used to generate and re-seed random number - * generators that do not seed themselves appropriately. - * - * @author owlstead - */ -public class SecureRandomStrengthener { - private static final String DEFAULT_PSEUDO_RANDOM_NUMBER_GENERATOR = "SHA1PRNG"; - - private static final EntropySource mTimeEntropySource = new EntropySource() { - - final ByteBuffer timeBuffer = ByteBuffer.allocate(Long.SIZE / Byte.SIZE - * 2); - - @Override - public ByteBuffer provideEntropy() { - this.timeBuffer.clear(); - this.timeBuffer.putLong(System.currentTimeMillis()); - this.timeBuffer.putLong(System.nanoTime()); - this.timeBuffer.flip(); - return this.timeBuffer; - } - }; - - private final String algorithm; - private final List entropySources = new LinkedList(); - private final MessageDigest digest; - private final ByteBuffer seedBuffer; - - /** - * Generates an instance of a {@link SecureRandomStrengthener} that - * generates and re-seeds instances of {@code "SHA1PRNG"}. - * - * @return the strengthener, never null - */ - public static SecureRandomStrengthener getInstance() { - return new SecureRandomStrengthener( - DEFAULT_PSEUDO_RANDOM_NUMBER_GENERATOR); - } - - /** - * Generates an instance of a {@link SecureRandomStrengthener} that - * generates instances of the given argument. Note that the availability of - * the given algorithm arguments in not tested until generation. - * - * @param algorithm - * the algorithm indicating the {@link SecureRandom} instance to - * use - * @return the strengthener, never null - */ - public static SecureRandomStrengthener getInstance(final String algorithm) { - return new SecureRandomStrengthener(algorithm); - } - - private SecureRandomStrengthener(final String algorithm) { - if (algorithm == null || algorithm.length() == 0) { - throw new IllegalArgumentException( - "Please provide a PRNG algorithm string such as SHA1PRNG"); - } - - this.algorithm = algorithm; - try { - this.digest = MessageDigest.getInstance("SHA1"); - } catch (final NoSuchAlgorithmException e) { - throw new IllegalStateException( - "MessageDigest to create seed not available", e); - } - this.seedBuffer = ByteBuffer.allocate(this.digest.getDigestLength()); - } - - /** - * Add an entropy source, which will be called for each generation and - * re-seeding of the given random number generator. - * - * @param source - * the source of entropy - */ - public void addEntropySource(final EntropySource source) { - if (source == null) { - throw new IllegalArgumentException( - "EntropySource should not be null"); - } - this.entropySources.add(source); - } - - /** - * Generates and seeds a random number generator of the configured - * algorithm. Calls the {@link EntropySource#provideEntropy()} method of all - * added sources of entropy. - * - * @return the random number generator - */ - public SecureRandom generateAndSeedRandomNumberGenerator() { - final SecureRandom secureRandom; - try { - secureRandom = SecureRandom.getInstance(this.algorithm); - } catch (final NoSuchAlgorithmException e) { - throw new IllegalStateException("PRNG is not available", e); - } - - reseed(secureRandom); - return secureRandom; - } - - /** - * Re-seeds the random number generator. Calls the - * {@link EntropySource#provideEntropy()} method of all added sources of - * entropy. - * - * @param secureRandom - * the random number generator to re-seed - */ - public void reseed(final SecureRandom secureRandom) { - this.seedBuffer.clear(); - secureRandom.nextBytes(this.seedBuffer.array()); - - for (final EntropySource source : this.entropySources) { - final ByteBuffer entropy = source.provideEntropy(); - if (entropy == null) { - continue; - } - - final ByteBuffer wipeBuffer = entropy.duplicate(); - this.digest.update(entropy); - wipe(wipeBuffer); - } - - this.digest.update(mTimeEntropySource.provideEntropy()); - this.digest.update(this.seedBuffer); - this.seedBuffer.clear(); - // remove data from seedBuffer so it won't be retrievable - - // reuse - - try { - this.digest.digest(this.seedBuffer.array(), 0, - this.seedBuffer.capacity()); - } catch (final DigestException e) { - throw new IllegalStateException( - "DigestException should not be thrown", e); - } - secureRandom.setSeed(this.seedBuffer.array()); - - wipe(this.seedBuffer); - } - - private void wipe(final ByteBuffer buf) { - while (buf.hasRemaining()) { - buf.put((byte) 0); - } - } -} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/graphenej/errors/ChecksumException.java b/app/src/main/java/cy/agorise/graphenej/errors/ChecksumException.java deleted file mode 100644 index 84805d3..0000000 --- a/app/src/main/java/cy/agorise/graphenej/errors/ChecksumException.java +++ /dev/null @@ -1,10 +0,0 @@ -package cy.agorise.graphenej.errors; - -/** - * Created by nelson on 12/20/16. - */ -public class ChecksumException extends Exception { - public ChecksumException(String message){ - super(message); - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/errors/IncompatibleOperation.java b/app/src/main/java/cy/agorise/graphenej/errors/IncompatibleOperation.java deleted file mode 100644 index 410c79a..0000000 --- a/app/src/main/java/cy/agorise/graphenej/errors/IncompatibleOperation.java +++ /dev/null @@ -1,11 +0,0 @@ -package cy.agorise.graphenej.errors; - -/** - * Created by nelson on 1/18/17. - */ -public class IncompatibleOperation extends RuntimeException { - - public IncompatibleOperation(String message){ - super(message); - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/errors/IncompleteAssetError.java b/app/src/main/java/cy/agorise/graphenej/errors/IncompleteAssetError.java deleted file mode 100644 index 1bbee6a..0000000 --- a/app/src/main/java/cy/agorise/graphenej/errors/IncompleteAssetError.java +++ /dev/null @@ -1,15 +0,0 @@ -package cy.agorise.graphenej.errors; - -/** - * Created by nelson on 12/25/16. - */ -public class IncompleteAssetError extends RuntimeException{ - - public IncompleteAssetError(String message){ - super(message); - } - - public IncompleteAssetError(){ - super("The asset used in this method is probably incomplete, Assets instances can be created with just its id information but this context requires more information"); - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/errors/MalformedAddressException.java b/app/src/main/java/cy/agorise/graphenej/errors/MalformedAddressException.java deleted file mode 100644 index 91c25b8..0000000 --- a/app/src/main/java/cy/agorise/graphenej/errors/MalformedAddressException.java +++ /dev/null @@ -1,10 +0,0 @@ -package cy.agorise.graphenej.errors; - -/** - * Created by nelson on 12/1/16. - */ -public class MalformedAddressException extends Exception { - public MalformedAddressException(String message){ - super(message); - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/errors/MalformedOperationException.java b/app/src/main/java/cy/agorise/graphenej/errors/MalformedOperationException.java deleted file mode 100644 index f6b95b4..0000000 --- a/app/src/main/java/cy/agorise/graphenej/errors/MalformedOperationException.java +++ /dev/null @@ -1,11 +0,0 @@ -package cy.agorise.graphenej.errors; - -/** - * Created by nelson on 3/1/17. - */ -public class MalformedOperationException extends RuntimeException { - - public MalformedOperationException(String msg){ - super(msg); - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/errors/MalformedTransactionException.java b/app/src/main/java/cy/agorise/graphenej/errors/MalformedTransactionException.java deleted file mode 100644 index 22b1d39..0000000 --- a/app/src/main/java/cy/agorise/graphenej/errors/MalformedTransactionException.java +++ /dev/null @@ -1,11 +0,0 @@ -package cy.agorise.graphenej.errors; - -/** - * Created by nelson on 11/14/16. - */ -public class MalformedTransactionException extends Exception { - - public MalformedTransactionException(String message){ - super(message); - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/errors/RepeatedRequestIdException.java b/app/src/main/java/cy/agorise/graphenej/errors/RepeatedRequestIdException.java deleted file mode 100644 index 587095c..0000000 --- a/app/src/main/java/cy/agorise/graphenej/errors/RepeatedRequestIdException.java +++ /dev/null @@ -1,12 +0,0 @@ -package cy.agorise.graphenej.errors; - -/** - * Created by nelson on 6/27/17. - */ - -public class RepeatedRequestIdException extends Exception { - - public RepeatedRequestIdException(String message){ - super(message); - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/interfaces/ByteSerializable.java b/app/src/main/java/cy/agorise/graphenej/interfaces/ByteSerializable.java deleted file mode 100644 index 7043f20..0000000 --- a/app/src/main/java/cy/agorise/graphenej/interfaces/ByteSerializable.java +++ /dev/null @@ -1,9 +0,0 @@ -package cy.agorise.graphenej.interfaces; - -/** - * Interface implemented by all entities for which makes sense to have a byte-array representation. - */ -public interface ByteSerializable { - - byte[] toBytes(); -} diff --git a/app/src/main/java/cy/agorise/graphenej/interfaces/GrapheneSerializable.java b/app/src/main/java/cy/agorise/graphenej/interfaces/GrapheneSerializable.java deleted file mode 100644 index f7e6d20..0000000 --- a/app/src/main/java/cy/agorise/graphenej/interfaces/GrapheneSerializable.java +++ /dev/null @@ -1,7 +0,0 @@ -package cy.agorise.graphenej.interfaces; - -/** - * Interface used to group both ByteSerializable and JsonSerializable interfaces. - */ -public interface GrapheneSerializable extends ByteSerializable, JsonSerializable { -} diff --git a/app/src/main/java/cy/agorise/graphenej/interfaces/JsonSerializable.java b/app/src/main/java/cy/agorise/graphenej/interfaces/JsonSerializable.java deleted file mode 100644 index bb52407..0000000 --- a/app/src/main/java/cy/agorise/graphenej/interfaces/JsonSerializable.java +++ /dev/null @@ -1,16 +0,0 @@ -package cy.agorise.graphenej.interfaces; - -import com.google.gson.JsonElement; - -import java.io.Serializable; - -/** - * Interface to be implemented by any entity for which makes sense to - * have a JSON-formatted string and object representation. - */ -public interface JsonSerializable extends Serializable { - - String toJsonString(); - - JsonElement toJsonObject(); -} diff --git a/app/src/main/java/cy/agorise/graphenej/interfaces/NodeErrorListener.java b/app/src/main/java/cy/agorise/graphenej/interfaces/NodeErrorListener.java deleted file mode 100644 index f1afe60..0000000 --- a/app/src/main/java/cy/agorise/graphenej/interfaces/NodeErrorListener.java +++ /dev/null @@ -1,10 +0,0 @@ -package cy.agorise.graphenej.interfaces; - -import cy.agorise.graphenej.models.BaseResponse; - -/** - * Interface to be implemented by any listener to network errors. - */ -public interface NodeErrorListener { - void onError(BaseResponse.Error error); -} diff --git a/app/src/main/java/cy/agorise/graphenej/interfaces/SubscriptionHub.java b/app/src/main/java/cy/agorise/graphenej/interfaces/SubscriptionHub.java deleted file mode 100644 index 22c634f..0000000 --- a/app/src/main/java/cy/agorise/graphenej/interfaces/SubscriptionHub.java +++ /dev/null @@ -1,30 +0,0 @@ -package cy.agorise.graphenej.interfaces; - -import java.util.List; - -/** - * Interface to be implemented by any class that hosts a SubscriptionResponseDeserializer and wants to - * expose an interface for its management of its listeners. - * - * Created by nelson on 1/30/17. - */ -public interface SubscriptionHub { - - /** - * Adds a given listener to the list of subscription listeners. - * @param listener: The SubscriptionListener to add. - */ - void addSubscriptionListener(SubscriptionListener listener); - - /** - * Removes a given listener from the list. - * @param listener: The SubscriptionListener to remove. - */ - void removeSubscriptionListener(SubscriptionListener listener); - - /** - * Retrieves a list of all subscription listeners. - * @return - */ - List getSubscriptionListeners(); -} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/graphenej/interfaces/SubscriptionListener.java b/app/src/main/java/cy/agorise/graphenej/interfaces/SubscriptionListener.java deleted file mode 100644 index 3bd3f76..0000000 --- a/app/src/main/java/cy/agorise/graphenej/interfaces/SubscriptionListener.java +++ /dev/null @@ -1,30 +0,0 @@ -package cy.agorise.graphenej.interfaces; - -import cy.agorise.graphenej.ObjectType; -import cy.agorise.graphenej.models.SubscriptionResponse; - -/** - * Generic interface that must be implemented by any class that wants to be informed about a specific - * event notification. - * - * Created by nelson on 1/26/17. - */ -public interface SubscriptionListener { - - /** - * Every subscription listener must implement a method that returns the type of object it is - * interested in. - * @return: Instance of the ObjectType enum class. - */ - ObjectType getInterestObjectType(); - - - /** - * Method called whenever there is an update that might be of interest for this listener. - * Note however that the objects returned inside the SubscriptionResponse are not guaranteed to be - * only of the object type requested by this class in the getInterestObjectType. - * - * @param response: SubscriptionResponse instance, which may or may not contain an object of interest. - */ - void onSubscriptionUpdate(SubscriptionResponse response); -} diff --git a/app/src/main/java/cy/agorise/graphenej/interfaces/WitnessResponseListener.java b/app/src/main/java/cy/agorise/graphenej/interfaces/WitnessResponseListener.java deleted file mode 100644 index 28f1eca..0000000 --- a/app/src/main/java/cy/agorise/graphenej/interfaces/WitnessResponseListener.java +++ /dev/null @@ -1,14 +0,0 @@ -package cy.agorise.graphenej.interfaces; - -import cy.agorise.graphenej.models.BaseResponse; -import cy.agorise.graphenej.models.WitnessResponse; - -/** - * Class used to represent any listener to network requests. - */ -public interface WitnessResponseListener { - - void onSuccess(WitnessResponse response); - - void onError(BaseResponse.Error error); -} diff --git a/app/src/main/java/cy/agorise/graphenej/models/AccountBalanceUpdate.java b/app/src/main/java/cy/agorise/graphenej/models/AccountBalanceUpdate.java deleted file mode 100644 index d155ea7..0000000 --- a/app/src/main/java/cy/agorise/graphenej/models/AccountBalanceUpdate.java +++ /dev/null @@ -1,23 +0,0 @@ -package cy.agorise.graphenej.models; - -import java.io.Serializable; - -import cy.agorise.graphenej.GrapheneObject; - -/** - * Created by nelson on 1/12/17. - */ - -public class AccountBalanceUpdate extends GrapheneObject implements Serializable { - public static final String KEY_OWNER = "owner"; - public static final String KEY_ASSET_TYPE = "asset_type"; - public static final String KEY_BALANCE = "balance"; - - public String owner; - public String asset_type; - public long balance; - - public AccountBalanceUpdate(String id) { - super(id); - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/models/AccountProperties.java b/app/src/main/java/cy/agorise/graphenej/models/AccountProperties.java deleted file mode 100644 index 1a4a84f..0000000 --- a/app/src/main/java/cy/agorise/graphenej/models/AccountProperties.java +++ /dev/null @@ -1,30 +0,0 @@ -package cy.agorise.graphenej.models; - -import cy.agorise.graphenej.AccountOptions; -import cy.agorise.graphenej.Authority; - -/** - * Created by nelson on 11/15/16. - */ -public class AccountProperties { - public String id; - public String membership_expiration_date; - public String registrar; - public String referrer; - public String lifetime_referrer; - public long network_fee_percentage; - public long lifetime_referrer_fee_percentage; - public long referrer_rewards_percentage; - public String name; - public Authority owner; - public Authority active; - public AccountOptions options; - public String statistics; - public String[] whitelisting_accounts; - public String[] blacklisting_accounts; - public String[] whitelisted_accounts; - public String[] blacklisted_accounts; - public Object[] owner_special_authority; - public Object[] active_special_authority; - public long top_n_control_flags; -} diff --git a/app/src/main/java/cy/agorise/graphenej/models/ApiCall.java b/app/src/main/java/cy/agorise/graphenej/models/ApiCall.java deleted file mode 100644 index d6be686..0000000 --- a/app/src/main/java/cy/agorise/graphenej/models/ApiCall.java +++ /dev/null @@ -1,110 +0,0 @@ -package cy.agorise.graphenej.models; - -import com.google.gson.GsonBuilder; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonSerializationContext; -import com.google.gson.JsonSerializer; -import cy.agorise.graphenej.interfaces.JsonSerializable; - -import java.io.Serializable; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; - -/** - * Class used to build a Graphene websocket API call. - * @see Websocket Calls & Notifications - */ -public class ApiCall implements JsonSerializable { - public static final String KEY_SEQUENCE_ID = "id"; - public static final String KEY_METHOD = "method"; - public static final String KEY_PARAMS = "params"; - public static final String KEY_JSON_RPC = "jsonrpc"; - - public String method; - public String methodToCall; - public String jsonrpc; - public List params; - public int apiId; - public int sequenceId; - - public ApiCall(int apiId, String methodToCall, List params, String jsonrpc, int sequenceId){ - this.apiId = apiId; - this.method = "call"; - this.methodToCall = methodToCall; - this.jsonrpc = jsonrpc; - this.params = params; - this.sequenceId = sequenceId; - } - - public ApiCall(int apiId, String method, String methodToCall, List params, String jsonrpc, int sequenceId){ - this.apiId = apiId; - this.method = method; - this.methodToCall = methodToCall; - this.jsonrpc = jsonrpc; - this.params = params; - this.sequenceId = sequenceId; - } - - @Override - public String toJsonString() { - GsonBuilder gsonBuilder = new GsonBuilder(); - gsonBuilder.registerTypeAdapter(ApiCall.class, new ApiCallSerializer()); - return gsonBuilder.create().toJson(this); - } - - @Override - public JsonElement toJsonObject() { - JsonObject obj = new JsonObject(); - obj.addProperty(KEY_SEQUENCE_ID, this.sequenceId); - obj.addProperty(KEY_METHOD, this.method); - JsonArray paramsArray = new JsonArray(); - paramsArray.add(this.apiId); - paramsArray.add(this.methodToCall); - JsonArray methodParams = new JsonArray(); - - for(int i = 0; i < this.params.size(); i++){ - if(this.params.get(i) instanceof JsonSerializable) { - // Sometimes the parameters are objects - methodParams.add(((JsonSerializable) this.params.get(i)).toJsonObject()); - }else if (Number.class.isInstance(this.params.get(i))){ - // Other times they are numbers - methodParams.add( (Number) this.params.get(i)); - }else if(this.params.get(i) instanceof String || this.params.get(i) == null){ - // Other times they are plain strings - methodParams.add((String) this.params.get(i)); - }else if(this.params.get(i) instanceof ArrayList) { - // Other times it might be an array - JsonArray array = new JsonArray(); - ArrayList listArgument = (ArrayList) this.params.get(i); - for (int l = 0; l < listArgument.size(); l++) { - Serializable element = listArgument.get(l); - if (element instanceof JsonSerializable) - array.add(((JsonSerializable) element).toJsonObject()); - else if (element instanceof String) { - array.add((String) element); - } - } - methodParams.add(array); - }else if(this.params.get(i) instanceof Boolean){ - methodParams.add((boolean) this.params.get(i)); - }else{ - System.out.println("Skipping parameter of type: "+this.params.get(i).getClass()); - } - } - paramsArray.add(methodParams); - obj.add(KEY_PARAMS, paramsArray); - obj.addProperty(KEY_JSON_RPC, this.jsonrpc); - return obj; - } - - class ApiCallSerializer implements JsonSerializer { - - @Override - public JsonElement serialize(ApiCall apiCall, Type type, JsonSerializationContext jsonSerializationContext) { - return toJsonObject(); - } - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/models/AssetFeed.java b/app/src/main/java/cy/agorise/graphenej/models/AssetFeed.java deleted file mode 100644 index 66eef84..0000000 --- a/app/src/main/java/cy/agorise/graphenej/models/AssetFeed.java +++ /dev/null @@ -1,13 +0,0 @@ -package cy.agorise.graphenej.models; - -import cy.agorise.graphenej.Price; - -/** - * Created by nelson on 1/9/17. - */ -public class AssetFeed { - public Price settlement_price; - public long maintenance_collateral_ratio; - public long maximum_short_squeeze_ratio; - public Price core_exchange_rate; -} diff --git a/app/src/main/java/cy/agorise/graphenej/models/AssetHolderCount.java b/app/src/main/java/cy/agorise/graphenej/models/AssetHolderCount.java deleted file mode 100644 index 6885415..0000000 --- a/app/src/main/java/cy/agorise/graphenej/models/AssetHolderCount.java +++ /dev/null @@ -1,29 +0,0 @@ -package cy.agorise.graphenej.models; - -import com.google.gson.*; -import cy.agorise.graphenej.Asset; - -import java.lang.reflect.Type; - -/** - * Created by nelson on 1/25/17. - */ -public class AssetHolderCount { - public static final String KEY_ASSET_ID = "asset_id"; - public static final String KEY_COUNT = "count"; - - public Asset asset; - public long count; - - public static class HoldersCountDeserializer implements JsonDeserializer { - - @Override - public AssetHolderCount deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - JsonObject jsonObject = json.getAsJsonObject(); - AssetHolderCount holdersCount = new AssetHolderCount(); - holdersCount.asset = new Asset(jsonObject.get(KEY_ASSET_ID).getAsString()); - holdersCount.count = jsonObject.get(KEY_COUNT).getAsLong(); - return holdersCount; - } - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/models/BaseResponse.java b/app/src/main/java/cy/agorise/graphenej/models/BaseResponse.java deleted file mode 100644 index 50b7622..0000000 --- a/app/src/main/java/cy/agorise/graphenej/models/BaseResponse.java +++ /dev/null @@ -1,29 +0,0 @@ -package cy.agorise.graphenej.models; - -/** - * Created by nelson on 11/12/16. - */ -public class BaseResponse { - public long id; - public Error error; - - public static class Error { - public ErrorData data; - public int code; - public String message; - public Error(String message){ - this.message = message; - } - } - - public static class ErrorData { - public int code; - public String name; - public String message; - //TODO: Include stack data - - public ErrorData(String message){ - this.message = message; - } - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/models/BitAssetData.java b/app/src/main/java/cy/agorise/graphenej/models/BitAssetData.java deleted file mode 100644 index 1d27222..0000000 --- a/app/src/main/java/cy/agorise/graphenej/models/BitAssetData.java +++ /dev/null @@ -1,25 +0,0 @@ -package cy.agorise.graphenej.models; - -import cy.agorise.graphenej.GrapheneObject; -import cy.agorise.graphenej.Price; - -/** - * This is the representation of the response from the 'get_objects' call with - * a 2.4.x id, which will retrieve a 'impl_asset_bitasset_data_type'. - * - * Created by nelson on 1/8/17. - */ -public class BitAssetData extends GrapheneObject { - public Object[] feeds; - public AssetFeed current_feed; - public String current_feed_publication_time; - public Object options; - public long force_settled_volume; - public boolean is_prediction_market; - public Price settlement_price; - public long settlement_fund; - - public BitAssetData(String id) { - super(id); - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/models/BlockHeader.java b/app/src/main/java/cy/agorise/graphenej/models/BlockHeader.java deleted file mode 100644 index 9ebdef7..0000000 --- a/app/src/main/java/cy/agorise/graphenej/models/BlockHeader.java +++ /dev/null @@ -1,12 +0,0 @@ -package cy.agorise.graphenej.models; - -/** - * Created by nelson on 12/13/16. - */ -public class BlockHeader { - public String previous; - public String timestamp; - public String witness; - public String transaction_merkle_root; - public Object[] extension; -} diff --git a/app/src/main/java/cy/agorise/graphenej/models/BroadcastedTransaction.java b/app/src/main/java/cy/agorise/graphenej/models/BroadcastedTransaction.java deleted file mode 100644 index e280005..0000000 --- a/app/src/main/java/cy/agorise/graphenej/models/BroadcastedTransaction.java +++ /dev/null @@ -1,42 +0,0 @@ -package cy.agorise.graphenej.models; - -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonParseException; -import cy.agorise.graphenej.GrapheneObject; -import cy.agorise.graphenej.Transaction; - -import java.io.Serializable; -import java.lang.reflect.Type; - -/** - * Created by nelson on 1/28/17. - */ -public class BroadcastedTransaction extends GrapheneObject implements Serializable { - public static final String KEY_TRX = "trx"; - public static final String KEY_TRX_ID = "trx_id"; - - private Transaction trx; - private String trx_id; - - public BroadcastedTransaction(String id){ - super(id); - } - - public void setTransaction(Transaction t){ - this.trx = t; - } - - public Transaction getTransaction() { - return trx; - } - - public void setTransactionId(String id){ - this.trx_id = id; - } - - public String getTransactionId() { - return trx_id; - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/models/BucketObject.java b/app/src/main/java/cy/agorise/graphenej/models/BucketObject.java deleted file mode 100644 index 816befd..0000000 --- a/app/src/main/java/cy/agorise/graphenej/models/BucketObject.java +++ /dev/null @@ -1,84 +0,0 @@ -package cy.agorise.graphenej.models; - -import com.google.gson.*; -import cy.agorise.graphenej.Asset; - -import java.lang.reflect.Type; -import java.math.BigDecimal; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; - -/** - * Created by nelson on 12/22/16. - */ -public class BucketObject { - public static final String KEY_HIGH_BASE = "high_base"; - public static final String KEY_HIGH_QUOTE = "high_quote"; - public static final String KEY_LOW_BASE = "low_base"; - public static final String KEY_LOW_QUOTE = "low_quote"; - public static final String KEY_OPEN_BASE = "open_base"; - public static final String KEY_OPEN_QUOTE = "open_quote"; - public static final String KEY_CLOSE_BASE = "close_base"; - public static final String KEY_CLOSE_QUOTE = "close_quote"; - public static final String KEY_BASE_VOLUME = "base_volume"; - public static final String KEY_QUOTE_VOLUME = "quote_volume"; - public static final String KEY_BASE = "base"; - public static final String KEY_QUOTE = "quote"; - public static final String KEY_SECONDS = "seconds"; - public static final String KEY_OPEN = "open"; - public static final String KEY_KEY = "key"; - - public String id; - public Key key; - public BigDecimal high_base; - public BigDecimal high_quote; - public BigDecimal low_base; - public BigDecimal low_quote; - public BigDecimal open_base; - public BigDecimal open_quote; - public BigDecimal close_base; - public BigDecimal close_quote; - public BigDecimal base_volume; - public BigDecimal quote_volume; - - public static class Key { - public Asset base; - public Asset quote; - public long seconds; - public Date open; - } - - public static class BucketDeserializer implements JsonDeserializer { - - @Override - public BucketObject deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - JsonObject jsonBucket = json.getAsJsonObject(); - BucketObject bucket = new BucketObject(); - bucket.high_base = jsonBucket.get(KEY_HIGH_BASE).getAsBigDecimal(); - bucket.high_quote = jsonBucket.get(KEY_HIGH_QUOTE).getAsBigDecimal(); - bucket.low_base = jsonBucket.get(KEY_LOW_BASE).getAsBigDecimal(); - bucket.low_quote = jsonBucket.get(KEY_LOW_QUOTE).getAsBigDecimal(); - bucket.open_base = jsonBucket.get(KEY_OPEN_BASE).getAsBigDecimal(); - bucket.open_quote = jsonBucket.get(KEY_OPEN_QUOTE).getAsBigDecimal(); - bucket.close_base = jsonBucket.get(KEY_CLOSE_BASE).getAsBigDecimal(); - bucket.close_quote = jsonBucket.get(KEY_CLOSE_QUOTE).getAsBigDecimal(); - bucket.base_volume = jsonBucket.get(KEY_BASE_VOLUME).getAsBigDecimal(); - bucket.quote_volume = jsonBucket.get(KEY_QUOTE_VOLUME).getAsBigDecimal(); - bucket.key = new Key(); - String baseId = jsonBucket.get(KEY_KEY).getAsJsonObject().get(KEY_BASE).getAsString(); - String quoteId = jsonBucket.get(KEY_KEY).getAsJsonObject().get(KEY_QUOTE).getAsString(); - bucket.key.base = new Asset(baseId); - bucket.key.quote = new Asset(quoteId); - bucket.key.seconds = jsonBucket.get(KEY_KEY).getAsJsonObject().get(KEY_SECONDS).getAsLong(); - - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); - try { - bucket.key.open = dateFormat.parse(jsonBucket.get(KEY_KEY).getAsJsonObject().get(KEY_OPEN).getAsString()); - } catch (ParseException e) { - System.out.println("ParseException while deserializing BucketObject. Msg: "+e.getMessage()); - } - return bucket; - } - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/models/DynamicGlobalProperties.java b/app/src/main/java/cy/agorise/graphenej/models/DynamicGlobalProperties.java deleted file mode 100644 index 8c925e2..0000000 --- a/app/src/main/java/cy/agorise/graphenej/models/DynamicGlobalProperties.java +++ /dev/null @@ -1,99 +0,0 @@ -package cy.agorise.graphenej.models; - -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; - -import java.io.Serializable; -import java.lang.reflect.Type; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.TimeZone; - -import cy.agorise.graphenej.GrapheneObject; -import cy.agorise.graphenej.Util; - -/** - * Class used to deserialize the 'result' field returned by the full node after making a call - * to the 'get_dynamic_global_properties' RPC. - */ -public class DynamicGlobalProperties extends GrapheneObject implements Serializable { - public static final String KEY_HEAD_BLOCK_NUMBER = "head_block_number"; - public static final String KEY_HEAD_BLOCK_ID ="head_block_id"; - public static final String KEY_TIME = "time"; - public static final String KEY_CURRENT_WITNESS = "current_witness"; - public static final String KEY_NEXT_MAINTENANCE_TIME = "next_maintenance_time"; - public static final String KEY_LAST_BUDGET_TIME = "last_budget_time"; - public static final String KEY_WITNESS_BUDGET = "witness_budget"; - public static final String KEY_ACCOUNTS_REGISTERED_THIS_INTERVAL = "accounts_registered_this_interval"; - public static final String KEY_RECENTLY_MISSED_COUNT = "recently_missed_count"; - public static final String KEY_CURRENT_ASLOT = "current_aslot"; - public static final String KEY_RECENT_SLOTS_FILLED = "recent_slots_filled"; - public static final String KEY_DYNAMIC_FLAGS = "dynamic_flags"; - public static final String KEY_LAST_IRREVERSIBLE_BLOCK_NUM = "last_irreversible_block_num"; - - public long head_block_number; - public String head_block_id; - public Date time; - public String current_witness; - public Date next_maintenance_time; - public String last_budget_time; - public long witness_budget; - public long accounts_registered_this_interval; - public long recently_missed_count; - public long current_aslot; - public String recent_slots_filled; - public int dynamic_flags; - public long last_irreversible_block_num; - - public DynamicGlobalProperties(String id) { - super(id); - } - - /** - * Class that will parse the JSON element containing the dynamic global properties object and - * return an instance of the {@link DynamicGlobalProperties} class. - */ - public static class DynamicGlobalPropertiesDeserializer implements JsonDeserializer { - - @Override - public DynamicGlobalProperties deserialize(JsonElement jsonElement, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - JsonObject jsonObject = jsonElement.getAsJsonObject(); - - // Creating an instance of the DynamicGlobalProperties - DynamicGlobalProperties dynamicGlobal = new DynamicGlobalProperties(jsonElement.getAsJsonObject().get(KEY_ID).getAsString()); - - // Start to fill in the parsed details - dynamicGlobal.head_block_number = jsonObject.get(DynamicGlobalProperties.KEY_HEAD_BLOCK_NUMBER).getAsLong(); - dynamicGlobal.head_block_id = jsonObject.get(DynamicGlobalProperties.KEY_HEAD_BLOCK_ID).getAsString(); - - SimpleDateFormat dateFormat = new SimpleDateFormat(Util.TIME_DATE_FORMAT); - dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); - try { - dynamicGlobal.time = dateFormat.parse(jsonObject.get(DynamicGlobalProperties.KEY_TIME).getAsString()); - } catch (ParseException e) { - System.out.println("ParseException. Msg: "+e.getMessage()); - } - - try { - dynamicGlobal.next_maintenance_time = dateFormat.parse(jsonObject.get(DynamicGlobalProperties.KEY_NEXT_MAINTENANCE_TIME).getAsString()); - } catch (ParseException e) { - System.out.println("ParseException. Msg: "+e.getMessage()); - } - - dynamicGlobal.current_witness = jsonObject.get(DynamicGlobalProperties.KEY_CURRENT_WITNESS).getAsString(); - dynamicGlobal.last_budget_time = jsonObject.get(DynamicGlobalProperties.KEY_LAST_BUDGET_TIME).getAsString(); - dynamicGlobal.witness_budget = jsonObject.get(DynamicGlobalProperties.KEY_WITNESS_BUDGET).getAsLong(); - dynamicGlobal.accounts_registered_this_interval = jsonObject.get(DynamicGlobalProperties.KEY_ACCOUNTS_REGISTERED_THIS_INTERVAL).getAsLong(); - dynamicGlobal.recently_missed_count = jsonObject.get(DynamicGlobalProperties.KEY_RECENTLY_MISSED_COUNT).getAsLong(); - dynamicGlobal.current_aslot = jsonObject.get(DynamicGlobalProperties.KEY_CURRENT_ASLOT).getAsLong(); - dynamicGlobal.recent_slots_filled = jsonObject.get(DynamicGlobalProperties.KEY_RECENT_SLOTS_FILLED).getAsString(); - dynamicGlobal.dynamic_flags = jsonObject.get(DynamicGlobalProperties.KEY_DYNAMIC_FLAGS).getAsInt(); - dynamicGlobal.last_irreversible_block_num = jsonObject.get(DynamicGlobalProperties.KEY_LAST_IRREVERSIBLE_BLOCK_NUM).getAsLong(); - return dynamicGlobal; - } - } -} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/graphenej/models/HistoricalTransfer.java b/app/src/main/java/cy/agorise/graphenej/models/HistoricalTransfer.java deleted file mode 100644 index d14e5b8..0000000 --- a/app/src/main/java/cy/agorise/graphenej/models/HistoricalTransfer.java +++ /dev/null @@ -1,69 +0,0 @@ -package cy.agorise.graphenej.models; - -import cy.agorise.graphenej.operations.TransferOperation; - - -/** - * This class offers support to deserialization of transfer operations received by the API - * method get_relative_account_history. - * - * More operations types might be listed in the response of that method, but by using this class - * those will be filtered out of the parsed result. - */ -public class HistoricalTransfer { - private String id; - private TransferOperation op; - public Object[] result; - private long block_num; - private long trx_in_block; - private long op_in_trx; - private long virtual_op; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public TransferOperation getOperation() { - return op; - } - - public void setOperation(TransferOperation op) { - this.op = op; - } - - public long getBlockNum() { - return block_num; - } - - public void setBlockNum(long block_num) { - this.block_num = block_num; - } - - public long getTransactionsInBlock() { - return trx_in_block; - } - - public void setTransactionsInBlock(long trx_in_block) { - this.trx_in_block = trx_in_block; - } - - public long getOperationsInTrx() { - return op_in_trx; - } - - public void setOperationsInTrx(long op_in_trx) { - this.op_in_trx = op_in_trx; - } - - public long getVirtualOp() { - return virtual_op; - } - - public void setVirtualOp(long virtual_op) { - this.virtual_op = virtual_op; - } -} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/graphenej/models/SubscriptionResponse.java b/app/src/main/java/cy/agorise/graphenej/models/SubscriptionResponse.java deleted file mode 100644 index 2b2f6d0..0000000 --- a/app/src/main/java/cy/agorise/graphenej/models/SubscriptionResponse.java +++ /dev/null @@ -1,201 +0,0 @@ -package cy.agorise.graphenej.models; - -import com.google.gson.JsonArray; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; - -import java.io.Serializable; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; - -import cy.agorise.graphenej.GrapheneObject; -import cy.agorise.graphenej.ObjectType; -import cy.agorise.graphenej.Transaction; -import cy.agorise.graphenej.interfaces.SubscriptionListener; - -/** - * Class that represents a generic subscription response. - * The template for every subscription response is the following: - * - * { - * "method": "notice" - * "params": [ - * SUBSCRIPTION_ID, - * [[ - * { "id": "2.1.0", ... }, - * { "id": ... }, - * { "id": ... }, - * { "id": ... } - * ]] - * ], - * } - * - * As of 1/2017, the witness API returns all sort of events, not just the ones we're interested in once we - * make a call to the 'set_subscribe_callback', regardless of whether the 'clear_filter' parameter is set to - * true or false. - * - * To minimize CPU usage, we introduce a scheme of selective parsing, implemented by the static inner class - * SubscriptionResponseDeserializer. - * - * Created by nelson on 1/12/17. - */ -public class SubscriptionResponse { - private static final String TAG = "SubscriptionResponse"; - public static final String KEY_ID = "id"; - public static final String KEY_METHOD = "method"; - public static final String KEY_PARAMS = "params"; - - public int id; - public String method; - public List params; - - /** - * Inner static class used to parse and deserialize subscription responses in a partial way, - * depending on the amount of SubscriptionListeners we might have registered. - * - * The rationale behind these architecture is to avoid wasting computational resources parsing unneeded - * objects that might come once the are subscribed to the witness notifications. - */ - public static class SubscriptionResponseDeserializer implements JsonDeserializer { - /** - * Map of ObjectType to Integer used to keep track of the current amount of listener per type - */ - private HashMap listenerTypeCount; - - /** - * List of listeners - */ - private LinkedList mListeners; - - /** - * Constructor that will just create a list of SubscriptionListeners and - * a map of ObjectType to integer in order to keep track of how many listeners - * to each type of object we have. - */ - public SubscriptionResponseDeserializer(){ - mListeners = new LinkedList<>(); - listenerTypeCount = new HashMap<>(); - } - - /** - * Adds a subscription listener to the list. - * @param subscriptionListener: Class implementing the {@see SubscriptionListener} interface - * to be added to the list. - */ - public void addSubscriptionListener(SubscriptionListener subscriptionListener){ - int currentCount = 0; - if(listenerTypeCount.containsKey(subscriptionListener.getInterestObjectType())){ - currentCount = listenerTypeCount.get(subscriptionListener.getInterestObjectType()); - } - this.listenerTypeCount.put(subscriptionListener.getInterestObjectType(), currentCount + 1); - this.mListeners.add(subscriptionListener); - } - - /** - * Retrieves the full list of SubscriptionListeners registered. - * @return - */ - public List getSubscriptionListeners(){ - return this.mListeners; - } - - /** - * Removes a subscription listener to the list. - * @param subscriptionListener: Class implementing the {@see SubscriptionListener} interface - * to be removed from the list. - */ - public void removeSubscriptionListener(SubscriptionListener subscriptionListener){ - int currentCount = listenerTypeCount.get(subscriptionListener.getInterestObjectType()); - if(currentCount != 0){ - this.listenerTypeCount.put(subscriptionListener.getInterestObjectType(), currentCount); - }else{ - System.out.println("Trying to remove subscription listener, but none is registered!"); - } - this.mListeners.remove(subscriptionListener); - } - - /** - * Removes all registered subscription listeners - */ - public void clearAllSubscriptionListeners(){ - this.mListeners.clear(); - this.listenerTypeCount.clear(); - } - - @Override - public SubscriptionResponse deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - SubscriptionResponse response = new SubscriptionResponse(); - JsonObject responseObject = json.getAsJsonObject(); - if(!responseObject.has(KEY_METHOD)){ - return response; - } - response.method = responseObject.get(KEY_METHOD).getAsString(); - - JsonArray paramsArray = responseObject.get(KEY_PARAMS).getAsJsonArray(); - response.params = new ArrayList<>(); - response.params.add(paramsArray.get(0).getAsInt()); - ArrayList secondArgument = new ArrayList<>(); - response.params.add(secondArgument); - - // Hash map used to record the type of objects present in this subscription message - // and only alert listeners that might be interested - HashMap objectMap = new HashMap<>(); - - JsonArray subArray = paramsArray.get(1).getAsJsonArray().get(0).getAsJsonArray(); - for(JsonElement object : subArray){ - if(object.isJsonObject()){ - GrapheneObject grapheneObject = new GrapheneObject(object.getAsJsonObject().get(KEY_ID).getAsString()); - - int listenerTypeCount = 0; - if(this.listenerTypeCount.containsKey(grapheneObject.getObjectType())){ - listenerTypeCount = this.listenerTypeCount.get(grapheneObject.getObjectType()); - } - /* - * Here's where we apply the selective deserialization logic, meaning we only completely deserialize - * an object contained in a notification if there is at least one registered listener interested in - * objects of that type. - */ - if(listenerTypeCount > 0){ - JsonObject jsonObject = object.getAsJsonObject(); - if(grapheneObject.getObjectType() == ObjectType.ACCOUNT_BALANCE_OBJECT){ - AccountBalanceUpdate balanceObject = new AccountBalanceUpdate(grapheneObject.getObjectId()); - balanceObject.owner = jsonObject.get(AccountBalanceUpdate.KEY_OWNER).getAsString(); - balanceObject.asset_type = jsonObject.get(AccountBalanceUpdate.KEY_ASSET_TYPE).getAsString(); - balanceObject.balance = jsonObject.get(AccountBalanceUpdate.KEY_BALANCE).getAsLong(); - objectMap.put(ObjectType.ACCOUNT_BALANCE_OBJECT, true); - secondArgument.add(balanceObject); - }else if(grapheneObject.getObjectType() == ObjectType.DYNAMIC_GLOBAL_PROPERTY_OBJECT){ - DynamicGlobalProperties dynamicGlobalProperties = context.deserialize(object, DynamicGlobalProperties.class); - objectMap.put(ObjectType.DYNAMIC_GLOBAL_PROPERTY_OBJECT, true); - secondArgument.add(dynamicGlobalProperties); - }else if(grapheneObject.getObjectType() == ObjectType.TRANSACTION_OBJECT){ - BroadcastedTransaction broadcastedTransaction = new BroadcastedTransaction(grapheneObject.getObjectId()); - broadcastedTransaction.setTransaction((Transaction) context.deserialize(jsonObject.get(BroadcastedTransaction.KEY_TRX), Transaction.class)); - broadcastedTransaction.setTransactionId(jsonObject.get(BroadcastedTransaction.KEY_TRX_ID).getAsString()); - objectMap.put(ObjectType.TRANSACTION_OBJECT, true); - secondArgument.add(broadcastedTransaction); - }else{ - //TODO: Add support for other types of objects - } - } - }else{ - secondArgument.add(object.getAsString()); - } - } - for(SubscriptionListener listener : mListeners){ - // Only notify the listener if there is an object of interest in - // this notification - if(objectMap.containsKey(listener.getInterestObjectType())){ - listener.onSubscriptionUpdate(response); - } - } - return response; - } - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/models/WitnessResponse.java b/app/src/main/java/cy/agorise/graphenej/models/WitnessResponse.java deleted file mode 100644 index 2cabae9..0000000 --- a/app/src/main/java/cy/agorise/graphenej/models/WitnessResponse.java +++ /dev/null @@ -1,11 +0,0 @@ -package cy.agorise.graphenej.models; - -/** - * Generic witness response - */ -public class WitnessResponse extends BaseResponse{ - public static final String KEY_ID = "id"; - public static final String KEY_RESULT = "result"; - - public T result; -} diff --git a/app/src/main/java/cy/agorise/graphenej/models/backup/LinkedAccount.java b/app/src/main/java/cy/agorise/graphenej/models/backup/LinkedAccount.java deleted file mode 100644 index 5bdc52e..0000000 --- a/app/src/main/java/cy/agorise/graphenej/models/backup/LinkedAccount.java +++ /dev/null @@ -1,31 +0,0 @@ -package cy.agorise.graphenej.models.backup; - -/** - * Class used to represent an entry in the "linked_accounts" field of the JSON-formatted backup file. - * Created by nelson on 2/15/17. - */ -public class LinkedAccount { - private String name; - private String chainId; - - public LinkedAccount(String name, String chainId){ - this.name = name; - this.chainId = chainId; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getChainId() { - return chainId; - } - - public void setChainId(String chainId) { - this.chainId = chainId; - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/models/backup/PrivateKeyBackup.java b/app/src/main/java/cy/agorise/graphenej/models/backup/PrivateKeyBackup.java deleted file mode 100644 index aa77745..0000000 --- a/app/src/main/java/cy/agorise/graphenej/models/backup/PrivateKeyBackup.java +++ /dev/null @@ -1,38 +0,0 @@ -package cy.agorise.graphenej.models.backup; - -import cy.agorise.graphenej.Address; -import cy.agorise.graphenej.Util; -import org.bitcoinj.core.ECKey; - -/** - * Class used to represent an entry in the "private_keys" array field in the JSON-formatted - * backup file. - * - * Created by nelson on 2/14/17. - */ -public class PrivateKeyBackup { - public String encrypted_key; - public String pubkey; - public int brainkey_sequence; - public int id; - - public PrivateKeyBackup(byte[] privateKey, int brainkeySequence, int id, byte[] encryptionKey){ - this.encrypted_key = encryptPrivateKey(privateKey, encryptionKey); - this.brainkey_sequence = brainkeySequence; - this.id = id; - deriveAddress(privateKey); - } - - public byte[] decryptPrivateKey(byte[] encryptionKey){ - return Util.decryptAES(Util.hexToBytes(encrypted_key), encryptionKey); - } - - public String encryptPrivateKey(byte[] data, byte[] encryptionKey){ - return Util.bytesToHex(Util.encryptAES(data, encryptionKey)); - } - - private void deriveAddress(byte[] privateKey){ - Address address = new Address(ECKey.fromPublicOnly(ECKey.fromPrivate(privateKey).getPubKey())); - this.pubkey = address.toString(); - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/models/backup/Wallet.java b/app/src/main/java/cy/agorise/graphenej/models/backup/Wallet.java deleted file mode 100644 index 12cd616..0000000 --- a/app/src/main/java/cy/agorise/graphenej/models/backup/Wallet.java +++ /dev/null @@ -1,202 +0,0 @@ -package cy.agorise.graphenej.models.backup; - -import cy.agorise.graphenej.Address; -import cy.agorise.graphenej.Util; -import cy.agorise.graphenej.crypto.SecureRandomGenerator; -import org.bitcoinj.core.ECKey; -import org.bitcoinj.core.Sha256Hash; -import org.spongycastle.crypto.digests.SHA256Digest; - -import java.io.UnsupportedEncodingException; -import java.security.SecureRandom; -import java.text.SimpleDateFormat; -import java.util.Date; - -/** - * This class holds data deserialized from a wallet in the backup file. - * - * Created by nelson on 2/14/17. - */ -public class Wallet { - private String public_name; - private String password_pubkey; - private String encryption_key; - private String encrypted_brainkey; - private String brainkey_pubkey; - private int brainkey_sequence; - private String brainkey_backup_date; - private String created; - private String last_modified; - private String chain_id; - private String id; - private String backup_date; - - /** - * No args constructor - */ - public Wallet(){} - - public Wallet(String name){ - this.public_name = name; - this.id = name; - } - - /** - * Wallet constructor that takes a few arguments. - * @param name: The name of this wallet. - * @param brainKey: The brain key to be used. - * @param brainkeySequence: The brain key sequence. - * @param chainId: The chain id - * @param password: Password used to encrypt all sensitive data. - */ - public Wallet(String name, String brainKey, int brainkeySequence, String chainId, String password){ - this(name); - SecureRandom secureRandom = SecureRandomGenerator.getSecureRandom(); - byte[] decryptedKey = new byte[Util.KEY_LENGTH]; - secureRandom.nextBytes(decryptedKey); - this.encryption_key = Util.bytesToHex(Util.encryptAES(decryptedKey, password.getBytes())); - this.encrypted_brainkey = Util.bytesToHex(Util.encryptAES(brainKey.getBytes(), decryptedKey)); - this.brainkey_sequence = brainkeySequence; - this.chain_id = chainId; - - try { - byte[] passwordHash = Sha256Hash.hash(password.getBytes("UTF8")); - this.password_pubkey = new Address(ECKey.fromPublicOnly(ECKey.fromPrivate(passwordHash).getPubKey())).toString(); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - try{ - byte[] brainkeyHash = Sha256Hash.hash(brainKey.getBytes("UTF8")); - this.brainkey_pubkey = new Address(ECKey.fromPublicOnly(ECKey.fromPrivate(brainkeyHash).getPubKey())).toString(); - } catch(UnsupportedEncodingException e){ - e.printStackTrace(); - } - - Date now = new Date(); - SimpleDateFormat dateFormat = new SimpleDateFormat(Util.TIME_DATE_FORMAT); - this.created = dateFormat.format(now); - this.last_modified = created; - this.backup_date = created; - this.brainkey_backup_date = created; - } - - /** - * Method that will return the decrypted version of the "encrypted_brainkey" field. - * @param password: Password used to encrypt the encryption key. - * @return: The brainkey in its plaintext version. - */ - public String decryptBrainKey(String password){ - byte[] decryptedKey = getEncryptionKey(password); - byte[] encryptedBrainKey = Util.hexToBytes(encrypted_brainkey); - return new String(Util.decryptAES(encryptedBrainKey, decryptedKey)); - } - - /** - * Decrypts the encryption key, which is also provided in an encrypted form. - * @param password: The password used to encrypt the encryption key. - * @return: The encryption key. - */ - public byte[] getEncryptionKey(String password){ - return Util.decryptAES(Util.hexToBytes(encryption_key), password.getBytes()); - } - - public String getPrivateName() { - return public_name; - } - - public void setPrivateName(String privateName) { - this.public_name = privateName; - } - - public String getPasswordPubkey() { - return password_pubkey; - } - - public void setPasswordPubkey(String password_pubkey) { - this.password_pubkey = password_pubkey; - } - - /** - * Gets the cyphertext version of the encryption key. - * @return: Encryption key in its cyphertext version. - */ - public String getEncryptionKey() { - return encryption_key; - } - - public void setEncryptionKey(String encryption_key) { - this.encryption_key = encryption_key; - } - - public String getEncryptedBrainkey() { - return encrypted_brainkey; - } - - public void setEncryptedBrainkey(String encrypted_brainkey) { - this.encrypted_brainkey = encrypted_brainkey; - } - - public String getBrainkeyPubkey() { - return brainkey_pubkey; - } - - public void setBrainkeyPubkey(String brainkey_pubkey) { - this.brainkey_pubkey = brainkey_pubkey; - } - - public int getBrainkeySequence() { - return brainkey_sequence; - } - - public void setBrainkeySequence(int brainkey_sequence) { - this.brainkey_sequence = brainkey_sequence; - } - - public String getBrainkeyBackup_date() { - return brainkey_backup_date; - } - - public void setBrainkeyBackupDate(String brainkey_backup_date) { - this.brainkey_backup_date = brainkey_backup_date; - } - - public String getCreated() { - return created; - } - - public void setCreated(String created) { - this.created = created; - } - - public String getLastModified() { - return last_modified; - } - - public void setLastModified(String last_modified) { - this.last_modified = last_modified; - } - - public String getChainId() { - return chain_id; - } - - public void setChainId(String chain_id) { - this.chain_id = chain_id; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getBackupDate() { - return backup_date; - } - - public void setBackupDate(String backup_date) { - this.backup_date = backup_date; - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/models/backup/WalletBackup.java b/app/src/main/java/cy/agorise/graphenej/models/backup/WalletBackup.java deleted file mode 100644 index bac160f..0000000 --- a/app/src/main/java/cy/agorise/graphenej/models/backup/WalletBackup.java +++ /dev/null @@ -1,49 +0,0 @@ -package cy.agorise.graphenej.models.backup; - -import java.util.List; - -/** - * This class is used to represent the JSON-formatted version of the file backup containing one or more - * wallets and keys. - * - * Created by nelson on 2/14/17. - */ -public class WalletBackup { - private Wallet[] wallet; - private PrivateKeyBackup[] private_keys; - private LinkedAccount[] linked_accounts; - - public WalletBackup(List wallets, List privateKeys, List linkedAccounts){ - this.wallet = wallets.toArray(new Wallet[wallets.size()]); - this.private_keys = privateKeys.toArray(new PrivateKeyBackup[privateKeys.size()]); - this.linked_accounts = linkedAccounts.toArray(new LinkedAccount[linkedAccounts.size()]); - } - - public Wallet[] getWallets(){ - return wallet; - } - - public PrivateKeyBackup[] getPrivateKeys(){ - return private_keys; - } - - public LinkedAccount[] getLinkedAccounts(){ - return linked_accounts; - } - - public Wallet getWallet(int index){ - return wallet[index]; - } - - public PrivateKeyBackup getPrivateKeyBackup(int index){ - return private_keys[index]; - } - - public int getWalletCount(){ - return wallet.length; - } - - public int getKeyCount(){ - return private_keys.length; - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/objects/Memo.java b/app/src/main/java/cy/agorise/graphenej/objects/Memo.java deleted file mode 100644 index 669c5e4..0000000 --- a/app/src/main/java/cy/agorise/graphenej/objects/Memo.java +++ /dev/null @@ -1,306 +0,0 @@ -package cy.agorise.graphenej.objects; - -import com.google.common.primitives.Bytes; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; - -import cy.agorise.graphenej.Address; -import cy.agorise.graphenej.PublicKey; -import cy.agorise.graphenej.Util; -import cy.agorise.graphenej.errors.ChecksumException; -import cy.agorise.graphenej.errors.MalformedAddressException; -import cy.agorise.graphenej.interfaces.ByteSerializable; -import cy.agorise.graphenej.interfaces.JsonSerializable; -import cy.agorise.graphenej.operations.TransferOperation; - -import org.bitcoinj.core.ECKey; -import org.spongycastle.math.ec.ECPoint; - -import java.lang.reflect.Type; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.Arrays; - -/** - * Created by nelson on 11/9/16. - */ -public class Memo implements ByteSerializable, JsonSerializable { - public final static String TAG = "Memo"; - public static final String KEY_FROM = "from"; - public static final String KEY_TO = "to"; - public static final String KEY_NONCE = "nonce"; - public static final String KEY_MESSAGE = "message"; - - private Address from; - private Address to; - private long nonce; - private byte[] message; - private String plaintextMessage; - - public String getPlaintextMessage() { - if(plaintextMessage == null) - return ""; - else - return plaintextMessage; - } - - public void setPlaintextMessage(String plaintextMessage) { - this.plaintextMessage = plaintextMessage; - } - - /** - * Empty Constructor - */ - public Memo() { - this.from = null; - this.to = null; - this.message = null; - } - - /** - * Constructor used for private memos. - * @param from: Address of sender - * @param to: Address of recipient. - * @param nonce: Nonce used in the encryption. - * @param message: Message in ciphertext. - */ - public Memo(Address from, Address to, long nonce, byte[] message){ - this.from = from; - this.to = to; - this.nonce = nonce; - this.message = message; - } - - /** - * Constructor intended to be used with public memos - * @param message: Message in plaintext. - */ - public Memo(String message){ - this.message = message.getBytes(); - } - - public Address getSource(){ - return this.from; - } - - public Address getDestination(){ - return this.to; - } - - public long getNonce(){ - return this.nonce; - } - - public byte[] getByteMessage(){ - return this.message; - } - - public String getStringMessage(){ - if(this.message != null) - return new String(this.message); - else - return ""; - } - - /** - * Method used to decrypt memo data. - * @param privateKey: Private key of the sender. - * @param publicKey: Public key of the recipient. - * @param nonce: The nonce. - * @param message: Plaintext message. - * @return: The encrypted version of the message. - */ - public static byte[] encryptMessage(ECKey privateKey, PublicKey publicKey, long nonce, String message){ - byte[] encrypted = null; - try { - MessageDigest sha256 = MessageDigest.getInstance("SHA-256"); - MessageDigest sha512 = MessageDigest.getInstance("SHA-512"); - - // Getting nonce bytes - String stringNonce = String.format("%d", nonce); - byte[] nonceBytes = Arrays.copyOfRange(Util.hexlify(stringNonce), 0, stringNonce.length()); - - // Getting shared secret - byte[] secret = publicKey.getKey().getPubKeyPoint().multiply(privateKey.getPrivKey()).normalize().getXCoord().getEncoded(); - - // SHA-512 of shared secret - byte[] ss = sha512.digest(secret); - - byte[] seed = Bytes.concat(nonceBytes, Util.hexlify(Util.bytesToHex(ss))); - - // Calculating checksum - byte[] sha256Msg = sha256.digest(message.getBytes()); - byte[] checksum = Arrays.copyOfRange(sha256Msg, 0, 4); - - // Concatenating checksum + message bytes - byte[] msgFinal = Bytes.concat(checksum, message.getBytes()); - - // Applying encryption - encrypted = Util.encryptAES(msgFinal, seed); - } catch (NoSuchAlgorithmException ex) { - System.out.println("NoSuchAlgotithmException. Msg:"+ ex.getMessage()); - } - return encrypted; - } - - /** - * Method used to encrypt memo data. - * @param privateKey: Private key of the sender. - * @param destinationAddress: Address of the recipient. - * @param nonce: The nonce. - * @param message: Plaintext message. - * @return: The encrypted version of the message. - */ - public static byte[] encryptMessage(ECKey privateKey, Address destinationAddress, long nonce, String message){ - return encryptMessage(privateKey, destinationAddress.getPublicKey(), nonce, message); - } - - - /** - * Method used to decrypt memo data. - * @param privateKey: The private key of the recipient. - * @param publicKey: The public key of the sender. - * @param nonce: The nonce. - * @param message: The encrypted message. - * @return: The plaintext version of the enrcrypted message. - * @throws ChecksumException - */ - public static String decryptMessage(ECKey privateKey, PublicKey publicKey, long nonce, byte[] message) throws ChecksumException { - String plaintext = ""; - try { - MessageDigest sha256 = MessageDigest.getInstance("SHA-256"); - MessageDigest sha512 = MessageDigest.getInstance("SHA-512"); - - // Getting nonce bytes - String stringNonce = String.format("%d", nonce); - byte[] nonceBytes = Arrays.copyOfRange(Util.hexlify(stringNonce), 0, stringNonce.length()); - - // Getting shared secret - byte[] secret = publicKey.getKey().getPubKeyPoint().multiply(privateKey.getPrivKey()).normalize().getXCoord().getEncoded(); - - // SHA-512 of shared secret - byte[] ss = sha512.digest(secret); - - byte[] seed = Bytes.concat(nonceBytes, Util.hexlify(Util.bytesToHex(ss))); - - // Calculating checksum - byte[] sha256Msg = sha256.digest(message); - - - // Applying decryption - byte[] temp = Util.decryptAES(message, seed); - byte[] checksum = Arrays.copyOfRange(temp, 0, 4); - byte[] decrypted = Arrays.copyOfRange(temp, 4, temp.length); - plaintext = new String(decrypted); - byte[] checksumConfirmation = Arrays.copyOfRange(sha256.digest(decrypted), 0, 4); - boolean checksumVerification = Arrays.equals(checksum, checksumConfirmation); - if(!checksumVerification){ - throw new ChecksumException("Invalid checksum found while performing decryption"); - } - } catch (NoSuchAlgorithmException e) { - System.out.println("NoSuchAlgotithmException. Msg:"+ e.getMessage()); - } - return plaintext; - } - - /** - * Method used to decrypt memo data. - * @param privateKey: The private key of the recipient. - * @param sourceAddress: The public address key of the sender. - * @param nonce: The nonce. - * @param message: The encrypted message. - * @return: The plaintext version of the enrcrypted message. - * @throws ChecksumException - */ - public static String decryptMessage(ECKey privateKey, Address sourceAddress, long nonce, byte[] message) throws ChecksumException { - return decryptMessage(privateKey, sourceAddress.getPublicKey(), nonce, message); - } - - - /** - * Implement metod, serialized this Object - * @return the byte array of this object serialized - */ - @Override - public byte[] toBytes() { - if ((this.from == null) && (this.to == null) && (this.message == null)) { - return new byte[]{(byte) 0}; - } else if(this.from == null && this.to == null & this.message != null){ - return Bytes.concat(new byte[]{1}, - new byte[]{(byte)0}, - new byte[]{(byte)0}, - new byte[]{(byte)0}, - new byte[]{(byte) this.message.length}, - this.message); - } else { - byte[] nonceBytes = Util.revertLong(nonce); - - ECPoint senderPoint = ECKey.compressPoint(from.getPublicKey().getKey().getPubKeyPoint()); - PublicKey senderPublicKey = new PublicKey(ECKey.fromPublicOnly(senderPoint)); - - ECPoint recipientPoint = ECKey.compressPoint(to.getPublicKey().getKey().getPubKeyPoint()); - PublicKey recipientPublicKey = new PublicKey(ECKey.fromPublicOnly(recipientPoint)); - - return Bytes.concat(new byte[]{1}, - senderPublicKey.toBytes(), - recipientPublicKey.toBytes(), - nonceBytes, - new byte[]{(byte) this.message.length}, - this.message); - } - } - - @Override - public String toJsonString() { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public JsonElement toJsonObject() { - JsonObject memoObject = new JsonObject(); - if ((this.from == null) && (this.to == null)) { - // Public memo - // TODO: Add public memo support -// memoObject.addProperty(KEY_FROM, ""); -// memoObject.addProperty(KEY_TO, ""); -// memoObject.addProperty(KEY_NONCE, ""); -// memoObject.addProperty(KEY_MESSAGE, Util.bytesToHex(this.message)); - return null; - }else{ - memoObject.addProperty(KEY_FROM, this.from.toString()); - memoObject.addProperty(KEY_TO, this.to.toString()); - memoObject.addProperty(KEY_NONCE, String.format("%d", this.nonce)); - memoObject.addProperty(KEY_MESSAGE, Util.bytesToHex(this.message)); - } - return memoObject; - } - - /** - * Class used to deserialize a memo - */ - public static class MemoDeserializer implements JsonDeserializer { - - @Override - public Memo deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - JsonObject jsonObject = json.getAsJsonObject(); - String fromAddress = jsonObject.get(KEY_FROM).getAsString(); - String toAddress = jsonObject.get(KEY_TO).getAsString(); - long nonce = jsonObject.get(KEY_NONCE).getAsLong(); - String msg = jsonObject.get(KEY_MESSAGE).getAsString(); - - Memo memo = null; - try{ - Address from = new Address(fromAddress); - Address to = new Address(toAddress); - byte[] message = Util.hexToBytes(msg); - memo = new Memo(from, to, nonce, message); - }catch(MalformedAddressException e){ - System.out.println("MalformedAddressException. Msg: "+e.getMessage()); - } - return memo; - } - } -} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/graphenej/operations/AccountUpdateOperation.java b/app/src/main/java/cy/agorise/graphenej/operations/AccountUpdateOperation.java deleted file mode 100644 index b596ccf..0000000 --- a/app/src/main/java/cy/agorise/graphenej/operations/AccountUpdateOperation.java +++ /dev/null @@ -1,102 +0,0 @@ -package cy.agorise.graphenej.operations; - -import com.google.common.primitives.Bytes; -import com.google.common.primitives.UnsignedLong; -import com.google.gson.Gson; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import cy.agorise.graphenej.*; - -/** - * Class used to encapsulate operations related to the ACCOUNT_UPDATE_OPERATION. - */ -public class AccountUpdateOperation extends BaseOperation { - public static final String KEY_ACCOUNT = "account"; - public static final String KEY_OWNER = "owner"; - public static final String KEY_ACTIVE = "active"; - public static final String KEY_FEE = "fee"; - public static final String KEY_NEW_OPTIONS = "new_options"; - public static final String KEY_EXTENSIONS = "extensions"; - - private AssetAmount fee; - private UserAccount account; - private Optional owner; - private Optional active; - private Optional new_options; - - /** - * Account update operation constructor. - * @param account User account to update. Can't be null. - * @param owner Owner authority to set. Can be null. - * @param active Active authority to set. Can be null. - * @param options Active authority to set. Can be null. - * @param fee The fee to pay. Can be null. - */ - public AccountUpdateOperation(UserAccount account, Authority owner, Authority active, AccountOptions options, AssetAmount fee){ - super(OperationType.ACCOUNT_UPDATE_OPERATION); - this.fee = fee; - this.account = account; - this.owner = new Optional<>(owner); - this.active = new Optional<>(active); - this.new_options = new Optional<>(options); - extensions = new Extensions(); - } - - public AccountUpdateOperation(UserAccount account, Authority owner, Authority active, AccountOptions options){ - this(account, owner, active, options, new AssetAmount(UnsignedLong.valueOf(0), new Asset("1.3.0"))); - } - - @Override - public void setFee(AssetAmount fee){ - this.fee = fee; - } - - public void setOwner(Authority owner){ - this.owner = new Optional<>(owner); - } - - public void setActive(Authority active){ - this.active = new Optional<>(active); - } - - public void setAccountOptions(AccountOptions options){ - this.new_options = new Optional<>(options); - } - - @Override - public String toJsonString() { - Gson gson = new Gson(); - return gson.toJson(this); - } - - @Override - public JsonElement toJsonObject() { - JsonArray array = new JsonArray(); - array.add(this.getId()); - - JsonObject accountUpdate = new JsonObject(); - accountUpdate.add(KEY_FEE, fee.toJsonObject()); - accountUpdate.addProperty(KEY_ACCOUNT, account.getObjectId()); - if(owner.isSet()) - accountUpdate.add(KEY_OWNER, owner.toJsonObject()); - if(active.isSet()) - accountUpdate.add(KEY_ACTIVE, active.toJsonObject()); - if(new_options.isSet()) - accountUpdate.add(KEY_NEW_OPTIONS, new_options.toJsonObject()); - accountUpdate.add(KEY_EXTENSIONS, extensions.toJsonObject()); - array.add(accountUpdate); - return array; - } - - @Override - public byte[] toBytes() { - byte[] feeBytes = fee.toBytes(); - byte[] accountBytes = account.toBytes(); - byte[] ownerBytes = owner.toBytes(); - byte[] activeBytes = active.toBytes(); - byte[] newOptionsBytes = new_options.toBytes(); - byte[] extensionBytes = extensions.toBytes(); - return Bytes.concat(feeBytes, accountBytes, ownerBytes, activeBytes, newOptionsBytes, extensionBytes); - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/operations/AccountUpdateOperationBuilder.java b/app/src/main/java/cy/agorise/graphenej/operations/AccountUpdateOperationBuilder.java deleted file mode 100644 index f0904e6..0000000 --- a/app/src/main/java/cy/agorise/graphenej/operations/AccountUpdateOperationBuilder.java +++ /dev/null @@ -1,59 +0,0 @@ -package cy.agorise.graphenej.operations; - -import cy.agorise.graphenej.*; -import cy.agorise.graphenej.errors.MalformedOperationException; - -/** - * Created by nelson on 3/1/17. - */ -public class AccountUpdateOperationBuilder extends BaseOperationBuilder { - private AssetAmount fee; - private UserAccount account; - private Authority owner; - private Authority active; - private AccountOptions new_options; - - public AccountUpdateOperationBuilder setFee(AssetAmount fee) { - this.fee = fee; - return this; - } - - public AccountUpdateOperationBuilder setAccount(UserAccount account) { - this.account = account; - return this; - } - - public AccountUpdateOperationBuilder setOwner(Authority owner) { - this.owner = owner; - return this; - } - - public AccountUpdateOperationBuilder setActive(Authority active) { - this.active = active; - return this; - } - - public AccountUpdateOperationBuilder setOptions(AccountOptions newOptions) { - this.new_options = newOptions; - return this; - } - - @Override - public AccountUpdateOperation build() { - AccountUpdateOperation operation; - if(this.account == null){ - throw new MalformedOperationException("This operation requires an account to be set"); - }else{ - if(owner != null || active != null || new_options != null){ - if(fee == null){ - operation = new AccountUpdateOperation(account, owner, active, new_options); - }else{ - operation = new AccountUpdateOperation(account, owner, active, new_options, fee); - } - }else{ - throw new MalformedOperationException("This operation requires at least either an authority or account options change"); - } - } - return operation; - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/operations/BaseOperationBuilder.java b/app/src/main/java/cy/agorise/graphenej/operations/BaseOperationBuilder.java deleted file mode 100644 index d2cd322..0000000 --- a/app/src/main/java/cy/agorise/graphenej/operations/BaseOperationBuilder.java +++ /dev/null @@ -1,17 +0,0 @@ -package cy.agorise.graphenej.operations; - -import cy.agorise.graphenej.BaseOperation; - -/** - * Base template for all operation-specific factory classes. - */ -public abstract class BaseOperationBuilder { - - /** - * Must be implemented and return the specific operation the - * factory is supposed to build. - * - * @return: A usable instance of a given operation. - */ - public abstract BaseOperation build(); -} diff --git a/app/src/main/java/cy/agorise/graphenej/operations/LimitOrderCancelOperation.java b/app/src/main/java/cy/agorise/graphenej/operations/LimitOrderCancelOperation.java deleted file mode 100644 index 7b5065e..0000000 --- a/app/src/main/java/cy/agorise/graphenej/operations/LimitOrderCancelOperation.java +++ /dev/null @@ -1,61 +0,0 @@ -package cy.agorise.graphenej.operations; - -import com.google.common.primitives.Bytes; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import cy.agorise.graphenej.*; - -/** - * Created by nelson on 3/21/17. - */ -public class LimitOrderCancelOperation extends BaseOperation { - - // Constants used in the JSON representation - public static final String KEY_FEE_PAYING_ACCOUNT = "fee_paying_account"; - public static final String KEY_ORDER_ID = "order"; - - - public LimitOrderCancelOperation(LimitOrder order, UserAccount feePayingAccount) { - super(OperationType.LIMIT_ORDER_CANCEL_OPERATION); - this.order = order; - this.feePayingAccount = feePayingAccount; - } - - // Inner fields of a limit order cancel operation - private AssetAmount fee; - private UserAccount feePayingAccount; - private LimitOrder order; - - @Override - public String toJsonString() { - return null; - } - - @Override - public JsonElement toJsonObject() { - JsonArray array = (JsonArray) super.toJsonObject(); - JsonObject jsonObject = new JsonObject(); - if(fee != null) - jsonObject.add(KEY_FEE, fee.toJsonObject()); - jsonObject.addProperty(KEY_FEE_PAYING_ACCOUNT, feePayingAccount.getObjectId()); - jsonObject.addProperty(KEY_ORDER_ID, order.getObjectId()); - jsonObject.add(KEY_EXTENSIONS, new JsonArray()); - array.add(jsonObject); - return array; - } - - @Override - public void setFee(AssetAmount assetAmount) { - this.fee = assetAmount; - } - - @Override - public byte[] toBytes() { - byte[] feeBytes = this.fee.toBytes(); - byte[] feePayingAccountBytes = this.feePayingAccount.toBytes(); - byte[] orderIdBytes = this.order.toBytes(); - byte[] extensions = this.extensions.toBytes(); - return Bytes.concat(feeBytes, feePayingAccountBytes, orderIdBytes, extensions); - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/operations/LimitOrderCreateOperation.java b/app/src/main/java/cy/agorise/graphenej/operations/LimitOrderCreateOperation.java deleted file mode 100644 index 64b2f9d..0000000 --- a/app/src/main/java/cy/agorise/graphenej/operations/LimitOrderCreateOperation.java +++ /dev/null @@ -1,233 +0,0 @@ -package cy.agorise.graphenej.operations; - -import com.google.common.primitives.Bytes; -import com.google.gson.JsonArray; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; - -import java.lang.reflect.Type; -import java.nio.ByteBuffer; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.TimeZone; - -import cy.agorise.graphenej.AssetAmount; -import cy.agorise.graphenej.BaseOperation; -import cy.agorise.graphenej.OperationType; -import cy.agorise.graphenej.UserAccount; -import cy.agorise.graphenej.Util; - -/** - * Operation used to denote the creation of a limit order on the blockchain. - * - * The blockchain will atempt to sell amount_to_sell.asset_id for as much min_to_receive.asset_id as possible. - * The fee will be paid by the seller's account. Market fees will apply as specified by the issuer of both the - * selling asset and the receiving asset as a percentage of the amount exchanged. - * - * If either the selling asset or the receiving asset is white list restricted, the order will only be created - * if the seller is on the white list of the restricted asset type. - * - * Market orders are matched in the order they are included in the block chain. - */ -public class LimitOrderCreateOperation extends BaseOperation { - // Number of bytes used for the expiration field. - private final int EXPIRATION_BYTE_LENGTH = 4; - - // Constants used in the JSON representation - public static final String KEY_SELLER = "seller"; - public static final String KEY_AMOUNT_TO_SELL = "amount_to_sell"; - public static final String KEY_MIN_TO_RECEIVE = "min_to_receive"; - public static final String KEY_EXPIRATION = "expiration"; - public static final String KEY_FILL_OR_KILL = "fill_or_kill"; - - // Inner fields of a limit order - private AssetAmount fee; - private UserAccount seller; - private AssetAmount amountToSell; - private AssetAmount minToReceive; - private int expiration; - private boolean fillOrKill; - - /** - * @param seller: Id of the seller - * @param toSell: Id of the asset to sell - * @param minToReceive: The minimum amount of the asset to receive - * @param expiration: Expiration in seconds - * @param fillOrKill: If this flag is set the entire order must be filled or the operation is rejected. - */ - public LimitOrderCreateOperation(UserAccount seller, AssetAmount toSell, AssetAmount minToReceive, int expiration, boolean fillOrKill){ - super(OperationType.LIMIT_ORDER_CREATE_OPERATION); - this.seller = seller; - this.amountToSell = toSell; - this.minToReceive = minToReceive; - this.expiration = expiration; - this.fillOrKill = fillOrKill; - } - - @Override - public String toJsonString() { - return null; - } - - @Override - public JsonElement toJsonObject() { - JsonArray array = (JsonArray) super.toJsonObject(); - JsonObject jsonObject = new JsonObject(); - if(fee != null) - jsonObject.add(KEY_FEE, fee.toJsonObject()); - jsonObject.addProperty(KEY_SELLER, seller.getObjectId()); - jsonObject.add(KEY_AMOUNT_TO_SELL, amountToSell.toJsonObject()); - jsonObject.add(KEY_MIN_TO_RECEIVE, minToReceive.toJsonObject()); - - SimpleDateFormat simpleDateFormat = new SimpleDateFormat(Util.TIME_DATE_FORMAT); - simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); - - jsonObject.addProperty(KEY_EXPIRATION, simpleDateFormat.format(new Date(((long) expiration) * 1000))); - jsonObject.addProperty(KEY_FILL_OR_KILL, this.fillOrKill ? "true" : "false"); - jsonObject.add(KEY_EXTENSIONS, new JsonArray()); - array.add(jsonObject); - return array; - } - - @Override - public void setFee(AssetAmount assetAmount) { - this.fee = assetAmount; - } - - public AssetAmount getFee(){ return this.fee; } - - public UserAccount getSeller() { - return seller; - } - - public void setSeller(UserAccount seller) { - this.seller = seller; - } - - public AssetAmount getAmountToSell() { - return amountToSell; - } - - public void setAmountToSell(AssetAmount amountToSell) { - this.amountToSell = amountToSell; - } - - public AssetAmount getMinToReceive() { - return minToReceive; - } - - public void setMinToReceive(AssetAmount minToReceive) { - this.minToReceive = minToReceive; - } - - public int getExpiration() { - return expiration; - } - - public void setExpiration(int expiration) { - this.expiration = expiration; - } - - public boolean isFillOrKill() { - return fillOrKill; - } - - public void setFillOrKill(boolean fillOrKill) { - this.fillOrKill = fillOrKill; - } - - @Override - public byte[] toBytes() { - byte[] feeBytes = this.fee.toBytes(); - byte[] sellerBytes = this.seller.toBytes(); - byte[] amountBytes = this.amountToSell.toBytes(); - byte[] minAmountBytes = this.minToReceive.toBytes(); - - ByteBuffer buffer = ByteBuffer.allocate(EXPIRATION_BYTE_LENGTH); - buffer.putInt(this.expiration); - byte[] expirationBytes = Util.revertBytes(buffer.array()); - - byte[] fillOrKill = this.fillOrKill ? new byte[]{ 0x1 } : new byte[]{ 0x0 }; - byte[] extensions = this.extensions.toBytes(); - - return Bytes.concat(feeBytes, sellerBytes, amountBytes, minAmountBytes, expirationBytes, fillOrKill, extensions); - } - - /** - * Deserializer used to convert the JSON-formatted representation of a limit_order_create_operation - * into its java object version. - * - * The following is an example of the serialized form of this operation: - * - * [ - * 1, - * { - * "fee": { - * "amount": 14676, - * "asset_id": "1.3.0" - * }, - * "seller": "1.2.36449", - * "amount_to_sell": { - * "amount": 945472, - * "asset_id": "1.3.850" - * }, - * "min_to_receive": { - * "amount": 4354658, - * "asset_id": "1.3.861" - * }, - * "expiration": "1963-11-25T06:31:44", - * "fill_or_kill": false, - * "extensions": [] - * } - * ] - * - * - */ - public static class LimitOrderCreateDeserializer implements JsonDeserializer { - - @Override - public LimitOrderCreateOperation deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - if(json.isJsonArray()){ - // This block is used just to check if we are in the first step of the deserialization - // when we are dealing with an array. - JsonArray serializedTransfer = json.getAsJsonArray(); - if(serializedTransfer.get(0).getAsInt() != OperationType.LIMIT_ORDER_CREATE_OPERATION.ordinal()){ - // If the operation type does not correspond to a transfer operation, we return null - return null; - }else{ - // Calling itself recursively, this is only done once, so there will be no problems. - return context.deserialize(serializedTransfer.get(1), LimitOrderCreateOperation.class); - } - }else{ - // This block is called in the second recursion and takes care of deserializing the - // limit order data itself. - JsonObject jsonObject = json.getAsJsonObject(); - - AssetAmount fee = context.deserialize(jsonObject.get(KEY_FEE), AssetAmount.class); - UserAccount seller = context.deserialize(jsonObject.get(KEY_SELLER), UserAccount.class); - AssetAmount amountToSell = context.deserialize(jsonObject.get(KEY_AMOUNT_TO_SELL), AssetAmount.class); - AssetAmount minToReceive = context.deserialize(jsonObject.get(KEY_MIN_TO_RECEIVE), AssetAmount.class); - String expiration = jsonObject.get(KEY_EXPIRATION).getAsString(); - boolean fillOrKill = jsonObject.get(KEY_FILL_OR_KILL).getAsBoolean(); - - SimpleDateFormat simpleDateFormat = new SimpleDateFormat(Util.TIME_DATE_FORMAT); - int expirationPosix = 0; - try { - Date expirationDate = simpleDateFormat.parse(expiration); - expirationPosix = (int) (expirationDate.getTime() / 1000); - } catch (ParseException e) { - e.printStackTrace(); - } - - // Creating an instance of the LimitOrderCreateOperation and setting the fee - LimitOrderCreateOperation operation = new LimitOrderCreateOperation(seller, amountToSell, minToReceive, expirationPosix, fillOrKill); - operation.setFee(fee); - return operation; - } - } - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/operations/TransferOperation.java b/app/src/main/java/cy/agorise/graphenej/operations/TransferOperation.java deleted file mode 100644 index 0988640..0000000 --- a/app/src/main/java/cy/agorise/graphenej/operations/TransferOperation.java +++ /dev/null @@ -1,205 +0,0 @@ -package cy.agorise.graphenej.operations; - -import com.google.common.primitives.Bytes; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonArray; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.JsonSerializationContext; -import com.google.gson.JsonSerializer; - -import java.lang.reflect.Type; - -import cy.agorise.graphenej.AssetAmount; -import cy.agorise.graphenej.BaseOperation; -import cy.agorise.graphenej.OperationType; -import cy.agorise.graphenej.UserAccount; -import cy.agorise.graphenej.objects.Memo; - -/** - * Class used to encapsulate the TransferOperation operation related functionalities. - */ -public class TransferOperation extends BaseOperation { - public static final String KEY_AMOUNT = "amount"; - public static final String KEY_FROM = "from"; - public static final String KEY_TO = "to"; - public static final String KEY_MEMO = "memo"; - - private AssetAmount fee; - private AssetAmount amount; - private UserAccount from; - private UserAccount to; - private Memo memo; - - public TransferOperation(UserAccount from, UserAccount to, AssetAmount transferAmount, AssetAmount fee){ - super(OperationType.TRANSFER_OPERATION); - this.from = from; - this.to = to; - this.amount = transferAmount; - this.fee = fee; - this.memo = new Memo(); - } - - public TransferOperation(UserAccount from, UserAccount to, AssetAmount transferAmount){ - super(OperationType.TRANSFER_OPERATION); - this.from = from; - this.to = to; - this.amount = transferAmount; - this.memo = new Memo(); - } - - public UserAccount getFrom(){ - return this.from; - } - - public UserAccount getTo(){ - return this.to; - } - - public AssetAmount getAssetAmount(){ - return this.amount; - } - - public AssetAmount getFee(){ - return this.fee; - } - - public void setAssetAmount(AssetAmount assetAmount){ - this.amount = assetAmount; - } - - public void setFrom(UserAccount from) { - this.from = from; - } - - public void setTo(UserAccount to) { - this.to = to; - } - - public void setMemo(Memo memo) { - this.memo = memo; - } - - public Memo getMemo() { - return this.memo; - } - - @Override - public void setFee(AssetAmount newFee){ - this.fee = newFee; - } - - @Override - public byte[] toBytes() { - byte[] feeBytes = fee.toBytes(); - byte[] fromBytes = from.toBytes(); - byte[] toBytes = to.toBytes(); - byte[] amountBytes = amount.toBytes(); - byte[] memoBytes = memo.toBytes(); - byte[] extensions = this.extensions.toBytes(); - return Bytes.concat(feeBytes, fromBytes, toBytes, amountBytes, memoBytes, extensions); - } - - @Override - public String toJsonString() { - //TODO: Evaluate using simple Gson class to return a simple string representation and drop the TransferSerializer class - GsonBuilder gsonBuilder = new GsonBuilder(); - gsonBuilder.registerTypeAdapter(TransferOperation.class, new TransferSerializer()); - return gsonBuilder.create().toJson(this); - } - - @Override - public JsonElement toJsonObject() { - JsonArray array = new JsonArray(); - array.add(this.getId()); - JsonObject jsonObject = new JsonObject(); - if(fee != null) - jsonObject.add(KEY_FEE, fee.toJsonObject()); - jsonObject.addProperty(KEY_FROM, from.getObjectId()); - jsonObject.addProperty(KEY_TO, to.getObjectId()); - jsonObject.add(KEY_AMOUNT, amount.toJsonObject()); - jsonObject.add(KEY_MEMO, memo.toJsonObject()); - jsonObject.add(KEY_EXTENSIONS, new JsonArray()); - array.add(jsonObject); - return array; - } - - public static class TransferSerializer implements JsonSerializer { - - @Override - public JsonElement serialize(TransferOperation transfer, Type type, JsonSerializationContext jsonSerializationContext) { - JsonArray arrayRep = new JsonArray(); - arrayRep.add(transfer.getId()); - arrayRep.add(transfer.toJsonObject()); - return arrayRep; - } - } - - /** - * This deserializer will work on any transfer operation serialized in the 'array form' used a lot in - * the Graphene Blockchain API. - * - * An example of this serialized form is the following: - * - * [ - * 0, - * { - * "fee": { - * "amount": 264174, - * "asset_id": "1.3.0" - * }, - * "from": "1.2.138632", - * "to": "1.2.129848", - * "amount": { - * "amount": 100, - * "asset_id": "1.3.0" - * }, - * "extensions": [] - * } - * ] - * - * It will convert this data into a nice TransferOperation object. - */ - public static class TransferDeserializer implements JsonDeserializer { - - @Override - public TransferOperation deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - if(json.isJsonArray()){ - // This block is used just to check if we are in the first step of the deserialization - // when we are dealing with an array. - JsonArray serializedTransfer = json.getAsJsonArray(); - if(serializedTransfer.get(0).getAsInt() != OperationType.TRANSFER_OPERATION.ordinal()){ - // If the operation type does not correspond to a transfer operation, we return null - return null; - }else{ - // Calling itself recursively, this is only done once, so there will be no problems. - return context.deserialize(serializedTransfer.get(1), TransferOperation.class); - } - }else{ - // This block is called in the second recursion and takes care of deserializing the - // transfer data itself. - JsonObject jsonObject = json.getAsJsonObject(); - - // Deserializing AssetAmount objects - AssetAmount amount = context.deserialize(jsonObject.get(KEY_AMOUNT), AssetAmount.class); - AssetAmount fee = context.deserialize(jsonObject.get(KEY_FEE), AssetAmount.class); - - // Deserializing UserAccount objects - UserAccount from = new UserAccount(jsonObject.get(KEY_FROM).getAsString()); - UserAccount to = new UserAccount(jsonObject.get(KEY_TO).getAsString()); - TransferOperation transfer = new TransferOperation(from, to, amount, fee); - - // If the transfer had a memo, deserialize it - if(jsonObject.has(KEY_MEMO)){ - Memo memo = context.deserialize(jsonObject.get(KEY_MEMO), Memo.class); - transfer.setMemo(memo); - } - - return transfer; - } - } - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/operations/TransferOperationBuilder.java b/app/src/main/java/cy/agorise/graphenej/operations/TransferOperationBuilder.java deleted file mode 100644 index 709589b..0000000 --- a/app/src/main/java/cy/agorise/graphenej/operations/TransferOperationBuilder.java +++ /dev/null @@ -1,63 +0,0 @@ -package cy.agorise.graphenej.operations; - -import cy.agorise.graphenej.AssetAmount; -import cy.agorise.graphenej.UserAccount; -import cy.agorise.graphenej.errors.MalformedOperationException; -import cy.agorise.graphenej.objects.Memo; - -/** - * Factory class used to build a transfer operation - */ -public class TransferOperationBuilder extends BaseOperationBuilder { - private UserAccount from; - private UserAccount to; - private AssetAmount transferAmount; - private AssetAmount fee; - private Memo memo; - - public TransferOperationBuilder setSource(UserAccount from) { - this.from = from; - return this; - } - - public TransferOperationBuilder setDestination(UserAccount to) { - this.to = to; - return this; - } - - public TransferOperationBuilder setTransferAmount(AssetAmount transferAmount) { - this.transferAmount = transferAmount; - return this; - } - - public TransferOperationBuilder setFee(AssetAmount fee) { - this.fee = fee; - return this; - } - - public TransferOperationBuilder setMemo(Memo memo) { - this.memo = memo; - return this; - } - - @Override - public TransferOperation build(){ - TransferOperation transferOperation; - if(from == null ){ - throw new MalformedOperationException("Missing source account information"); - }else if(to == null){ - throw new MalformedOperationException("Missing destination account information"); - }else if(transferAmount == null){ - throw new MalformedOperationException("Missing transfer amount information"); - } - if(fee != null){ - transferOperation = new TransferOperation(from, to, transferAmount, fee); - }else{ - transferOperation = new TransferOperation(from, to, transferAmount); - } - if(memo != null){ - transferOperation.setMemo(this.memo); - } - return transferOperation; - } -} diff --git a/app/src/main/java/cy/agorise/graphenej/test/NaiveSSLContext.java b/app/src/main/java/cy/agorise/graphenej/test/NaiveSSLContext.java deleted file mode 100644 index ac7c9a3..0000000 --- a/app/src/main/java/cy/agorise/graphenej/test/NaiveSSLContext.java +++ /dev/null @@ -1,126 +0,0 @@ -package cy.agorise.graphenej.test; - -/* - * Copyright (C) 2015 Neo Visionaries Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, - * either express or implied. See the License for the specific - * language governing permissions and limitations under the - * License. - */ -import java.security.KeyManagementException; -import java.security.NoSuchAlgorithmException; -import java.security.NoSuchProviderException; -import java.security.Provider; -import java.security.cert.X509Certificate; -import javax.net.ssl.SSLContext; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; - - -/** - * A factory class which creates an {@link SSLContext} that - * naively accepts all certificates without verification. - * - *
- * // Create an SSL context that naively accepts all certificates.
- * SSLContext context = NaiveSSLContext.getInstance("TLS");
- *
- * // Create a socket factory from the SSL context.
- * SSLSocketFactory factory = context.getSocketFactory();
- *
- * // Create a socket from the socket factory.
- * SSLSocket socket = factory.createSocket("www.example.com", 443);
- * 
- * - * @author Takahiko Kawasaki - */ -public class NaiveSSLContext -{ - private NaiveSSLContext() - { - } - - - /** - * Get an SSLContext that implements the specified secure - * socket protocol and naively accepts all certificates - * without verification. - */ - public static SSLContext getInstance(String protocol) throws NoSuchAlgorithmException - { - return init(SSLContext.getInstance(protocol)); - } - - - /** - * Get an SSLContext that implements the specified secure - * socket protocol and naively accepts all certificates - * without verification. - */ - public static SSLContext getInstance(String protocol, Provider provider) throws NoSuchAlgorithmException - { - return init(SSLContext.getInstance(protocol, provider)); - } - - - /** - * Get an SSLContext that implements the specified secure - * socket protocol and naively accepts all certificates - * without verification. - */ - public static SSLContext getInstance(String protocol, String provider) throws NoSuchAlgorithmException, NoSuchProviderException - { - return init(SSLContext.getInstance(protocol, provider)); - } - - - /** - * Set NaiveTrustManager to the given context. - */ - private static SSLContext init(SSLContext context) - { - try - { - // Set NaiveTrustManager. - context.init(null, new TrustManager[] { new NaiveTrustManager() }, null); - } - catch (KeyManagementException e) - { - throw new RuntimeException("Failed to initialize an SSLContext.", e); - } - - return context; - } - - - /** - * A {@link TrustManager} which trusts all certificates naively. - */ - private static class NaiveTrustManager implements X509TrustManager - { - @Override - public X509Certificate[] getAcceptedIssuers() - { - return null; - } - - - public void checkClientTrusted(X509Certificate[] certs, String authType) - { - } - - - public void checkServerTrusted(X509Certificate[] certs, String authType) - { - } - } -} \ No newline at end of file