diff --git a/pom.xml b/pom.xml
index 22e388fa930771dd22ad63182e0263c14db04a19..5885804ea4f387a935f5dfe0cba383be6b843e96 100644
--- a/pom.xml
+++ b/pom.xml
@@ -29,6 +29,27 @@
             <version>8.0.33</version> 
         </dependency>
 
+        <dependency>
+            <groupId>com.sun.net.httpserver</groupId>
+            <artifactId>http</artifactId>
+            <version>20070405</version>
+        </dependency>
+
+
+       <!-- https://mvnrepository.com/artifact/javax.xml.ws/jaxws-api -->
+        <dependency>
+            <groupId>javax.xml.ws</groupId>
+            <artifactId>jaxws-api</artifactId>
+            <version>2.2</version>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/javainetlocator/inetaddresslocator -->
+        <dependency>
+            <groupId>javainetlocator</groupId>
+            <artifactId>inetaddresslocator</artifactId>
+            <version>2.18</version>
+        </dependency>
+
     </dependencies>
 
     <build>
diff --git a/src/main/java/org/example/model/Log.java b/src/main/java/org/example/model/Log.java
new file mode 100644
index 0000000000000000000000000000000000000000..c5949e79174ec32f95e836506a6a32d5d97ed6c1
--- /dev/null
+++ b/src/main/java/org/example/model/Log.java
@@ -0,0 +1,24 @@
+package org.example.model;
+
+import org.example.core.Database;
+import java.sql.Statement;
+
+
+public class Log extends Database {
+    public Log() {
+        super();
+      }
+
+    public String InsertLog(String deskripsi, String ipaddr, String endpoint) {
+    try {
+        Statement statement = this.connection.createStatement();
+        String query = "INSERT INTO soap_log (description, ip_address, endpoint) VALUES ('" + deskripsi + "', '" + ipaddr + "', '" + endpoint + "')";
+        statement.executeUpdate(query);
+    } catch (Exception e) {
+        e.printStackTrace();
+        return "Failed inserting log";
+    }
+    return "Successfully inserting log";
+    }
+    
+}
diff --git a/src/main/java/org/example/service/ChallengeServiceImpl.java b/src/main/java/org/example/service/ChallengeServiceImpl.java
index 39ea856ce8dcf64e3820525c2df158c9436c49e4..a277185b85753bd49085b2533a5c8205bd3a6d5e 100644
--- a/src/main/java/org/example/service/ChallengeServiceImpl.java
+++ b/src/main/java/org/example/service/ChallengeServiceImpl.java
@@ -1,19 +1,51 @@
 
 package org.example.service;
 
+import javax.annotation.Resource;
 import javax.jws.WebService;
+import javax.xml.ws.EndpointReference;
+import javax.xml.ws.WebServiceContext;
+import javax.xml.ws.handler.MessageContext;
 import javax.jws.WebMethod;
 
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.xml.internal.ws.developer.JAXWSProperties;
 import org.example.model.Challenge;
 import org.example.model.ChallengeDAOImpl;
 import org.example.core.Database;
+import org.example.model.Log;
+import org.w3c.dom.Element;
+import java.security.Principal;
 
 @WebService
 public class ChallengeServiceImpl implements ChallengeService {
+
+    @Resource
+    public WebServiceContext wsContext;
+
     @Override
     @WebMethod
     public Challenge getChallengeById(int id) {
         ChallengeDAOImpl challengeDAO = new ChallengeDAOImpl();
+        log("Get challenge by id");
         return challengeDAO.findById(id);
     }
+
+    public void log(String description) {
+        try {
+            MessageContext msgContext = wsContext.getMessageContext();
+            HttpExchange httpExchange = (HttpExchange) msgContext.get("com.sun.xml.internal.ws.http.exchange");
+            String ip = httpExchange.getRemoteAddress().getAddress().getHostAddress();
+            String endpoint = httpExchange.getRequestURI().toString();
+            System.out.println(ip);
+            System.out.println(endpoint);
+            Log log = new Log();
+            String apiKey = httpExchange.getRequestHeaders().getFirst("X-API-Key");
+            String desc = apiKey + ": " + description;
+           log.InsertLog(desc, ip, endpoint);
+        } catch (Exception e) {
+           System.out.println("Internal Server Error: " + e.getMessage());
+        }
+    }
+
 }
