Skip to content
Open
Changes from all commits
Commits
Show all changes
94 commits
Select commit Hold shift + click to select a range
e81762a
Merge pull request #2 from helderdarocha/master
arthurmsouza Oct 1, 2015
e8e49eb
Criar test
arthurmsouza Aug 20, 2025
b5dcfb5
Atualizar o test
arthurmsouza Aug 20, 2025
41c3db6
Atualizar o test
arthurmsouza Aug 21, 2025
9675e9e
Atualizar o test
arthurmsouza Aug 21, 2025
830dc44
Atualizar o test
arthurmsouza Aug 21, 2025
955684c
Atualizar o test
arthurmsouza Aug 21, 2025
27b111d
Atualizar o test
arthurmsouza Aug 22, 2025
a839b91
Atualizar o test
arthurmsouza Aug 22, 2025
5efedbf
Atualizar o test
arthurmsouza Aug 22, 2025
c301dd4
Atualizar o test
arthurmsouza Aug 22, 2025
cfbb44f
Atualizar o test
arthurmsouza Aug 22, 2025
3c88368
Atualizar o test
arthurmsouza Aug 22, 2025
a6cb643
Atualizar o test
arthurmsouza Aug 23, 2025
ce4435a
Atualizar o test
arthurmsouza Aug 23, 2025
5d52ce8
Atualizar o test
arthurmsouza Aug 23, 2025
1d62ddc
Atualizar o test
arthurmsouza Aug 24, 2025
d1730ba
Update test
arthurmsouza Aug 24, 2025
1ca7765
Update test
arthurmsouza Aug 24, 2025
5d6cd91
Update test
arthurmsouza Aug 24, 2025
56093e8
Update test
arthurmsouza Aug 24, 2025
1d40b6f
Update test
arthurmsouza Aug 24, 2025
f2c1508
Update test
arthurmsouza Aug 24, 2025
0f638bd
Atualizar o test
arthurmsouza Aug 24, 2025
d351f09
Atualizar o test
arthurmsouza Aug 24, 2025
daabcdd
Atualizar o test
arthurmsouza Aug 25, 2025
032cccf
Atualizar o test
arthurmsouza Aug 25, 2025
acb0b31
Atualizar o test
arthurmsouza Aug 25, 2025
04277d3
Update test
arthurmsouza Aug 25, 2025
0c9a2d8
Atualizar o test
arthurmsouza Aug 27, 2025
826efa5
Atualizar o test
arthurmsouza Aug 27, 2025
69781be
Atualizar o test
arthurmsouza Sep 16, 2025
04b93c8
Atualizar o test
arthurmsouza Sep 16, 2025
a192167
Atualizar o test
arthurmsouza Sep 16, 2025
5a3e1c7
Atualizar o test
arthurmsouza Sep 23, 2025
82459c5
Atualizar o test
arthurmsouza Sep 23, 2025
d78a2ce
Update test
arthurmsouza Sep 24, 2025
07d6b09
Atualizar o test
arthurmsouza Sep 24, 2025
e32b8c9
Atualizar o test
arthurmsouza Sep 24, 2025
542556a
Atualizar o test
arthurmsouza Sep 24, 2025
bef48cc
Atualizar o test
arthurmsouza Sep 24, 2025
80b65fa
Atualizar o test
arthurmsouza Sep 24, 2025
fa6525c
Atualizar o test
arthurmsouza Sep 24, 2025
a470dbe
Atualizar o test
arthurmsouza Sep 25, 2025
c33edc8
Update test
arthurmsouza Sep 30, 2025
d45c881
Update test
arthurmsouza Sep 30, 2025
99efbbe
Update test
arthurmsouza Sep 30, 2025
d889186
Update test
arthurmsouza Sep 30, 2025
be338ea
Update test
arthurmsouza Sep 30, 2025
7a950bc
Update test
arthurmsouza Sep 30, 2025
a34d391
Atualizar o test
arthurmsouza Sep 30, 2025
56faeeb
Update test
arthurmsouza Sep 30, 2025
328ebfa
Update test
arthurmsouza Sep 30, 2025
6c7fe7b
Update test
arthurmsouza Sep 30, 2025
eaa3628
Atualizar o test
arthurmsouza Sep 30, 2025
5a79f15
Atualizar o test
arthurmsouza Sep 30, 2025
3a1698a
Atualizar o test
arthurmsouza Sep 30, 2025
7845f6a
Atualizar o test
arthurmsouza Sep 30, 2025
0eb3018
Atualizar o test
arthurmsouza Sep 30, 2025
575ac9e
Atualizar o test
arthurmsouza Sep 30, 2025
401ea2b
Atualizar o test
arthurmsouza Sep 30, 2025
f478c30
Atualizar o test
arthurmsouza Sep 30, 2025
4b40e76
Atualizar o test
arthurmsouza Sep 30, 2025
10158a5
Atualizar o test
arthurmsouza Sep 30, 2025
7ac8e44
Atualizar o test
arthurmsouza Sep 30, 2025
c37477a
Atualizar o test
arthurmsouza Sep 30, 2025
1a45756
Atualizar o test
arthurmsouza Sep 30, 2025
7148ea9
Atualizar o test
arthurmsouza Sep 30, 2025
3d344f1
Atualizar o test
arthurmsouza Sep 30, 2025
fd0a1ee
Atualizar o test
arthurmsouza Sep 30, 2025
8b6b8ce
Atualizar o test
arthurmsouza Oct 7, 2025
4e48c95
Atualizar o test
arthurmsouza Oct 7, 2025
2abd223
Atualizar o test
arthurmsouza Oct 7, 2025
fec6dd7
Atualizar o test
arthurmsouza Oct 12, 2025
f0745a1
Atualizar o test
arthurmsouza Oct 12, 2025
35135e3
Atualizar o test
arthurmsouza Oct 12, 2025
298885f
Atualizar o test
arthurmsouza Oct 13, 2025
64c5c85
Atualizar o test
arthurmsouza Oct 13, 2025
e655102
Atualizar o test
arthurmsouza Oct 14, 2025
7959bfc
Atualizar o test
arthurmsouza Oct 14, 2025
b29e8d2
Atualizar o test
arthurmsouza Oct 22, 2025
a23678b
Update Keycloak Service description in test file
arthurmsouza Oct 23, 2025
4126126
Update test
arthurmsouza Oct 23, 2025
4418017
Update Validium Technical Design document with clarifications
arthurmsouza Nov 12, 2025
17bc5a5
Atualizar o test
arthurmsouza Nov 20, 2025
27bc6b0
Atualizar o test
arthurmsouza Nov 20, 2025
c30a146
Add onboarding guide for Swift Digital Ledger Portal
arthurmsouza Dec 2, 2025
7f571a8
Add minimum system requirements section
arthurmsouza Dec 2, 2025
f8aaf02
Enhance onboarding section with submission guidelines
arthurmsouza Dec 2, 2025
8f5ec14
Atualizar o test
arthurmsouza Dec 3, 2025
642dc11
Atualizar o test
arthurmsouza Dec 3, 2025
4054d2d
Atualizar o test
arthurmsouza Dec 3, 2025
e82cd02
Actualizar test
arthurmsouza Dec 23, 2025
91c1927
Implement InterbankLiabilityRegistry contract
arthurmsouza Jan 9, 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
215 changes: 215 additions & 0 deletions test
Original file line number Diff line number Diff line change
@@ -0,0 +1,215 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/access/AccessControl.sol";

