Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
05d3a83
chore: release ATS v4.0.0
themariofrancia Jan 22, 2026
65a2236
refactor: scripts
themariofrancia Jan 22, 2026
3c98121
fix: linting
themariofrancia Jan 22, 2026
8916d43
chore: bump ATS packages to v4.0.1
themariofrancia Jan 22, 2026
f491e20
fix: prevent ReDoS in comment removal functions within `solidityUtils…
themariofrancia Jan 22, 2026
3dd61b5
fix: enhance comment removal logic in `solidityUtils.ts` to handle ed…
themariofrancia Jan 22, 2026
0d6d78a
Revert "fix: enhance comment removal logic in `solidityUtils.ts` to h…
themariofrancia Jan 22, 2026
aa25e83
fix: refine comment parsing
themariofrancia Jan 22, 2026
66fd5db
fix: refine comment parsing
themariofrancia Jan 23, 2026
bf68d16
fix: refine comment parsing
themariofrancia Jan 23, 2026
959c0c7
fix: backtracking issue
themariofrancia Jan 23, 2026
ef68a02
fix: backtracking issue
themariofrancia Jan 26, 2026
5f579dc
fix: linting issues for ATS contracts (#796)
jaime-iobermudez Jan 22, 2026
8ffc87f
chore: lint project, update headers, and add husky check (#797)
jaime-iobermudez Jan 23, 2026
4f47740
chore: remove additional spdx license (#803)
jaime-iobermudez Jan 26, 2026
60f35fc
fix: kpi interest rate (#805)
themariofrancia Jan 27, 2026
5ad81f9
refactor: unused code removed and rearrangements (#808)
AlbertoMolinaIoBuilders Jan 27, 2026
b443f2d
test: unreachable code removed and input parameters type defined (#811)
AlbertoMolinaIoBuilders Jan 28, 2026
8c085a9
chore: rename dfns key variable (#801)
jaime-iobermudez Jan 28, 2026
f1bac7a
feat(infra): add three-layer DCO and GPG signature enforcement
MiguelLZPF Jan 27, 2026
cf42407
refactor: restructure registry generator into modular architecture
MiguelLZPF Jan 27, 2026
bde618b
refactor: replace ts-node with tsx for script execution
MiguelLZPF Jan 27, 2026
f1d22ad
fix(hooks): check GPG signature presence instead of verification
MiguelLZPF Jan 28, 2026
ae70481
fix: remain lint issues (#813)
jaime-iobermudez Jan 29, 2026
93df4e8
test: coverage increased (#812)
AlbertoMolinaIoBuilders Jan 29, 2026
5a1cbb8
fix: update docs script
themariofrancia Jan 30, 2026
f1bfa16
fix: duplicated methods removed (#816)
AlbertoMolinaIoBuilders Feb 2, 2026
2b85b45
Merge remote-tracking branch 'origin/main' into development
luigi-io Feb 2, 2026
bacd8ba
chore: release ATS packages v4.1.0 and MP packages v1.0.1
luigi-io Feb 2, 2026
32fe6a0
chore: upgrade typechain dependencies and add unit test coverage
MiguelLZPF Jan 26, 2026
c01b4f1
test: add comprehensive checkpoint and deployment file test coverage
MiguelLZPF Jan 26, 2026
9955039
test(scripts): add comprehensive unit tests for deployment utilities
MiguelLZPF Jan 26, 2026
6dde67a
test(scripts): add comprehensive unit tests for scripts utilities
MiguelLZPF Jan 27, 2026
c7bdbad
test(scripts): add comprehensive registry and coverage configuration …
MiguelLZPF Jan 27, 2026
35fde1c
test(scripts): reorganize tests and add factory unit test coverage
MiguelLZPF Jan 29, 2026
e378e82
refactor: move contract tests to integration folder
MiguelLZPF Jan 29, 2026
2a68dba
chore: rewrite ats doc (#817)
themariofrancia Feb 4, 2026
ff0efc0
Merge branch 'main' into development
luigi-io Feb 5, 2026
01973cf
test(scripts): refactor integration test helpers to reduce boilerplate
MiguelLZPF Feb 2, 2026
fe7032f
test(scripts): add test timing and configuration constants to elimina…
MiguelLZPF Feb 2, 2026
80eda79
test(scripts): add coverage test commands and consolidate deployment …
MiguelLZPF Feb 3, 2026
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
11 changes: 11 additions & 0 deletions .changeset/bright-tests-shine.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
"@hashgraph/asset-tokenization-contracts": patch
---

Improve test infrastructure and coverage for contracts scripts:

- Reorganize test suite into unit/integration categories
- Add comprehensive unit tests for registry generator, checkpoint manager, and deployment utilities
- Refactor registry generator into modular architecture (cache/, core/, utils/)
- Standardize CLI utilities and improve error handling
- Fix changeset-check workflow to use dynamic base branch instead of hardcoded develop
5 changes: 5 additions & 0 deletions .changeset/contract-tests-integration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@hashgraph/asset-tokenization-contracts": patch
---

Rename test/contracts/unit to test/contracts/integration to accurately reflect test type
11 changes: 11 additions & 0 deletions .changeset/sharp-helpers-unite.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
"@hashgraph/asset-tokenization-contracts": patch
---

Refactor integration test helpers to reduce boilerplate and eliminate magic numbers:

- Add centralized test constants (TEST_DELAYS, TEST_OPTIONS.CONFIRMATIONS_INSTANT, EIP1967_SLOTS, TEST_GAS_LIMITS, TEST_INIT_VALUES)
- Create reusable test helpers (silenceScriptLogging, createCheckpointCleanupHooks)
- Standardize import organization across all integration tests
- Reclassify atsRegistry.data.test.ts from integration to unit directory
- Reduce test code duplication (~100 lines eliminated)
14 changes: 9 additions & 5 deletions .github/workflows/changeset-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,13 @@ jobs:
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
fetch-depth: 0
# Ensure we have the develop branch for comparison
# Ensure we have the head branch for comparison
ref: ${{ github.head_ref }}

- name: Fetch develop branch
- name: Fetch base branch
run: |
git fetch origin develop:develop || git fetch origin main:develop || true
echo "Base branch: ${{ github.base_ref }}"
git fetch origin ${{ github.base_ref }}:${{ github.base_ref }}
git branch -a

- name: Setup NodeJS Environment
Expand Down Expand Up @@ -64,14 +65,17 @@ jobs:

- name: Check changeset status
if: ${{ steps.bypass.outputs.bypass == 'false' }}
env:
BASE_BRANCH: ${{ github.base_ref }}
run: |
echo "πŸ” Checking for NEW changesets in this PR..."
echo "Comparing HEAD against base branch: ${BASE_BRANCH}"

NEW_CHANGESETS=$(git diff develop...HEAD --name-only --diff-filter=A | grep "^\.changeset/.*\.md$" | grep -v "README.md" || true)
NEW_CHANGESETS=$(git diff "${BASE_BRANCH}...HEAD" --name-only --diff-filter=A | grep "^\.changeset/.*\.md$" | grep -v "README.md" || true)
NEW_CHANGESET_COUNT=$(echo "${NEW_CHANGESETS}" | grep -c "\.md$" || echo "0")

echo "Files changed in PR:"
git diff develop...HEAD --name-only --diff-filter=A | head -10
git diff "${BASE_BRANCH}...HEAD" --name-only --diff-filter=A | head -10
echo ""
echo "NEW changeset files in this PR: ${NEW_CHANGESET_COUNT}"
if [[ -n "${NEW_CHANGESETS}" ]]; then
Expand Down
1 change: 1 addition & 0 deletions .npmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node-options=--max-old-space-size=32768
43 changes: 43 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,49 @@ This monorepo is structured with **npm workspaces** and is designed for scalabil
- Strong CI/CD workflows with conditional builds and tests for each module.
- Custodian integration at the SDK level (Dfns, Fireblocks, AWS KMS).

## What Can You Build?

### Asset Tokenization Studio (ATS)

Digitize and manage securities on the blockchain with enterprise-grade compliance.

| What You Can Do | Business Value | Example Scenarios |
| ---------------------------------- | -------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
| **Launch Digital Securities** | Go to market faster with ready-to-use equity and bond token infrastructure | Issue tokenized shares for a private fund, create a corporate bond with automated coupon payments |
| **Automate Investor Compliance** | Reduce manual KYC/AML overhead with on-chain verification | Automatically block transfers to non-verified investors, enforce accreditation requirements |
| **Enforce Transfer Rules** | Ensure regulatory compliance without manual intervention | Restrict trading during lock-up periods, limit ownership to specific jurisdictions |
| **Run Corporate Actions** | Eliminate spreadsheets and manual calculations for distributions | Pay dividends to 10,000 shareholders in one click, execute a 2-for-1 stock split |
| **Manage Cap Tables in Real-Time** | Always know who owns what, with instant settlement | Track ownership changes as they happen, generate shareholder reports instantly |
| **Handle Regulatory Requests** | Respond to legal requirements with precision controls | Freeze a specific investor's account, pause all trading during an investigation |
| **Enable Institutional Custody** | Meet institutional requirements with enterprise wallet integrations | Connect Fireblocks or Dfns for secure key management |

For detailed product capabilities, see the [ATS Product Guide](docs/ats/user-guides/capabilities-overview.md).

### Mass Payout

Distribute payments to thousands of token holders efficiently and reliably.

| What You Can Do | Business Value | Example Scenarios |
| ------------------------------------ | ----------------------------------------------------------------- | -------------------------------------------------------------------------------- |
| **Pay Thousands of Holders at Once** | Replace manual payment processing with automated batch operations | Distribute quarterly dividends to 50,000 shareholders in a single transaction |
| **Set Up Recurring Distributions** | "Set and forget" scheduled payments | Automate monthly rental income distributions, quarterly bond coupon payments |
| **Pay in Any Currency** | Flexibility to distribute HBAR or any HTS token | Pay dividends in USDC stablecoin, distribute rewards in native tokens |
| **Guarantee Fair Distribution** | Snapshot balances at record date for accurate pro-rata payments | Ensure investors who held on the record date receive their share |
| **Track Every Payment** | Full audit trail for compliance and reconciliation | Know exactly who was paid, when, and how much - with retry handling for failures |

For detailed product capabilities, see the [Mass Payout User Guides](docs/mass-payout/user-guides/index.md).

### Who Is This For?

| Role | How ATS Helps You | How Mass Payout Helps You |
| ----------------------- | ---------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
| **Issuers** | Launch securities in days instead of months, with compliance built-in | Stop processing dividend checks manually - automate everything |
| **Asset Managers** | Manage your entire portfolio from one dashboard with real-time data | Run distributions across all your funds with a few clicks |
| **Transfer Agents** | Replace legacy systems with real-time, blockchain-based cap table management | Process bulk payments with complete audit trails for regulators |
| **Custodians** | Offer tokenized asset custody with enterprise-grade security integrations | Ensure your clients receive distributions directly to custodied accounts |
| **Compliance Officers** | Enforce rules automatically - no more chasing paperwork | Full visibility into every payment for audit and reporting |
| **Developers** | Build on proven infrastructure instead of starting from scratch | Add payment distribution to your app with simple SDK calls |

## Monorepo Structure

```
Expand Down
3 changes: 2 additions & 1 deletion apps/docs/sidebars-ats.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// SPDX-License-Identifier: Apache-2.0
import type { SidebarsConfig } from "@docusaurus/plugin-content-docs";

