Skip to content

Commit

Permalink
[Feat] nft 발행 코드 개발
Browse files Browse the repository at this point in the history
  • Loading branch information
yerim216 committed Nov 15, 2023
1 parent cbadc50 commit 54993f2
Show file tree
Hide file tree
Showing 8 changed files with 596 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
application.yml
HELP.md
.gradle
build/
Expand Down
5 changes: 5 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ dependencies {

// swagger
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0")

//web3j
implementation 'org.web3j:core:4.9.6'


}

tasks.named('test') {
Expand Down
428 changes: 428 additions & 0 deletions src/main/java/zerobibim/flory/domain/contract/NFT.java

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package zerobibim.flory.domain.contract.controller;

import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import zerobibim.flory.domain.contract.NFT;
import zerobibim.flory.domain.contract.NFT.*;

import java.math.BigInteger;

@RestController
@RequestMapping("/api/nft")
public class NftController {
private final NFT nft;

@Autowired
public NftController(NFT nft) {
this.nft = nft;
}

// Define your API endpoints here
@PostMapping("/mint")
public String mintToken(@RequestParam String to, @RequestParam BigInteger tokenId, @RequestParam String uri) {
try {
// Mint a new token
return "Token minted successfully";
} catch (Exception e) {
// Handle exceptions appropriately (e.g., log the error)
return "Error minting token: " + e.getMessage();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package zerobibim.flory.domain.contract.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

public class NFTRequestDto {
@Getter
@NoArgsConstructor
@AllArgsConstructor
public static class MemberNFTInfo {
private String walletAddress;
private String ipfsUrl;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package zerobibim.flory.domain.contract.service;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import okhttp3.*;

import java.io.IOException;

public class IPFSPhotoService {
public String insertIpfs(Long memberPhotoId) throws IOException {
MemberPhoto memberPhoto = memberPhotoRepository.findById(memberPhotoId).orElseThrow();

OkHttpClient client = new OkHttpClient();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"pinataContent\":{\"name\": \"" +memberPhoto.getName() + "\""
+ ",\"description\":\"" + memberPhoto.getDescription() + "\",\"image\":\"" + memberPhoto.getImageUrl() + "\"}}");

Request request = new Request.Builder()
.url("https://api.pinata.cloud/pinning/pinJSONToIPFS")
.post(body)
.addHeader("Authorization", PINATA_JWT)
.addHeader("accept", "application/json")
.addHeader("content-type", "application/json")
.build();

ResponseBody responsebody = client.newCall(request).execute().body();
ObjectMapper mapper = new ObjectMapper();
assert responsebody != null;
JsonNode jsonNode = mapper.readTree(responsebody.byteStream());
return jsonNode.get("IpfsHash").asText();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package zerobibim.flory.domain.contract.service;

import org.springframework.beans.factory.annotation.Value;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.web3j.abi.EventEncoder;
import org.web3j.abi.datatypes.generated.Uint256;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.core.DefaultBlockParameter;
import org.web3j.protocol.core.DefaultBlockParameterName;
import org.web3j.protocol.core.methods.response.*;
import zerobibim.flory.domain.contract.NFT;
import zerobibim.flory.domain.contract.dto.NFTRequestDto;

import java.math.BigInteger;
import java.util.Arrays;
import java.util.concurrent.ExecutionException;

@Slf4j
@RequiredArgsConstructor
@Service("web3jService")
public class Web3jService {

private final NFT nft;

public TransactionReceipt nftCreate(NFTRequestDto.MemberNFTInfo memberNFTInfo) throws Exception {

return nft.mint(memberNFTInfo.getWalletAddress(), "ipfs://" +)
.sendAsync()
.get();
}

}
47 changes: 47 additions & 0 deletions src/main/java/zerobibim/flory/global/config/Web3jConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package zerobibim.flory.global.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.web3j.crypto.Credentials;
import org.web3j.crypto.ECKeyPair;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.http.HttpService;
import org.web3j.tx.Contract;
import org.web3j.tx.gas.StaticGasProvider;
import zerobibim.flory.domain.contract.NFT;

import java.math.BigInteger;

@Configuration
public class Web3jConfig {

@Value("${infura.API_URL}")
private String INFURA_API_URL;

@Value("${metamask.PRIVATE_KEY}")
private String PRIVATE_KEY;

@Value("${metamask.CONTRACT_ADDRESS}")
private String CONTRACT_ADDRESS;

@Bean
public Web3j web3j() {
return Web3j.build(new HttpService(INFURA_API_URL));
}

@Bean
public Credentials credentials() {
BigInteger privateKeyInBT = new BigInteger(PRIVATE_KEY, 16);
return Credentials.create(ECKeyPair.create(privateKeyInBT));
}

@Bean
public NFT nft() {
BigInteger gasPrice = Contract.GAS_PRICE;
BigInteger gasLimit = Contract.GAS_LIMIT;
//StaticGasProvider gasProvider = new StaticGasProvider(gasPrice, gasLimit);

return NFT.load(CONTRACT_ADDRESS, web3j(), credentials(), gasPrice, gasLimit);
}
}

0 comments on commit 54993f2

Please sign in to comment.