/**
* InterbankLiabilityRegistry (Record Only)
*
* PURPOSE:
* - Record interbank liabilities only (no settlement, no token movement)
* - Enforce bilateral credit limits
* - Track outstanding exposure
*
* ROLES:
* - DEFAULT_ADMIN_ROLE : governance / role management
* - ADMIN_ROLE : operational control
* - add/remove banks
* - record liabilities
* - BANK_ROLE : bank agents (debtor / creditor identities)
* - set credit limits
*
* MODEL:
* - creditLimit[debtor][creditor][currency] = max outstanding allowed
* - exposure[debtor][creditor][currency] = current outstanding
*/
contract InterbankLiabilityRegistry is AccessControl {
bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE");
bytes32 public constant BANK_ROLE = keccak256("BANK_ROLE");

constructor(address[] memory admins, address[] memory bankAgents) {
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);

for (uint256 i = 0; i < admins.length; i++) {
require(admins[i] != address(0), "BAD_ADMIN");
_grantRole(ADMIN_ROLE, admins[i]);
}

for (uint256 i = 0; i < bankAgents.length; i++) {
require(bankAgents[i] != address(0), "BAD_BANK");
_grantRole(BANK_ROLE, bankAgents[i]);
}
}

// -----------------------------
// Bank management (ADMIN_ROLE)
// -----------------------------
event BankAdded(address indexed bankAgent);
event BankRemoved(address indexed bankAgent);

function addBank(address bankAgent) external onlyRole(ADMIN_ROLE) {
require(bankAgent != address(0), "BAD_BANK");
_grantRole(BANK_ROLE, bankAgent);
emit BankAdded(bankAgent);
}