\ No newline at end of file
diff --git a/src/main/java/org/example/service/TopupService.java b/src/main/java/org/example/service/TopupService.java
new file mode 100644
index 0000000000000000000000000000000000000000..407f9108be20180314f930bccd4ff80f787f6266
--- /dev/null
+++ b/src/main/java/org/example/service/TopupService.java
@@ -0,0 +1,18 @@
+
+package org.example.service;
+
+import javax.jws.WebMethod;
+import javax.jws.WebParam;
+import javax.jws.WebService;
+import javax.jws.soap.SOAPBinding;
+import javax.jws.soap.SOAPBinding.ParameterStyle;
+import javax.jws.soap.SOAPBinding.Style;
+
+@WebService
+@SOAPBinding(style = Style.DOCUMENT, parameterStyle = ParameterStyle.WRAPPED)
+public interface TopupService {
+	@WebMethod
+	public int topupPoint (
+			@WebParam(name = "userId", targetNamespace = "http://service.example.org/") int userId,
+			@WebParam(name = "cost", targetNamespace = "http://service.example.org/") int cost);
+}
diff --git a/src/main/java/org/example/service/TopupServiceImpl.java b/src/main/java/org/example/service/TopupServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..2547d346405afa34986fc3a6132f89419e97bfad
--- /dev/null
+++ b/src/main/java/org/example/service/TopupServiceImpl.java
@@ -0,0 +1,79 @@
+
+package org.example.service;
+
+import javax.annotation.Resource;
+import javax.jws.WebService;
+import javax.xml.ws.WebServiceContext;
+import javax.xml.ws.handler.MessageContext;
+import com.sun.net.httpserver.HttpExchange;
+
+
+import com.sun.xml.internal.ws.developer.JAXWSProperties;
+import org.example.model.Challenge;
+import org.example.model.ChallengeDAOImpl;
+import org.example.core.Database;
+import org.example.model.Log;
+import org.w3c.dom.Element;
+import java.security.Principal;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.Statement;
+
+@WebService
+public class TopupServiceImpl implements TopupService {
+
+    @Resource
+    public WebServiceContext wsContext;
+
+   public Boolean checkApiKey() {
+       String[] API_KEYS = { "test" };
+       MessageContext msgContext = wsContext.getMessageContext();
+       HttpExchange httpExchange = (HttpExchange) msgContext.get("com.sun.xml.internal.ws.http.exchange");
+       String apiKey = httpExchange.getRequestHeaders().getFirst("X-API-Key");
+       if (apiKey == null) {
+         return false;
+       } else if (apiKey.equals(API_KEYS[0]) || apiKey.equals(API_KEYS[1]) || apiKey.equals(API_KEYS[2])
+           || apiKey.equals(API_KEYS[3])) {
+         return true;
+       } else {
+         return false;
+       }
+   }
+
+   public void log(String description) {
+    try {
+        MessageContext msgContext = wsContext.getMessageContext();
+        HttpExchange httpExchange = (HttpExchange) msgContext.get("com.sun.xml.internal.ws.http.exchange");
+        String ip = httpExchange.getRemoteAddress().getAddress().getHostAddress();
+        String endpoint = httpExchange.getRequestURI().toString();
+        System.out.println(ip);
+        System.out.println(endpoint);
+        Log log = new Log();
+        String apiKey = httpExchange.getRequestHeaders().getFirst("X-API-Key");
+        String desc = apiKey + ": " + description;
+       log.InsertLog(desc, ip, endpoint);
+    } catch (Exception e) {
+       System.out.println("Internal Server Error: " + e.getMessage());
+    }
+}
+
+
+    @Override
+    public int topupPoint(int userId, int cost) {
+        Database db = new Database();
+        Connection connection = db.getConnection();
+        try {
+            Statement statement = connection.createStatement();
+            String query = "SELECT";
+            ResultSet result = statement.executeQuery(query);
+            log("topup point");
+                return 1;
+        } catch (Exception e) {
+            e.printStackTrace();
+            log("Error creating subscription");
+            return 0;
+        }
+    }
+
+    
+}
\ No newline at end of file