feat:-ORM addition for possible complex queries.

-ABI for smart contracts
This commit is contained in:
Ricky Putra Pratama Tedjo 2025-08-13 15:21:40 +07:00
parent 473838b3b7
commit be18e4088f
9 changed files with 2073 additions and 132 deletions

2
.gitignore vendored
View File

@ -72,3 +72,5 @@ node_modules
# Hardhat Ignition default folder for deployments against a local node
ignition/deployments/chain-31337
/generated/prisma

View File

@ -4,40 +4,395 @@ pragma solidity ^0.8.27;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
// contract P2PTransferProject {
// address public owner;
// string public name;
// modifier onlyOwner() {
// require(msg.sender == owner, "Only owner");
// _;
// }
// constructor(string memory _name) {
// owner = msg.sender;
// name = _name;
// }
// function getBalance() external view returns (uint256) {
// return address(this).balance;
// }
// function setName(string memory _name) external onlyOwner {
// name = _name;
// }
// function getName() external view returns (string memory) {
// return name;
// }
// function getOwner() external view returns (address) {
// return owner;
// }
// }
contract ProjectToken is ERC20 {
using Strings for uint256;
constructor() ERC20("ProjectToken", "PTKN") {}
struct TokenDetail {
string tokenId;
string idProjek;
string idUser;
int256 nilai; // Changed to int256
}
struct Transaksi {
string idUser;
string namaUser;
string idProjek;
string judulProjek;
string ownerProjek;
int256 jumlahToken; // Changed to int256
int256 totalNominal; // Changed to int256
}
struct Agreement {
string idProjek;
string idUser;
string namaProyek;
string namaPetugas;
string alamatPetugas;
string namaPemilikProyek;
string nik;
string noHp;
string alamat;
string signature;
string tandaTangan;
int256 nominalDisetujui; // Changed to int256
uint256 createdAt;
}
mapping(uint256 => Agreement) public agreements;
uint256 public agreementCount;
event AgreementCreated(
string idProjek,
string idUser,
string namaProyek,
string namaPetugas,
string alamatPetugas,
string namaPemilikProyek,
string nik,
string noHp,
string alamat,
string signature,
string tandaTangan,
int256 nominalDisetujui,
uint256 createdAt
);
mapping(string => TokenDetail) public tokenDetails;
uint256 private tokenIdCounter;
string[] public allTokenIds;
event TokenCreated(
string indexed tokenId,
string idProjek,
string idUser,
int256 nilai
);
event TokenNominalReset(string indexed tokenId);
Transaksi[] public transaksiList;
function generateUniqueId() private returns (string memory) {
tokenIdCounter += 1;
uint256 counter = tokenIdCounter;
return
string(
abi.encodePacked(
"TKN-",
block.timestamp.toString(),
"-",
counter.toString()
)
);
}
function createToken(
string memory idProjek,
string memory idUser,
int256 nilai
) public {
string memory tokenId = generateUniqueId();
_mint(msg.sender, uint256(nilai >= 0 ? nilai : -nilai));
tokenDetails[tokenId] = TokenDetail(tokenId, idProjek, idUser, nilai);
allTokenIds.push(tokenId);
emit TokenCreated(tokenId, idProjek, idUser, nilai);
}
function getAllTokens() public view returns (TokenDetail[] memory) {
TokenDetail[] memory tokens = new TokenDetail[](allTokenIds.length);
for (uint256 i = 0; i < allTokenIds.length; i++) {
tokens[i] = tokenDetails[allTokenIds[i]];
}
return tokens;
}
function getTokenById(
string memory tokenId
) public view returns (TokenDetail memory) {
require(
bytes(tokenDetails[tokenId].tokenId).length > 0,
"Project Token not found"
);
return tokenDetails[tokenId];
}
function getTokenByProjectId(
string memory idProjek
) public view returns (TokenDetail[] memory) {
uint256 count = 0;
for (uint256 i = 0; i < allTokenIds.length; i++) {
if (
keccak256(bytes(tokenDetails[allTokenIds[i]].idProjek)) ==
keccak256(bytes(idProjek))
) {
count++;
}
}
TokenDetail[] memory projekTokens = new TokenDetail[](count);
uint256 index = 0;
for (uint256 i = 0; i < allTokenIds.length; i++) {
if (
keccak256(bytes(tokenDetails[allTokenIds[i]].idProjek)) ==
keccak256(bytes(idProjek))
) {
projekTokens[index] = tokenDetails[allTokenIds[i]];
index++;
}
}
return projekTokens;
}
function getTokenByUserAndProject(
string memory idUser,
string memory idProjek
) public view returns (TokenDetail[] memory) {
uint256 count = 0;
for (uint256 i = 0; i < allTokenIds.length; i++) {
if (
keccak256(bytes(tokenDetails[allTokenIds[i]].idUser)) ==
keccak256(bytes(idUser)) &&
keccak256(bytes(tokenDetails[allTokenIds[i]].idProjek)) ==
keccak256(bytes(idProjek))
) {
count++;
}
}
TokenDetail[] memory filteredTokens = new TokenDetail[](count);
uint256 index = 0;
for (uint256 i = 0; i < allTokenIds.length; i++) {
if (
keccak256(bytes(tokenDetails[allTokenIds[i]].idUser)) ==
keccak256(bytes(idUser)) &&
keccak256(bytes(tokenDetails[allTokenIds[i]].idProjek)) ==
keccak256(bytes(idProjek))
) {
filteredTokens[index] = tokenDetails[allTokenIds[i]];
index++;
}
}
return filteredTokens;
}
function getTotalTokens() public view returns (uint256) {
return allTokenIds.length;
}
function resetTokenNominal(string memory tokenId) public {
require(
bytes(tokenDetails[tokenId].tokenId).length > 0,
"Project Token not found"
);
int256 currentValue = tokenDetails[tokenId].nilai;
tokenDetails[tokenId].nilai = 0;
_burn(msg.sender, uint256(currentValue >= 0 ? currentValue : -currentValue));
emit TokenNominalReset(tokenId);
}
function addTransaction(
string memory idUser,
string memory namaUser,
string memory idProjek,
string memory judulProjek,
string memory ownerProjek,
int256 jumlahToken,
int256 totalNominal
) public {
transaksiList.push(
Transaksi({
idUser: idUser,
namaUser: namaUser,
idProjek: idProjek,
judulProjek: judulProjek,
ownerProjek: ownerProjek,
jumlahToken: jumlahToken,
totalNominal: totalNominal
})
);
}
function getAllTransaction() public view returns (Transaksi[] memory) {
return transaksiList;
}
function getTransactionByUserId(
string memory idUser
) public view returns (Transaksi[] memory) {
uint256 count = 0;
for (uint256 i = 0; i < transaksiList.length; i++) {
if (
keccak256(bytes(transaksiList[i].idUser)) ==
keccak256(bytes(idUser))
) {
count++;
}
}
Transaksi[] memory userTransactions = new Transaksi[](count);
uint256 index = 0;
for (uint256 i = 0; i < transaksiList.length; i++) {
if (
keccak256(bytes(transaksiList[i].idUser)) ==
keccak256(bytes(idUser))
) {
userTransactions[index] = transaksiList[i];
index++;
}
}
return userTransactions;
}
function getTransactionByProjectId(
string memory idProjek
) public view returns (Transaksi[] memory) {
uint256 count = 0;
for (uint256 i = 0; i < transaksiList.length; i++) {
if (
keccak256(bytes(transaksiList[i].idProjek)) ==
keccak256(bytes(idProjek))
) {
count++;
}
}
Transaksi[] memory projectTransactions = new Transaksi[](count);
uint256 index = 0;
for (uint256 i = 0; i < transaksiList.length; i++) {
if (
keccak256(bytes(transaksiList[i].idProjek)) ==
keccak256(bytes(idProjek))
) {
projectTransactions[index] = transaksiList[i];
index++;
}
}
return projectTransactions;
}
function createAgreementLetter(
string memory _idProjek,
string memory _idUser,
string memory _namaProyek,
string memory _namaPetugas,
string memory _alamatPetugas,
string memory _namaPemilikProyek,
string memory _nik,
string memory _noHp,
string memory _alamat,
string memory _signature,
string memory _tandaTangan,
int256 _nominalDisetujui
) public {
agreementCount++;
agreements[agreementCount] = Agreement({
idProjek: _idProjek,
idUser: _idUser,
namaProyek: _namaProyek,
namaPetugas: _namaPetugas,
alamatPetugas: _alamatPetugas,
namaPemilikProyek: _namaPemilikProyek,
nik: _nik,
noHp: _noHp,
alamat: _alamat,
signature: _signature,
tandaTangan: _tandaTangan,
nominalDisetujui: _nominalDisetujui,
createdAt: block.timestamp
});
emit AgreementCreated(
_idProjek,
_idUser,
_namaProyek,
_namaPetugas,
_alamatPetugas,
_namaPemilikProyek,
_nik,
_noHp,
_alamat,
_signature,
_tandaTangan,
_nominalDisetujui,
block.timestamp
);
}
function getAllAgreement() public view returns (Agreement[] memory) {
Agreement[] memory allAgreements = new Agreement[](agreementCount);
for (uint256 i = 1; i <= agreementCount; i++) {
allAgreements[i - 1] = agreements[i];
}
return allAgreements;
}
function getAgreementByProjectId(
string memory idProjek
) public view returns (Agreement[] memory) {
uint256 count = 0;
for (uint256 i = 1; i <= agreementCount; i++) {
if (
keccak256(bytes(agreements[i].idProjek)) ==
keccak256(bytes(idProjek))
) {
count++;
}
}
Agreement[] memory projectAgreements = new Agreement[](count);
uint256 index = 0;
for (uint256 i = 1; i <= agreementCount; i++) {
if (
keccak256(bytes(agreements[i].idProjek)) ==
keccak256(bytes(idProjek))
) {
projectAgreements[index] = agreements[i];
index++;
}
}
return projectAgreements;
}
function getTotalNominalToken(
string memory idUser,
string memory idProjek
) public view returns (int256) { // Changed to int256
int256 totalNominal = 0; // Changed to int256
for (uint256 i = 0; i < allTokenIds.length; i++) {
TokenDetail memory tokenDetail = tokenDetails[allTokenIds[i]];
if (
keccak256(bytes(tokenDetail.idUser)) ==
keccak256(bytes(idUser)) &&
keccak256(bytes(tokenDetail.idProjek)) ==
keccak256(bytes(idProjek))
) {
totalNominal += tokenDetail.nilai;
}
}
return totalNominal;
}
}