function removeBank(address bankAgent) external onlyRole(ADMIN_ROLE) {
_revokeRole(BANK_ROLE, bankAgent);
emit BankRemoved(bankAgent);
}

function isBank(address bankAgent) public view returns (bool) {
return hasRole(BANK_ROLE, bankAgent);
}

// -----------------------------
// Credit limits & exposure
// -----------------------------
/**
* Dimension order:
* debtorAgent → creditorAgent → currency → amount
*
* creditLimit:
* - Maximum outstanding amount allowed from debtor to creditor in a given currency
*/
mapping(address => mapping(address => mapping(bytes32 => int256))) public creditLimit;

/**
* exposure:
* - Current outstanding amount from debtor to creditor in a given currency
*/
mapping(address => mapping(address => mapping(bytes32 => int256))) public exposure;

event CreditLimitSet(
address indexed debtorAgent,
address indexed creditorAgent,
bytes32 indexed currency,
int256 limit
);

/**
* Credit limit is set by BANK_ROLE
*/
function setCreditLimit(
address debtorAgent,
address creditorAgent,
bytes32 currency,
int256 limit
) external onlyRole(BANK_ROLE) {
require(isBank(debtorAgent) && isBank(creditorAgent), "NOT_A_BANK");
require(limit >= 0, "LIMIT_NEGATIVE");

int256 currentExposure = exposure[debtorAgent][creditorAgent][currency];
require(limit >= currentExposure, "LIMIT_BELOW_EXPOSURE");

creditLimit[debtorAgent][creditorAgent][currency] = limit;
emit CreditLimitSet(debtorAgent, creditorAgent, currency, limit);
}

function availableCredit(
address debtorAgent,
address creditorAgent,
bytes32 currency
) external view returns (int256 limit, int256 used, int256 available) {
limit = creditLimit[debtorAgent][creditorAgent][currency];
used = exposure[debtorAgent][creditorAgent][currency];
available = limit - used;
}

// -----------------------------
// Liability records (immutable)
// -----------------------------
struct Liability {
bytes32 id;
address debtorAgent;
address creditorAgent;
uint256 amount;
bytes32 currency;
bytes32 batchId;
}

mapping(bytes32 => Liability) private liabilities;

event LiabilityRecorded(
bytes32 indexed id,
address indexed debtorAgent,
address indexed creditorAgent,
uint256 amount,
bytes32 indexed currency,
bytes32 batchId,
int256 newExposure,
int256 limit
);

/**
* recordLiability
* - One-way record
* - Enforces creditLimit and updates exposure
* - Stores immutable record (no settlement)
*/
function recordLiability(
bytes32 id,
address debtorAgent,
address creditorAgent,
uint256 amount,
bytes32 currency,
bytes32 batchId
) external onlyRole(ADMIN_ROLE) {
require(id != bytes32(0), "ID_REQUIRED");
require(isBank(debtorAgent) && isBank(creditorAgent), "NOT_A_BANK");
require(amount > 0, "AMOUNT_REQUIRED");
require(liabilities[id].id == bytes32(0), "DUPLICATE_ID");

int256 limit = creditLimit[debtorAgent][creditorAgent][currency];
require(limit > 0, "NO_CREDIT_LIMIT");

int256 currentExposure = exposure[debtorAgent][creditorAgent][currency];
int256 delta = int256(amount);
require(currentExposure + delta <= limit, "CREDIT_LIMIT_EXCEEDED");

int256 newExposure = currentExposure + delta;
exposure[debtorAgent][creditorAgent][currency] = newExposure;

liabilities[id] = Liability({
id: id,
debtorAgent: debtorAgent,
creditorAgent: creditorAgent,
amount: amount,
currency: currency,
batchId: batchId
});

emit LiabilityRecorded(
id,
debtorAgent,
creditorAgent,
amount,
currency,
batchId,
newExposure,
limit
);
}

function getLiability(bytes32 id) external view returns (Liability memory) {
Liability memory l = liabilities[id];
require(l.id != bytes32(0), "NOT_FOUND");
return l;
}
}


////
Whitelist the bank agent addresses (debtor/creditor agents).
• Store bilateral credit limits as:
limits[debtorAgent][creditorAgent][currency] = int256(limit)
• Track current exposure / outstanding as:
exposure[debtorAgent][creditorAgent][currency] = int256(currentOutstanding)
• When the debtor emits the token-escrow event, your Orchestrator observes it and calls the registry passing:
• debtorAgent
• creditorAgent
• amount
• currency

The contract verifies:
exposure + amount <= limit and then records the interbank liability.