diff --git a/README.md b/README.md index c7b46f2..337f69d 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,8 @@ It's designed for managing issuer records and verifying user compliance based on - `addIssuersRecord(string[] memory name, uint32[] memory version, address[] memory issuerAddress)`: Adds multiple issuer records. - `removeIssuerRecord(string memory name, uint32 version)`: Removes an issuer record. -- `function getIssuerAddressesByNameAndVersions(`: Get list of Issuer addresses by their name and versions +- ` function getIssuerRecordByAddress(address issuerAddress)`: Gets the issuer record by its address. +- `getIssuerAddressesByNameAndVersions(string memory name, uint32[] memory version)`: Get list of Issuer addresses by their name and versions - `updateIssuerRecord(address issuerAddress, string memory name)`: Updates the name of an issuer. - `listIssuersRecord(uint256 start, uint256 end)`: Lists issuer records within a specified range. - `issuerRecordCount()`: Returns the total number of issuer records. @@ -53,5 +54,5 @@ It's designed for managing issuer records and verifying user compliance based on | Contract | Address | |------------|--------------------------------------------| -| ProxyAdmin | `0xe49de5cAC6aa19E70499D89D04E475a7CcDC58C1` | -| SWTRProxy | `0x7a838b0545513aC19920128Fdc8ECd25C9b1b1bD` | \ No newline at end of file +| ProxyAdmin | `0x96e3ba5a33d21f64E5504Fd964656d1535a87F7e` | +| SWTRProxy | `0xBF896E5616d12fE6Bd7a376D2DBb924ff531CFDF` | \ No newline at end of file diff --git a/contracts/IComplianceBridge.sol b/contracts/IComplianceBridge.sol deleted file mode 100644 index 9781614..0000000 --- a/contracts/IComplianceBridge.sol +++ /dev/null @@ -1,63 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.24; - -interface IComplianceBridge { - struct VerificationData { - // Verification type - uint32 verificationType; - // Verification Id - bytes verificationId; - // Verification issuer address - address issuerAddress; - // From which chain proof was transferred - string originChain; - // Original issuance timestamp - uint32 issuanceTimestamp; - // Original expiration timestamp - uint32 expirationTimestamp; - // Original proof data (ZK-proof) - bytes originalData; - // ZK-proof original schema - string schema; - // Verification id for checking(KYC/KYB/AML etc) from issuer side - string issuerVerificationId; - // Version - uint32 version; - } - - enum VerificationType { - VT_UNSPECIFIED, // VT_UNSPECIFIED defines an invalid/undefined verification type. - VT_KYC, // Know Your Custom - VT_KYB, // Know Your Business - VT_KYW, // Know Your Wallet - VT_HUMANITY, // Check humanity - VT_AML, // Anti Money Laundering (check transactions) - VT_ADDRESS, - VT_CUSTOM, - VT_CREDIT_SCORE - } - - function addVerificationDetails( - address userAddress, - string memory originChain, - uint32 verificationType, - uint32 issuanceTimestamp, - uint32 expirationTimestamp, - bytes memory proofData, - string memory schema, - string memory issuerVerificationId, - uint32 version - ) external; - - function hasVerification( - address userAddress, - uint32 verificationType, - uint32 expirationTimestamp, - address[] memory allowedIssuers - ) external returns (bool); - - function getVerificationData( - address userAddress, - address issuerAddress - ) external returns (bytes memory); -} diff --git a/contracts/SWTRImplementation.sol b/contracts/SWTRImplementation.sol index 68305c1..b0a9627 100644 --- a/contracts/SWTRImplementation.sol +++ b/contracts/SWTRImplementation.sol @@ -1,17 +1,12 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.24; -import {IComplianceBridge} from "./IComplianceBridge.sol"; +import {IComplianceBridge} from "./interfaces/IComplianceBridge.sol"; import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import {ISWTRProxy} from "./interfaces/ISWTRProxy.sol"; -contract SWTRImplementation is OwnableUpgradeable { - struct Issuer { - string name; - uint32 version; - address issuerAddress; - } - +contract SWTRImplementation is ISWTRProxy, OwnableUpgradeable { Issuer[] public issuers; mapping(address => Issuer) public issuerByAddress; mapping(address => uint256) issuerIndex; @@ -73,6 +68,12 @@ contract SWTRImplementation is OwnableUpgradeable { delete issuerAddressByNameAndVersion[name][version]; } + function getIssuerRecordByAddress( + address issuerAddress + ) public view returns (Issuer memory) { + return issuerByAddress[issuerAddress]; + } + function getIssuerAddressesByNameAndVersions( string memory name, uint32[] memory version @@ -103,7 +104,7 @@ contract SWTRImplementation is OwnableUpgradeable { function isUserVerified( address userAddress, - IComplianceBridge.VerificationType verificationType + ISWTRProxy.VerificationType verificationType ) public view returns (bool) { address[] memory allowedIssuers; bytes memory payload = abi.encodeCall( @@ -120,7 +121,7 @@ contract SWTRImplementation is OwnableUpgradeable { function isUserVerifiedBy( address userAddress, - IComplianceBridge.VerificationType verificationType, + ISWTRProxy.VerificationType verificationType, address[] memory allowedIssuers ) public view returns (bool) { bytes memory payload = abi.encodeCall( @@ -138,18 +139,18 @@ contract SWTRImplementation is OwnableUpgradeable { function listVerificationData( address userAddress, address issuerAddress - ) public view returns (IComplianceBridge.VerificationData[] memory) { + ) public view returns (ISWTRProxy.VerificationData[] memory) { bytes memory payload = abi.encodeCall( IComplianceBridge.getVerificationData, (userAddress, issuerAddress) ); (bool success, bytes memory data) = address(1028).staticcall(payload); - IComplianceBridge.VerificationData[] memory verificationData; + ISWTRProxy.VerificationData[] memory verificationData; if (success) { // Decode the bytes data into an array of structs verificationData = abi.decode( data, - (IComplianceBridge.VerificationData[]) + (ISWTRProxy.VerificationData[]) ); } return verificationData; @@ -159,8 +160,8 @@ contract SWTRImplementation is OwnableUpgradeable { address userAddress, address issuerAddress, bytes memory verificationId - ) public view returns (IComplianceBridge.VerificationData memory) { - IComplianceBridge.VerificationData[] + ) public view returns (ISWTRProxy.VerificationData memory) { + ISWTRProxy.VerificationData[] memory verificationData = listVerificationData( userAddress, issuerAddress @@ -185,9 +186,9 @@ contract SWTRImplementation is OwnableUpgradeable { function getVerificationCountry( address userAddress, address issuerAddress, - IComplianceBridge.VerificationType verificationType + ISWTRProxy.VerificationType verificationType ) public view returns (string memory) { - IComplianceBridge.VerificationData[] + ISWTRProxy.VerificationData[] memory verificationData = listVerificationData( userAddress, issuerAddress @@ -257,9 +258,9 @@ contract SWTRImplementation is OwnableUpgradeable { function passedVerificationType( address userAddress, address issuerAddress, - IComplianceBridge.VerificationType verificationType + ISWTRProxy.VerificationType verificationType ) public view returns (bool) { - IComplianceBridge.VerificationData[] + ISWTRProxy.VerificationData[] memory verificationData = listVerificationData( userAddress, issuerAddress @@ -286,7 +287,7 @@ contract SWTRImplementation is OwnableUpgradeable { passedVerificationType( userAddress, issuerAddress, - IComplianceBridge.VerificationType.VT_HUMANITY + ISWTRProxy.VerificationType.VT_HUMANITY ); } @@ -298,7 +299,7 @@ contract SWTRImplementation is OwnableUpgradeable { passedVerificationType( userAddress, issuerAddress, - IComplianceBridge.VerificationType.VT_AML + ISWTRProxy.VerificationType.VT_AML ); } } diff --git a/contracts/interfaces/IComplianceBridge.sol b/contracts/interfaces/IComplianceBridge.sol new file mode 100644 index 0000000..3d3a7ec --- /dev/null +++ b/contracts/interfaces/IComplianceBridge.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.24; + +interface IComplianceBridge { + function hasVerification( + address userAddress, + uint32 verificationType, + uint32 expirationTimestamp, + address[] memory allowedIssuers + ) external returns (bool); + + function getVerificationData( + address userAddress, + address issuerAddress + ) external returns (bytes memory); + + function addVerificationDetails( + address userAddress, + string memory originChain, + uint32 verificationType, + uint32 issuanceTimestamp, + uint32 expirationTimestamp, + bytes memory proofData, + string memory schema, + string memory issuerVerificationId, + uint32 version + ) external; +} diff --git a/contracts/interfaces/ISWTRProxy.sol b/contracts/interfaces/ISWTRProxy.sol new file mode 100644 index 0000000..2784085 --- /dev/null +++ b/contracts/interfaces/ISWTRProxy.sol @@ -0,0 +1,125 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.24; + +interface ISWTRProxy { + struct VerificationData { + // Verification type + uint32 verificationType; + // Verification Id + bytes verificationId; + // Verification issuer address + address issuerAddress; + // From which chain proof was transferred + string originChain; + // Original issuance timestamp + uint32 issuanceTimestamp; + // Original expiration timestamp + uint32 expirationTimestamp; + // Original proof data (ZK-proof) + bytes originalData; + // ZK-proof original schema + string schema; + // Verification id for checking(KYC/KYB/AML etc) from issuer side + string issuerVerificationId; + // Version + uint32 version; + } + + enum VerificationType { + VT_UNSPECIFIED, // VT_UNSPECIFIED defines an invalid/undefined verification type. + VT_KYC, // Know Your Custom + VT_KYB, // Know Your Business + VT_KYW, // Know Your Wallet + VT_HUMANITY, // Check humanity + VT_AML, // Anti Money Laundering (check transactions) + VT_ADDRESS, + VT_CUSTOM, + VT_CREDIT_SCORE + } + + struct Issuer { + string name; + uint32 version; + address issuerAddress; + } + + function getIssuerRecordByAddress( + address issuerAddress + ) external view returns (Issuer memory); + + function getIssuerAddressesByNameAndVersions( + string memory name, + uint32[] memory version + ) external view returns (address[] memory); + + function listIssuersRecord( + uint256 start, + uint256 end + ) external view returns (Issuer[] memory); + + function issuerRecordCount() external view returns (uint256); + + function isUserVerified( + address userAddress, + ISWTRProxy.VerificationType verificationType + ) external view returns (bool); + + function isUserVerifiedBy( + address userAddress, + ISWTRProxy.VerificationType verificationType, + address[] memory allowedIssuers + ) external view returns (bool); + + function listVerificationData( + address userAddress, + address issuerAddress + ) external view returns (ISWTRProxy.VerificationData[] memory); + + function getVerificationDataById( + address userAddress, + address issuerAddress, + bytes memory verificationId + ) external view returns (ISWTRProxy.VerificationData memory); + + function getVerificationCountry( + address userAddress, + address issuerAddress, + ISWTRProxy.VerificationType verificationType + ) external view returns (string memory); + + function decodeQuadrataPassportV1OriginalData( + bytes memory originalData + ) + external + pure + returns ( + uint8 aml, + string memory country, + string memory did, + bool isBusiness, + bool investorStatus + ); + + function decodeWorldcoinV1OriginalData( + bytes memory originalData + ) + external + pure + returns ( + string memory merkle_root, + string memory nullifier_hash, + string memory proof, + string memory verification_level + ); + + function passedVerificationType( + address userAddress, + address issuerAddress, + ISWTRProxy.VerificationType verificationType + ) external view returns (bool); + + function walletPassedAML( + address userAddress, + address issuerAddress + ) external view returns (bool); +} diff --git a/scripts/addIssuers.ts b/scripts/addIssuers.ts index 1a9a16c..c1b8697 100644 --- a/scripts/addIssuers.ts +++ b/scripts/addIssuers.ts @@ -6,7 +6,7 @@ async function main() { const [signer] = await ethers.getSigners(); const contract = await ethers.getContractAt( "SWTRImplementation", - "0x7a838b0545513aC19920128Fdc8ECd25C9b1b1bD" // proxy address + "0xBF896E5616d12fE6Bd7a376D2DBb924ff531CFDF" // proxy address ); console.log("Adding new records..."); diff --git a/scripts/getAdminAndImplementation.ts b/scripts/getAdminAndImplementation.ts index b9a7854..3dff1b6 100644 --- a/scripts/getAdminAndImplementation.ts +++ b/scripts/getAdminAndImplementation.ts @@ -6,12 +6,12 @@ async function main() { const SWTRProxy = await ethers.getContractAt( "SWTRProxy", - "0x7a838b0545513aC19920128Fdc8ECd25C9b1b1bD" // proxy address + "0xBF896E5616d12fE6Bd7a376D2DBb924ff531CFDF" // proxy address ); const proxyAdmin = await ethers.getContractAt( "ProxyAdmin", - "0xe49de5cAC6aa19E70499D89D04E475a7CcDC58C1" // proxy admin address + "0x96e3ba5a33d21f64E5504Fd964656d1535a87F7e" // proxy admin address ); const implementation = ( diff --git a/scripts/listIssuers.ts b/scripts/listIssuers.ts index ab846e8..be2a75a 100644 --- a/scripts/listIssuers.ts +++ b/scripts/listIssuers.ts @@ -5,7 +5,7 @@ async function main() { const [signer] = await ethers.getSigners(); const contract = await ethers.getContractAt( "SWTRImplementation", - "0x7a838b0545513aC19920128Fdc8ECd25C9b1b1bD" // proxy address + "0xBF896E5616d12fE6Bd7a376D2DBb924ff531CFDF" // proxy address ); const issuerCount = (await readContractData( diff --git a/scripts/upgrade.ts b/scripts/upgrade.ts index 34c4846..d64094d 100644 --- a/scripts/upgrade.ts +++ b/scripts/upgrade.ts @@ -6,7 +6,7 @@ async function main() { const [signer] = await ethers.getSigners(); const SWTRProxy = await ethers.getContractAt( "SWTRProxy", - "0x7a838b0545513aC19920128Fdc8ECd25C9b1b1bD" // proxy address + "0xBF896E5616d12fE6Bd7a376D2DBb924ff531CFDF" // proxy address ); const SWTRImplementation = await ethers.deployContract("SWTRImplementation"); @@ -15,7 +15,7 @@ async function main() { const proxyAdmin = await ethers.getContractAt( "ProxyAdmin", - "0xe49de5cAC6aa19E70499D89D04E475a7CcDC58C1" + "0x96e3ba5a33d21f64E5504Fd964656d1535a87F7e" ); let tx: TransactionResponse = await sendShieldedTransaction(