Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions contracts/mocks/MockIdentityRegistry.sol
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,9 @@ contract MockIdentityRegistry {
function registerIdentity(address _userAddress, uint256 _country, bool _isVerified) external {
_verified[_userAddress] = IdentityData(_isVerified, _country);
}

function identity(address /*_userAddress*/) public pure returns (address) {
// Returning hardcoded address for testing
return 0x26291175Fa0Ea3C8583fEdEB56805eA68289b105;
}
}
12 changes: 12 additions & 0 deletions contracts/mocks/MockNewTokenImplementation.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import {UCEF3643} from '../token/UCEF3643.sol';

contract MockNewTokenImplementation is UCEF3643 {
// Overriding a method for testing
function allowance(address /*owner*/, address /*spender*/) public view virtual override returns (uint256) {
// Mock value to check in tests
return 99900;
}
}
21 changes: 21 additions & 0 deletions contracts/mocks/MockTrexImplementationAuthority.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

// Importing TokenProxy here to force it to be included in the artifacts. Used for testing.
import "@tokenysolutions/t-rex/contracts/proxy/TokenProxy.sol";

contract MockTrexImplementationAuthority {
address _tokenImplementation;

constructor(address tokenImplementation) {
_tokenImplementation = tokenImplementation;
}

function getTokenImplementation() external view returns (address) {
return _tokenImplementation;
}

function updateTokenImplementation(address newTokenImplementation) external {
_tokenImplementation = newTokenImplementation;
}
}
8 changes: 6 additions & 2 deletions contracts/token/UCEF3643.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
pragma solidity ^0.8.17;

import {Token} from "@tokenysolutions/t-rex/contracts/token/Token.sol";
import {IIdentityRegistry} from "@tokenysolutions/t-rex/contracts/registry/interface/IIdentityRegistry.sol";

