diff --git a/build.gradle b/build.gradle index 48861fc..9246999 100644 --- a/build.gradle +++ b/build.gradle @@ -2,19 +2,30 @@ plugins { id 'java-library' id 'maven-publish' id "org.gradle.test-retry" version "1.5.10" + id "io.sentry.jvm.gradle" version "4.11.0" } group 'org.torusresearch' version '4.0.0' -sourceCompatibility = JavaVersion.VERSION_1_8 -targetCompatibility = JavaVersion.VERSION_1_8 +sourceCompatibility = JavaVersion.VERSION_11 +targetCompatibility = JavaVersion.VERSION_11 repositories { mavenCentral() maven { url 'https://jitpack.io' } } +sentry { + // Generates a JVM (Java, Kotlin, etc.) source bundle and uploads your source code to Sentry. + // This enables source context, allowing you to see your source + // code as part of your stack traces in Sentry. + includeSourceContext = true + + org = "torus" + projectName = "torus-utils-java" +} + dependencies { implementation 'org.torusresearch:fetch-node-details-java:5.0.0' implementation 'org.web3j:core:4.8.8-android' diff --git a/jitpack.yml b/jitpack.yml new file mode 100644 index 0000000..46c8529 --- /dev/null +++ b/jitpack.yml @@ -0,0 +1,2 @@ +jdk: + - openjdk11 \ No newline at end of file diff --git a/src/main/java/org/torusresearch/torusutils/TorusUtils.java b/src/main/java/org/torusresearch/torusutils/TorusUtils.java index a5d4931..c81e870 100644 --- a/src/main/java/org/torusresearch/torusutils/TorusUtils.java +++ b/src/main/java/org/torusresearch/torusutils/TorusUtils.java @@ -6,6 +6,7 @@ import org.jetbrains.annotations.NotNull; import org.torusresearch.fetchnodedetails.types.TorusNodePub; import org.torusresearch.fetchnodedetails.types.Web3AuthNetwork; +import org.torusresearch.torusutils.analytics.SentryUtils; import org.torusresearch.torusutils.apis.APIUtils; import org.torusresearch.torusutils.apis.JsonRPCErrorInfo; import org.torusresearch.torusutils.apis.requests.GetMetadataParams; @@ -53,6 +54,7 @@ public class TorusUtils { { setupBouncyCastle(); + SentryUtils.init(); } public TorusUtils(TorusOptions options) throws TorusUtilError { diff --git a/src/main/java/org/torusresearch/torusutils/analytics/SentryUtils.java b/src/main/java/org/torusresearch/torusutils/analytics/SentryUtils.java new file mode 100644 index 0000000..7f30329 --- /dev/null +++ b/src/main/java/org/torusresearch/torusutils/analytics/SentryUtils.java @@ -0,0 +1,41 @@ +package org.torusresearch.torusutils.analytics; + +import io.sentry.Sentry; + +public class SentryUtils { + + public static void init() { + Sentry.init(options -> { + options.setDsn("https://bff95fa0489909b1f269f3bd099e3c6d@o503538.ingest.us.sentry.io/4507960706990080"); + options.setDebug(true); + }); + } + + // Capture an exception + public static void captureException(String msg) { + Sentry.captureException(new Exception(msg)); + } + + public static void addBreadcrumb(String message) { + Sentry.addBreadcrumb(message); + } + + public static void logInformation(String clientId, String finalEvmAddress, String platform) { + Sentry.configureScope(scope -> { + scope.setTag("clientId", clientId); + scope.setTag("finalEvmAddress", finalEvmAddress); + scope.setTag("platform", platform); + }); + } + + public static void setContext(String key, String value) { + Sentry.configureScope(scope -> { + scope.setExtra(key, value); + }); + } + + public static void close() { + Sentry.close(); + } +} + diff --git a/src/main/java/org/torusresearch/torusutils/helpers/KeyUtils.java b/src/main/java/org/torusresearch/torusutils/helpers/KeyUtils.java index e80de63..131214e 100644 --- a/src/main/java/org/torusresearch/torusutils/helpers/KeyUtils.java +++ b/src/main/java/org/torusresearch/torusutils/helpers/KeyUtils.java @@ -1,5 +1,7 @@ package org.torusresearch.torusutils.helpers; + import com.google.gson.Gson; + import org.bouncycastle.crypto.ec.CustomNamedCurves; import org.bouncycastle.crypto.params.ECDomainParameters; import org.bouncycastle.crypto.params.ECPrivateKeyParameters; diff --git a/src/main/java/org/torusresearch/torusutils/helpers/NodeUtils.java b/src/main/java/org/torusresearch/torusutils/helpers/NodeUtils.java index 9310030..dd09c16 100644 --- a/src/main/java/org/torusresearch/torusutils/helpers/NodeUtils.java +++ b/src/main/java/org/torusresearch/torusutils/helpers/NodeUtils.java @@ -12,6 +12,7 @@ import org.jetbrains.annotations.Nullable; import org.torusresearch.fetchnodedetails.types.Web3AuthNetwork; import org.torusresearch.torusutils.TorusUtils; +import org.torusresearch.torusutils.analytics.SentryUtils; import org.torusresearch.torusutils.apis.APIUtils; import org.torusresearch.torusutils.apis.JsonRPCErrorInfo; import org.torusresearch.torusutils.apis.JsonRPCResponse; @@ -536,6 +537,8 @@ public static TorusKey retrieveOrImportShare(@NotNull String legacyMetadataHost, isUpgraded = metadataNonce.equals(BigInteger.ZERO); } + SentryUtils.logInformation(clientId, finalEvmAddress, "torus-utils-java"); + return new TorusKey( new FinalKeyData(finalEvmAddress, finalPubKeyCoords[0], finalPubKeyCoords[1], finalPrivKey), new OAuthKeyData(oAuthKeyAddress, oAuthPublicKeyCoords[0], oAuthPublicKeyCoords[1], oAuthKey), diff --git a/src/main/java/org/torusresearch/torusutils/helpers/TorusUtilError.java b/src/main/java/org/torusresearch/torusutils/helpers/TorusUtilError.java index 50befb6..dd8ee0b 100644 --- a/src/main/java/org/torusresearch/torusutils/helpers/TorusUtilError.java +++ b/src/main/java/org/torusresearch/torusutils/helpers/TorusUtilError.java @@ -1,6 +1,7 @@ package org.torusresearch.torusutils.helpers; import org.jetbrains.annotations.NotNull; +import org.torusresearch.torusutils.analytics.SentryUtils; public class TorusUtilError extends Exception { @@ -16,22 +17,23 @@ public class TorusUtilError extends Exception { public static final TorusUtilError INVALID_KEY_SIZE = new TorusUtilError("Invalid key size. Expected 32 bytes"); public static final TorusUtilError INVALID_PUB_KEY_SIZE = new TorusUtilError("Invalid key size. Expected 64 bytes"); public static final TorusUtilError INVALID_INPUT = new TorusUtilError("Input was found to be invalid"); - - public static TorusUtilError RUNTIME_ERROR(@NotNull String msg) { - return new TorusUtilError(msg); - } public static final TorusUtilError RETRIEVE_OR_IMPORT_SHARE_ERROR = new TorusUtilError("retrieve or import share failed"); public static final TorusUtilError METADATA_NONCE_MISSING = new TorusUtilError("Unable to fetch metadata nonce"); public static final TorusUtilError GATING_ERROR = new TorusUtilError("could not process request"); public static final TorusUtilError PUB_NONCE_MISSING = new TorusUtilError("public nonce is missing"); - private final String message; - public TorusUtilError(@NotNull String message) { super(message); + SentryUtils.captureException(message); this.message = message; } + private final String message; + + public static TorusUtilError RUNTIME_ERROR(@NotNull String msg) { + return new TorusUtilError(msg); + } + @Override public String toString() { return message;