View File

@ -2,7 +2,16 @@ import { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
const config: HardhatUserConfig = {
solidity: "0.8.28",
solidity: {
version: "0.8.28",
settings:{
optimizer: {
enabled: true,
runs: 500
},
viaIR: true
}
},
};
export default config;

337
package-lock.json generated
View File

@ -43,6 +43,7 @@
"jest": "^29.7.0",
"pg": "^8.16.3",
"prettier": "^3.4.2",
"prisma": "^6.14.0",
"source-map-support": "^0.5.21",
"supertest": "^7.0.0",
"ts-jest": "^29.2.5",
@ -3803,6 +3804,69 @@
"url": "https://opencollective.com/pkgr"
}
},
"node_modules/@prisma/config": {
"version": "6.14.0",
"resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.14.0.tgz",
"integrity": "sha512-IwC7o5KNNGhmblLs23swnfBjADkacBb7wvyDXUWLwuvUQciKJZqyecU0jw0d7JRkswrj+XTL8fdr0y2/VerKQQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"c12": "3.1.0",
"deepmerge-ts": "7.1.5",
"effect": "3.16.12",
"empathic": "2.0.0"
}
},
"node_modules/@prisma/debug": {
"version": "6.14.0",
"resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.14.0.tgz",
"integrity": "sha512-j4Lf+y+5QIJgQD4sJWSbkOD7geKx9CakaLp/TyTy/UDu9Wo0awvWCBH/BAxTHUaCpIl9USA5VS/KJhDqKJSwug==",
"dev": true,
"license": "Apache-2.0"
},
"node_modules/@prisma/engines": {
"version": "6.14.0",
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.14.0.tgz",
"integrity": "sha512-LhJjqsALFEcoAtF07nSaOkVguaxw/ZsgfROIYZ8bAZDobe7y8Wy+PkYQaPOK1iLSsFgV2MhCO/eNrI1gdSOj6w==",
"dev": true,
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
"@prisma/debug": "6.14.0",
"@prisma/engines-version": "6.14.0-25.717184b7b35ea05dfa71a3236b7af656013e1e49",
"@prisma/fetch-engine": "6.14.0",
"@prisma/get-platform": "6.14.0"
}
},
"node_modules/@prisma/engines-version": {
"version": "6.14.0-25.717184b7b35ea05dfa71a3236b7af656013e1e49",
"resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.14.0-25.717184b7b35ea05dfa71a3236b7af656013e1e49.tgz",
"integrity": "sha512-EgN9ODJpiX45yvwcngoStp3uQPJ3l+AEVoQ6dMMO2QvmwIlnxfApzKmJQExzdo7/hqQANrz5txHJdGYHzOnGHA==",
"dev": true,
"license": "Apache-2.0"
},
"node_modules/@prisma/fetch-engine": {
"version": "6.14.0",
"resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.14.0.tgz",
"integrity": "sha512-MPzYPOKMENYOaY3AcAbaKrfvXVlvTc6iHmTXsp9RiwCX+bPyfDMqMFVUSVXPYrXnrvEzhGHfyiFy0PRLHPysNg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@prisma/debug": "6.14.0",
"@prisma/engines-version": "6.14.0-25.717184b7b35ea05dfa71a3236b7af656013e1e49",
"@prisma/get-platform": "6.14.0"
}
},
"node_modules/@prisma/get-platform": {
"version": "6.14.0",
"resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.14.0.tgz",
"integrity": "sha512-7VjuxKNwjnBhKfqPpMeWiHEa2sVjYzmHdl1slW6STuUCe9QnOY0OY1ljGSvz6wpG4U8DfbDqkG1yofd/1GINww==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@prisma/debug": "6.14.0"
}
},
"node_modules/@scure/base": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz",
@ -4051,6 +4115,13 @@
"license": "MIT",
"peer": true
},
"node_modules/@standard-schema/spec": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz",
"integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==",
"dev": true,
"license": "MIT"
},
"node_modules/@swc/cli": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/@swc/cli/-/cli-0.6.0.tgz",
@ -6556,6 +6627,48 @@
"node": ">= 0.8"
}
},
"node_modules/c12": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/c12/-/c12-3.1.0.tgz",
"integrity": "sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==",
"dev": true,
"license": "MIT",
"dependencies": {
"chokidar": "^4.0.3",
"confbox": "^0.2.2",
"defu": "^6.1.4",
"dotenv": "^16.6.1",
"exsolve": "^1.0.7",
"giget": "^2.0.0",
"jiti": "^2.4.2",
"ohash": "^2.0.11",
"pathe": "^2.0.3",
"perfect-debounce": "^1.0.0",
"pkg-types": "^2.2.0",
"rc9": "^2.1.2"
},
"peerDependencies": {
"magicast": "^0.3.5"
},
"peerDependenciesMeta": {
"magicast": {
"optional": true
}
}
},
"node_modules/c12/node_modules/dotenv": {
"version": "16.6.1",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz",
"integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==",
"dev": true,
"license": "BSD-2-Clause",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://dotenvx.com"
}
},
"node_modules/cacheable-lookup": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz",
@ -6840,6 +6953,16 @@
"node": ">= 0.10"
}
},
"node_modules/citty": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz",
"integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"consola": "^3.2.3"
}
},
"node_modules/cjs-module-lexer": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz",
@ -7244,6 +7367,13 @@
"typedarray": "^0.0.6"
}
},
"node_modules/confbox": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz",
"integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==",
"dev": true,
"license": "MIT"
},
"node_modules/consola": {
"version": "3.4.2",
"resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz",
@ -7553,6 +7683,16 @@
"node": ">=0.10.0"
}
},
"node_modules/deepmerge-ts": {
"version": "7.1.5",
"resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz",
"integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=16.0.0"
}
},
"node_modules/defaults": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/defaults/-/defaults-2.0.2.tgz",
@ -7594,6 +7734,13 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/defu": {
"version": "6.1.4",
"resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz",
"integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==",
"dev": true,
"license": "MIT"
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@ -7612,6 +7759,13 @@
"node": ">= 0.8"
}
},
"node_modules/destr": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz",
"integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==",
"dev": true,
"license": "MIT"
},
"node_modules/detect-newline": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
@ -7732,6 +7886,17 @@
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
"license": "MIT"
},
"node_modules/effect": {
"version": "3.16.12",
"resolved": "https://registry.npmjs.org/effect/-/effect-3.16.12.tgz",
"integrity": "sha512-N39iBk0K71F9nb442TLbTkjl24FLUzuvx2i1I2RsEAQsdAdUTuUoW0vlfUXgkMTUOnYqKnWcFfqw4hK4Pw27hg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@standard-schema/spec": "^1.0.0",
"fast-check": "^3.23.1"
}
},
"node_modules/ejs": {
"version": "3.1.10",
"resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
@ -7795,6 +7960,16 @@
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"license": "MIT"
},
"node_modules/empathic": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz",
"integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=14"
}
},
"node_modules/encodeurl": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
@ -8560,6 +8735,13 @@
"node": ">= 0.6"
}
},
"node_modules/exsolve": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz",
"integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==",
"dev": true,
"license": "MIT"
},
"node_modules/ext-list": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz",
@ -8615,6 +8797,29 @@
"node": ">=0.10.0"
}
},
"node_modules/fast-check": {
"version": "3.23.2",
"resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz",
"integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==",
"dev": true,
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/dubzzz"
},
{
"type": "opencollective",
"url": "https://opencollective.com/fast-check"
}
],
"license": "MIT",
"dependencies": {
"pure-rand": "^6.1.0"
},
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@ -9347,6 +9552,24 @@
"node": ">=4"
}
},
"node_modules/giget": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz",
"integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==",
"dev": true,
"license": "MIT",
"dependencies": {
"citty": "^0.1.6",
"consola": "^3.4.0",
"defu": "^6.1.4",
"node-fetch-native": "^1.6.6",
"nypm": "^0.6.0",
"pathe": "^2.0.3"
},
"bin": {
"giget": "dist/cli.mjs"
}
},
"node_modules/glob": {
"version": "11.0.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz",
@ -11377,6 +11600,16 @@
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
"node_modules/jiti": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz",
"integrity": "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==",
"dev": true,
"license": "MIT",
"bin": {
"jiti": "lib/jiti-cli.mjs"
}
},
"node_modules/js-sha3": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
@ -12465,6 +12698,13 @@
"lodash": "^4.17.21"
}
},
"node_modules/node-fetch-native": {
"version": "1.6.7",
"resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz",
"integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==",
"dev": true,
"license": "MIT"
},
"node_modules/node-gyp-build": {
"version": "4.8.4",
"resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz",
@ -12570,6 +12810,26 @@
"license": "MIT",
"peer": true
},
"node_modules/nypm": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.1.tgz",
"integrity": "sha512-hlacBiRiv1k9hZFiphPUkfSQ/ZfQzZDzC+8z0wL3lvDAOUu/2NnChkKuMoMjNur/9OpKuz2QsIeiPVN0xM5Q0w==",
"dev": true,
"license": "MIT",
"dependencies": {
"citty": "^0.1.6",
"consola": "^3.4.2",
"pathe": "^2.0.3",
"pkg-types": "^2.2.0",
"tinyexec": "^1.0.1"
},
"bin": {
"nypm": "dist/cli.mjs"
},
"engines": {
"node": "^14.16.0 || >=16.10.0"
}
},
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@ -12597,6 +12857,13 @@
"integrity": "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==",
"license": "MIT"
},
"node_modules/ohash": {
"version": "2.0.11",
"resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz",
"integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==",
"dev": true,
"license": "MIT"
},
"node_modules/on-finished": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
@ -12959,6 +13226,13 @@
"node": ">=8"
}
},
"node_modules/pathe": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
"integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
"dev": true,
"license": "MIT"
},
"node_modules/pathval": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
@ -13028,6 +13302,13 @@
"dev": true,
"license": "MIT"
},
"node_modules/perfect-debounce": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
"integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
"dev": true,
"license": "MIT"
},
"node_modules/pg": {
"version": "8.16.3",
"resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz",
@ -13252,6 +13533,18 @@
"node": ">=8"
}
},
"node_modules/pkg-types": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.2.0.tgz",
"integrity": "sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"confbox": "^0.2.2",
"exsolve": "^1.0.7",
"pathe": "^2.0.3"
}
},
"node_modules/pluralize": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
@ -13382,6 +13675,32 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/prisma": {
"version": "6.14.0",
"resolved": "https://registry.npmjs.org/prisma/-/prisma-6.14.0.tgz",
"integrity": "sha512-QEuCwxu+Uq9BffFw7in8In+WfbSUN0ewnaSUKloLkbJd42w6EyFckux4M0f7VwwHlM3A8ssaz4OyniCXlsn0WA==",
"dev": true,
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
"@prisma/config": "6.14.0",
"@prisma/engines": "6.14.0"
},
"bin": {
"prisma": "build/index.js"
},
"engines": {
"node": ">=18.18"
},
"peerDependencies": {
"typescript": ">=5.1.0"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"node_modules/prompts": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
@ -13523,6 +13842,17 @@
"node": ">= 0.8"
}
},
"node_modules/rc9": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz",
"integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==",
"dev": true,
"license": "MIT",
"dependencies": {
"defu": "^6.1.4",
"destr": "^2.0.3"
}
},
"node_modules/react-is": {
"version": "18.3.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
@ -15397,6 +15727,13 @@
"readable-stream": "3"
}
},
"node_modules/tinyexec": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz",
"integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==",
"dev": true,
"license": "MIT"
},
"node_modules/tinyglobby": {
"version": "0.2.14",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz",

View File

@ -54,6 +54,7 @@
"jest": "^29.7.0",
"pg": "^8.16.3",
"prettier": "^3.4.2",
"prisma": "^6.14.0",
"source-map-support": "^0.5.21",
"supertest": "^7.0.0",
"ts-jest": "^29.2.5",

15
prisma/schema.prisma Normal file
View File

@ -0,0 +1,15 @@
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init
generator client {
provider = "prisma-client-js"
output = "../generated/prisma"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,7 +1,7 @@
import { Injectable } from "@nestjs/common";
import { ConfigService } from "@nestjs/config";
import { ethers } from "ethers";
import * as P2PTransferProject from "./abis/P2PTransferProject.json";
import * as P2PTransferProject from "./abis/ProjectToken.json";
@Injectable()
export class ProviderService {