contract UCEF3643 is Token {

Expand Down Expand Up @@ -151,12 +152,15 @@ contract UCEF3643 is Token {

/**
* @dev Internal function to determine if an address is authorized to view a balance
* This implementation only owner is allowed to see balance. Can be overridden on derived contracts.
* This implementation only owner or sender's identity are allowed to see balance. Can be overridden on derived contracts.
* @param account The address to check authorization for
* @return bool True if authorized, false otherwise
*/
function _authorizeBalance(address account) internal view virtual returns (bool) {
require(msg.sender == account, 'Unauthorized balance access');
require(
msg.sender == account || address(IIdentityRegistry(_tokenIdentityRegistry).identity(msg.sender)) == account,
'Unauthorized balance access'
);
return true;
}

Expand Down
31 changes: 31 additions & 0 deletions contracts/vendor/tokenysolutions/DeploySuite.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

/**
* @title TREX Deploy Suite Contract
* @notice Required to compile the artifacts used by `deploy-suite.ts` script
*/

import "@tokenysolutions/t-rex/contracts/registry/implementation/ClaimTopicsRegistry.sol";
import "@tokenysolutions/t-rex/contracts/registry/implementation/TrustedIssuersRegistry.sol";
import "@tokenysolutions/t-rex/contracts/registry/implementation/IdentityRegistryStorage.sol";
import "@tokenysolutions/t-rex/contracts/registry/implementation/IdentityRegistry.sol";
import "@tokenysolutions/t-rex/contracts/compliance/modular/ModularCompliance.sol";
import "@tokenysolutions/t-rex/contracts/proxy/authority/TREXImplementationAuthority.sol";
import "@tokenysolutions/t-rex/contracts/factory/TREXFactory.sol";
import "@tokenysolutions/t-rex/contracts/proxy/ClaimTopicsRegistryProxy.sol";
import "@tokenysolutions/t-rex/contracts/registry/implementation/ClaimTopicsRegistry.sol";
import "@tokenysolutions/t-rex/contracts/proxy/TrustedIssuersRegistryProxy.sol";
import "@tokenysolutions/t-rex/contracts/registry/implementation/TrustedIssuersRegistry.sol";
import "@tokenysolutions/t-rex/contracts/proxy/IdentityRegistryStorageProxy.sol";
import "@tokenysolutions/t-rex/contracts/registry/implementation/IdentityRegistryStorage.sol";
import "@tokenysolutions/t-rex/contracts/compliance/legacy/DefaultCompliance.sol";
import "@tokenysolutions/t-rex/contracts/proxy/IdentityRegistryProxy.sol";
import "@tokenysolutions/t-rex/contracts/proxy/TokenProxy.sol";
import "@onchain-id/solidity/contracts/Identity.sol";
import "@onchain-id/solidity/contracts/proxy/ImplementationAuthority.sol";
import "@onchain-id/solidity/contracts/proxy/IdentityProxy.sol";
import "@onchain-id/solidity/contracts/factory/IdFactory.sol";
import "@onchain-id/solidity/contracts/ClaimIssuer.sol";

contract DeploySuite {}
5 changes: 4 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@
"test": "npx hardhat test",
"chain": "npx hardhat node",
"coverage": "npx hardhat coverage",
"script": "script() { npx hardhat --network ${2:-localhost} run scripts/${1}.ts; }; script",
"clean:ignition": "rm -rf .ignition && rm -rf ./ignition/deployments",
"clean:all": "pnpm clean && pnpm clean:ignition",
"deploy:module": "deploy() { npx hardhat ignition deploy ignition/modules/$1.ts --network ${2:-localhost} --deployment-id ${2:-localhost} --reset; }; deploy $@",
"deploy:module": "deploy() { npx hardhat ignition deploy ignition/modules/$1.ts --network ${2:-localhost} --deployment-id ${2:-localhost} --reset; }; deploy",
"clean": "npx hardhat clean",
"format": "prettier --write \"**/*.{js,jsx,ts,tsx}\" --ignore-path .prettierignore",
"format:check": "prettier --check \"**/*.{js,jsx,ts,tsx}\" --ignore-path .prettierignore",
Expand All @@ -18,6 +19,7 @@
},
"devDependencies": {
"@appliedblockchain/silentdatarollup-core": "^0.1.3",
"@appliedblockchain/silentdatarollup-ethers-provider": "^0.1.3",
"@appliedblockchain/silentdatarollup-hardhat-plugin": "^0.1.3",
"@nomicfoundation/hardhat-chai-matchers": "^2.0.0",
"@nomicfoundation/hardhat-ethers": "^3.0.0",
Expand Down Expand Up @@ -46,6 +48,7 @@
"globals": "^16.0.0",
"hardhat": "^2.19.0",
"hardhat-gas-reporter": "^1.0.8",
"picocolors": "^1.1.1",
"prettier": "^3.0.0",
"solidity-coverage": "^0.8.1",
"ts-node": "^10.9.2",
Expand Down
20 changes: 20 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

65 changes: 65 additions & 0 deletions scripts/deploy-suite.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import fs from 'fs'
import { main } from './fixtures/deploy-full-suite.fixture'
import { exportAccounts } from './utils'

const exportPrivateKeys = process.env.EXPORT_PRIVATE_KEYS === 'true'

;(async () => {
const result = await main({
// suiteFilePath: 'SDSuiteDeployment.json',
// skipClaimIssuer: true,
// skipIdentities: false,
})

if (result) {
const content = JSON.stringify(
{
suite: {
claimIssuerContract: await result.suite.claimIssuerContract?.getAddress(),
claimTopicsRegistry: await result.suite.claimTopicsRegistry.getAddress(),
trustedIssuersRegistry: await result.suite.trustedIssuersRegistry.getAddress(),
identityRegistryStorage: await result.suite.identityRegistryStorage.getAddress(),
defaultCompliance: await result.suite.defaultCompliance.getAddress(),
identityRegistry: await result.suite.identityRegistry.getAddress(),
tokenOID: await result.suite.tokenOID.getAddress(),
token: await result.suite.token.getAddress(),
},
authorities: {
identityImplementationAuthority: await result.authorities.identityImplementationAuthority.getAddress(),
trexImplementationAuthority: await result.authorities.trexImplementationAuthority.getAddress(),
},
factories: {
identityFactory: await result.factories.identityFactory.getAddress(),
trexFactory: await result.factories.trexFactory.getAddress(),
},
implementations: {
identityImplementation: await result.implementations.identityImplementation.getAddress(),
claimTopicsRegistryImplementation:
await result.implementations.claimTopicsRegistryImplementation.getAddress(),
trustedIssuersRegistryImplementation:
await result.implementations.trustedIssuersRegistryImplementation.getAddress(),
identityRegistryStorageImplementation:
await result.implementations.identityRegistryStorageImplementation.getAddress(),
identityRegistryImplementation: await result.implementations.identityRegistryImplementation.getAddress(),
modularComplianceImplementation: await result.implementations.modularComplianceImplementation.getAddress(),
tokenImplementation: await result.implementations.tokenImplementation.getAddress(),
},
identities: result.identities
? {
aliceIdentity: await result.identities.aliceIdentity.getAddress(),
bobIdentity: await result.identities.bobIdentity.getAddress(),
charlieIdentity: await result.identities.charlieIdentity.getAddress(),
}
: undefined,
accounts: exportAccounts(
result.accounts as Record<string, { address: string; privateKey?: string }>,
exportPrivateKeys,
),
},
null,
2,
)

fs.writeFileSync('DeploymentOutput.json', content)
}
})()
Loading