const sidebars: SidebarsConfig = {
Expand All @@ -11,7 +12,7 @@ const sidebars: SidebarsConfig = {
type: "doc",
id: "getting-started/index",
},
items: ["getting-started/quick-start", "getting-started/full-setup"],
items: ["getting-started/capabilities-overview", "getting-started/quick-start", "getting-started/full-setup"],
},
{
type: "category",
Expand Down
3 changes: 2 additions & 1 deletion apps/docs/sidebars-mass-payout.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// SPDX-License-Identifier: Apache-2.0
import type { SidebarsConfig } from "@docusaurus/plugin-content-docs";

const sidebars: SidebarsConfig = {
Expand All @@ -11,7 +12,7 @@ const sidebars: SidebarsConfig = {
type: "doc",
id: "getting-started/index",
},
items: ["getting-started/quick-start", "getting-started/full-setup"],
items: ["getting-started/capabilities-overview", "getting-started/quick-start", "getting-started/full-setup"],
},
{
type: "category",
Expand Down
22 changes: 21 additions & 1 deletion apps/docs/src/css/custom.css
Original file line number Diff line number Diff line change
Expand Up @@ -192,14 +192,34 @@

/* Tables */
table {
border-collapse: collapse;
width: 100% !important;
border-collapse: collapse !important;
border: 1px solid var(--ifm-table-border-color);
table-layout: fixed !important;
display: table !important;
}

table thead {
display: table-header-group !important;
width: 100% !important;
background-color: var(--ifm-color-gray-50);
}

table tbody {
display: table-row-group !important;
width: 100% !important;
}

table tr {
display: table-row !important;
width: 100% !important;
}

table th,
table td {
display: table-cell !important;
}

[data-theme='dark'] table thead {
background-color: var(--ifm-color-gray-900);
}
Expand Down
144 changes: 144 additions & 0 deletions apps/docs/src/pages/index.module.css
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
/**
* SPDX-License-Identifier: Apache-2.0
* CSS files with the .module.css suffix will be treated as CSS modules
* and scoped locally.
*/
Expand All @@ -20,4 +21,147 @@
display: flex;
align-items: center;
justify-content: center;
flex-wrap: wrap;
gap: 1rem;
}

/* Products Section */
.productsSection {
padding: 3rem 0;
}

.productCard {
background: var(--ifm-card-background-color);
border: 1px solid var(--ifm-color-emphasis-200);
border-radius: 8px;
padding: 2rem;
height: 100%;
display: flex;
flex-direction: column;
}

.productCard h2 {
margin-bottom: 0.5rem;
}

.tagline {
color: var(--ifm-color-emphasis-700);
font-size: 1.1rem;
margin-bottom: 1.5rem;
}

.featureList {
flex-grow: 1;
margin-bottom: 1.5rem;
padding-left: 1.25rem;
}

.featureList li {
margin-bottom: 0.5rem;
}

.cardButtons {
display: flex;
gap: 0.75rem;
flex-wrap: wrap;
}

/* Capabilities Table Section */
.tableSection {
padding: 3rem 0;
background: var(--ifm-color-emphasis-100);
}

.tableWrapper {
width: 100%;
overflow-x: auto;
}

.capabilitiesTable {
background: var(--ifm-card-background-color);
border-radius: 8px;
overflow: hidden;
}

.capabilitiesTable th,
.capabilitiesTable td {
padding: 0.75rem 1rem;
text-align: left;
border-bottom: 1px solid var(--ifm-color-emphasis-200);
}

.capabilitiesTable th {
background: var(--ifm-color-primary);
color: white;
font-weight: 600;
}

.capabilitiesTable tr:last-child td {
border-bottom: none;
}

.capabilitiesTable tr:hover td {
background: var(--ifm-color-emphasis-100);
}

/* Workflow Section */
.workflowSection {
padding: 3rem 0;
}

.workflowSteps {
display: flex;
align-items: center;
justify-content: center;
flex-wrap: wrap;
gap: 0.5rem;
}

.workflowStep {
display: flex;
flex-direction: column;
align-items: center;
padding: 1rem 1.5rem;
background: var(--ifm-card-background-color);
border: 1px solid var(--ifm-color-emphasis-200);
border-radius: 8px;
min-width: 140px;
}

.stepNumber {
width: 32px;
height: 32px;
border-radius: 50%;
background: var(--ifm-color-primary);
color: white;
display: flex;
align-items: center;
justify-content: center;
font-weight: bold;
margin-bottom: 0.5rem;
}

.stepProduct {
font-size: 0.85rem;
color: var(--ifm-color-emphasis-600);
margin-top: 0.25rem;
}

.workflowArrow {
font-size: 1.5rem;
color: var(--ifm-color-emphasis-500);
}

@media screen and (max-width: 768px) {
.workflowSteps {
flex-direction: column;
}

.workflowArrow {
transform: rotate(90deg);
}

.productCard {
margin-bottom: 1.5rem;
}
}
Loading
Loading